Make a bot list from access.log and use it

The other day, after playing a bit with GoAccess I found that the numbers didn’t add up with my in-app tracking, and I decided to take a slice of access.log and eyeball it to see what’s going on. What I found was discouraging: lots an lots of bot and crawler requests. As disappointing as it was, it was still good to find this out and adjust my perception to reality.

My simple meditation routine

My current meditation practice is a sort of mindfulness meditation: it’s intended as a way of training attention, focus, and self-awareness.

Back to Top ↑


Project-based learning

Recently I was discussing with a friend that was thinking about developing some programming skills.

Back to Top ↑


Google Apps Script

For a while, I was collecting the DMARC reports, just in case I can find something useful in them. I didn’t, but I liked the lil script that I wrote in this Apps Script from Google. It’s like VBA for Microsoft Office — if you ever heard of it. If not, it’s automation for Google apps and services.

moreutils ifne run function

There is this lil program in moreutils called ifne. I use it in shell pipelines, to execute a given command when there is some output. A quick example:

Simple log aggregation for Docker containers

The Why

The Docker composition on one of my side projects has recently got to 6 containers: SMTP-in, SMTP-out, app, subscription, website, and certbot. Since I have deployed a 0.1.0 version to DigitalOcean a couple of weeks ago, I caught myself feeling increasingly anxious about losing logs every time I deployed a new version of the container.

An easy TDD exercise and some more

A couple of months ago I’ve set out to write a lil RSS-checking program that I thought would be useful for a friend. As a small green-field project, I thought it’s going to be perfect to — once again — try that hippy TDD method that everyone was talking about 10 years ago. In retrospect, a few things came in really handy while writing this program, and wanted to share them.

iPhone re-install frees up space

I have a more or less ancient iPhone SE 2016, with 16GB of storage. For the past year or so, the storage was filled up to 15.5GB most of the time. I kept juggling the apps by offloading and restoring the ones that I only needed once a week. Lately, some of the apps that I use grew past 200MB in size, and I got to a point where I just didn’t have enough space.

One tip to journal easier

If I were to give a single piece of advice for easier journaling it would be this: make it handy.

How to start journaling

The other day I found myself in a conversation where I was recommending journaling to improve self-awareness and the capacity to analyze issues small and large. Then as I thought about that conversation later, I realized that for someone who didn’t journal for at least some time, it may sound too grandiose and unapproachable, and so I thought that I should have suggested an easier way to begin. After that, this idea was bubbling again and again in my mind, and so here I am explaining it here.

Angular tip of the week: parametrized templates

On my 30-th week of Angular, I learned something that I was looking for since the first week: a lightweight way to get a “parametrized” piece of view. Coming from a couple of years of React, I was used to having function components to abstract away noisy bits of a view, and for some time I thought the only way to get that is to get such a thing.

Getting through the mess

Every now and then I end up in a messy codebase. It’s scary and discouraging to try to fix a bug in there.

Back to Top ↑


About switching jobs

I have recently switched jobs. This is the main reason why I haven’t written on my blog for a while: I wanted to focus on getting familiar with the new household.

Angular 6 years later

In 2014, I wrote about a couple of things that I liked about Angular, then at v1.4, I think. Now, as I’m getting on Angular at my new job, and I’d like to share the things I like again. So far, the concepts seem familiar, and I will only comment on the things that jump at me, from the perspective of a newcomer.

Per-directory Bash history

I’m a heavy console user and I like my shell history to be relevant to the project that I’m working on. For example if I cd into ~/src/mixbook_editors, I want the shell history for that specific project—this is what I mean by per-directory Bash history.

Make tests less repetitive

On my side project, I strive to have as good of a unit-test coverage as I can. Because I define the input and every outputs of a scenario handler, there can be a lot of execution paths to unit-test, and so it can get pretty tedious to cover all of them. This is why I’m employing a technique that resembles data-driven testing.

Checking Tailwind CSS

One of the things on my side project that I felt iffy for some time is the UI toolkit. I have gathered notes, links, fonts, but I have held back from actually trying anything so far. I wanted to first have a robust setup that would allow me to add functionality, frontend and backend. Having that more or less in place, the goal that I had set for this sprint was to look for a UI toolkit. I have recently heard about Tailwind CSS on “The Art of Product” podcast and I made a note to take a look at it.

Online presence for $5 a month

A few months ago a friend asked for help with the degrading quality of their web host. At that time they had an old all-in-one service that was hosting their static website that they edited by hand, DNS, and email. I have done that a couple more times for the domains that I owned and for my other people, and I offered my “solution”:

Speeding up my TypeScript build

I was cleaning up my NPM modules on my side project. Since almost from the beginning, I have had 2 “child” package.json files, one for the backend and one for the frontend, and the “main” one in the project root.

Transactional tests with Mocha.js

This week, while working on the email change scenario on my side project, I realized that my tests are not transactional, which meant that their changes to the DB could persist across test runs and so tests could influence each other. Hm… I thought I fixed this before.

Simple indefinite asset caching

In my last post about my side project I have mentioned that I have extracted 2 shared bundles to increase my build speed, and one downside of that is that now have two more requests for every page, and this week I have implemented a small tweak that will compensate to that: indefinite caching.

Faster TypeScript build with project references

This weekend I have finally got to optimizing the TypeScript build for my side project. Because page bundles included both shared modules — one for the code shared between the backend and the frontend, and one for the code shared between the pages — they were getting longer to compile.

Simpler architecture: validation and error handling

Today I would like to explain how I arrange validation and error handling on my side project. One useful outcome of using TypeScript on both sides — backend and frontend — is that I get to share the data structures, error states, and also the validation logic. And it’s not as much about sharing the code itself, but about the ability to keep the two sides aligned as the code evolves.

Heroku: a PaaS for stress reduction

One of the items that I had planned for this sprint was to fix the deployment system. Well, the “system” is a bit too grandiose for a Bash pipeline in the Makefile. The essence is that I didn’t pay too much attention to it after a couple of initial deploys, and then one day I went to the public URL and the app didn’t come up. I logged into the DigitalOcean server, and felt lost: didn’t really remember the commands to check for the system service status, didn’t know how to verify if the code is up to date.

Planning as a cure for getting lost in rabbit holes

One thing that I didn’t feel completely content with regards to the work on my side project was that I sometimes was getting lost down some rabbit holes, mostly on technical matters, like getting some makefile right or getting types right in TypeScript. This could take entire mornings with nothing to show for, and when this came out a couple of times during my own weekly retrospective, I decided I should do something about it.

One reason to prioritize the feature work over tech work

A couple of weeks ago I wrote about the P/PC Balance, and while thinking about it some more, a kind of comic realization stroke me: I realized that one good reason to prioritize feature work above technical work on a project is that the former is finite, while the latter is potentially infinite.

Simpler architecture

On the side-project that I’ve mentioned before, I’m making a priority of 2 things: (1) use the least amount of libraries and frameworks, and (2) organize the code in a way that reflects the logical structure of the app.

Back to Top ↑


JS hoisting gotcha

I have written why I like function hoisting in JS, but the other day I got a bite in the back in the context of function hoisting. 😸

make background start

I have a couple of Jekyll-based websites, and my make start looks something like this:

	bundle exec jekyll serve

This works. I run it in another terminal tab, and ^C it when I’m done. The other day though, I thought it’d be nice if make start would run in the background and then say make stop when I’m done. Here is what came out. 🤓

bind: warning: line editing not enabled

The other day I was writing a Makefile which involved nvm and stumbled upon an error that seemed to make sense, on one hand, but on the other hand I couldn’t quickly google out a clean solution. Digging in some more, I’ve devised my own, which I’m going to present here. 🤓

Jekyll post alias

I’ve launched a new Jekyll website recently, and one thing that I wanted to be able to do on the very first days is to be able to have different URLs for a single post. 🤔

Use-case: I’ve published an article on the blog, but the topic is one that comes up frequently enough that I want to have it on the FAQ page, but also have a simple one- or two-word permalink that I would be able to tell someone on the phone, for example /socializare.

Markdown lists with vim

The other day I found myself copy-pasting some Google Docs texts into a new Jekyll website, and so I had to format quite a bunch of lists. After Google Docs, the reflex was to select the rows, and hit ⌘+Shift+8, so I thought: Hey why not make a key-mapping? 🤓

make nvm node

Today I launched on a new project and there was a specific Node version required, specified (strangely) in package.json. I’ve expected it to be in .nvmrc, but never mind, I had to get it working, and I wanted it working with make, as I do for every new project.

Back to Top ↑


Select from union type in Elm

One of the things that attracted me early on in Elm were the union types: Having the compiler ensure that discrete values of a variable are correct seems quite useful. And it was as disappointing when I couldn’t find out a type-safe and reasonably straightforward way to build a <select> tag out of a union type. I’m emphasizing type-safe because Elm’s type system is the reason why I’m learning it. Conceptually these two things — a union type and a dropdown — align perfectly, and I thought it should be a way to code it as well.

Composing Elm on week 5

A few weeks ago I have set out to try Elm on a toy project of mine. The experience was like learning to program again: I had to figure out very basic things like how to attach an event handler to a field.

Behind the scenes of my first talk

A couple of weeks ago I gave a talk at our local JavaScript meetup. It was my first talk ever, and, as you can probably imagine, I had a couple of notable moments. And I’d like to share them.

Back to Top ↑


Promise array sequence

The other day at work, as during a proof-of-concept task, I needed to take a screenshot of a list of HTML pages, but massage them a bit before that. The list of pages could be long so I needed them to run in sequence.

FP concepts in shell pipelines

The other day I was faced with a little task at work: find in the current repository subdirectories that contain a file named render-javascript.js and zip those directories one by one. Here is what came out:

NPM publishing automation

I have a small module on NPM and I found myself tweaking it more than a few times lately. One piece of routine related to this kind of work is Git tag management: I want to have a tag for every new version that I publish on NPM. This is handy if you want to get a specific version of the module directly from the GitHub repository.

Switching from tape to Mocha

I have a side-project where I use tape for testing. A few days ago I stumbled on a test that I thought should fail, but passed.

We all do TDD

The other day I’ve stumbled upon the an article entitled “Testing is not a phase.” — It reads like a list of truisms. And then it came to me: Well, of course, we all do test-drive things! Let me explain.

MTA of the week: sSMTP

I fiddled with a couple of servers in the past weeks and one of the things I needed immediately was email. I wanted to allow cron and the webapps to send out emails.

Vim tip of the day: C-a and C-x

They say that in Ruby if you think “I’m wondering if there is a function that does X” then it probably exists. More and more I find that is true about Vim too.

Testing location change in JS

Every now and then I come across a scenario where I need to unit-test some code that navigates across pages by directly changing location. Some time ago I have accidentally stumbled upon a solution: the location.assign() function.

Expressive JS: askToConfirm

The other day at my day job I needed to change some buttons to ask for confirmation before executing the actual action.

Wheel re-inventing: executeInParallel

At my day job we often need to write low-level JS code without any framework or library handy, and we often end up re-inventing some of the wheels. executeInParallel is one of those wheels:

A reality check

I have a friend. He was a lawyer, but a few months ago he realized he doesn’t enjoy it, and decided to change countries and profession: he moved, and now makes wooden toys. He said he wants to try to sell his toys online and asked for advice on how to do that on the cheap.

Vim macro of the week

The other day I was putting together an ad-hock eslint configuration where I had just one JS file for a prototype page. I was inside a git repo and I didn’t want to have additional files, so I kind of resisted the idea to have a .eslintrc file, but I can have a Makefile — I have that in my ~/.gitignore, so I can easily add one here and have all the messy bits hidden inside it:

The indexOf problem

I have recently read this article “Don’t Make Me Remember Things” where the author complains about string’s indexOf method having less-than-ideal API. Specifically, about the case when the sought substring is not found: indexOf usually returns a nonsense value like null or -1, and the developer has to remember that, which leads to bugs.

Choice is a search

From time to time I stumble upon yet another article mentioning that humans are just bad at choices. I think accepting it as a truth is detrimental, and I’d like to disprove it.

To throw or not to throw

I’m working on a little basket widget, and while thinking about the model I caught myself unsure about how to handle validation errors. For example: while instantiating a new Product, I need its ID, name and price, but what should I do when price is not a number?

Back to Top ↑


One tip on writing: be concrete

Every now and then, I set out to write an article about some Grand Idea® that just came to me. It usually happens when I read something dramatic rant on something.

FP-style conditional callbacks

The other day I was putting together a little UI to collect emails: an input and a button. So I wanted the email to be take in when the user clicks the button:

JS promise recursion

The other day I wanted to get some data from an API. The API is giving the information paginated, so I have to fetch it page by page.

How did I get unstuck this weekend

For the past few weeks I got a bit stuck with one of my side project’s UI. I have had some vision of how that particular form should look like — which sections there were and how they were positioned, looked quite nice and it worked well so far — but now I’ve got to a point where I needed something else to fit in, and it won’t let me. And there I was stuck.

On testing UIs

I have heard that people resist testing UIs because “they change often”, and my oppinion is that from the perspective of “tests as safety net” UI testing is as valuable as any other kind of testing.

OOP and FP nicely mixed in JS

OOP wants together behavior and data that change together. FP wants behavior and data separate so that the behavior can be used with more than one kind of data. JS makes the two collaborate well “for a greater good.”

My new old JS module system

A few months ago I’ve switched one of my side projects from CommonJS modules to plain JS namespaces, and in this post I’ll explain why.

My JS enum type

For my PersonSection widget I needed to have a PERSON_TYPES constant.

Why I like function hoisting in JS

There is this phenomenon in JS called “function hoisting.” It’s regarded as odd to newcomers but I found it improving code readability and use it every day.

Why I code test-after now

On my front-end side-projects I mostly did test-first development and it worked pretty well. But for my new job that I began recently I found myself struggling really hard to do TDD, and eventually gave up and coded test-after.

The “C” in CSS

One of the first things that I learned about CSS is that it cascades. Cascading is a lot like inheritance in OOP. It’s useful for the same reasons, and, for the same reasons leads to CSS fragility when misused.

Me in review

6 weeks ago I have switched jobs. It’s a big change and it’s also good time to review other big things.

My testing guideline

I use one non-academic guideline that helps me decide what and how to test in my code.

My understanding of “paradox of choice”

There was a video on TED called “The paradox of choice.” I have never agreed with this idea that more options make the choice harder. I have criticized it a while ago on Facebook, but today I share my understanding of its mechanics.

Why I stopped pursuing entrepreneurship

More than a few years ago I decided I want to work on my own business. I’ve been learning quite a few things from books, blogs, and podcasts, and even tried a few things. But I think today it has become clear to me that business ownership is not my thing.

My way to test web UIs

I remember how amazed I was while reading Kent Beck’s “Test Driven Development: By Example.” Automated regression tests sounded very useful. But it was not obvious how to apply that in the context of web UIs.

My view of motivation

In the last post on Travis Neilson’s mailing list, he’s sharing his thoughts about motivation and proposes some solutions.

My explanation of DCI

In the episode 21 of “Giant Robots” podcast Jim Gay is invited to talk about the DCI concept. The original document explains it with an example about saving accounts. Jim tries to explain it with an app user. I find both examples somewhat unhelpful, and thinking about this subject a little more, I think I found a better one.

My Git trail map

In my last article I said that I have started a little study by following thoughtbot’s trail maps. After Heroku, I’ve picked Git, and today I will write about the things I’ve learned from it.

Trail maps

I don’t have a CS degree, and most of what I know I’ve learned along the way because I found it interesting or because I needed to solve a problem. It worked pretty well so far, but sometimes I feel like I need a bit of structure around it, usually when I’m trying to make sense of a bigger picture.

Input for vim abbrevs

I got into React.js lately, and one thing that I have noticed right away is the boilerplate that I have to type for every component. For example, if I have a Button component, I have to type this:

My today’s view on code

This morning I have finished watching a course on Frontend Masters. It’s called “Hardcore Functional Programming in JavaScript.” Functional programming (FP) is interesting to me. It’s partly because I hear people speaking very passionately about it. It’s like an exotic thing that I don’t completely understand, but I’m curious to find out what it is.

FP vs. OOP: input

I often think about how Functional Programming (FP) compares to Object Oriented Programming (OOP).

My intentful writing

I have recently shared a link to the one of the recent episodes of “Late Nights with Trav and Los” podcast: “Why You Should Be A Publisher.” I’m mentioning this because I find writing is a very interesting subject in how it affects how I understand things, and how I see and understand myself.

Me is back to work

This my first day back to my day-job at Assembla. My plan is to find an hour every day to work on my project.

My own hackathon: day 14

This is the last day of this sprint. I’m far from an MVP, but I have scratched the surface of what’s possible and this gives me some more visibility for the next steps.

My own hackathon: day 10

Yesterday I traveled to Bucharest (and I have slept the first half of the today to recover).

My own hackathon: day 7/14

Monday. In the morning I have watched the React video course on FrontendMasters, by Ryan Florence. Pretty good. I can’t say I found a ton of new things but it’s good to get confirmation that what I know are about the right things, and also give the whole thing a bit of structure in my mind. Fundamental things are well explained. There was a nice quick intro to Flux, which clarified by vague view on it.

My own hackathon: day 5/14

Today it’s a different day, it’s Saturday: until afternoon I dug channels for our drainage system in the back-yard. I did my best to escape out of there around 16:00 and got to the office.

My random thought of the day

Having your own business is in many ways similar to being employed: you make a long-term commitment, you take on some responsibility, you do the work, and you get payed for it.

My own hackathon: day 4/14

Today I worked pretty smooth once I got into the flow. And I feel a bit more tired than usual and I have some theories on why.

My own hackathon: day 3/14

In the morning I’ve spent some more time thinking and googling around about automated testing. Not finding anything that I would like to give a try, burned a hole into my motivation. Now I realize it’s a good idea to do this kind of research later in the day, when most of my brain power was put into useful work.

My own hackathon: day 2/14

I wasn’t very productive on day 2. I have burned the first half of the day trying to write the least meaningful test and failed. I admit that I was not prepared for that: both Chrome apps and React are new to me, and it’s just too much struggle. Both are unlike anything I have worked with so far and for the sake of making at least some progress, I will first get more familiar with them.

My own hackathon: day 1/14

I wrote about this app for bailiffs that I started to build and failed. I also wrote that some a couple of weeks ago I went with my partner to a former colleague of his — a bailiff — to interview him and see how he actually works and if there would be any value in building an app for them.

My new notion of web app

One of my side projects that I’ve been toying with, is a productivity app for bailiffs. And since I’m reading “Lean Customer Development” by Cindy Alvarez, a few days ago I went with my partner to interview a bailiff — a former college teammate of his.

My practical Vim

Last night I have finished re-reading Drew Neil’s “Practical Vim” and I gathered a whole lot of little things that I want to try, and include in my workflow if they fit.

My awkward writing

My articles here so far are more awkward than not, and I was a bit confused about why would that be. I was wondering about that because, if I look at my emails, I generally consider them as coherent and well put together, I even take some kind of pride in that.Then how come my articles are not that good? I think I have an answer and it’s in a way similar to my theory about why public speaking is generally considered hard.When I write an email, I generally have a clear subject, and a known audience—a specific person—and I write about a specific aspect about the subject. And I believe these two knowns is what makes it relatively easy to write a clear and coherent message.On the other hand, in case of blogging this is not the case. Although I may know the subject, I don’t know the audience at all, and whether they are interested or not in the specific aspect of the subject that I’m trying to talk about.I think this is what makes it hard: if I don’t know you’re interested to hear about X, I will be reticent speaking about it, and I will probably fall sideways into other things that I guess may be more interesting to you.So my theory is that this is what makes blogging—or public speaking—hard, and from here I think it’ll be easier to find a way out. Yay!

My make

About a year ago I wanted to jshint only files that have changed since the last run, and with Grunt I had to write custom code to do that. I used to be able to find my way through Makefiles in FreeBSD ports when I was a kid, so decided to try make.

Oiling promise chains

When working with asynchronous procedures in Node, I find promise chains help me write pretty readable linear-looking code:

Back to Top ↑


My cloud

I have a little Tonido plug on my fridge. For last 4-5 years it proudly served a couple of static websites, hosted the DNS zones for a few domains, and the SMTP redirection for those few domains. It didn’t hold the messages, just forwarded them to some other email service, like GMail.

Two days

This week I had a couple of harsh days.

Promises as before filters

The Firebase JS library is callback-based, which feels pretty cumbersome after I got used to promises. So, the other day I wanted to have a FirebaseClient object that given a Firebase URL and credentials would give me a simple way to read and write data to it, something like this:

Timing promises

I have a deeply nested loop of promises that query a remote API, and I had them logging their time by default, like this:

Simple .env

I’ve seen .env being used in Heroku projects, and also in a RubyTapas episode about Dotenv gem, and I kind of liked it. But I’m reticent to add more libraries or tools to my toolset, especially if they’re language specific like Dotenv.

Timing out JS promises

When wrapping an API client I found myself wanting to set a timeout for promise-based methods. I first used setTimeout to reject the deferred promise after a given amount of time, like this:

Keeping secrets in a node app

For some time I was looking for a way to safely store my app secrets like API keys. Environment variables are OK, they work, but I found it cumbersome. I had a Heroku project where this worked with a .env file that looked like this:

Fake chain pattern

I have recently read “Smalltalk Best Practice Patterns” and since the idea of pattern is fresh in my mind, I want to share a function naming trick that I use many times.

Small is productive

Last Friday, on my way home, I was wondering why did spend that long hours every day of the week. And the week before? I was getting work done, but somehow I was not seeing my work as good as a couple of weeks ago. I found myself counting 11–12 hours between when I left home and when I came back.

Enjoy the stability

It’ll take some time for the peace and comfort to become stability. I think it’s OK to lean on it for a while and enjoy its comfort. Even if it may feel like a plateau sometimes, that is fine: that stability is the very thing that will let your innate curiosity overcome the fears accumulated along the time and drive you towards exploration. The exploration in turn, will help you find what makes you happy.

Make peace

It’s innate for any human being to try to understand how things work. I will share my reasoning on why my life is as good as it is. I plan to split my findings into short posts and knit them along the way.

Make it fun

For many years I’m fond of productivity and its inner workings and I have one trick that works particularly well, described by my status in messengers:

One reason to write

As I mentioned in my previous article, I just finished reading the book “On Writing Well” by William Zinsser. I want to clarify a bit why am I so excited about the subject of writing.

On the book “On writing well”

I just finished reading “On Writing Well” by William Zinsser. I enjoyed most of it. I’ve skipped the chapter on sports writing because sports is not a subject I find particularly interesting (but I’m reading it now). I feel a bit disoriented now: I’ve read a lot of good advice from a such master, and I can’t say that I know the precise next steps to improve my writing. I think I should have took notes.


It’s not that I could argue with DHH regarding TDD—in technology he’s at a level that I may never reach. Mr. Kent Beck had his say on that article, and also Mr. Robert C. Martin, although not as to-the-point as Mr. Beck’s.

On Writing Well

This morning I got to the “Business Writing: Writing in Your Job” chapter in the “On Writing Well” book by William Zinsser. I found many things I wanted to write down and share, but instead of retelling it I thought I will just quote a good chunk of it and let you enjoy the original. It’s pretty long for a blog article, but it’s an easy and pleasant reading. I’ll start with the second paragraph since I think it goes straight to the point. Here it goes.

Testing promise-based JS code

One tricky thing about testing promises is that they handle errors thrown by their .then() callbacks. So I have a test like this:


I try to limit the amount of magic that I allow in my worldview, as too much of it can cause confusion.

On Testable JavaScript

After I watched and shared Mark Trostler’s presentation “Testable JavaScript” three times, at intervals of about a year. And for me, the experience was like reading one of those books that you find out more each time you re-read it.

On Diversity

Accepting Diversity in people as a good thing, and understanding its implications gave me a much better life.

The Clean Coder

I just finished reading Robert C. Martin’s book “The Clean Coder”.

On blogging

One thing that I found interesting in the “Apprenticeship Patterns” book is the emphasis it puts on blogging. It’s not that this surprised me, I have heard about this many times, and I think I understand its benefits, but one notable thing is that it gives ideas on what to write about, and one good reason: to use it as a tool towards a better understanding for yourself.

My side project

After last night’s “JavaScript MVC Frameworks” meeting I was super excited, in a way¹. As a result I woke up at 3 in the morning and went to my stand-up² table in the kitchen and started to tackle the app-sleeping issue with my free one-dyno xo-scripts app at Heroku that was supposed to do some daily data pluck-and-store, and for some reason didn’t in the last month or so. Got it working and added a reminder to my GCanlendar to periodically verify it works and a plan-B³ in case this doesn’t work in the long term.

My 3 “Why Angular”s

In a previous post I said that I recently went to a JS meet up, and I was left with the impression that the presentations would have been more useful if they were more narrowly focused: maybe take a specific problem and explain how a particular framework helps in solving it. Then I thought, what exactly do I mean by that? So here is what.

Back to Top ↑