diff --git a/.gitignore b/.gitignore index 3242097..467268f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.sw? -public/* +# public/* tags diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..4679252 --- /dev/null +++ b/public/404.html @@ -0,0 +1,66 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

404: Page not found

+

Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. Head back home to try finding it again.

+
+ +
+ + + + diff --git a/public/announcements/about-me/index.html b/public/announcements/about-me/index.html new file mode 100644 index 0000000..42d6fba --- /dev/null +++ b/public/announcements/about-me/index.html @@ -0,0 +1,92 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

About Me

+ +

In case it wasn't clear by the URL, this is the blog of Julio Biason.

+

I'm a software developer/engineer/architect for about 30 years -- which +doesn't mean I know everything about software +development/engineering/architecture, but I do try.

+

You can contact me over julio "dot" biason "at" pm "dot" me, just convert +the things in quotes to their symbol and remove the spaces -- and all that +just because I want to make the life of spammers harder, and sorry about +making your life harder, but still...

+

You can see my random thoughts on Functional +Cafe.

+

I do have a Twitter account, but I'm not updating it as often as I do on +Functional Cafe.

+

I do not have a Facebook account -- not anymore.

+ +
+ + + + +
+ + + + diff --git a/public/announcements/index.html b/public/announcements/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/announcements/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/announcements/juliobiasonnet-40/index.html b/public/announcements/juliobiasonnet-40/index.html new file mode 100644 index 0000000..19ff3fd --- /dev/null +++ b/public/announcements/juliobiasonnet-40/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Announcing JulioBiason.Net 4.0

+ +

Short version: New new blog engine and layout.

+ +

Long version: Just to change things a bit, I moved my blog from +Pelican to Zola, for +absolutely no good reason. Actually, there is one good reason: Zola is a single +binary that I can carry around with my blog content, so I don't need to worry +about Python and VirtualEnv and download packages (although those things are a +breeze with Python).

+

But, for the sake of contantly changing and breaking stuff.... new engine!

+ +
+ + + + +
+ + + + diff --git a/public/books/index.html b/public/books/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/books/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/books/things-i-learnt/add-then-remove/index.html b/public/books/things-i-learnt/add-then-remove/index.html new file mode 100644 index 0000000..2011eb3 --- /dev/null +++ b/public/books/things-i-learnt/add-then-remove/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - One Version To Add, One Version To Remove

+ +

A lot of things change during development. One day you need a field, another +day that field may be completely different. For those cases, use one version +to add the new field and another to remove.

+ +

You have a database with a lot of customers and their ID is numerical. But for +some reason, they now need to be strings. Instead of changing the field type +and doing a whole migration, make a deploy with a new field, in which you'll +keep the old and the new format going on and, in the next release, remove +the old field. No downtime. You can even run the migration while the system is +up, since the new field won't be used.

+

(I'm simplifying the problem a lot here, 'cause the customer would have +references all around your system, but you get the point, right?)

+

I had a problem in which we store the link for an object directly in the +backend (we shouldn't, that's a frontend problem, but that's a discussion for +another time); our interface is changing and so should the link. If we did a +change in the link directly, that would mean the backend would have to be +deployed at the same time as the new interface; by adding the new link +format in another field, we can deploy the backend easily without breaking the +current system.

+
+ +
+ << Be Transparent With The User +
+ + +   + + +
+ Learn To Monitor >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/always-vcs/index.html b/public/books/things-i-learnt/always-vcs/index.html new file mode 100644 index 0000000..d5b8deb --- /dev/null +++ b/public/books/things-i-learnt/always-vcs/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Always Use A Version Control System

+ +

"This is my stupid application that I just want to learn something" is not +even a good excuse to not use a version control system.

+ +

A very long time ago, using a source control system (or Version Control +System) required installing a server, configuring it properly, installing the +client and then you could keep track of the changes you were doing on your +code.

+

Today there are lots of options that can work in a standalone fashion: Just +install the client and you're done (well, mostly done, you still need to +initialize the environment, but that is mostly straightforward these days).

+

And, again, there is no good reason to not start a project, as simple as it +will be, without a version control.

+

The VCS will allow you to explore new changes without breaking the main code. +It will allow you to save a half-way change to make a complete different +change.

+

And, in the long, since you'll end up with working in team and will be +required to use a VCS, you'll be used to using one.

+
+ +
+ << Good Languages Come With Integrated Documentation +
+ + +   + + +
+ One Commit Per Change >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/app-composition-stupid/index.html b/public/books/things-i-learnt/app-composition-stupid/index.html new file mode 100644 index 0000000..bfa6040 --- /dev/null +++ b/public/books/things-i-learnt/app-composition-stupid/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Even for Application Composition, Start Stupid

+ +

Application composition may lead to microservices -- which is good -- but +microservices require some ideas about how applications "talk" between them +over the wire (protocols and such) which you don't need to start with.

+ +

Again, because you just want to simplify your work, you can make the +applications use files directly: Have your first application generate two +files and the second application receive the file names from the command +line. There, simple and stupid, +and works.

+

You can even make the first application, instead of generating a file, just +send its result on the standard output, and have the second application +receive the data from the standard input -- both of which are managed as +files, anyway. Then, with a bit of magic, you can put everything together +without wasting space.

+

Worry about talking over the wire later, when you understand how networks +work.

+
+ +
+ << Not Just Function Composition, But Application Composition +
+ + +   + + +
+ Logs Are For Events, Not User Interface >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/application-composition/index.html b/public/books/things-i-learnt/application-composition/index.html new file mode 100644 index 0000000..805c23e --- /dev/null +++ b/public/books/things-i-learnt/application-composition/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Not Just Function Composition, But Application Composition

+ +

When we were discussing the magical number +seven, I mentioned that it made +more sense to actually call the functions in sequence instead of each calling +the next. That's basically a "function composition", one thing you can also do +with your applications.

+ +

Unix came with the idea of "applications that do one thing and do it well". +And then you could just pick the output of one application and plug it as +input of another (and then plug the output of the second into a third, and so +on).

+

Also, I mentioned that you could use configuration +files to do the same processing over +different source elements (based on a configuration, that is) instead of +writing an application that would process both in a single shot.

+

One problem with that approach is that you may need both results to actually +produce a usable result (for example, how would you build a list of common +followings of two Twitter users if you don't have both lists?).

+

That problem can easily be solved if you write a different application that +just receives both lists and compare them. That would greatly simplify your +general codebase 'cause instead of one massive codebase with lots of moving +pieces, you'd have two small codebases, with less moving pieces. One could +still break the other -- say, if you or someone else changes the result of the +first function -- but you will still get the results of the first without +missing the whole 'cause the second is breaking.

+

PS: I reckon it's really hard to create application composition with graphical +applications (why would you ask your user to have two applications open at +the same time to make something work?) but you can extrapolate this for almost +everything else.

+
+ +
+ << Command Line Options Are Weird, But Helpful +
+ + +   + + +
+ Even for Application Composition, Start Stupid >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/bad-code-defense/index.html b/public/books/things-i-learnt/bad-code-defense/index.html new file mode 100644 index 0000000..3827523 --- /dev/null +++ b/public/books/things-i-learnt/bad-code-defense/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Don't Defend Bad Code

+ +

Bad code exists everywhere. You shouldn't defend it, even if it is your own +code.

+ +

Bad code isn't bad on purpose. It sadly happens. But because it is bad, you +shouldn't defend it.

+

For example, an application does whatever you need. But it crashes from time +to time. Software shouldn't crash and you shouldn't defend it just because it +does whatever you need.

+

Your internal application works on a single browser. That's bad. "But maybe +the other devs thought it wouldn't be worth working on all browsers". No. It +is bad. You shouldn't defend the other devs because they decided to focus on +a single browser due whatever problems they were facing. Sure it wasn't nice +that they had to do this trade-off, but it is still bad software.

+

If we keep defending this kind of software, we will still get bad software.

+
+ +
+ << Own Your Shit +
+ + +   + + +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/blogging/index.html b/public/books/things-i-learnt/blogging/index.html new file mode 100644 index 0000000..d5bc3e9 --- /dev/null +++ b/public/books/things-i-learnt/blogging/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet

+ +

You may feel "I'm not start enough to talk about this" or "This must be so +stupid I shouldn't talk about it". Don't.

+ +

Create a blog. Post about your stupid solutions. They are still smarter than +someone else's solution.

+

Also, come back later and fight your own solutions with better ones.

+

Show your growth.

+

But do yourself a favour and turn off comments. Unfortunately, the internet is +a toxic place and the fears you may have are created by a small portion of it +that doesn't care about people learning.

+

Focus on your work. Focus on whatever you are thinking. Post about your +speculations if something would work. Revisit them later. Answer yourself. All +that will show that you're interested in the field and will count points +towards you.

+

There are several options on where to blog; even Github/Gitlab can be used to +blogging, using their Pages features.

+
+ +
+ << I.T. World Is Really Small +
+ + +   + + +
+ Don't Hide Your Stupid Solution >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/boolean-parameters/index.html b/public/books/things-i-learnt/boolean-parameters/index.html new file mode 100644 index 0000000..15f28d3 --- /dev/null +++ b/public/books/things-i-learnt/boolean-parameters/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Don't Use Booleans As Parameters

+ +

When you're designing a function, you may be tempted to add a flag (a +parameter in a function that it is a boolean). Don't do this.

+ +

Here, let me show you an example: Suppose you have a messaging system and you +have a function that returns all the messages to an user, called +getUserMessages. But there is a case where you need to return a summary of +each message (say, the first paragraph) or the full message. So you add a +flag/Boolean parameter called retrieveFullMessage.

+

Again, don't do that.

+

'Cause anyone reading your code will see getUserMessage(userId, true) and +wonder what the heck that true means.

+

You can either rename the function to getUserMessageSummaries and have +another getUserMessagesFull or something around those lines, but each +function just call the original getUserMessage with true or false -- but the +interface to the outside of your class/module will still be clear.

+

But don't add flags/Boolean parameters to your API.

+
+ +
+ << Future Thinking is Future Trashing +
+ + +   + + +
+ Beware of Interface Changes >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/cargo-cult/index.html b/public/books/things-i-learnt/cargo-cult/index.html new file mode 100644 index 0000000..db8d01b --- /dev/null +++ b/public/books/things-i-learnt/cargo-cult/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Understand And Stay Away From Cargo Cult

+ +

"Cargo cult" is a type of cult +which appeared in the Melanesia, in which the natives would build their copy +of an airplane (no motor, 'cause they didn't have the knowledge to build one +-- or even knew what went inside the airplane) in the hopes they would get the +same results as a real airplane.

+ +

In IT, a "cargo cult" is the expectation that if you use the same tools as +some big players, you'd end up getting the same results.

+

One example: Netflix runs a large fleet of microservices daily; they use +Spring Cloud; if we use Spring Cloud, we can also run a large fleet of +microservices.

+

Although it may sound correct in a first glance, things are not like that. +There is much more to the Netflix fleet than just Spring Cloud.

+

Sometimes, cargo cult can appear in a form of "fanaticism" about celebrities: +Fowler said +such and such pattern works this way and that's exactly what we should do. +Just because Fowler is well know software engineer and architect and do have +some very clever ideas, picking them and running exactly the way he described +may do more harm than good -- basically, 'cause you'd end up applying a +design pattern without worrying about solving your problem in the first place.

+

Another example: "ProductX is sponsored by BigCompany, so it's good". It may +be, but the fact that BigCompany is being ProductX doesn't immediately makes +ProductX good, or even if it fits your solution. And there is much more +behind a product than just its +development.

+
+ +
+ << A Language Is Much More Than A Language +
+ + +   + + +
+ Right Tool For The Job Is Just To Push An Agenda >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/coc/index.html b/public/books/things-i-learnt/coc/index.html new file mode 100644 index 0000000..4a83fcb --- /dev/null +++ b/public/books/things-i-learnt/coc/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Code of Conduct Protect YOU, Not THEM

+ +

When you're beginning with any language/library/framework, check their CoC; +they will protect you from being harassed for not immediately getting what +is going on instead of blocking you from telling them what you think.

+ +

I'm mentioning this 'cause a lot of people complain about CoC, but they +forget that they allow them to join in any project without being called +"freaking noob" or "just go read the docs before annoying us".

+

And don't be afraid to ask moderators if someone that seems be in the +community for longer than you isn't break the CoC. Just because you just got +into the community, it doesn't mean you can't be part of it or that someone +can abuse their position of "veteran" to not respect you.

+

Also, remember that most people that are against CoCs are the ones that want +to be able to call names on everyone.

+
+ +
+ << When It's Time to Stop, It's Time To Stop +
+ + +   + + +
+ Learn To Say No >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/code-formatters/index.html b/public/books/things-i-learnt/code-formatters/index.html new file mode 100644 index 0000000..cc299e4 --- /dev/null +++ b/public/books/things-i-learnt/code-formatters/index.html @@ -0,0 +1,128 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Code Formatting Tools Are Ok, But No Silver Bullet

+ +

One thing a team may decide to fix the continuous flux of code style comments +in a code review is to use a code formatting tool to auto-format the code. +That's ok, but they should never rely on it.

+ +

Now yeah, that kinda solves the problem, but there is one small problem: +we, humans, are not as flexible to read code as computers are; what is +readable by a computer may not be readable by a human. Surely they try to +create some heuristics on what is good for human reading, but that doesn't mean +it gets right.

+

Also, unless you start from scratch to use the auto-formatting tool or do a +change in all files in one single go, you should never assume it will do a +good job.

+

I've seen tools like this implemented in a commit hook, in a way that the tool +would reformat the code just before adding it to the repository. The biggest +problem is that, in that team, we didn't run the auto-formatting tool in the +whole project before hand, and we also added a coverage tool (that checked the +coverage on the changed parts of the file) without every running the coverage +tool on everything. The result is that, suddenly, a lot of commits got refused +because the auto-formatting tool was changing lines that the developer didn't +change (it changed old code) and suddenly the coverage tool noted the missed +tests and decided it was no good.

+

So good, punctual changes were suddenly being blocked 'cause instead of doing +the whole thing in a single shot, people decided it was a good idea to let the +code evolve till everything fixed itself.

+

On top of that, some people who were neither in the mood to actually add the +tests or worried about style found a way to do the commits without running +the hook, so they basically skipped the whole "let's improve our code" and +let fuck all.

+

So, it's ok if you run the auto-formatting tool for yourself, but you need to +have the maturity and responsibility to watch yourself and be willing to fix +and take responsibility for other people's code when the formatter changes +their code.

+
+ +
+ << Code Reviews Are Not For Style +
+ + +   + + +
+ Code Style: Follow It >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/code-reviews-style/index.html b/public/books/things-i-learnt/code-reviews-style/index.html new file mode 100644 index 0000000..e02ced3 --- /dev/null +++ b/public/books/things-i-learnt/code-reviews-style/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Code Reviews Are Not For Style

+ +

When doing code reviews, do not focus on style; focus on design things that +look a bit weird.

+ +

Code reviews are designed to spread knowledge around the team, with focus on +construction and problem description. Does the sequence of code gives you an +understanding on what it is trying to do? Does it contains something you know +it will make things harder to read in the future? Does it miss the point?

+

That's the things you should focus.

+

If the author of the code missed a space here, left a blank line there... +that's of no consequence in a code review. This is not the thing to discuss in +the code review.

+

And people hate people who go through code reviews just to point +missing/extra spaces and lines.

+

On the other hand, if you find something weird in the code which is something +you want the author to recheck, then you're free to comment that "it would +be good" if they fix the style. But that's it.

+
+ +
+ << The Right Tool Is More Obvious Than You Think +
+ + +   + + +
+ The Right Tool Is More Obvious Than You Think >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/code-style/index.html b/public/books/things-i-learnt/code-style/index.html new file mode 100644 index 0000000..831bc3f --- /dev/null +++ b/public/books/things-i-learnt/code-style/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Code Style: Follow It

+ +

If your project have a defined code style, you must follow it. Sometimes it +may not be clear ("this struct/class should be singular or plural"?), but do +your best to follow it.

+ +

If your project doesn't have a style, maybe it's time to pick one. There are +well established styles for almost every language today, so you can start with +that. You can even make your changes, but you need to realize that since it's +been established for a while, a lot of other people are using that style and, +thus, if you keep as is, your code will mesh better with the rest of the +ecosystem.

+

And remember that even your stupid code is part of the ecosystem of the +language and the better you +interact with the ecosystem, the better citizen in the ecosystem you are.

+

TIP: If you don't have a code style yet, and you're using a language +that's derived from C or C++, use K&R +Style; if you're +working with Python, there is only one style: +PEP8.

+
+ +
+ << Code Formatting Tools Are Ok, But No Silver Bullet +
+ + +   + + +
+ ... Unless That Code Style Is The Google Code Style >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/cognitive-cost/index.html b/public/books/things-i-learnt/cognitive-cost/index.html new file mode 100644 index 0000000..693158b --- /dev/null +++ b/public/books/things-i-learnt/cognitive-cost/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Cognitive Cost Is The Readability Killer

+ +

"Cognitive dissonance" +is a fancy way of saying "I need to remember two (or more) different and +contradicting things at the same time to understand this." Keeping those +different things in your head creates a cost and it keeps accumulating the +more indirect the things are ('cause you'll have to keep all those in your +head).

+ +

(Disclaimer: I like to use the expression "cognitive dissonance" to make me +sound smarter. I usually explain what it means, though.)

+

To give you an example of a (very mild) cognitive cost, I'll show you this:

+ +

So, pretty simple, right? One function sums numbers and another returns a +boolean.

+

Now, what would you say if I shown you this, in Python:

+
sum(is_pred(x) for x in my_list)
+
+

Wait, didn't I say that sum() sums numbers? And that is_pred() returns a +boolean. How can I sum booleans? What's the expected result of True + True + +False?

+

Sadly, this works. Because someone, long time ago, didn't think booleans were +worth a thing and used an integer instead. And everyone else since then did +the same stupid mistake.

+

But, for you, you'll now read a line that says "summing a boolean list returns +a number". And that's two different, disparate things that you suddenly have +to keep in mind when reading that line.

+

That's why types are important. Also, +this may sound a bit like the magical number +seven, 'cause you have to keep +two things at your mind at the same thing but, although that's not near seven, +they are not the same, with opposite (for weird meanings of "opposite", in +this case) meanings.

+
+ +
+ << The Magic Number Seven, Plus Or Minus Two +
+ + +   + + +
+ Learn The Basics of Functional Programming >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/command-line-options/index.html b/public/books/things-i-learnt/command-line-options/index.html new file mode 100644 index 0000000..673337e --- /dev/null +++ b/public/books/things-i-learnt/command-line-options/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Command Line Options Are Weird, But Helpful

+ +

In this day and age, when everything has a graphical interface, does it still +makes sense to add command line options to your application? In fact, it does.

+ +

When I mentioned the configuration file, you may have thought about using +adding a default path for it and using the same file over and over.

+

Well, that's not wrong, but what if you want to use a different configuration? +Would you keep moving the original configuration file to another place, moving +your configuration back and keep this back and forth? Keep both versions and +just use a symbolic link with +the configuration filename pointing to the one you want?

+

Why not add a command line option in which the user can select which +configuration file should be loaded?

+

This would make their life and yours easy.

+

Also, be aware that, today, there may be libraries to handle command line in +every language, which will help you build a good command line interface, along +with standardizing it to have the same interface as other applications.

+
+ +
+ << The Config File Is Friend +
+ + +   + + +
+ Not Just Function Composition, But Application Composition >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/config-file/index.html b/public/books/things-i-learnt/config-file/index.html new file mode 100644 index 0000000..5af588b --- /dev/null +++ b/public/books/things-i-learnt/config-file/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - The Config File Is Friend

+ +

Do not ignore the power of configuration files.

+ +

Imagine you wrote a function that you have to pass a value for it to start +processing (say, a twitter user account id). But then you have to do that with +two values and you just call the function again with the other value.

+

It makes more sense to use a config file and just run the application twice +with two different config files 'cause, this way, you have a single, small, +testable application instead of two, or a very complex application that does a +lot of stuff.

+

We can even jump into the idea of creating +libraries and say that, instead of +splitting your e-commerce application into smaller parts and making a big one +by grouping these smaller parts, you could simply have one e-commerce +application and, for each of your clients, you would have a different +configuration file, pointing to different assets. This way, even the assets +may reside in the same repository in the same branch, 'cause all that +identifies which assets should be used are defined in the configuration file.

+

"But which one should I use?" you may ask. Well, "it depends". It may make +sense to have one single application with different configuration files if +most of its can be used all the time. If the intersection of used things is +very small, it may make more sense to split into different libraries and just +"pick and chose" what to use.

+

But besides the replacement of libraries, you can also think things like: "Ok, +I have to remove elements after a while1; but which would be a good time +that they can exist before I can remove them?" Well, if you're not quite sure +(and, sometimes, even when you're sure), you can use a configuration file to +define how long those elements will stay in the system before being expunged. +Maybe you're not even thinking about how long each element will stay in the +system, but how many of those elements you'll keep in the system before +removing the old ones -- which is, again, a good candidate to be moved to a +configuration file.

+

Configuration files allow you to change properties of the system without +recompiling everything. And, if in the future you decide to follow the 12 +Factor app, +you'll find that you're half-way through it.

+
1 +

In other words, they have a time to +live.

+
+
+ +
+ << Nothing More Permanent Than A Temporary Solution +
+ + +   + + +
+ Command Line Options Are Weird, But Helpful >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/crash-it/index.html b/public/books/things-i-learnt/crash-it/index.html new file mode 100644 index 0000000..e14f550 --- /dev/null +++ b/public/books/things-i-learnt/crash-it/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - It's Better To Let The Application Crash Than Do Nothing

+ +

Although that sounds weird, it's better to not add any error handling than +silently capturing errors and doing nothing.

+ +

For example, a (sadly common) example of Java code:

+
try {
+  something_that_can_raise_exception()
+} catch (Exception ex) {
+  System.out.println(ex);
+}
+
+

This does nothing to deal with the exception -- besides printing it, that is.

+

The example may be a bit bad, 'cause Java forces capturing exceptions on +functions that throw exceptions and it forces functions to mark themselves as +throwing exceptions if there a throw in them.

+

But Python doesn't have this restriction and people still try to capture +exceptions for doing absolutely nothing -- and, worse, just keep the execution +going.

+

If the language allows it, you should let the application crash due the lack +of error handling -- as long as you don't have any idea on how to handle it. +Then, when they crash, you can think of a way to deal with it, instead of +silently capturing it and doing nothing.

+

Also, keep in mind to not go forth and capture every exception/error in a +single take -- like the example above, which will capture every exception, or +like except Exception in Python. This last example actually happened to me +when another developer added this "broad except"1 in a network code and, at +some point, the code would get into the capture all the time. We checked every +cable, every connection, every interface, till I noticed there was a syntax +error in the code. In Python, syntax errors raise exceptions and, because we +had a "capture all exceptions", we lost some pretty good time looking for the +problem in the wrong place.

+
1 +

As called by Pylint.

+
+
+ +
+ << Beware of Interface Changes +
+ + +   + + +
+ If You Know How To Handle It, Handle It >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/data-flow/index.html b/public/books/things-i-learnt/data-flow/index.html new file mode 100644 index 0000000..b7ad297 --- /dev/null +++ b/public/books/things-i-learnt/data-flow/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Thinking Data Flow Beats Patterns

+ +

When you're trying to find a solution to your problem, think on the way the +data will flow through your code.

+ +

Instead of focusing on design patterns, a better way is to think the way the +data will flow -- and be transformed -- on your code.

+

For example, the user will input a number. You'll get this number and find the +respective record on the database. This is a transformation -- no, it's not +"I'll get the number and receive a complete different thing based upon it", +you're actually transforming the number into a record, using the database as a +transformation.

+

(Yes, I know, it's not that clear at the first glance, but you have to think +that they are the same data with different representations.)

+

Most of the time I did that, I managed to come with more clear design for my +applications. I didn't even think about how many functions/classes it would be +needed to do these kind of transformations, that was something I came up +after I could see the data flow.

+

In a way, this way of thinking gets things more clear 'cause you have a list +of steps of transformations you need to do, so you can write them one after +another, which prevents a lot of bad code in the future.

+
+ +
+ << Design Patters Are Used to Name Solution, Not Find Them +
+ + +   + + +
+ The Magic Number Seven, Plus Or Minus Two >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/data-types/index.html b/public/books/things-i-learnt/data-types/index.html new file mode 100644 index 0000000..7a24925 --- /dev/null +++ b/public/books/things-i-learnt/data-types/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Types Say What You Data Is

+ +

Memory is just a sequence of bytes; bytes are just numbers from 0 to 255; what +those numbers mean is described on the language type system.

+ +

For example, in C, a char type of value 65 is most probably the letter "A", +which an int of value is 65 is the number 65.

+

Remember this when dealing with your data.

+

And it doesn't matter of your language of choice uses dynamic typing or static +typing. The same still applies.

+

One classic example of misusing types is adding booleans. Booleans are either +true or false, but because most languages follow C, which doesn't have a +boolean type and uses compiler pre-processors to define TRUE as an integer +with the value 1 and FALSE with another integer with the value 0. Newer +languages were build on top of what older developers knew, and so, a bunch of +those languages also assumed using an integer under booleans was a good idea. +And even today, with modern languages, people rely on those old methods.

+

Let me repeat that: You're adding booleans and expecting a number -- only +because in the old times there wasn't boolean types.

+

No, you're counting the number of elements in the list 'cause that would see +the whole list. You're not even filtering the false values over and counting +the resulting list size. You're jumping the underlying type to get a bit of +performance out.

+

Fortunately, some new languages are using booleans as a complete different +type and wouldn't allow this kind of stuff.

+
+ +
+ << If You Know How To Handle It, Handle It +
+ + +   + + +
+ If Your Data Has a Schema, Use a Structure >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/debuggers/index.html b/public/books/things-i-learnt/debuggers/index.html new file mode 100644 index 0000000..0cb011f --- /dev/null +++ b/public/books/things-i-learnt/debuggers/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Debuggers Are Overrated

+ +

I heard a lot of people complaining that code editors are bad 'cause it's hard +to attach a debugger. I'd claim that this vision is wrong.

+ +

But let's take a thing out of the way beforehand: I'm not saying debuggers are +bad you should never use them. Debuggers have their use, but every time I +had to use one, it was because there was something missing.

+

Most recently, using a framework in Java, I had problems with my code. I'd +expect it to crash 'cause I didn't handle +things. What actually happened is that the framework silently hid the error +and restarted the processing. To find out what was happening, I had to attach +a debugger and see what was wrong with the data; otherwise, I'd have no idea +about what's wrong.

+

Was a debugger necessary there? I don't think so. If the framework actually +displayed the error (crashed, put a wall of text on the logs, whatever), I +wouldn't need to use a debugger. But, because something was missing, I did, +in fact, was forced to use a debugger.

+

Besides this, in the long run, you'd end up with problems in locations that +you can't attach a debugger -- for example, your production environment. You +could but you shouldn't do this. On the other hand, if you log +events, then you can see what was going +on, without a debugger.

+

Again, I'm not taking the merits of debuggers, but in the long run, they are +mostly useless and actually point missing surrounding support to actually +understand what's going on.

+
+ +
+ << Shortcuts Are Nice, But Only In The Short Run +
+ + +   + + +
+ Think About The Users >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/disclaimer/index.html b/public/books/things-i-learnt/disclaimer/index.html new file mode 100644 index 0000000..dd373be --- /dev/null +++ b/public/books/things-i-learnt/disclaimer/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Disclaimer

+ +

There is one magical thing you need to know when reading this book: It's all +personal opinion

+ +

A lot of stuff I'm going to discuss throughout this book will come directly +from my personal experience in several projects -- system applications, web +backend, embedded, mobile, stream processing -- in several different languages +-- C, C++, Python, Java, Clojure, Rust. And, because it comes from personal +experience, everything reflects my own personal opinion on several subjects.

+

Obviously, you don't need to agree with every single point. But I hope at +least it will make you rethink a few subjects.

+

Also, sometimes I may mention some examples that people who know me -- either +worked with me, heard me complain about some project, inherit one of my +projects, I inherit one of the their projects -- may recognized and think +I'm attacking the author.

+

I am not.

+

We do mistakes. Sometimes we don't know the topic with are attacking, +sometimes we don't have full specs, sometimes we don't have the time to write +things properly in a crunchtime. And that's why some things don't look as +pretty as they should. Heck, if you think I'm attacking the original author of +some example, look back the stuff I wrote and you'll see things a lot worse.

+

But I need the example. I have this hope that showing people a few mistakes +can make things better. I want to show people how my opinion built over +some subject. And, again, I'm in no way attacking the original author of the +code. I may even call the code "stupid", but I'm not calling the author +stupid.

+

With that in mind...

+
+ +
+ << Intro +
+ + +   + + +
+ Spec First, The Code >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/document-and/index.html b/public/books/things-i-learnt/document-and/index.html new file mode 100644 index 0000000..f825486 --- /dev/null +++ b/public/books/things-i-learnt/document-and/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - If A Function Description Includes An "And", It's Wrong

+ +

Functions should do one thing and one thing only. I clear indication that +you're breaking this principle is the need to add an "and" in its +documentation.

+ +

This is kind like "sometimes rule", but most of the time, when you feel you +need to add an "and" to the function documentation (its +contract), then you're telling +that that function is doing two (or more) things.

+

One of guiding principles of good code is the Single responsibility +principle, in +which each module/class/function should do one thing and one thing only. And, +again, if you're saying that a function is doing "this" and "that", you can +be sure it's not doing just one thing.

+

Ok, but what now? Well, you have two functions, with two distinct contracts. +Ok, but you had those two being called, what happens now? Well, where you +called one, you now will need to call two. If your preferred language have +support for function composition, you can use that to group both functions +again. This is the kind of stuff that you'll get when you learn to use +functional programming.

+
+ +
+ << The Function Documentation Is Its Contract +
+ + +   + + +
+ Good Languages Come With Integrated Documentation >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/document-is-contract/index.html b/public/books/things-i-learnt/document-is-contract/index.html new file mode 100644 index 0000000..6517db6 --- /dev/null +++ b/public/books/things-i-learnt/document-is-contract/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - The Function Documentation Is Its Contract

+ +

When you start the code by writing the general flow as +steps and making each step a +function, you're actually making a contract (probably with your future self): +I'm saying this function does this and this is what it does.

+ +

Remember that the documentation must be a clear explanation of what your code +is doing and why it exists; remember that good messages will make reading +the code only by the function documentation +should be clear.

+

A function called mult, documented as "Get the value and multiply by 2" but, +when you look at the code, it does multiply by 2, but also sends the result +through the network or even just asks a remote service to multiply the +incoming result by 2, is clearly breaking its contract. It's not just +multiplying by 2, it's doing more than just that, or it's asking someone else +to manipulate the value.

+

Now, what happens when this kind of thing happens?

+

The easy solution is to change the documentation. But do you know if people +who called the function expecting it to be "multiply value by 2" will be happy +for it to call an external service? There is a clear breach of "contract" -- +whatever you initially said your function would do -- so the correct solution +would be to add a new function with a proper contract -- and probably a better +name.

+
+ +
+ << Documentation Is a Love Letter To Your Future Self +
+ + +   + + +
+ If A Function Description Includes An And, It's Wrong >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/document-it/index.html b/public/books/things-i-learnt/document-it/index.html new file mode 100644 index 0000000..8a9650a --- /dev/null +++ b/public/books/things-i-learnt/document-it/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Documentation Is a Love Letter To Your Future Self

+ +

We all know writing the damn docs for functions and classes and modules is a +pain in the backside. But realizing what you were thinking when you wrote the +function will save your butt in the future.

+ +

When I say that it will save your butt, I don't mean the documentation will +tell you something like "Here are the lotto numbers in 2027"1 or "If John +complains about your future code review, here is some shit he did in the +past".

+

I mean, it will explain how the flow of your code is expected to do. Imaging +this: pick your code and replace every function call to its documentation. Can +you understand what it is expected by reading that? If you can, +congratulations, you won't have a problem in the future; if you can't... well, +I have some bad news for you...

+

One point that may come here is "Code is its own documentation" or +"self-documenting code". I do understand, and yes, simpler functions may make +the documentation redundant (for example, if you notice that you need a +function that multiplies two numbers -- and only do that -- giving it a +description of "Multiples two numbers" may look redundant), but you have to +ask yourself why you needed such simple function. Why it exists? Where +it sits in the general data flow?

+

Another thing you can document: rarely used functions. One example is Java +Collectors: In Java, you can create a stream of data, which you can apply +transformations and such and, in the end, you may put the resulting collection +of data into another structure -- a list, for example. The thing is, +collecting to a list is pretty common, but collecting into a map, with a +function as key and another value as value, splitting the result into two +different data blocks, is not that common. Because it is uncommon to see such +collector, it is a good idea to add tips on what each option is.

+

That's the things you need to document.

+
1 +

Please, don't make me revise this in 2027... :(

+
+
+ +
+ << Good Languages Come With Tests +
+ + +   + + +
+ The Function Documentation Is Its Contract >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/fixable/index.html b/public/books/things-i-learnt/fixable/index.html new file mode 100644 index 0000000..3ed28b4 --- /dev/null +++ b/public/books/things-i-learnt/fixable/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable

+ +

You may think "But I could go to those people and say 'Why are you being +toxic?' or 'Why are you attacking me?' or even just tell them it's not nice to +say such things. It would help."

+

I don't believe that's the case.

+ +

In the case of toxic people, they just want to see the place burn so they can +be the hero that saves the day. Microaggressors just want to make your feel +down 'cause so they could feel superior to you.

+

And I don't think they can be easily fixable. That's their modus operandi and +they will keep doing it so 'cause that's the only way they can see to +"improve" themselves -- even if there is no real improvement, they are just +letting everything down so they seem better than the others.

+

On the other hand, if you keep paying attention to the way people react to +you, you may notice that you may be +doing this to others. And now the ball is in your park: Do you want to be a +better person or not?

+
+ +
+ << Beware of Microaggressions +
+ + +   + + +
+ Realize When It's Time To Quit >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/functional-programming/index.html b/public/books/things-i-learnt/functional-programming/index.html new file mode 100644 index 0000000..9d0533c --- /dev/null +++ b/public/books/things-i-learnt/functional-programming/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Learn The Basics of Functional Programming

+ +

At this point, you should at least have heard about how cool functional +programming is. There are a lot of concepts here, but at least the very basic +ones you should keep in mind.

+ +

A lot of talks about functional programming come with weird words like +"functors" and "monads". It doesn't hurt to know what they really mean +(disclaimer: I still don't). But some other stuff coming from functional +programming is actually easy to understand and grasp.

+

For example, immutability. This means that all your data can't change once +it's created. Do you have a record with user information and the user changed +their password? No, do not change the password field, create a new user record +with the updated password and discard the old one. Sure, it does a lot of +"create and destroy" sequences which makes absolutely no sense (why would you +allocate memory for a new user, copy everything from the old one to the new +one, update one field, and "deallocate" the memory from the old one? It makes +no sense!) but, in the long run, it would prevent weird results, specially +when you understand and start use threads.

+

(Basically, you're avoiding a shared state -- the memory -- between parts of +your code.)

+

Another useful concept is pure functions. Pure functions are functions that, +called with the same parameters, always return the same result, no matter how +many times you call them. One example of a non pure function is random(): +each time you call random(), you get a different number1. An example of a +pure function would be something like this in Python:

+
def mult(x):
+   return x * 4
+
+

No matter how many times you call mult(2), it will always return 8. Another +example could be our immutable password change above: You could easily write a +function that receives a user record and returns a new user record with the +password changed. You could call with the same record over and over again and +it will always return the same resulting record.

+

Pure functions are useful 'cause they are, first most, easy to test.

+

Second, they are easy to chain, specially in a data +flow design: Because they don't have an +internal state (which is the real reason they are called pure functions), you +can easily call one after the other and no matter how many times you pass +things around, they still produce the same result. And because each function, +given the same input, produce the same result, chaining them all also +produces the same result given the same inputs.

+

Just those two concepts can make code longer (again, you're creating a new +user record instead of simply changing one field), but the final result is a +more robust code.

+
1 +

Except in Haskell, but it does require sending the seed every time, so +you end up with random values based on the seed, so even there it is a pure +function.

+
+
+ +
+ << Cognitive Cost Is The Readability Killer +
+ + +   + + +
+ Shortcuts Are Nice, But Only In The Short Run >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/future-trashing/index.html b/public/books/things-i-learnt/future-trashing/index.html new file mode 100644 index 0000000..1f97ff7 --- /dev/null +++ b/public/books/things-i-learnt/future-trashing/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Future Thinking is Future Trashing

+ +

When developers try to solve a problem, they sometimes try to find a way that +will solve all the problems, including the ones that may appear in the future.

+ +

Trying to solve the problems that will appear in the future comes with a hefty +tax: future problems future will never come -- and, believe me, they will +never come -- and you'll end up either having to maintain a huge behemoth of +code that will never be fully used or you'll end up rewriting the whole thing +'cause there is a shitton of unused stuff.

+

Solve the problem you have right now. Then solve the next one. And the next +one. At one point, you'll realize there is a pattern emerging from those +solutions and then you'll find your "solve everything". This pattern is the +abstraction you're looking for and then you'll be able to solve it in a +simple way.

+

As Steve Jobs once said "You can't connect the dots looking forward, only +backwards".

+
+ +
+ << Be Ready To Throw Your Code Away +
+ + +   + + +
+ Don't Use Booleans As Parameters >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/gerrit/index.html b/public/books/things-i-learnt/gerrit/index.html new file mode 100644 index 0000000..3794607 --- /dev/null +++ b/public/books/things-i-learnt/gerrit/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Gerrit Is A Mistake

+ +

I hate calling software "a mistake", but I can't find any other way to +describe Gerrit. You may see people using Gerrit 'cause Google uses it. The +thing is: Google misunderstood what Git actually is.

+ +

When Linus Torvalds came with Git, he was trying to mimic another system, +BitKeeper. Along with some improvements over CVS and SubVersion, Git made +really easy to create and merge branches, something that was either +almost-not-supported or slow-as-heck, depending on which tool you look at.

+

You need to take this into consideration: Git made branches easy.

+

Then someone came with the idea of Gerrit: Instead of managing branches, it +actually manages commits. Instead of having a branch for each feature, you +should have one single commit as feature. You can have branches on your +machine, but the server only deal with commits.

+

So Gerrit took Git, a tool that improved the way we deal with branches, and +removed branches. This is akin to taking a text editor and taking away the +ability to edit text. Does that sound right to you?

+

In my personal opinion, what they did was to take git apart and put an err in +the middle: gERRit.

+

When I see someone using Gerrit, I know something is wrong there.

+
+ +
+ << One Commit Per Change +
+ + +   + + +
+ Git-Flow Is The Way To Go >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/gherkin/index.html b/public/books/things-i-learnt/gherkin/index.html new file mode 100644 index 0000000..7742f85 --- /dev/null +++ b/public/books/things-i-learnt/gherkin/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Gherkin Is Your Friend to Understand Expectations

+ +

Gherkin is file format for writing behaviour tests (BDD). But it can also give +you some insights on what you should do.

+ +

Alright, let's talk a bit about Gherkin:

+

Gherkin +is a file format created for Cucumber, +which describes scenarios, what's in them, what actions the user/system will +do and what's expected after those actions, in a very high level, allowing +people without programming experience can describe what's expected from the +system.

+

Although Gherkin was born with Cucumber, it is now supported by a bunch of +programming languages, through external libraries.

+

A typical Gherkin file may look something like this:

+ +

Or, in a more concrete example:

+ +

Pretty simple, right?

+

Now, why I'm mentioning this?

+

Sometimes, specs are not the most clear source of information about what it is +expected from the system, and up can't think of steps to do +so. If you're confused about what +you should write, asking the person responsible for the request to write +something like Gherkin may give you some better insights about it.

+

Obviously, it won't be complete. People tend to forget the error situations -- +like filling the name field with numbers, using characters in age fields, +tweets with no text and just attachments -- but at least with a Gherkin +description of the system, you can get a better picture of the whole.

+

Also, you may not like to write specs. That's alright, you can replace them +with Gherkin anyway.

+
+ +
+ << Write Steps as Comments +
+ + +   + + +
+ Design Patters Are Used to Name Solution, Not Find Them >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/git-flow/index.html b/public/books/things-i-learnt/git-flow/index.html new file mode 100644 index 0000000..eeb2714 --- /dev/null +++ b/public/books/things-i-learnt/git-flow/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Git-Flow Is The Way To Go

+ +

If Gerrit is such a mistake, what can you use +instead? Git Flow!

+ +

Git Flow is a plugin for Git for managing branches. It is based on the concept +of "feature branches", in which each branch is a feature or bug you're working +on. Once you finish it, it will just close the branch.

+

Although there is a lot to be said about Git and how you should use it, the +fact is that Git Flow manages a lot of complexity of having a stable branch, +an "unstable"/testing branch and all features around those.

+

Not only that, but with the current source control sites like Github and +GitLab, the flow is quite similar -- although working with branches is changed +with forks.

+

You can even install Git Flow and use it on your personal project -- which is +something I do with this blog/book!

+
+ +
+ << Gerrit Is A Mistake +
+ + +   + + +
+ Organize Your Code by Data/Type, Not Functionality >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/google-code-style/index.html b/public/books/things-i-learnt/google-code-style/index.html new file mode 100644 index 0000000..8f5b68a --- /dev/null +++ b/public/books/things-i-learnt/google-code-style/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style

+ +

Every freaking time Google comes with their own coding style, it's a garbage +fire. The community came with a better style way before and Google seem to +come with a style with high contrasting parts just to call it theirs.

+ +

The only reason to use Google Code Style is in case someone less smart than +you decided it would be a good idea to use it. Then, I feel sorry for you, but +you'll have to follow Google Code Style.

+
+ +
+ << Code Style: Follow It +
+ + +   + + +
+ Hero Projects: You'll Have To Do It Yourself >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/handle-it/index.html b/public/books/things-i-learnt/handle-it/index.html new file mode 100644 index 0000000..4c29e26 --- /dev/null +++ b/public/books/things-i-learnt/handle-it/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - If You Know How To Handle It, Handle It

+ +

If you know an error can occur, then you should handle it properly, instead of +ignoring it.

+ +

This is the opposite point of let it crash: +You're writing some code that you know it can crash in a certain way, what +should you do? Well, the answer is simple: handle it, not ignore it.

+

If we go back to the fact that Java will describe every single exception that +can be thrown by a function, you should handle each exception, no excuses.

+

If you're using Python, then you should capture the exceptions you know how to +handle, no exceptions -- and tying with the previous point, if you don't know +how to handle them, you should not capture them in the first place.

+

But, no matter what language you're using, if you know an error/exception can +occur, deal with it. If you have to save the content of the user somewhere +else, log it to be reprocessed later or even just show an error message, do +it.

+

Although I seriously meant it, it doesn't mean you have to remember every +single exception/error code and what it means when calling a function. You can +write code that will actually go through the happy path and later fill the +blanks. Or even, when you're working on another part of the code, if you +remember another problem, just write on a post-it and add the handling later. +The important bit is not to forget to handle it.

+
+ +
+ << It's Better To Let The Application Crash Than Do Nothing +
+ + +   + + +
+ Types Say What You Data Is >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/hero-projects/index.html b/public/books/things-i-learnt/hero-projects/index.html new file mode 100644 index 0000000..8b21bf3 --- /dev/null +++ b/public/books/things-i-learnt/hero-projects/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style

+ +

An "hero project" is a project/spec change that you personally think will +solve a group of problems in your project. It could be a different +architecture, a new framework or even a new language.

+ +

Hero projects happen mostly when a single developer wants to prove something +without the support of the company or even the time they are in.

+

On those projects, developers will spend their free time to write a +proof-of-concept, just to prove a point.

+

And, sometimes, it just proves that they are were wrong.

+

(Although that last point sounds a bit sad, if you have to do an hero project, +you'll still learn something new and, maybe, even add a new bullet point to +your CV.)

+

Just to be clear: Sometimes an hero project will fail because the answer is +obvious. Don't let that make you +feel down.

+
+ +
+ << ... Unless That Code Style Is The Google Code Style +
+ + +   + + +
+ Global Changes Must Be Discussed With The Whole Team First >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/hero-syndrome/index.html b/public/books/things-i-learnt/hero-syndrome/index.html new file mode 100644 index 0000000..30f02a7 --- /dev/null +++ b/public/books/things-i-learnt/hero-syndrome/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Don't Confuse Hero Project With Hero Syndrome

+ +

Someone that suffers from Hero Syndrome will claim that things won't work +unless they are carefully watching over everything.

+ +

I've seen this at least two times in my professional life. Usually, those +people are actually doing so much micromanaging that they are not other +realize when things are in trouble.

+

I've even seen someone doing a poor job on their job, so things would break +and then start calling people out that he had to fix it 'cause nobody would.

+

Don't do that.

+

I know you can get frustrated when you're the only one realizing things are +breaking apart, but you can add some +monitoring to your project, asking your +manager to show your solution -- you can even mention it on your group/daily +stand up meeting -- and pointing out to people how to realize when your +project broke. Suddenly, people will realize how to monitor theirs too.

+
+ +
+ << Pay Attention On How People React To You +
+ + +   + + +
+ Beware of Toxic People >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/index.html b/public/books/things-i-learnt/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/books/things-i-learnt/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/books/things-i-learnt/integration-tests/index.html b/public/books/things-i-learnt/integration-tests/index.html new file mode 100644 index 0000000..74ca5f1 --- /dev/null +++ b/public/books/things-i-learnt/integration-tests/index.html @@ -0,0 +1,155 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Unit Tests Are Good, Integration Tests Are Gooder

+ +

The view of the whole is greater than the sum of its parts. And that includes +tests for the whole compared to tests of single things.

+ +

First, I just don't want to into a discussion about what's the "unit in a unit +test"1, so let's take the point that a unit test is a test that tests a +class/function, not the whole system from end to end, which would require data +flowing through several classes/functions.

+

There are several libraries/frameworks that actually split this in a way that +you can't test the whole. +Spring+Mockito is one of +those combinations -- and one that I worked with. Due the bean container of +Java, the extensive use of Beans by Spring and the way Mockito interacts with +the container, it's pretty easy to write tests that involve only one class: +You can ask Mockito to mock every dependency injection (so it injects mocked +beans instead of the real ones) in one class and mock every injected class, +simply using annotations.

+

And this is cool and all and makes tests simple and fast. But the fact that we +are making sure each class does what it should do, it doesn't give a proper +view of the whole; you can't see if that collection of perfectly tested +classes actually solve the problem the system is responsible for solving.

+

Once, in C++, I wrote an alarm system +daemon for switches. There +were three different levels of things the alarm system should do, depending on +the incoming message from a service: It could only log the message of the +incoming error, it could log the error and send a SNMP message, or it could +log the error, send a SNMP message and turn a LED in the front panel on. +Because each piece had a well defined functionality, we broke the system in +three different parts: One for the log, one for the SNMP and one for the LED. +All tested, all pretty. But I still had a nagging feeling that something was +missing. That's when I wrote a test that would bring the daemon up, send some +alarms and see the results.

+

And, although each module was well tested, we still got one things we were +doing it wrong. If we never wrote an integration test, we would never catch +those.

+

Not only that, but because we wrote a test that interacted with the daemon, we +could get a better picture of its functionality and the test actually made +sense -- as in, if you read the unit tests, they seemed disconnected from +what the daemon was expected to do, but the integration tests actually read +like "Here, let me show that we actually did what you asked". And yes, this +was akin to Gherkin tests, although I didn't +know Gherkin at the time -- and, better yet, we had tests that proved that we +were following the spec.

+

Personally, I think over time integration tests become more important than +unit tests. The reason is that I personally have the feeling2 that unit +tests check if the classes/functions have adherence to the underlying +design -- Does your view can actually work without the controller? Is the +controller using something from the model or using things that should be in +the view? -- but adherence to the design gets better over time -- developers +start using the layout from previous examples, so they capture the design by +osmosis, while the big picture starts to get more and more complex, with lots +of moving parts.

+
1 +

There is no "unit" in "unit tests". "Unit test" means the test is a +unit, indivisible and dependent only on itself.

+
+
2 +

Again, it's pure feeling from my experience. I have no data to back that +affirmation up, so take it with a grain of salt.

+
+
+ +
+ << Think About The Users +
+ + +   + + +
+ Testing Every Function Creates Dead Code >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/interface-changes/index.html b/public/books/things-i-learnt/interface-changes/index.html new file mode 100644 index 0000000..5c5820f --- /dev/null +++ b/public/books/things-i-learnt/interface-changes/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Beware of Interface Changes

+ +

Interfaces and APIs is what you give away to others. If you keep changing them, +you'll make everyone's life sad.

+ +

When talking about boolean +parameters, I mentioned about +renaming the function. If you control the whole source where the function is +used, that's not issue, it's just a matter of search and replace.

+

But if that function was actually exposed in a library, you shouldn't change +function names in a whim. That will break a lot of other applications beyond +your control and make a lot of other people unhappy.

+

Remember, when you write tests for APIs, +you can see these kind of changes happening and you can see the kind of +changes you're doing on how they reflect externally.

+

You can create the new functions and mark the current one as deprecated, +either by documentation or by some code feature. Then, after a few releases, +you can finally kill the original function.

+

(A dickish move you can do is to create the new functions, mark the current +function as deprecated and add a sleep at the start of the function, in a +way that people using the old function are forced to update.)

+
+ +
+ << Don't Use Booleans As Parameters +
+ + +   + + +
+ It's Better To Let The Application Crash Than Do Nothing >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/intro/index.html b/public/books/things-i-learnt/intro/index.html new file mode 100644 index 0000000..b619091 --- /dev/null +++ b/public/books/things-i-learnt/intro/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Intro

+ +

"Things I Learnt The Hard Way (In 30 Years of Software Development)" started +as a simple sequence of toots (the same as "tweets", on +Mastodon when I was thinking about a +new presentation I could do.

+

But why "a new presentation"?

+ +

I go around my state with a group called +"Tchelinux": We usually go to universities and talk +to people starting uni, explaining things about free/libre software and +sometimes telling people about things they wouldn't normally see in the uni +curriculum.

+

One thing that annoys me is that there are very few presentations about "when +things go wrong". All the presentations show prototypes or tell the good +stuff, and hide all the wrong things that could happen1. Obviously, after +working 30 years in the field of software development, I saw my fair share of +things going wrong -- sometimes in unimaginable piles of crap -- and I thought +"maybe that's something people would like to hear".

+

(And, to be completely honest, some of those piles of crap were my own fault.)

+

And that's when the toot sequence started. Just before I noticed, I spent the +whole day just posting this kind of stuff (fortunately, my pile of things in +the "incoming" folder was a bit empty at the time) and it had 30 points, plus +addenda and a few explanation points. That's when I decided to group all +them in a single post.

+

(Actually, I'm lying: Someone mentioned on Functional Café that I should make +a blog post for making it easier to read.)

+

All I thought when I grouped everything in a post was "this will make things +easier for the people following the thread on Mastodon". But then the post +appeared on Reddit. And Twitter. And HackerNews. And YCombinator. And none of +those where mine.

+

But here is the thing: Each point was limited by the toot size, which is 500 +characters. Sometimes that's not enough to expand the point, explain it +properly and add some examples.

+

And that's how the idea to write this "book" came to life.

+

One thing you must keep in mind here: These are my options. I understand +that not everything is so black and white as put here, and some people's +experiences may not match things here. Also, you get a bit cynical about +technology after 30 years. So... thread carefully, 'cause here be dragons.

+
1 +

Yup, I'm guilty of that too.

+
+
+ + +   + + +
+ Disclaimer >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/languages-are-more/index.html b/public/books/things-i-learnt/languages-are-more/index.html new file mode 100644 index 0000000..c7e26e7 --- /dev/null +++ b/public/books/things-i-learnt/languages-are-more/index.html @@ -0,0 +1,139 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - A Language Is Much More Than A Language

+ +

Picking a programming language is much more than just picking the words that +will generate a code. They come with a community, a leadership, an ecosystem +and a thread the binds them all together.

+ +

Programming languages, in essence, are simply a bunch of keywords that make +things "go". But besides those keywords, they also bring their community, the +way the leaders deal with the community, the tools created by the leaders or +community to deal with the minutiae of creating a system, the way those tools +interact with each other, and a lot more.

+

While a language may have a simple syntax, it may be that the ones controlling +the language actually don't give two shits -- if you pardon my French -- to +the community. They focus on solving their problems, not the community +problems1.

+

Or maybe the community has duplicate tools -- which is not a problem -- but +that developers of each tool don't talk to each other. Or worse: They simply +refuse to look what other tools are doing, which could be used to improve +their own2.

+

And maybe that third language is not as simple as others, but the leadership +is always discussing things with the community, being transparent on their +decision, allowing the community to discuss the future of the language and +even different groups building tools decided to merge efforts to give the +community better tools.

+

That's why you can't "pick" a language by its syntax alone. That's only the +surface of what the whole of a language encapsulates and if you ignore the +other elements in it, you may find yourself with a cute language in a +community that is always fighting and never going forward.

+

And picking a language for something above the syntax is even worse.

+
1 +

Yes, this is common, even in larger communities. And yes, I've seen the +leadership ignoring requests from the community and, sometimes, just +ignoring all the hard work the community did to supply the missing bits +because they didn't like it. +2: Again, I've seen this before: There was a language that didn't come with +a build tool bundled. The community created a tool, which was widely +adopted. Later, a new build tool appeared and, in one of the notes, the +author of the new tool mentioned a feature. The community came and asked +"The previous build tool did something like that, what's the difference +between that and your tool?" And the answer was "I never used the first +tool." So, basically, the community ignored whatever the community was +using.

+
+
+ +
+ << Learn To Monitor +
+ + +   + + +
+ Don't Mess With Things Outside Your Project >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/languages-docs/index.html b/public/books/things-i-learnt/languages-docs/index.html new file mode 100644 index 0000000..2ad23d0 --- /dev/null +++ b/public/books/things-i-learnt/languages-docs/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Good Languages Come With Integrated Documentation

+ +

If you're worried about learning some new programming language, you can bet +the one with a better documentation is the one that is born with a document +processor.

+

Same goes for the frameworks/libraries of that language.

+ +

The answer for that is the same as languages that come with +tests: because the programming language standard library +comes with a documentation generator or even because documentation is bundled +in the language itself, it reduces the friction needed to start writing the +documentation.

+

Python is a curious case that it came with a simple documentation generator +(PyDoc) and a bundled documentation format (DocStrings). Nowadays, almost +nobody is using the default documentation generator anymore, but because the +documentation format is still there and is still supported by the language +(documentation appears as a property of every function, class and module), +other tools took the post of default documentation generator, but the +documentation format is still heavy used.

+

Also, the opposite seems almost always true: If the language doesn't come with +integrated documentation, there is a very good chance that the documentation +or the language or frameworks and libraries will be bad. Or, in the very +least, every library will pick its own format, every framework will pick its +own format and they will never match the language format, and you'll end up +with a mess of a documentation to decipher.

+
+ +
+ << If A Function Description Includes An And, It's Wrong +
+ + +   + + +
+ Always Use A Version Control System >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/languages-tests/index.html b/public/books/things-i-learnt/languages-tests/index.html new file mode 100644 index 0000000..a5dba8b --- /dev/null +++ b/public/books/things-i-learnt/languages-tests/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Good Languages Come With Tests

+ +

You can be sure that if a language brings a testing framework -- even minimal +-- in its standard library, the ecosystem around it will have better tests +than a language that doesn't carry a testing framework, no matter how good the +external testing frameworks for the language are.

+ +

The reason is kinda obvious on this one: When the language itself brings a +testing framework, it reduces the friction for people to start writing tests, +and that includes the authors of the language itself and the community.

+

Sure, better frameworks may come along, and languages that don't have a +testing framework in their standard library may have options with better +support and easier access but, again, when they are there from the start, the +start is better and the final result is better.

+
+ +
+ << Make Tests That You Know How To Run On The Command Line +
+ + +   + + +
+ Documentation Is A Love Letter To Your Future Self >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/learn-about-yourself/index.html b/public/books/things-i-learnt/learn-about-yourself/index.html new file mode 100644 index 0000000..acdad81 --- /dev/null +++ b/public/books/things-i-learnt/learn-about-yourself/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - You'll Learn About Yourself The Hard Way

+ +

We get frustrated with code that doesn't compile. We get angry with customers +asking things back and forth. We get upset when upper management can't make up +its mind. And we lash out on others when that happens.

+ +

Unfortunately, that's the way you'll learn about yourself. You'll learn to +figure out when you get frustrated. You'll learn how you can keep getting +attacked by others -- even micro-aggressions -- but, without realizing, at +some point you'll suddenly burst into an counter-attack that may seem out of +proportion.

+

The worst part of it all? Very few people will tell you what you're doing +before it's too late -- you'll get in trouble way before you could actually +understand what you were doing.

+

But, again, you'll get in trouble.

+

And you must learn about these events. Take the feedback as true, even if +you don't agree with it. I had my falls, and I always took it as something I +need to improve, even if later I said to my psychologist that I thought it was +unfair and biased -- mostly 'cause I'm the quiet guy that always took the +blows and never complained about, and people taking the flak from me were more +vocal and friendlier to the higher-ups. But, again, I took it as true, and did +my best to work on those problems.

+
+ +
+ << You'll Learn About Yourself The Hard Way +
+ + +   + + +
+ Pay Attention On How People React To You >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/libraries/index.html b/public/books/things-i-learnt/libraries/index.html new file mode 100644 index 0000000..8a2f4d6 --- /dev/null +++ b/public/books/things-i-learnt/libraries/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Create Libraries

+ +

One thing you must learn is how to break your project into smaller libraries, +to avoid doing rounds to deal with "the same, but a bit different".

+ +

I've seen a lot of projects that use things like branches for different +things. Say, you have an e-commerce page. But you also have different clients, +and they all have different colours and logo. Some people would take this +scenario and, using the VCS properties, use the main branch for the main code +and a branch for each client, merge from main branch from time to time -- and, +thus, the branches are never merged back.

+

This is suboptimal, 'cause that's not how VCS are supposed to be used.

+

But you can, for example, break the main code into a library/framework and +have one project for each client, with their assets and you just reference the +library/framework in each.

+

Simple and clean.

+

But stop there for a second. Although this makes the code cleaner, avoids +duplication and uses a VCS in the way it was supposed to be used, you can't +start this way.

+

Remember that future thinking is future +trashing. What you can do is actually +break your project by functionality, making modules related to their +data and then, when you get a +reasonable number of clients, you'll notice what can be reused in each, what +modules make sense for one client and not for another. And then you'll have a +good way to deal with those.

+

One project that may appear when creating libraries is "How do I create my own +library repository?" 'Cause all modern languages today have support for +importing external libraries and, even if your libraries will never be out of +your control, they are external to the project. So you may need to learn how +to deal with this before creating the libraries. And, unfortunately, each +language and build tool has its own way to manage this.

+
+ +
+ << Organize Your Code by Data/Type, Not Functionality +
+ + +   + + +
+ Paper Notes Are Actually Helpful >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/log-events/index.html b/public/books/things-i-learnt/log-events/index.html new file mode 100644 index 0000000..70c3b9f --- /dev/null +++ b/public/books/things-i-learnt/log-events/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Logs Are For Events, Not User Interface

+ +

Two things in one: First of all, when using logging, use it to log events, not +for user interfaces; second, log events in a machine readable way, not +necessarily an human readable format.

+ +

For a long time, I used logs to show to the user what was happening. To me, it +was logical to use something where I could mark errors as errors, general +information as information and, if the user requested more information, print +more information on what was going on. So I just added logging, defined normal +messages as info, errors as errors, information that may help me find +errors as debug and use only the logging system for all output of the +application.

+

But that's not what logs are targeted for -- and now I'm having to rethink +most of the stuff I already wrote.

+

Use the standard output to inform the user what's going on, in a human +readable format; use the standard error output to inform the user when things +go wrong; but use the logs to capture something that you'll have to process +later, so you should probably use a format that it is easier to parse, even if +it is not so friendly.

+

As an example, let's say you're connecting to a server. You could use the +standard output to say "Connecting to server", to give the user a feedback +about what's going on; at the same time, you could log "CONNECTION +[SERVER]", with the IP/Name of the server you're connecting. Surely, the +"CONNECTION" word is not that friendly to the user, but if you had to parse +the line, it would be really easy, wouldn't it?

+

Another example: If your application is adding a record to the database, there +is nothing wrong logging "ADDING_RECORD: field=value; field=value; +field=value" 'cause, in case something goes wrong while saving the record, you +could have the values to try to figure out why it failed -- surely, logging +why it failed also helps, but you know what I mean. This is an example of +something that makes complete sense in logs, but not in user interfaces.

+
+ +
+ << Even for Application Composition, Start Stupid +
+ + +   + + +
+ Be Transparent With The User >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/magical-number-seven/index.html b/public/books/things-i-learnt/magical-number-seven/index.html new file mode 100644 index 0000000..0772166 --- /dev/null +++ b/public/books/things-i-learnt/magical-number-seven/index.html @@ -0,0 +1,172 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - The Magical Number Seven, Plus Or Minus Two

+ +

"The magical number" +is a psychology article about the number of things one can keep in their mind +at the same time.

+ +

I've seen twice this weird construction on where a function would do some +processing, but its return value was the return of this processing, plus the +result of a second function and some bit of processing. Nothing major. But the +second function would also do some processing and call a third function. And +the third function would call a fourth. And the fourth a fifth. And the fifth, +a sixth function.

+

And the "processing" was not something small, like "add two" or "multiply by +itself or a configurable value".

+

Something like this

+
func_1
+ +-- func_2
+     +-- func_3
+	     +-- func_4
+		     +-- func_5
+			     +-- func6
+
+

(If you need the real processing I saw, it was a class that had a function +with some processing and then it would call a function in an injected +dependency -- which is pretty nice and dandy. But the injected dependency had +an injected dependency, and the third injected dependency also had an +injected dependency, and so forth).

+

Now, when you're trying to understand this kind of code to find a problem, +you'll have to keep in mind what the first, second, third, fourth, fifth and +sixth functions do, 'cause they are all calling each other (inside them).

+

This causes some serious mental overflow that shouldn't be necessary.

+

Not only that, but imagine that you put a log before and after func_1: The +log before points the data that's being send to func_1, and the log after +its result.

+

So you'd end up with the impression that func_1 does a lot of stuff, when it +actually is passing the transformation along.

+

(I got a weird experience with a function called expand, which logging +before the call would show some raw, compressed data, but the after was not +the expanded data, but actually a list of already processed data from the +compressed data.)

+

What would be a better solution, you may ask?

+

Well, if instead of making func_1 call func_2, you can make it return the +result (which may not be the final result, anyway) and then call func_2 +with that result.

+

Something like:

+
result1 = func_1
+result2 = func_2(result1)
+result3 = func_3(result2)
+result4 = func_4(result3)
+result5 = func_5(result4)
+result6 = func_6(result5)
+result7 = func_7(result6)
+
+

(If we go back to the dependency injection chain, you may think that instead +of making DI7 receive DI6 as dependency [which would receive DI5 as +dependency, which would receive DI4 as dependency, which would receive DI3 as +dependency and so forth] you would actually create all the DI (dependency +injections) in one single pass and then the starting function would call the +dependencies in a single shot, not chaining them.)

+

Now you can see exactly how the data is being transformed -- and, obviously, +the functions would have better names, like expand, break_lines, +name_fields and so on, so you can see that that compressed data I mentioned +before is actually being decompressed, the content is being broke line by +line, the lines are getting names in its fields and so on (and one could even +claim that it would make things clear if there was a function after +break_lines which would just break_fields, which would make name_fields +more obvious -- and in a construction like this it would be almost trivial to +add this additional step).

+

"But that isn't performant!" someone may cry. Well, maybe it's just a bit less +performant than the original chained-calls ('cause it wouldn't create and +destroy frames in the stack, it would just pile them up and then "unstack" them +all in the end), but heck, optimization is for compilers, not people. Your job +is to make the code readable and understandable. If you need performance, +you can think of a better sequence of steps, not some "let's make this a mess +to read" solution.

+

Just a quick note: Although the famous paper mentions that the number is +around 7, new research is actually pointing that the number is way lower than +that, at 4. So simply making func_1 call func_2, which would call +func_3, which would call func_4 may be enough to overload someone and make +them lose the track of what the code does.

+
+ +
+ << The Magic Number Seven, Plus Or Minus Two +
+ + +   + + +
+ Cognitive Cost Is The Readability Killer >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/microaggressions/index.html b/public/books/things-i-learnt/microaggressions/index.html new file mode 100644 index 0000000..f2c0d39 --- /dev/null +++ b/public/books/things-i-learnt/microaggressions/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Beware of Microaggressions

+ +

Microaggressions are defined as "brief, everyday exchanges that send +denigrating messages to certain individuals because of their group +membership". The hardest part is that they don't sound aggressive.

+ +

Although I'm not part of an oppressed group, I've been microattacked more than +once, by the same person.

+

At some point, he mentioned that one couldn't talk bad about someone "around +some people". That "someone" was a politician that got arrested for, +basically, stealing from the country to promote a certain other company. The +way that person said it, thought, made it seem I felt it was wrong to arrest +the politician.

+

Another time, I was casually saying that I shouldn't have come to work on my +motorbike, although three forecast apps said it wouldn't rain. His comment: "I +just looked outside".

+

It may seem innocuous reading those, but if you look closely, all he was +trying to do was do let me down. Oh no, I'm part of a group that thinks +politicians shouldn't be arrested! Oh no, I'm not smart enough to look +outside, while he is1.

+

And those are really hard to fight, 'cause we aren't prepared to "get" those +as real attacks.

+

On top of that, HR people are not really prepared to understand those (it will +always fall into the "it was just a joke"2 excuse and you'll be the +troublemaker3).

+

The worst part? While you don't fully get it as an attack, it will slowly pile +up. At some point, you may even burst into attacking the person back, with all +the concentrated attacks in a single moment. And them you will be seen as +aggressive, not them.

+

Better just stay away and avoid contact if possible.

+
1 +

In the end, when I had to leave work to go back home, it wasn't raining.

+
+
2 +

... which is the pure definition of "Schoddinger's Asshole": Someone +that make a comment and, by the other people reaction, call it a joke as a +"get out of jail" card.

+
+
3 +

And I do wish you have a HR department that understand microaggressions.

+
+
+ +
+ << Beware of Toxic People +
+ + +   + + +
+ Toxic/Aggressive People Are Fixable >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/monitoring/index.html b/public/books/things-i-learnt/monitoring/index.html new file mode 100644 index 0000000..bf44e8e --- /dev/null +++ b/public/books/things-i-learnt/monitoring/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Logs Are For Events, Not User Interface

+ +

On a previous life, to understand how a system behaved, I added a ton of +metrics: how fast things were going in, how fast things were going out, how +many things were in the middle, how many the job processed... Not doing it so +makes me feel... naked.

+ +

Monitoring your project performance give you a really good view of how a +system is behaving. Is the speed going down? Is the system taking longer to +process an input? Are no inputs being processed?

+

If you have this kind of information, you can check what is going on in the +system and understand why. Is it normal? Did a change around the system (the +other system that produces the input, the system that consumes in the output) +affected the results?

+

If you're not measuring, you'll have no idea.

+

Also, "If you can not measure it, you can not improve it", as Lord Kevin said.

+
+ +
+ << One Version To Add, One Version To Remove +
+ + +   + + +
+ A Language Is Much More Than A Language >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/not-done/index.html b/public/books/things-i-learnt/not-done/index.html new file mode 100644 index 0000000..acf64ef --- /dev/null +++ b/public/books/things-i-learnt/not-done/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Don't Tell It's Done When It's Not

+ +

You are tired of running the same thing over and over again. You kinda +remember that something weird may happen, but because you're tired, you tell +everyone that "It's finished". Don't.

+ +

I must admit that I've done this. Yes, there is that corner case that I didn't +test. Yes, there is that piece of code that, although it works, it's weird. +Yes, I left a technical debt behind. But we get tired of looking at the same +thing over and over. And we get pushed by higher ups to deliver stuff. And +that's when we say "It's done", when it's not.

+

Although we just dodged one, we end up leaving our colleagues -- people that +really depend on our work -- down. They expect to connect to whatever we are +doing to keep going. The expect to see the results of their work crystallized +by ours. And they can't. 'Cause we said "It's done" when it wasn't.

+

And you can be sure, as soon as that happens, they will be the first to point, +in minutes, that it is not done.

+

On the other hand, if you say "Almost, but there is this thing that bothers me +and I think it may give us a headache in the future", they will understand. So +be clear and transparent about your work.

+
+ +
+ << Take Responsibility For The Use Of Your Code +
+ + +   + + +
+ People Get Upset About Code And Architecture Quality 'Cause They Care >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/one-change-commit/index.html b/public/books/things-i-learnt/one-change-commit/index.html new file mode 100644 index 0000000..fb41b4b --- /dev/null +++ b/public/books/things-i-learnt/one-change-commit/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - One Commit Per Change

+ +

When working with source control tools, keep one change per commit. Avoid +bundling more than one change in a single commit just to "save time".

+ +

I've seen my fair share of commits with messages like "Fix issues #1, #2 +and #3". This is not something you should do. One commit for fixing issue #1, +another for #2 and yet another for #3.

+

Just note that I said "one commit per change", not "one commit per file". +Sometimes, to make a single change, you may need to change more than one file +-- it may point that you have a coupling problem, but that's a different +issue. You could, for example, make one commit which adds a new field in model +without adding a change in the controller to load this field; after all, the +controller won't (or, at least, shouldn't) break due the added field, and the +model won't break (or, at least, shouldn't) break because the controller is +not touching the field1.

+

When making a commit, think this: "In case something goes wrong, can I undo +this commit without breaking other stuff?" Commit history is stacked, so +obviously you'd have to undo the commits on top of that one. And that's +alright.

+

BONUS TIP! If you're using git, you can use git add -p in case you +"overchange". It will allow you to pick parts of a file, instead of adding all +the changes in the file before committing.

+
1 +

Ok, it may have some issues if the field can't be null, but you get +what I meant, right?

+
+
+ +
+ << Always Use A Version Control System +
+ + +   + + +
+ Gerrit Is A Mistake >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/optimization/index.html b/public/books/things-i-learnt/optimization/index.html new file mode 100644 index 0000000..acfb071 --- /dev/null +++ b/public/books/things-i-learnt/optimization/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Optimization Is For Compilers

+ +

Let say you need more performance on your application. You may be tempted to +look at your code and think "How can I keep this same logic and still remove a +few cycles, so things seem to go faster?" Well, if you want performance, you +need to change your logic.

+ +

But before jumping into the code, you may have to check your compiler options. +Maybe you're not generating the optimized version. Maybe there is an option +that you don't use that you can remove from the compilation.

+

'Cause "optimization" is what a compiler is for. They know where they can +extract most of the underlying architecture, and people have been finding ways +to make the compiled code more performance for decades. Heck, compilers can +even delete parts of your code 'cause they can "see" that a piece of code +will always produce the same result and, thus, isn't necessary and they will +just put the same result where that piece of code was.

+

What you need to do is to think about a better design for your code, not how +to improve the current code. And trying to trick the compiler by messing with +the types, although may produce faster +code, will really screw you in the future -- specially cause maintenance and +code understanding will take long and figuring out what went wrong will always +be harder.

+

Code is written for humans to read. ALWAYS. Optimization is what compilers +do. So find a smarter way to explain what you're trying to do instead of using +shorter words or messing with that your code is saying.

+
+ +
+ << Always Use UTF-8 For Your Strings +
+ + +   + + +
+ Units Makes Things Clear >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/outside-project/index.html b/public/books/things-i-learnt/outside-project/index.html new file mode 100644 index 0000000..afd4004 --- /dev/null +++ b/public/books/things-i-learnt/outside-project/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Don't Mess With Things Outside Your Project

+ +

Simple rule: Is the code yours or from your team? Good, you can make any +changes you want. Does it come from outside? DON'T. TOUCH. IT.

+ +

Sometimes people are tempted to, instead of using the proper extension tools, +change external libraries/frameworks -- for example, making changes directly +into WordPress or Django. Believe me, I've seen my fair share of this kind of +stuff going around.

+

This is an easy way to make the project -- the team project, that is -- +a huge security problem. As soon as a new version is released, you'll -- or, +better yet, someone who was not the person who decided to mess with outside +code -- have to keep up your changes in sync with the main project and, pretty +soon, you'll find that the changes don't apply anymore and you'll leave the +external project in an old version, full of security bugs.

+

Not only you'd end up with something that may very soon put at risk your whole +infrastructure, you won't take any benefits from things in the new versions, +'cause hey, you're stuck in the broken version!

+

Sometimes doing it so is faster and cheaper, and if you would do the same +thing using extensions or actually coding around the problem, even duplicating +the framework functions, would probably take longer and make you write more +code, but in the long run, it's worth the time.

+

Sometimes the change you need is impossible 'cause the framework you're using +doesn't have any support for extensions. This is the time you'll need to build +a new layer on top of the framework. Again, this may seem painful and +changing the framework directly is a lot easier, but you'll have to keep +updating your patch for newer versions, which may not be that easy. Building +on top of the framework will at least give you some assurance 'cause the +exposed API must be way more stable than the internal code.

+
+ +
+ << If Your Data Has a Schema, Use a Structure +
+ + +   + + +
+ Resist The Temptation Of Easy >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/own-your-shit/index.html b/public/books/things-i-learnt/own-your-shit/index.html new file mode 100644 index 0000000..6071e71 --- /dev/null +++ b/public/books/things-i-learnt/own-your-shit/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Own Your Shit

+ +

When I said "Scala is garbage" or "Gerrit is a mistake", it wasn't "l33th4x0r" +who said that; it was Julio Biason. 'Cause I do believe that putting your face +to be slapped is the way we grow.

+ +

I do understand -- and you must have realized reading some of the previous +points when I talk about it -- that privacy is important. For some people, +hiding their real name is important for lots of reasons.

+

But I also personally believe that using some weird name and some face that +isn't yours on your avatar may give you a false sense of "that person is the +guilty one, not me" when it comes to criticism.

+

I mean, yes, I hate Scala with a passion. I do understand why the language +developers decided to come with some options about it, and I still think those +decisions were stupid and you should never sacrifice readability for +ease-to-use.

+

But it wasn't some random person using a weird name full of numbers and an +avatar of some anime saying Scala is garbage. My name is even in this blog +name, in the URL and in every social network I use there is a picture of me.

+

So yeah, Julio said Scala is garbage.

+

There is another thing about using your real name and real face: I'm not just +saying "Scala is garbage", I have to back that up with some facts -- or, in +this case, personal opinions -- about it. It's not simply an attack to Scala, +is a somewhat thought out attack on Scala.

+

And, on top of that, someone will one day come to me and say "Yeah Julio, that +thing you said about Scala: It is that way because of this, this and this". +And I'll probably have to say "You know, you're right: I was wrong." Because I +can't simply move my mistake to some other personality; who was wrong was +me. And unless I own my shit up, I'd never get the understanding I'd need to +see my mistake about Scala in the first place.

+
+ +
+ << You Always Have The Time +
+ + +   + + +
+ Don't Defend Bad Code >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/paper-notes/index.html b/public/books/things-i-learnt/paper-notes/index.html new file mode 100644 index 0000000..2a43550 --- /dev/null +++ b/public/books/things-i-learnt/paper-notes/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Create Libraries

+ +

I've tried to go paperless many, many times. But keeping a notepad and a bunch +of post its in my desk has been one of the most helpful tools I ever got.

+ +

I've even managed to hide all my pens, move notepads to desks and use some +note-taking application instead. In the end, none of those managed to come +close to the utility of having something to scribble notes fast, or to draw a +very high concept of whatever I'm trying to explain.

+

Also, a desk full of post its, or even a monitor with a bunch of things around +gives the impression that you're really busy working -- just be careful to not +have too many post its, or it will look like you can't complete anything. It +even beats Trello!

+
+ +
+ << Create Libraries +
+ + +   + + +
+ Be Ready To Throw Your Code Away >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/patterns-not-solutions/index.html b/public/books/things-i-learnt/patterns-not-solutions/index.html new file mode 100644 index 0000000..baed135 --- /dev/null +++ b/public/books/things-i-learnt/patterns-not-solutions/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Design Patters Are Used to Name Solution, Not Find Them

+ +

Most of the times I saw design patterns being applied, they were applied as a +way to find a solution, so you end up twisting a solution -- and, sometimes, +the problem it self -- to fit the pattern.

+ +

My guess is that the heavy use of "let's apply this design pattern" before +even understanding the problem -- or even trying to solve it -- comes as a +form of cargo cult: "We saw that people +used this pattern and solved their problem, so let's use it too and it will +solve our problem". Or, worse: "Design pattern is described by Famous +Person, so we must use it".

+

Here is the thing: Design pattern should not be used as a way to find +solution to any problems. You may use some of them as base for your solution, +but you must focus on the problem, not the pattern.

+

"Do a visitor pattern will solve this?" is the wrong question. "What should we +do to solve our problem?" is the real question. Once you went there and solved +the problem you may look back and see if it is a visitor pattern -- or whatever +pattern. If it doesn't, that's alright, 'cause you solved the problem. If it +did... well, congratulations, you now know how to name your solution.

+

I've seen this happening a lot: People have a problem; people decided to use a +pattern; the pattern doesn't actually solve the problem (not in the 100% mark, +but above 50%); what happens then is that people start twisting the problem to +fit the pattern or, worse, add new layers to transform the problem into the +pattern.

+
+ +
+ << Gherkin Is Your Friend to Understand Expectations +
+ + +   + + +
+ Thinking Data Flow Beats Patterns >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/people-care/index.html b/public/books/things-i-learnt/people-care/index.html new file mode 100644 index 0000000..b25d0e9 --- /dev/null +++ b/public/books/things-i-learnt/people-care/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - People Get Upset About Code And Architecture Quality 'Cause They Care

+ +

At some point, you'll describe some solution/decision about some piece of +code or some architectural design and people will seem annoyed/pissed about +it. When people care about a product/code, they do that.

+ +

Or maybe you will get annoyed/pissed.

+

I think one of the nicest compliments I ever got was "You're annoying 'cause +you care" when we left a meeting in which we decided to cut corners and do +things halfway to beat some deadline -- or just 'cause people were not in the +mood to do things in a more complete way.

+
+ +
+ << People Get Upset About Code And Architecture Quality 'Cause They Care +
+ + +   + + +
+ You'll Learn About Yourself The Hard Way >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/permanent-solution/index.html b/public/books/things-i-learnt/permanent-solution/index.html new file mode 100644 index 0000000..3372b3a --- /dev/null +++ b/public/books/things-i-learnt/permanent-solution/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Nothing More Permanent Than A Temporary Solution

+ +

Depending on where you look, "Nothing more permanent than a temporary +solution" is either an old Russian proverb or a quote by Milton Friedman. +Thing is, temporary solutions, unless you think about the future to fix them, +will become permanent.

+ +

A temporary solution may appear either as a proof-of-concept or due some +restrained deadline. You may create perfect system +specs, you may have a perfect +understanding of the whole in your Gherkin +files but, at some point, you'll put some +small script to fix a minor problem, or do a "not so good" solution to a point +due to deadlines.

+

This happens and unless you take steps to get rid of those, you'll end up with +a bunch of spaghetti code pretty fast. And that will snowball to a point that +you won't be able to manage the project.

+

Once a scrum master suggested that we came with an idea to our product manager +to do something akin to "Every three sprints, we'll focus on product value; +the fourth one is ours to fix the things that are annoying us". I don't think +we ever talking to the product manager about this, but we managed to open +issues on our ticket system about the small warts we left behind, specially +due deadlines. So there we had, a specially crafted bug type for "technical +debt" which we never actually took the time to fix.

+

Unless you have a pretty good safety net to fix those, they will life forever. +And it may be a better option to tell "we can't deliver in time" than adding +(yet another) temporary solution, as hard as it is to convince the higher ups +that you can't deliver the product with a temporary solution.

+
+ +
+ << If It Doesn't Run On Your Computer, You Have A Problem +
+ + +   + + +
+ The Config File Is Friend >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/post-solution/index.html b/public/books/things-i-learnt/post-solution/index.html new file mode 100644 index 0000000..2f4f393 --- /dev/null +++ b/public/books/things-i-learnt/post-solution/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet

+ +

You may think "This project is so small and so focused on whatever I needed, I +should never post it on Github. What would people think?" Github is not for +that.

+ +

Github is not a repository for "cool, almost perfect" projects. You're free to +show that, at some point, you were a beginner1.

+

You can always come back, review what you did and fix it. It will, as your +blog, show that you're improving.

+

... or maybe you'll let your project there just to rot. I still have some +Python projects that I wrote when I was learning the language that, although +they work, they don't look like Python projects.

+

But who knows? Maybe the code you wrote to solve your small problem can help +someone else to fix their problem, which was not exactly the same, but pretty +close. Or even you could get a code review that would teach you something new +about the language/design you used.

+
1 +

Whoever see the first projects I did in +Rust wouldn't think I have 30 years of +experience in the field. Everybody is a beginner at some point.

+
+
+ +
+ << Blogging About Your Stupid Solution Is Still Better Than Being Quiet +
+ + +   + + +
+ Keep A List of Things I Don't Know >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/project-organization/index.html b/public/books/things-i-learnt/project-organization/index.html new file mode 100644 index 0000000..138b4d7 --- /dev/null +++ b/public/books/things-i-learnt/project-organization/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Organize Your Code by Data/Type, Not Functionality

+ +

A lot of projects assume that you'll put things with the same functionality in +the same place, no matter what data they deal with. This makes things harder +to break apart later.

+ +

Most projects keep organized by the functionality each component do. For +example, all the models are in the same place, all the functions that convert +one model into an internal structure/DTO are kept together, and so on. +Something like this:

+
.
++-- IncomingModels
+|   +-- DataTypeInterface
+|   +-- DataType1
+|   +-- DataType2
+|   +-- DataType3
++-- Filters
+|   +-- FilterInterface
+|   +-- FilterValidDataType2
++-- Processors
+|   +-- ProcessorInterface
+|   +-- ConvertDataType1ToDto1
+|   +-- ConvertDataType2ToDto2
++-- OutgoingModels
+    +-- DtoInterface
+    +-- Dto1
+	+-- Dto2
+
+

This is fine and works. But when you organize by data, it'll make a lot easier +to split your project in smaller projects -- 'cause, at some point, you may +want to do almost the same thing as you're doing right now, but with small +differences.

+
.
++-- Base
+|   +-- IncomingModels
+|   |   +-- DataTypeInterface
+|   +-- Filters
+|   |   +-- FilterInterface
+|   +-- Processors
+|   |   +-- ProcessorInterface
+|   +-- OutgoingModels
+|       +-- DtoInterface
++-- Data1
+|   +-- IncomingModels
+|   |   +-- DataType1
+|   +-- Processors
+|   |   +-- ConvertDataType1ToDto1
+|   +-- OutgoingModels
+|       +-- Dto1
+...
+
+

Now you can make a module that deals only with Data1, another that works +only with Data2 and so on. And then you can break them into isolated modules.

+

And then when you have another project that also have Data1 but also deals +with Data3, you can reuse most of the stuff in the Data1 module.

+

And I do understand that this creates an explosion of directories/packages, +which may seem a bit unnecessary.

+

Believe me, I also thought the idea of keeping things by functionality made +more sense. But in one project, I got a requirement to do almost the same +thing as I was doing before, but with a small change, which would require one +less step/transformation (in our example, you can think as the new requirement +as doing exactly what the Data1, Data2 and Data3 did, with their +transformations and such, but without the Data3 part). By breaking by their +types, I managed to create small modules for each one and the new project +would simply reference Data1 and Data2, but not Data3.

+
+ +
+ << Git-Flow Is The Way To Go +
+ + +   + + +
+ Create Libraries >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/quit/index.html b/public/books/things-i-learnt/quit/index.html new file mode 100644 index 0000000..4573640 --- /dev/null +++ b/public/books/things-i-learnt/quit/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable

+ +

Instead of taking the blows and keep moving, maybe it would be better to your +own health to simply quit.

+ +

Unexpected circumstances caused a delay on your task and your boss lashed at +you.

+

You need to keep avoiding a guy that keeps bad mouthing some minority, +something that you don't agree.

+

Another guy keeps an aggressive posture around women, and you know that's not +something nice to do.

+

Yet a third one keeps complaining that, when he's not around, things don't +work.

+

I've to say it: You're in a toxic environment. Even if the pay is nice and the +project is interesting, it's not worth your health. You'd end up being a +constantly pissed off, annoyed person on your forties (cough).

+
+ +
+ << Toxic/Aggressive People Are Not Fixable -- Unless It's You +
+ + +   + + +
+ I.T. World Is Really Small >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/resist-easy/index.html b/public/books/things-i-learnt/resist-easy/index.html new file mode 100644 index 0000000..0dd6733 --- /dev/null +++ b/public/books/things-i-learnt/resist-easy/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Resist The Temptation Of Easy

+ +

Sure that IDE will help you with a ton of autocomplete stuff and let you +easily build your project, but do you understand what's going on?

+ +

I'm not denying the fact that IDEs make things easier. I'm trying to say that +you should not rely heavily on their features.

+

I mentioned before that you should at least know how to run tests on the +command line and the same +applies to everything in IDEs: how to build, how to run, how to run tests and, +let's be honest here, how to find proper names for your variables and +functions. 'Cause it's nice that the IDE can complete all the names of +the functions, but if the autocomplete feature was off, would you know which +function you need? In other words, have you thought at least 10 seconds about +a good name for your function so you won't need to use autocomplete to +remember its name?

+

These days, IDEs can autocomplete almost everything, from function names to +even how to name your variables. But using the autocomplete is not always a +good solution. Finding better names is.

+
+ +
+ << Don't Mess With Things Outside Your Project +
+ + +   + + +
+ Start Stupid >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/responsible-code/index.html b/public/books/things-i-learnt/responsible-code/index.html new file mode 100644 index 0000000..6315ba5 --- /dev/null +++ b/public/books/things-i-learnt/responsible-code/index.html @@ -0,0 +1,128 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Take Responsibility For The Use Of Your Code

+ +

This is hard. Very very hard. It's the difference between "freedom" and +"responsibility".

+ +

There is nothing wrong in writing, for example, a software to capture people's +faces and detect their ethnicity, but you have to think about what that will +be used on.

+

Even on an open source project, you can take responsibility without blocking +people. You can make your project harder for people trying to abuse to use it, +to the point they will have to take control of their own fork.

+

One example is a small application called Tusky, which +is "An Android client for the microblogging server Mastodon", completely open +source. Mastodon is a network of microblogging servers with connect to each +other, kinda like Twitter, but you can pick a different server that is not +twitter.com and still get updates from that server. One of the servers that +appeared in the server list is an alt-right server which, as most alt-right +forums, promote a lot of hate. What Tusky did? When you try to add an account +on that server, instead of adding the account, they play a video of Never +Gonna Give You Up, basically +rickrolling anyone who, well, is +an alt-righter.

+

Tusky broke the open source license? No, the code is still available. Anyone +wanting to use the server can pick the code, fork it, remove the rickroll and +release their own version of the application. But Tusky developers took an +instead of saying "We'll not take part in promoting hate speech" and one can't +deny that they did.

+

It is a bit hard to do so on the company code -- you would get some reprimands +if you try to shame or block one of the company clients from using the company +application -- but you can say no and, +depending on how offensive you think the use the code is, you can even start +looking for a new place to work. People on larger and "cooler" companies, like +Google, left their jobs because they didn't agree with what the company was +doing, and so can you.

+
+ +
+ << Learn To Say No +
+ + +   + + +
+ Don't Tell It's Done When It's Not >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/right-tool-agenda/index.html b/public/books/things-i-learnt/right-tool-agenda/index.html new file mode 100644 index 0000000..9c4819f --- /dev/null +++ b/public/books/things-i-learnt/right-tool-agenda/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - "Right Tool For The Job" Is Just To Push An Agenda

+ +

A lot of times I heard "We should use the right tool for the job!" Most of +those times it was just a way to push an agenda.

+ +

When someone claims we should use the "right tool", the sentence mean there is +a right tool and a wrong tool to do something -- e.g., using a certain +language/framework instead of the current language/framework.

+

But sadly, none of those times it was really the "right tool". Most of the +time, the person saying we should use the "right tool" was trying to push +their own favourite language/framework, either because they disliked the +current language/framework or because they don't want to push the "hero +project".

+
+ +
+ << Understand And Stay Away From Cargo Cult +
+ + +   + + +
+ The Right Tool Is More Obvious Than You Think >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/right-tool-obvious/index.html b/public/books/things-i-learnt/right-tool-obvious/index.html new file mode 100644 index 0000000..3291c15 --- /dev/null +++ b/public/books/things-i-learnt/right-tool-obvious/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - The Right Tool Is More Obvious Than You Think

+ +

Maybe you're in a project that needs to process some text. Maybe you're +tempted to say "Let's use Perl" 'cause you know that Perl is very strong in +processing text.

+

But that may still be not the right tool.

+ +

Although Perl is an amazing tool to process files, providing every single +switch and option you'll ever need, you're missing something: You're working +on a C shop. Everybody knows C, not Perl.

+

Sure, if it is a small, "on the corner" kind of project, it's fine to be in +Perl; if it is important for the company, it's better that if it is a C +project.

+

One of the reason your hero project may fail is because of this: You may even +prove that what you thought it was a better solution is actually a better +solution, but it can't be applied 'cause nobody else can maintain it.

+
+ +
+ << Right Tool For The Job Is Just To Push An Agenda +
+ + +   + + +
+ Code Reviews Are Not For Style >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/run-locally/index.html b/public/books/things-i-learnt/run-locally/index.html new file mode 100644 index 0000000..eebcf9b --- /dev/null +++ b/public/books/things-i-learnt/run-locally/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - If It Doesn't Run On Your Computer, You Have A Problem

+ +

I've seen a lot of systems that would never run on a isolated computer, like +the developer tool, 'cause the system requires running on a specialized +environment. Those things are wrong.

+ +

Requiring a specialized environment absolutely kills productivity.

+

If your system will run on a specialized environment -- and I'm including "the +cloud" here -- look for something that can abstract whatever you're using. For +example, if you're using AWS SQS, which is a queue, look for a library that +can abstract the way a queue works so you can also run with RabbitMQ, which +can be easily run on your own computer.

+

If you're using a very specialized thing, you may have to write the +abstraction yourself, isolating it from the main system, so you can develop +the main product in peace.

+

One of the most productivity killer environment I worked require running the +project on a customized Apache installation, running the client specialized +framework. The whole problem is that the client refused to allow us to not use +it or install on our local machines (mostly 'cause the install of said +framework was really complex). In other for us to work and see things working, +we had to use a VPN to the client computers, develop things there and manually +forcing things to reload. No only we had absolutely nothing to do when the VPN +was down ('cause it require out company infrastructure working hand-in-hand +with the client infrastructure and the internet provider infrastructure, which +is absolutely impossible), the flow was really cumbersome.

+

If we had the chance to not use it and run all the development and tests on +our own computers, I have the feeling we could deliver the product 2-3 months +earlier.

+
+ +
+ << Units Makes Things Clear +
+ + +   + + +
+ Nothing More Permanent Than A Temporary Solution >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/say-no/index.html b/public/books/things-i-learnt/say-no/index.html new file mode 100644 index 0000000..a59ad5d --- /dev/null +++ b/public/books/things-i-learnt/say-no/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Learn To Say No

+ +

Sometimes, you'll have to say no: No, I can't do it; no, it can't be made in +this time; no, I don't feel capable of doing this; no, I don't feel +comfortable writing this.

+ +

Saying no doesn't mean you won't do it. Once I had to say to our CTO: "Ok, +I'll do it, but I want to note that I don't agree with what we are doing." In +the end, the app was barred exactly because the thing we were doing.

+

Being explicit about what you don't feel is a good point may not be what some +higher ups are expecting. The fact that you don't approve but will do it +anyway may be something that can either show that your not simply a drone or, +unfortunately, label you as a "troublemaker". Honestly, if you feel it threw +you in the former, you should start looking for a new place to work. If you +said you won't be comfortable and still did the work, and they had to label +you something, then this place doesn't respect you as a person.

+
+ +
+ << Code of Conduct Protect YOU, Not THEM +
+ + +   + + +
+ Take Responsibility For The Use Of Your Code >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/small-world/index.html b/public/books/things-i-learnt/small-world/index.html new file mode 100644 index 0000000..ae687aa --- /dev/null +++ b/public/books/things-i-learnt/small-world/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - I.T. World Is Really Small

+ +

We have two expressions here: "The world turns around"; it means whatever you +do, sometime in the future, you'll face the consequences of it. Another +expression is "The world of something is an egg"; because the world turns +around, if the world is an egg, you'll face the consequences sooner than you +think.

+ +

What do I meant with those two expressions?

+

Well, first thing, if you do a bad job, if you don't care about your +co-workers, if you're not a team player, if you keep bad mouthing someone... +You'll find someone that heard about the things you do and may damage your +reputation.

+

So be nice and a team player.

+

Just to be clear: Yes, I did my fair share of not being a team player and bad +mouthing people1 and I'm pretty sure there are companies around that would +never hire me 'cause someone inside heard that I bad mouth someone or didn't +do as a team player in some other place. I try to avoid doing it so as much as +I can but, hey, I'm just human.

+
1 +

I still call actions of previous colleagues around even to this day. If +I'm bad mouthing or just telling what happened is up to whoever is listening +to me.

+
+
+ +
+ << Realize When It's Time To Quit +
+ + +   + + +
+ Blogging About Your Stupid Solution Is Still Better Than Being Quiet >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/spec-first/index.html b/public/books/things-i-learnt/spec-first/index.html new file mode 100644 index 0000000..f9834b9 --- /dev/null +++ b/public/books/things-i-learnt/spec-first/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Spec First, Then Code

+ +

"Without requirements or design, programming is the art of adding bugs to an +empty text file." -- Louis Srygley

+ +

If you don't know what you're trying to solve, you don't know what to code.

+

A lot of times we have this feeling of "let me jump straight to the code". But +without understanding what problem you're trying to solve, you'd end up +writing a bunch of things that doesn't solve anything -- or, at least, +anything that should be solved.

+

So here is the point: Try to get a small spec on whatever you want to solve. +But be aware that even that spec may have to be thrown +out, as the understanding of the problem +tend to grow as long as the project continue.

+

Yes, it's paradoxical: You need a spec to know what to code to avoid coding +the wrong solution, but the spec may be wrong, so you end up solving the +wrong solution anyway. So what's the point? The point is, the spec reflects +the understanding of a problem at a certain point: All you (and your team) +know is there.

+

The times I stood longer looking at my own code wondering what to do next were +when we didn't have the next step defined: It was missing some point of the +solution or we didn't have the communication structures defined or something +of sorts. Usually, when that happened, I stumbled upon Twitter or Mastodon +instead of trying to solve the problem. So when you see yourself doing this +kind of stuff -- "I don't know what to do next, and I'm not sure if I'm done +with the current problem" -- then maybe it's time to stop and talk to other +people in the project to figure that out.

+

Another way to think this: Erik Deitrich have a post about Don’t Learn to +Code — Learn to Automate, +something I can get behind 'cause most of us, when doing stuff, think "I need +to do this, then I pick that thingy and put it there and from there I do this +other work". Basically, we create mental models of specs, step by step, on +what we need to do. And, from there, it may be even simpler, 'cause now all +you need to learn is "First, how I do this; Ok, got it, now I get the result +from this and put there" and so on. You can even have a learning path, if +you're a beginner.

+
+ +
+ << Disclaimer +
+ + +   + + +
+ Write Steps as Comments >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/specialists/index.html b/public/books/things-i-learnt/specialists/index.html new file mode 100644 index 0000000..2e08ad3 --- /dev/null +++ b/public/books/things-i-learnt/specialists/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Companies Look For Specialists But Keep Generalists Longer

+ +

If you know a lot about one single language, it may make it easier to get a +job, but in the long run, language usage dies or loses its charms and you'll +need to find something else. Knowing a bit about a lot of other languages +helps in the long run, not to mention that may help you think of better +solutions.

+ +

Even if you're in a shop that is mainly in one single language, that's no +excuse to not check other languages. But, then again, learning languages that +are just small changes on the current language would not help you either.

+

Alan Perlis, author of the ALGOL language, has one excellent phrase: "A +language that doesn't affect the way you think about programming, is not worth +knowing."

+

I still maintain one single rule for programming languages: The language I use +at work must not be the same language I use outside it1. That simple rule +made sure I was always learning something new.

+

Learning a new language can also help you understand things in some language +you used before: Rust help me understand how generics works in Java; seeing +how to do dependency injection in C++ help me understand how Spring does it in +Java.

+

On top of that, because I was always learning something new, moving between +projects was something that happened a lot. At one point, I was hired to work +with Python, but the contract was taking too long to be signed, and my manager +asked if I could help some other team with their iOS application. Because I +did learn a bit about Objective-C, surely I could help. Later, another project +in C show up and guess who also knew C?

+
1 +

... which led me into some sad times when I was working with Python.

+
+
+ +
+ << Global Changes Must Be Discussed With The Whole Team First +
+ + +   + + +
+ Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/start-stupid/index.html b/public/books/things-i-learnt/start-stupid/index.html new file mode 100644 index 0000000..638e0ad --- /dev/null +++ b/public/books/things-i-learnt/start-stupid/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Start Stupid

+ +

One way to get away from the IDE is to "start stupid": Just get the compiler +and get an editor (ANY editor) with code highlight and do your thing: Code, +build it, run it.

+ +

Notice that say "stupid way", not "simple way".

+

Doing things in the stupid way is not the easiest way to start a project. How +could one beat the easy of clicking a button and having the whole structure of +a project done for you?

+

But starting it in the stupid way, in which you have to think your project +layout, how to build stuff, how to run tests, how to do everything may give +you some insights on how things work, how the pieces mesh together and how to +cogs turn around. Even better: It make give you some insights on what +doesn't work.

+

Honestly, you don't have to do this with all projects. You can still use your +favourite IDE and do things in the easy way. But you can also have that side +project on which you'll do everything in the stupid way, just to understand +what your IDE is doing.

+

And when you grasp that, you'll be able to use any IDE.

+
+ +
+ << Resist The Temptation Of Easy +
+ + +   + + +
+ Always Use Timezones With Your Dates >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/steps-as-comments/index.html b/public/books/things-i-learnt/steps-as-comments/index.html new file mode 100644 index 0000000..4137baf --- /dev/null +++ b/public/books/things-i-learnt/steps-as-comments/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Write Steps as Comments

+ +

Don't know how to solve your problem? Write the steps as comments in your +code.

+ +

There you are, looking at the blank file wondering how you're going to solve +that problem. Here is a tip:

+

Take the spec you (or someone else) wrote. Break each point into a series of +steps to reach the expected behaviour. You can even write on your natural +language, if you don't speak English.

+

Then fill the spaces between the comments with code.

+

For example, if you have a spec of "connect to server X and retrieve +everything there. Save the content in the database. Remember that server X API +allow you can pass an ID (the last ID seen) and you can use it to not retrieve +the same content again." Pretty simple, right?

+

Writing this as comments, pointing the steps you need to make, you may end up +with something like this:

+
// connect to server X
+// retrieve posts
+// send posts to the database
+
+

Ah, you forgot the part about the ID. No problem, you just have to add it in +the proper places -- for example, it doesn't make sense to connect to the +server before you have the last seen ID:

+
// open configuration file
+// get value of the last seen ID; if it doesn't exist, it's empty.
+// connect to server X
+// retrieve posts starting at the last seen ID
+// send posts to the database
+// save the last seen ID in the configuration file
+
+

Now it is "easy"1: You just add the code after each comment.

+

A better option is to change the comments into functions and, instead of +writing the code between the comments, you write the functionality in the +function themselves and keep a clean view of what your application does in the +main code.

+

In A Comment Is An Invitation For +Refactoring, +Gergely Orosz points that comments in the code could be converted to function +calls, including things like grouping common things, or bugfixes. This is, +basically, the same thing, except in different points of development: One when +the code is about to be written and one when the code is already there.

+
1 +

Yes, that was sarcastic.

+
+
+ +
+ << Specs First, Then Code +
+ + +   + + +
+ Gherkin Is Your Friend to Understand Expectations >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/stupid-bugs-list/index.html b/public/books/things-i-learnt/stupid-bugs-list/index.html new file mode 100644 index 0000000..36a4a4c --- /dev/null +++ b/public/books/things-i-learnt/stupid-bugs-list/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve

+ +

If it took you more than one hour for you to figure out what went wrong, it is +a good idea to put it on list, 'cause these things have the tendency to appear +again.

+ +

I must admit that this is one thing that I should be doing, but I keep +forgetting. The worst part: It usually takes me about an hour to figure out +what went wrong, only to realize by the solution that I had the same problem +(with the same solution) before and it took me about one hour to figure out +what went wrong.

+

If I just had a list of stupid bugs that took me about 1 hour or more to +solve, I wouldn't be stuck for another hour figuring out what went wrong.

+
+ +
+ << Companies Look For Specialists But Keep Generalists Longer +
+ + +   + + +
+ When It's Time to Stop, It's Time To Stop >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/team-discussion/index.html b/public/books/things-i-learnt/team-discussion/index.html new file mode 100644 index 0000000..c00722e --- /dev/null +++ b/public/books/things-i-learnt/team-discussion/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Global Changes Must Be Discussed With The Whole Team First

+ +

So you got tired of bad tests and decided it is a good idea to add some fuzz +testing tool. Before you do add it in +the main branch, you have to discuss it with your team.

+ +

It's mind-bogging that some people think something it's so good that they +don't need to discuss with the whole team about it; they simply do. They don't +seem to care that people have their workflows and changing something would +break them. But hey, I've seen it so many times it is not even fun.

+

And let me clear here: You need to discuss it with the whole team, not just +some of it (excluding people on vacations, 'cause you don't want to call them +just to tell them something will change). Worse: Don't discuss only with those +that will agree with you; you may not have seen all the problems those changes +will inflict on the other devs workflows but, by bringing that with those that +may not agree with you, you may gain some more insights on what could go +wrong.

+

Also, focus on what would be the gains and the loses. "We'll get better tests, +but you'll have to take a bit more care on the way you write tests" is a good +explanation, specially if you show the changes people will have to do in +future tests. Also also, notice that I said future tests: if you want to +implement something new, you must be sure it won't require everyone getting +out of their way to make your idea work -- don't make people rewrite tests +'cause they will break; don't make the other devs reformat their code 'cause +you decided, alone, to add a linter to your CI with your own rules; don't make +people worry about unwritten tests 'cause you decided it would be a good idea +to add a code formatting tool and that would make your coverage tool think +they are changing some unrelated piece of code that wasn't untested before.

+

Don't be a jerk thinking you know more than your whole team.

+
+ +
+ << Global Changes Must Be Discussed With The Whole Team First +
+ + +   + + +
+ Companies Look For Specialists But Keep Generalists Longer >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/tests-apis/index.html b/public/books/things-i-learnt/tests-apis/index.html new file mode 100644 index 0000000..23289f8 --- /dev/null +++ b/public/books/things-i-learnt/tests-apis/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Tests Make Better APIs

+ +

Testing things in isolation may give a better view of your APIs.

+ +

After reading the integration tests +chapter, you may end up with the impression that I don't like unit tests1.

+

Actually, I think they provide some good intrinsic values.

+

For example, as mentioned before, they can provide a better look at the +adherence to the design.

+

But, at the same time, they give a better view of your internal -- and even +external -- APIs.

+

For example, you're writing the tests for the view layer -- 'cause, you know, +we write everything in layers; layers on top of layers2 -- and you're noticing +that you have to keep a lot of data (state) around to be able to make the +calls to the controller. Or that you have similar calls, but the parameters +are sometimes switched (say, one function gets a token and a user ID, and +another function gets a user ID and a token -- why?) That's a sign that you +may have to take a better look at the controller API.

+

Not only that, but take, for example, the fact that you're working on a +library -- which will be called by someone else -- and you're writing tests +for the most external layer, the layer that will be exposed by that library. +And, again, you're noticing that you have to keep a lot of context around, +lots of variables, variables coming from different places and similar calls +using parameters in different ways. Your tests will look like a mess, don't +they? That's because the API is a mess.

+

Unit testing your layers makes you the user of that layer API, and then you +can see how much one would suffer -- or, hopefully, enjoy -- using that.

+
1 +

Again, let's ignore for a second that there are no "unit" in "unit +tests"... +2: And layers all the way down, like +turtles.

+
+
+ +
+ << Unit Tests Are Good, Integration Tests Are Gooder +
+ + +   + + +
+ Make Tests That You Know How To Run on the Command line >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/tests-dead-code/index.html b/public/books/things-i-learnt/tests-dead-code/index.html new file mode 100644 index 0000000..c00fee3 --- /dev/null +++ b/public/books/things-i-learnt/tests-dead-code/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Testing Every Function Creates Dead Code

+ +

If you write a test for every single function on your system, and your system +keeps changing, how will you know when a function is not necessary anymore?

+ +

Writing a test for every single function on your system may come from the +"100% Coverage Syndrome", which afflicts some managers, thinking that the only +way to be completely sure your system is "bug free" is to write tests for +every single line of code, till you reach the magical "100% coverage" in all +the tests.

+

I do believe you can reach 100% coverage, as long as you're willing to +delete your code.

+

(Cue the universal grasps here.)

+

But how do you know which pieces of code can be deleted?

+

When I mentioned integration +tests, I mentioned how much more +sense it made to me reading them instead of the "unit" tests, because they +were describing exactly how the system would operate in normal (and some +abnormal) conditions. If you write tests that go through the system, assuming +it is a black box with an input point and an output, and you can get tests for +all the normal cases -- and some "abnormal", like when things go wrong -- then +you know that, if you run those tests and they mark some lines as "not +tested", it's because you don't need them.

+

"But Julio, you're forgetting the error control!" I do agree, specially when +you're talking with project owners or some other expert, that people will +forget to tell you what to do in case of things going wrong -- say, the user +typing their name in the age field -- but you can see those and you know +that you need error control so you can add the error control and describe +the situation where that error control would trigger.

+

If, on the other hand, you write a test for every function, when you do a +short/simple check, you'll find that the function is still being used in the +system by the tests, not actually, "value to the user" code. Sure, you can +use your IDE to go back and forth between code and test and see if it points a +use beyond the test, but it won't do it for yourself.

+

There is one other weird thing about using integration tests for error +controls: Sometimes, you can't reach the control statement. It's true! I did +wrote control checks for every function once but, when running in the +integration tests, there was no way to produce an input at the input layer of +the system that would reach the error control in that function 'cause the +other functions, which would run before the one I was trying to test, would +catch the error before it. If that's a design problem or not -- it probably +was -- it's a different discussion, but the fact is that that function didn't +need error control, something that I wouldn't see if I wrote test specifically +for it, but it was clear in an integration test run.

+
+ +
+ << Unit Tests Are Good, Integration Tests Are Gooder +
+ + +   + + +
+ Tests Make Better APIs >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/tests-in-the-command-line/index.html b/public/books/things-i-learnt/tests-in-the-command-line/index.html new file mode 100644 index 0000000..428534b --- /dev/null +++ b/public/books/things-i-learnt/tests-in-the-command-line/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Make Tests That You Know How To Run on the Command line

+ +

You know that "Play" with a little something on your IDE that runs only the +tests? Do you know what it does?

+ +

A long time ago I read the story about a professor that taught his students to +code. He preferred to teach using an IDE, 'cause then "students have to just +press a button to run the tests".

+

I get the idea, but I hate the execution.

+

When we get into professional field, we start using things like continuous +integration which, +basically, is "run tests every time something changes" (it's a bit more than +that, but that's the basic idea).

+

Now, let me ask you this: Do you think the students of the professor above +would know how to add the command to run the tests in a continuous +integration system?

+

I know I'm being too picky (one could even call me "pricky" about this) but +the fact is that whatever we do today, at some point can be automated: our +tests can be run in an automated form, our deployment can be run in an +automated form, our validation can be run in an automated form and so on. If +you have no idea how those things "happen", you'll need the help of someone +else to actually build this kind of stuff, instead of having the knowledge +(well, half knowledge, the other half is the CI tool) with you all the time.

+
+ +
+ << Tests Make Better APIs +
+ + +   + + +
+ Good Languages Come With Tests >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/things-i-dont-know/index.html b/public/books/things-i-learnt/things-i-dont-know/index.html new file mode 100644 index 0000000..b3bd34f --- /dev/null +++ b/public/books/things-i-learnt/things-i-dont-know/index.html @@ -0,0 +1,93 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Keep A List of Things I Don't Know

+ +

Richard Feymann, famous physicist, kept a notebook with the title "Things I +Don't Know".

+ +

I keep a similar "Task List" for myself. If some technology starts appearing +everywhere or something grabs my attention, but I don't have the time to +research it, I put it on this task list.

+

When I start my research, I keep some notes together, although not on +paper, so I can use as reference in the +future.

+

{{ chapters(prev_chapter_link="/books/things-i-learnt/post-solution", prev_chapter_title="Don't Hide Your Stupid Solution", next_chapter_link="/books/things-i-learnt/time", "next_chapter_title="You Always Have The Time") }}

+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/throw-away/index.html b/public/books/things-i-learnt/throw-away/index.html new file mode 100644 index 0000000..bce5e7d --- /dev/null +++ b/public/books/things-i-learnt/throw-away/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Be Ready To Throw Your Code Away

+ +

A lot of people, when they start with TDD, get annoyed when you say that you +may have to rewrite a lot of stuff, including whatever your already wrote.

+ +

TDD was designed to throw code away: The more you learn about your problem, +the more you understand that, whatever you wrote, won't solve the problem in +the long run. Also, as you slowly solve new problems, you may notice some +pattern in the code emerging (you're doing the same thing over and over, with +only minor changes). That's a good time to go over and rewrite everything to +take advantage of this pattern.

+

You shouldn't worry about this. Your code is not a wall (or any physical +object): if you have to throw it away, you didn't wasted materials. Surely it +means your time writing code was lost, but you got a better understanding +about the problem now, or you may start to think in a more concise way to +solve the problem.

+

Not only that, but as you progress through your project, solving problems and +getting "acquainted" with the problem, you'll also notice that the +spec will also change. This means that +the problem your code solve wasn't exactly the problem you needed to solve; +your code is trying to solve something that isn't exactly the problem.

+

Also, specs changing is really common. One thing that you can be sure is that +it won't change everywhere. Some of the things you solved will stay the +same, some others will be completely removed and some others added. And you +will see that you'll refactor your code a lot, and throw a lot of code away. +And not just code that solves the problem, but also the tests for that code.

+

... unless you focus mostly on integration +tests.

+
+ +
+ << Be Ready To Throw Your Code Away +
+ + +   + + +
+ Future Thinking Is Future Trashing >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/time-to-stop/index.html b/public/books/things-i-learnt/time-to-stop/index.html new file mode 100644 index 0000000..c341e15 --- /dev/null +++ b/public/books/things-i-learnt/time-to-stop/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - When It's Time to Stop, It's Time To Stop

+ +

Learn when you can't code anymore.

+ +

Learn when you can't process things anymore.

+

Don't push beyond that, it will just make things worse in the future.

+

I tried to keep coding once when I had a migraine (not strong, but not mild). +Next day, when I was better, I had to rewrite most of the stuff I did, 'cause +it was all shit.

+

Also, when you're not feeling fine, you won't be able to concentrate and your +productivity will plunge. It's a lot better to be a burden to society at your +own place than a burden to society at work.

+
+ +
+ << Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve +
+ + +   + + +
+ Code of Conduct Protect YOU, Not THEM >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/time/index.html b/public/books/things-i-learnt/time/index.html new file mode 100644 index 0000000..6c6a8cf --- /dev/null +++ b/public/books/things-i-learnt/time/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - You Always Have The Time

+ +

You may think "Alright, I have a list of things I don't know, but I have no +time to learn those things!" You do have time.

+ +

Most of this blog/book was written during my lunch breaks; I can have my lunch +in 30 minutes, and then I still have 20-30 minutes free for myself. In those +lunch breaks, I wrote a very stupid application in Rust to download some stuff +I wanted.

+

I don't fall asleep straight away, it still takes me about 30 minutes to +actually feel sleepy. That's when I pick my tablet and read a book, which most +of the time is technical book, about some technology I'm interested in.

+

Even if when I get home I don't feel like sitting in front of a computer to +code/write something, I always have the time to slowly progress.

+

And that's how I always have the time.

+

Sure, I could take those 30 minutes after lunch just to play games. I could +put myself to sleep watching Netflix. But, then again, I'd never wrote this +bunch of words, would never have an automated downloader and would not learn +about new stuff that people are talking about.

+

Maybe people think "If I don't finish, it's over". Your life doesn't end in +one day. You still have tomorrow to keep going -- to keep going, not to +start.

+
+ +
+ << Keep A List of Things I Don't Know +
+ + +   + + +
+ Own Your Shit >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/toxic-people/index.html b/public/books/things-i-learnt/toxic-people/index.html new file mode 100644 index 0000000..ad1615f --- /dev/null +++ b/public/books/things-i-learnt/toxic-people/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Beware of Toxic People

+ +

You'll find people that, even if they don't small talk you, they will bad +mouth everything else -- even some other people -- openly.

+ +

Toxic people love drama. They love to put people down. They love to point +mistakes made by others -- but never by themselves. Some of them actually do +that to make themselves look better in the eyes of the upper management.

+

Not totally toxic, but I did work with people who would never answer an email +unless the manager was in the discussion. Another person would always claims +his team did everything they could, even putting himself at the disposal of +the manager to solve any issues, and that the problem was not related to their +work -- which we proved three times it was.

+

You need to stay away from those people. They will harm in ways you can figure +out immediately. Their attitude towards other (and maybe even yourself) will +drive you so down you'll waste more time wondering what you did wrong than +doing your job.

+

One thing to take a lot of care: Even if it is not your intention, you may not +realize that you may be seen as toxic 'cause you don't understand yourself +yet and the way people react to +you.

+
+ +
+ << Don't Confuse Hero Project With Hero Syndrome +
+ + +   + + +
+ Beware of Microaggressions >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/transparent/index.html b/public/books/things-i-learnt/transparent/index.html new file mode 100644 index 0000000..4e64790 --- /dev/null +++ b/public/books/things-i-learnt/transparent/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Be Transparent With The User

+ +

Since we are talking about logging, +another thing you must do is to be transparent with the user in your user +interface.

+ +

And by "be transparent", I meant that your website/mobile app needs to point +out to the user that the webserver is down instead of saying to the user to +check their internet connection; your application is getting something from +the webserver, so you can say "Oops, something wrong on our side".

+

Another example: If you need to check a bunch of data before saying "It's +done", add a counter to show the user that the application is doing something. +Joplin, when syncing data with a webdav server, +needs to check a bunch of files; one version would simply sit still with a +spinner on "Syncing" and nothing more; when they added a counter, I could +easily see that there was something going on.

+

Those small details, for as bad as they may make you look, will win points +with the user in the long run.

+
+ +
+ << Logs Are For Events, Not User Interface +
+ + +   + + +
+ One Version To Add, One Version To Remove >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/understand-shortcuts/index.html b/public/books/things-i-learnt/understand-shortcuts/index.html new file mode 100644 index 0000000..7467eac --- /dev/null +++ b/public/books/things-i-learnt/understand-shortcuts/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Shortcuts Are nice, But Only In The Short Run

+ +

A lot of languages/libraries/frameworks add a way to make things shorter, +reducing the number of things you need to type.

+

But, later, that will bite you and you'll have to remove the shortcut and do +the long things.

+ +

Frameworks and libraries -- and even some languages -- come with "helpers" for +most boilerplate things. Instead of typing the same 5 lines of code over and +over, you can use a simple function; instead of writing the function with 5 +parameters, you can skip a bit and use another one with just one. Or you could +just add a simple macro expansion on top of your struct/class and it would +complete all the missing points.

+

Don't get me wrong, they are great.

+

But you must understand what the macro/function is hiding from you. 'Cause +sooner or later, you'll find a case where it doesn't have a perfect fit and +you need to change just a small detail. And then you'll start running in +circles 'cause, well, how the hell the macro/function did that?

+

I've bitten before by Spring and +Serde 'cause I started with the shortcuts without +understanding what they were doing. And then I got a problem which the +shortcut wouldn't solve, requiring me to go deep into the documentation. And +because I skipped a few steps and jumped straight into the shortcut, it took +me awhile to actually get what I needed to do different from the shortcut to +solve my problem: I had no idea what the shortcut did and, thus, I had no idea +what I needed differently from the shortcut to solve my problem.

+
+ +
+ << Learn The Basics of Functional Programming +
+ + +   + + +
+ Debuggers Are Overrated >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/units/index.html b/public/books/things-i-learnt/units/index.html new file mode 100644 index 0000000..7de899a --- /dev/null +++ b/public/books/things-i-learnt/units/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Units Makes Things Clear

+ +

You know what's one of the worst function names ever? sleep().

+

Sleep for how long? It is seconds or milliseconds?

+ +

Now let me ask you this: Would it clearer if the function was called +sleepForMs()? Would you understand that the function would make the +application sleep for a number of milliseconds?

+

What about sleepForSecs()? Do you understand that this will force your +application to sleep for a number of seconds?

+

What if, instead of using the function name, you could use sleep("10s")? Does +it make clear that you want it to sleep for 10 seconds?

+

That's why adding units to the function or parameters make sense. It removes +the ambiguity of what it means and doesn't rely on some specialized IDE/Editor +that display the parameter names.

+
+ +
+ << Optimization Is For Compilers +
+ + +   + + +
+ If It Doesn't Run On Your Computer, You Have A Problem >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/use-structures/index.html b/public/books/things-i-learnt/use-structures/index.html new file mode 100644 index 0000000..80a86fb --- /dev/null +++ b/public/books/things-i-learnt/use-structures/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - If Your Data Has a Schema, Use a Structure

+ +

You may be tempted to use a list (or tuple, if your language allows) to keep +your data if it has, say, only 2 fields. Don't.

+ +

Some languages allow unstructured data to be kept in the format of tuples: +They act like lists, but you can use to store heterogeneous data (which is a +cute way of "it stores fields of different types").

+

This languages also allow you to "destructurize" them, so you can extract +elements from them without directly accessing them by index.

+

For example, in Python, you can have a tuple with:

+
a_tuple = ('A String', 1, 7.5)
+
+

And you can destructure it with

+
some_string, an_integer, a_float = a_tuple
+
+

See? It's simple! You don't need to create a whole structure if you're just +passing a string, an integer and a float around.

+

Except, you do need a structure 'cause your data has a schema.

+

Tuples and destructuring should be used only when you need to pass data from +one function to another -- and barely that. When you have this tuple being +passed around, being destructured and created again -- say, you are adding one +value of the tuple to another value and producing a new tuple in the same +format -- then you have a structured -- and schemaed data.

+

And when you have a structured data, you must use a data class or a struct (or +even +NamedTuples, +if you're using Python).

+

Although it may look way more simpler to keep destructuring and building the +tuple over and over, in the long run you'll end up with a mess: a simple +change -- like adding a new field -- will require checking every destructuring +and every creation of the tuple to make sure if will stay in the same shape +every time.

+

So: You data has a schema? Use a Data Class or Class or Struct. Only if it is +schemaless, then you can use a tuple.

+

I've seen this used at least once. At the very start of the project, it +may seem easier to just store the data as a tuple and destructure it and build +it again when needed. There was even a whole module designed to receiving +tuples, destructure them and rebuild new ones (for example, a function that +would receive two tuples and compute the sum of the "value" field of each, +building a new tuple as a result). But because of this design, to add just a +new field, I had to change 14 files and do 168 changes around -- 'cause there +was a function to add two tuples, but there were points where you need just +one field, and there wasn't a function for it.

+

It would be easier to use if there were functions to extract each field, and +add two tuples, and what else was needed for managing the tuples, but then you +have to ask yourself: Why not use a class for that?

+
+ +
+ << Types Say What Your Data Is +
+ + +   + + +
+ Don't Mess With Things Outside Your Project >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/use-timezones/index.html b/public/books/things-i-learnt/use-timezones/index.html new file mode 100644 index 0000000..51bc7e1 --- /dev/null +++ b/public/books/things-i-learnt/use-timezones/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Always Use Timezones With Your Dates

+ +

No matter if the date you're receiving is in your local timezone and you'll +display it in your timezone, sooner or later, the fact that you ignored there +was a timezone behind that date will hurt you.

+ +

(Note: Most of this post when I say "date" you can think of "date and time", +although the date should also be "timezone aware".)

+

At some point of my professional life, ignoring timezones was easy: You just +pick the date, throw in the database, then read it back and everybody was +happy.

+

But things are not like this anymore. People will access your site from far +away locations, the source of the date may not be in the same timezone of your +system, your system may be running in a completely different timezone of your +dev machine (it's pretty common to run things in our machines in the local +timezone but the production system will run in UTC), the display may be a +complete different timezone than your production and dev machine and so on.

+

So always carry the timezone with the data. Find modules/classes that support +dates with timezones (a.k.a. make things timezone aware), capture the +timezone as soon as possible and carry it around in all operations. +Modules/classes that don't support timezones for dates/times should, as soon +as possible, removed from the system.

+

Any developers a bit more seasoned -- and by "seasoned" I meant "Had to deal +with times before" -- will probably claim "Hey, this is obvious!" And I'd +have to agree. But it's annoying how many times I got bitten by some stupid +bug 'cause we decided that "well, everything is in the same timezone, so it's +all good".

+
+ +
+ << Start Stupid +
+ + +   + + +
+ Always Use UTF-8 For Your Strings >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/use-utf8/index.html b/public/books/things-i-learnt/use-utf8/index.html new file mode 100644 index 0000000..215adca --- /dev/null +++ b/public/books/things-i-learnt/use-utf8/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Always Use UTF-8 For Your Strings

+ +

Long gone are the days where ASCII was +enough for everyone. Long gone are the days where you can deal with strings +with no "weird" or "funny" characters.

+ +

I became a developer in a time when the only encoding we had was ASCII. You +could encode all strings in sequences of bytes, 'cause all characters you +could use where encoded from 1 to 255 (well, from 32 [space] to 93 [close +brackets] and you still have a few latin-accented characters in some higher +positions, although not all accents where there).

+

Today, accepting characters beyond that is not the exception, but the norm. To +cope with all that, we have things like +Unicode and +uTF-8 for encoding that in reasonable +memory space (UTF-16 is also a good option here, but that would depend on your +language).

+

So, as much as you to make your system simple, you will have to keep the +internal representation of your strings in UTF-8/UTF-16. You may not receive +the data as UTF-8/UTF-16, but you'll have to encode it and keep transmitting +it around as UTF-8/UTF-16 till you have to display it, at which point you'll +convert from UTF-8/UTF-16 to whatever your display supports (maybe it even +supports displaying in UTF-8/UTF-16, so you're good already).

+

Today, I believe most languages do support UTF-8, which is great. You +may still have problems with inputs coming from other systems that are not +UTF-8 (old Windows versions, for example), but that's fairly easy to convert +-- the hard part is figuring out the input encoding, though. Also, most +developers tend to ignore this and assume the input is in ASCII, or ignore the +input encoding and get a bunch of weird characters on their printing, +'cause they completely ignored the conversion on the output point. That's why +I'm repeating the mantra of UTF-8: To remind you to always capture your input, +encode it in UTF-8 and then convert in the output.

+

One thing to keep in mind is that UTF-8 is not a "cost free" encoding as +ASCII: While in ASCII to move to the 10th character, you'd just jump 10 bytes +from the start of the string, with UTF-8 you can't, due some characters being +encoded as two or more bytes (you should read the Wikipedia page; the encoding +is pretty simple and makes a lot of sense) and, due this, you can't simply +jump 10 characters 'cause you may end up in second byte that represents a +single character. Walking through the whole string would require traversing +the string character by character, instead of simply jumping straight to the +proper position. But that's a price worth paying, in the long run.

+
+ +
+ << Always Use Timezones With Your Dates +
+ + +   + + +
+ Optimization Is For Compilers >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/users/index.html b/public/books/things-i-learnt/users/index.html new file mode 100644 index 0000000..64ec35e --- /dev/null +++ b/public/books/things-i-learnt/users/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Think About The Users

+ +

Think how the data you're collecting from your users will be used -- this is +more prevalent on these days, where "privacy" is a premium.

+ +

I once had a discussion with a CTO about collecting the user IMEI on our +mobile app. Basically, there was no use case for capturing that information +yet but, as he put at the time, "We may want to know if one user uses two +phones, or if two users use the same phone". I raised the fact that we didn't +need this information and, besides that, it felt like we were invading the +users privacy. He still decided to go ahead. My answer: "I'll do it, but I +want to point that I'm not happy with it."

+

In the end, the store blocked the app... because we were capturing the IMEI.

+

But there are cases and cases. If you really really need to capture user +information, be sure to protect it against unauthorized use, be it by external +forces (someone found a way to attack your data) or internal (some disgruntled +colleague decided to take the data from your users with them).

+

And be sure, there will be a leak at some point, it's just a matter of time. +If you can, the best way to protect your users data is to never capture it. +When a flaw on your system is found or when some colleague leaves the company +in bad terms, there will be no data to expose to the world, anyway. You can't +be more secure than this.

+
+ +
+ << Debuggers Are Overrated +
+ + +   + + +
+ Unit Tests Are Good, Integration Tests Are Gooder >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/things-i-learnt/watch-reactions/index.html b/public/books/things-i-learnt/watch-reactions/index.html new file mode 100644 index 0000000..b3003d5 --- /dev/null +++ b/public/books/things-i-learnt/watch-reactions/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - Pay Attention On How People React To You

+ +

One way you can learn about yourself is to pay attention on how people react +to your actions.

+ +

I have a "angry man resting face", which means that, even when I'm in a null +mood, it looks like I'm angry.

+

I already had one meeting and which I started to ask something and noticed +that the other person move a bit back. That's when I realized that didn't +sound exactly how I meant. I had to add "I'm not saying what you're proposing +is wrong, I'm just confused."

+

Also, I got a manager once come up with "I thought you were the serious +person... till you suddenly started singing in the middle of a meeting"1.

+

You need to keep an eye on this. How is people reacting to your reactions? Are +they opening themselves to you or are they closing?

+
1 +

I have this "serious" problem that, depending on the word someone says, +I recall some lyrics and suddenly start singing it.

+
+
+ +
+ << You'll Learn About Yourself The Hard Way +
+ + +   + + +
+ Don't Confuse Hero Project With Hero Syndrome >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/00-intro/index.html b/public/books/uma-licao-de-vim/00-intro/index.html new file mode 100644 index 0000000..0e54c5e --- /dev/null +++ b/public/books/uma-licao-de-vim/00-intro/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

00. Introdução

+ +

Esta é a parte em que eu explico porque eu escrevi tudo isso e cujo conteúdo +não vai afetar em nada seu conhecimento de VIM ou a sua vida.

+ +

Em 2000 tive meu primeiro contato com programação em Linux e, como era de se +esperar, o primeiro editor sugerido foi o "VIM".

+

Foi WTF à primeira vista (e o clássico "Como é que eu fecho isso?").

+

Ok, não é a mesma versão que eu usei a 8 anos atrás, mas a sensação é a mesma.

+

Depois de usar outros editores por algum tempo (cough FTE cough), finalmente +decidi dar o braço a torcer e passei a usar VIM, continuo usando até hoje. Não +que eu tenha usado somente VIM desde então, utilizei outros editores (TextMate, +Sublime Text 2, Gedit) mas eu sempre sinto falta de alguma coisa nos outros +editores que acabei de acostumando no VIM. E, ainda, VIM ainda é o editor que +eu mais ouço "Cara, como é que tu fez isso?".

+

Não que VIM seja um editor completo e perfeito. Existem coisas novas surgindo a +todo momento que ninguém sequer imaginava quando VIM foi criado; existem coisas +que pelas próprias limitações do editor, o VIM não faz. Para algumas dessas, +existem plugins -- e eu vou falar de alguns interessantes mais pra frente -- e, +infelizmente, para outras, não há nada que possa ser feito, a não ser saber que +estas "faltas" existem e estar preparados para elas.

+

E vejamos quantos "Cara, como é que tu fez isso?" vão aparecer até o final +deste livro.

+
+ + +   + + +
+ Modos >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/00-intro/vim-zero.png b/public/books/uma-licao-de-vim/00-intro/vim-zero.png new file mode 100644 index 0000000..580b5e9 Binary files /dev/null and b/public/books/uma-licao-de-vim/00-intro/vim-zero.png differ diff --git a/public/books/uma-licao-de-vim/01-01-modo-normal/Mind-Blown.jpg b/public/books/uma-licao-de-vim/01-01-modo-normal/Mind-Blown.jpg new file mode 100644 index 0000000..b50eb16 Binary files /dev/null and b/public/books/uma-licao-de-vim/01-01-modo-normal/Mind-Blown.jpg differ diff --git a/public/books/uma-licao-de-vim/01-01-modo-normal/index.html b/public/books/uma-licao-de-vim/01-01-modo-normal/index.html new file mode 100644 index 0000000..fe82f45 --- /dev/null +++ b/public/books/uma-licao-de-vim/01-01-modo-normal/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01.01. Modo Normal

+ +

Esta é a parte em que você ainda vai precisar de um arquivo pronto para ver +as coisas funcionando.

+ +

A apresentação mais clássica do modo normal são todas as demais explicações que +você vai achar por aí que dizem que é preciso usar h, j, k e l para +mover o cursor na tela. Tirando o fato que isso é uma balela sem tamanho e que +o VIM suporta movimentação com as teclas direcionais e que você não precisa +ficar pensando em mnemônicos como "j tem uma perna pra baixo, k tem uma perna +pra cima" e outras absurdices, estes são comandos normais válidos: ao +pressionar k, o cursor irá mover para a linha de cima, j moverá o cursor +para a linha de baixo e assim por diante.

+

Nem todos os comandos são acionados com apenas uma tecla. Alguns iniciam um +comando, mas ficam esperando mais informações para saber o que fazer ou onde +fazer. Assim, temos comandos que são de movimentação e outros de ação.

+

Comandos de Movimentação

+

Comandos de movimentação são comandos que movem o cursor no texto. Como já +vimos, h, j, k e l são comandos de movimentação. Além destes temos1:

+

f[letra]

+

Posiciona o cursor na próxima [letra] na linha. Se [letra] não existir, não +move o cursor. Por exemplo, fa irá mover o cursor para o próximo "a" na +linha.

+

F[letra]

+

O mesmo que f[letra], mas voltando na linha ao invés de ir pra frente.

+

t[letra]

+

Posiciona o cursor uma posição antes de [letra] na linha. Praticamente o mesmo +que f[letra], mas uma posição antes.

+

T[letra]

+

Assim como "F" faz o mesmo que "t", mas voltando na linha.

+

0

+

Move o cursor para a coluna 0.

+

_

+

Move o cursor para a primeira letra que não seja espaço ou tabulação na linha.

+

$

+

Move o cursor para o final da linha.

+

%

+

Move o cursor para o outro elemento do par (por exemplo, % quando cursor +estiver sobre um "(" irá mover o cursor para o ")" correspondente).

+

Até aqui eu acredito que você esteja pensando "nada que mude minha vida". Bom, +então aqui vem a primeira grande dica:

+
+

Se você digitar um número antes de fazer um comando, VIM irá repetir o +comando quantas vezes o número indicar.

+
+

+

Ok, talvez não tenha sido a revelação do século, mas isso quer dizer que se +você digitar 3f., VIM irá mover o cursor para o terceiro ponto na linha atual. +E isso também pode não parecer importante, mas daqui pra frente isso vai fazer +sentido.

+
+

Todas as imagens são copyright (C) seus respectivos donos.

+ +
+

1 De forma alguma, esta é uma lista completa de todos os comandos de +movimentação existentes, apenas os mais interessantes.

+
+ +
+ << Modos +
+ + +   + + +
+ Entendendo o Cursor >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/areyoufuckingkiddingme.jpg b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/areyoufuckingkiddingme.jpg new file mode 100644 index 0000000..23d7ebd Binary files /dev/null and b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/areyoufuckingkiddingme.jpg differ diff --git a/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/index.html b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/index.html new file mode 100644 index 0000000..ba772dd --- /dev/null +++ b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01.02. Entendendo o Cursor

+ +

Esta é a parte em que você vai lembrar quando o texto não parar exatamente +onde você pensava que ele iria parar.

+ +

Antes de passar para comandos do modo normal que realmente alteram o texto, é +preciso entender como o VIM entende o cursor, porque o funcionamento pode +parecer um pouco diferente dos demais editores.

+

Para todos os efeitos, considere que o cursor está sempre na parte inferior +esquerda do bloco do cursor.

+

+

Mais uma foto de você, nesse exato momento.

+

Porque é importante ter isso em mente?

+

Porque a maior parte dos editores trata as coisas um pouco diferentes: Por +exemplo, se houver uma linha inteira no clipboard, o VIM irá inserir (com o +comando padrão de colar, que vamos ver mais adiante) a nova linha abaixo na +linha atual -- a maior parte dos outros editores cola a nova linha no lugar da +linha atual e move a antiga linha uma posição abaixo.

+

Apenas tenha isso em mente agora que vamos começar a mudar de modo e alguns +comandos consideram a posição do cursor desta forma e tem uma "contraparte" +para ações antes do cursor -- e por isso o próximo capítulo parece ter comandos +repetidos.

+
+

Todas as imagens são copyright (C) seus respectivos donos.

+ +
+
+ +
+ << Modo Normal +
+ + +   + + +
+ Modo de Inserção >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/vim-cursor.png b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/vim-cursor.png new file mode 100644 index 0000000..f34e21b Binary files /dev/null and b/public/books/uma-licao-de-vim/01-02-entendendo-o-cursor/vim-cursor.png differ diff --git a/public/books/uma-licao-de-vim/01-03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg new file mode 100644 index 0000000..bb0bd04 Binary files /dev/null and b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg differ diff --git a/public/books/uma-licao-de-vim/01-03-modo-de-insercao/iStock_000014784346Small.jpg b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/iStock_000014784346Small.jpg new file mode 100644 index 0000000..8f0b7c9 Binary files /dev/null and b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/iStock_000014784346Small.jpg differ diff --git a/public/books/uma-licao-de-vim/01-03-modo-de-insercao/index.html b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/index.html new file mode 100644 index 0000000..21d50ef --- /dev/null +++ b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/index.html @@ -0,0 +1,173 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01.03. Mudando de Modos – Modo de Inserção

+ +

Esta é a parte em que você vai finalmente começar a editar o texto.

+ +

Agora que você sabe que existe mais de um modo de edição e como o cursor +funciona, podemos finalmente começar a ver como se passa de um modo para o +outro -- e, no processo, entender como editar um texto no VIM.

+

Primeiro, é preciso saber que o Modo Normal é o ponto central para todos os +outros modos -- o jeito mais fácil de passar de um modo para o outro é através +do Modo Normal. E, de qualquer modo1, para ir para o modo normal basta +pressionar Esc.

+

Lembre-se: Esc irá sempre voltar para o modo normal para que você possa passar +para os demais modos. Esc em modo normal irá continuar em modo normal2.

+

Para passar do modo normal para o modo de inserção, você deve usar o seguinte:

+

i

+

Vai para o modo de inserção na posição do cursor (lembre-se do capítulo +anterior: o cursor está no canto inferior esquerdo do cursor, logo qualquer +coisa que você digitar vai aparecer antes da letra onde o cursor se encontrava +antes de pressionar i).

+

I

+

Move o cursor para o primeiro caracter que não seja espaço ou tabulação na +linha e entra em modo de inserção (semelhante à _i).

+

a

+

Move o cursor uma posição pra frente e entra em modo de inserção (ou o mesmo +que li).

+

A

+

Move o cursor para o fim da linha e entra em modo de inserção (Seria quase um +$i, só que $ pára no último não branco da linha -- se considerarmos o caracter +de quebra de linha um caracter "branco" -- e i ficará antes desse não-branco).

+

o

+

Insere uma linha em branco depois do cursor e entra em modo de inserção.

+

O

+

Insere uma linha em branco acima do cursor e entra em modo de inserção.

+

R

+

Entra em modo de inserção, mas substitui as letras atuais ao invés de adicionar +mais. Sim, é um modo de substituição ("replace"), mas ainda é considerado um +modo de inserção.

+

Ok, pequena pausa para acertar os ponteiros agora: Uma coisa que eu comentei +anteriormente foi que, no modo normal é possível definir o número de vezes que +um comando será repetido. Por mais estranho que isso possa parecer, todos os +comandos acima também aceitam um número de repetições. Por exemplo, 20A-[Esc] +irá repetir o comando A- 20 vezes, efetivamente colocando 20 "-" na linha +atual; 20Oolá[Esc] irá adicionar 20 linhas de olá no seu texto, a partir da +posição do cursor.

+

Sua vida acabou de mudar.

+

Quem estava prestando atenção deve ter notado que eu pulei r como opção de +modo de inserção e todos os demais comandos tem uma versão em minúsculas e +maiúsculas. O motivo é que r tem um funcionamento, digamos, peculiar.

+

r, por si só, espera por uma tecla para substituir o caracter sob o cursor. +Seria o equivalente a fazer R, pressionar uma tecla e, na sequência, +pressionar [Esc] para sair do modo de inserção. O estranho, no entando, é +quando é definido um número de vezes que r deve ser executado: Neste caso, o +caracter sob o cursor é alterado para o caracter indicado, o cursor é movido +para o próximo caracter e o processo se repete até o número de vezes indicado +(ou seja alcançado o final da linha). 20r-[Esc] irá, efetivametne, substituir +os 20 próximos caracteres por "-" -- que não seria o mesmo que digitar, +manualmente, r- 20 vezes.

+

Existem ainda outros dois comandos para entrar em modo de inserção: c e s. +Existem algumas diferenças configuráveis entre ambos, mas o funcionamento é o +mesmo: Removem os caracteres indicados pela movimentação e passam para o modo +de inserção.

+

Como assim "movimentação"?!?

+

De novo, pausa para acertar os ponteiros: no capítulo #2.2, eu falei sobre +comandos do modo normal que movimentam o cursor. Aqui, c e s não vão entrar em +modo de inserção até que você adicione uma sequência de movimentação. Assim: s$ +irá remover tudo da posição de cursor até o final da linha e entrará em modo de +inserção, s% irá remover tudo da posição do cursor até o próximo elemento que +"fecha" o elemento atual (aspas, parênteses, colchetes, etc) e entrará em modo +de inserção, c2f. irá remover tudo da posição do cursor até o segundo ponto na +linha e entrará em modo de inserção e assim por diante.

+

A ficha finalmetne caiu

+

Embora c e s funcionem de forma semelhante, C e S não: C irá apagar +tudo da posição do cursor até o final da linha enquanto que S irá remover +todo o conteúdo da linha, não importando a posição do cursor. Logicamente, +depois de fazerem isso, ambos entram em modo de inserção. Com um número de +repetições, no entanto, ambos funcionam da mesma forma -- tanto 20S quanto +20C irão remover a linha atual e mais 19 e entrar em modo de edição.

+

E, só pra lembrar: Pressionar [Esc] irá voltar para o modo normal.

+
+

Todas as imagens são copyright (C) seus respectivos donos.

+ +
+

1 ... exceto o modo Ex, mas como eu falei antes, não é um modo muito útil +hoje em dia e, portanto, eu estou ignorando ele daqui pra frente.

+

2 ... O que explica porque vários programadores experientes em VIM tem a +mania de, algumas vezes, ficar pressionando [Esc] rapidamente quando +algo sai errado.

+
+ +
+ << Entendendo o Cursor +
+ + +   + + +
+ Modo Visual >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-03-modo-de-insercao/jaw-drop.jpg b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/jaw-drop.jpg new file mode 100644 index 0000000..c139613 Binary files /dev/null and b/public/books/uma-licao-de-vim/01-03-modo-de-insercao/jaw-drop.jpg differ diff --git a/public/books/uma-licao-de-vim/01-04-modo-visual/index.html b/public/books/uma-licao-de-vim/01-04-modo-visual/index.html new file mode 100644 index 0000000..8c0c338 --- /dev/null +++ b/public/books/uma-licao-de-vim/01-04-modo-visual/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01.04. Mudando de Modos – Modo Visual

+ +

Esta é a parte em que VIM deixa de ser um editor tão alienígena.

+ +

Na nota de rodapé do primeiro capítulo eu comentei que a maior parte dos +comandos do modo visual podem ser feitos no modo de comando. Como já vimos o +modo de comando, fica mais fácil entender o modo visual.

+

Em suma, o modo visual é a versão do VIM para o "Shift+Direcionais" dos demais +editores: Vai selecionando texto, deixando visível o que está sendo +selecionado. A diferença é que não é preciso ficar segurando o Shift o tempo +todo. E todos os demais comandos de movimentação ainda são válidos.

+

Para entrar no modo visual, você usa, em modo normal, v -- e, de novo, você não +precisa pressionar ou ficar segurando nenhuma tecla: o modo ficará ativo até +que você cancele o modo visual (voltando para o modo normal com [Esc]) ou seja +utilizado algum comando de alteração de texto (como s).

+

Uma vez que a região fique selecionada, você pode usar qualquer comando de +alteração de textos para executar somente naquela região. Assim, ao invés de +ficar contando quantos pontos a linha tem para chegar no número certo de saltos +para o commando f, você pode facilmente ativar o modo visual, navegar a bel +prazer, usado qualquer combinação de comandos de movimentação (incluindo +repetir f a vontade) até chegar no ponto que quiser e executar o comando +somente naquela região.

+

Além de v, existem outros dois outros comandos para entrar em modo visual: +[Shift]+v e [Ctrl]+v.

+

[Shift]+v é chamado de "modo visual de linha" porque, bem, são selecionadas +linhas inteiras neste modo, incluíndo o caracter de nova linha de cada uma das +linhas selecionadas. Neste modo, não é possível selecionar apenas parte de uma +linha, somente linhas inteiras -- que é útil quando se quer remover aquela +função inteira1.

+

[Ctrl]+v é chamado de "modo visual de bloco" e faz algo que poucos outros +editores conseguem: seleção de regiões retangulares. A pergunta que você deve +estar se fazendo agora é: e como é que o VIM junta as linhas se eu apagar um +bloco inteiro? Resposta indireta: O modo visual de bloco funciona como se +várias seleções fossem feitas ao mesmo tempo, o que significa que cada linha é +uma seleção diferente e que cada comando de alteração de texto é executado +individualmente em cada linha. Assim, se você iniciar o modo visual de bloco, +selecionar várias linhas mas apenas uma coluna, e executar o comando c,[Esc], o +que vai acontecer é que o VIM irá substituir o caracter na coluna indicada por +vírgula em cada uma das linhas. Ou seja, respondendo a pergunta feita logo no +começo deste parágrafo: o VIM irá juntar as linhas como se você tivesse ido na +primeira linha, executado o comando, retornado a coluna inicial, ido para a +linha seguinte, repetido o comando e passado para a próxima linha.

+

1 Ou copiar para outro arquivo, que nós vamos ver mais pra frente.

+
+ +
+ << Modo de Inserção +
+ + +   + + +
+ Outros Comandos >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-05-modo-de-comando/index.html b/public/books/uma-licao-de-vim/01-05-modo-de-comando/index.html new file mode 100644 index 0000000..9cb543f --- /dev/null +++ b/public/books/uma-licao-de-vim/01-05-modo-de-comando/index.html @@ -0,0 +1,203 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01.05. Mudando de Modos – Modo de Comando

+ +

Essa é a parte onde você vai aprender a fazer as coisas que precisavam de um +menu para serem feitas.

+ +

Existem três "iniciadores" de comandos no modo de... erm... comando:

+ +

Comandos de Edição

+

Assim como os comandos do modo normal, a quantidade de comandos de edição é +grande demais para cobrir de uma vez só. Então vamos dar uma olhada nos mais +utilizados:

+

:q

+

Sai do VIM. Esse deve ser o comando mais infame da história do editor -- pelo +menos, para os não iniciados. E ele ainda aparece na tela inicial do VIM, se +você prestar atenção.

+

:w

+

Salva o arquivo atual em disco. Você pode passar o nome do arquivo a ser salvo +neste ponto. :w, por exemplo, irá salvar o conteúdo com o nome atual; :w outro-nome irá salvar o conteúdo no arquivo "outro-nome".

+

:wall

+

Salva todos os arquivos arquivos. Mais adiante veremos como ter vários arquivos +abertos ao mesmo tempo.

+

:wq

+

Salva o arquivo atual e o fecha.

+

:help

+

Abre o help do VIM no tópico indicado. Por exemplo, :help :w irá apresentar as +opções existentes para o comando :w; :help c irá mostrar as opções do comando c +do modo normal e assim por diante.

+

:set

+

Configura (ou apresenta) alguma configuração do VIM. Mais a frente veremos como +configurar o VIM e veremos as opções este comando.

+

:r

+

(Ou :read) Não é muito comum, mas permite carregar o conteúdo de outro arquivo +para dentro do arquivo atual. sem precisar fazer todo o processo de +copiar-e-colar (que veremos mais adiante). Um fato interessante de :r é que se +o nome do arquivo a ser carregado começar com "!", o VIM irá tentar executar o +comando ao invés de carregar o conteúdo. Por exemplo, :r date irá carregar o +conteúdo do arquivo date para dentro do arquivo atual enquanto que :r !date irá +executar o comando date e "colar" o resultado para dentro do arquivo atual.

+

:noh

+

(Ou :nohighlight) Desliga a marcação sobre elementos de pesquisa. A seguir nós +vamos ver sobre o comando de pesquisa; ao fazer uma, o VIM irá colocar um +"realce" (ou "highlight") sobre as palavras encontradas. Para desligar esses +realces no texto, você pode usar :noh.

+

Aqui eu preciso abrir três parenteses:

+ +

Comando de Pesquisa

+

O comando de pesquisa é, simplesmente, /. Uma vez pressionado, você verá o +cursor indo para a última linha da tela esperando a pesquisa. Uma coisa a ter +em mente é que o VIM utiliza expressões regulares -- então algumas coisas que +você procurar não irão funcionar exatamente como você está esperando. ".", por +exemplo. Eu não vou entrar em detalhes sobre expressões regulares porque há +pilhas de informações sobre elas na internet -- e há praticamente mais sobre +elas do que essa série tem (e terá) sobre VIM.

+

Dois comandos do modo normal que eu não mencionei antes por estarem ligados ao +comando de pesquisa são n e N. n irá mover o cursor para a próxima +ocorrência da pesquisa, enquanto que N move o cursor para a anterior. Note +que eu falei "move o cursor"; isso quer dizer que n e N são comandos de +movimentação e, portanto, podem ser usados com outros comandos do modo normal +que utilizam movimentação. Por exemplo, procurar por "olá" e, em modo normal, +executar cn irá remover tudo da posição do cursor até a próxima ocorrência de +"olá" (e entrará em modo de edição).

+

Comando de Filtro

+

O comando de filtro pega o conteúdo no editor e passa para outro programa. Por +exemplo, se você tiver o aplicativo "rot13", ao executar !rot13, todo o +conteúdo do arquivo será convertido para ROT13. Se você digitar !!rot13, no +entanto, o conteúdo ainda será passado para o filtro e o resultado irá +substituir o conteúdo do buffer atual.

+

Não parece ser interessante, mas um dos aplicativos que normalmente vem com o +VIM é "xxd", que converte o conteúdo para sua representação hexadecimal. Ao +executar "!xxd", você verá todo o conteúdo do seu arquivo com os valores +hexadecimais de cada caracter.

+

1 Não confunda "Não ter permissão de escrita" com "O arquivo pertence ao +root". No primeiro caso, o usuário tem permissão de ler o arquivo e trocar +as permissões enquanto que no segundo o editor teria que ter permissões +especiais de execução para poder trocar as permissões. O VIM só consegue +responder ao :w! se ele próprio -- e, no caso, o próprio usuário -- tiver +permissões suficientes sem requisitar outro aplicativo.

+

2 Na verdade, o VIM vem sim com comandos que inicial com letra maíuscula: São +os comandos de exploração de diretório :Explore, :Rexplore, :Vexplore e o +famigerado :Sexplore, que o pessoal costuma encurtar para :Sex.

+
+ +
+ << Modo Visual +
+ + +   + + +
+ Modo de Comando >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-modos/index.html b/public/books/uma-licao-de-vim/01-modos/index.html new file mode 100644 index 0000000..f7653da --- /dev/null +++ b/public/books/uma-licao-de-vim/01-modos/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

01. Modos

+ +

Esta é a parte onde eu explico porque você não conseguia sair do VIM na +primeira vez que tentou usá-lo.

+ +

Uma das primeiras coisas que é preciso entender sobre VIM é que ele é um editor +modal. Enquanto outros editores abrem os arquivos diretamente em "modo de +edição" (para começar a usar a nomenclatura que o VIM adota) -- permitindo que +você possa, imediatamente, editar o texto --, o VIM entra em "modo normal" (que +não é o modo "normal" dos outros editores).

+

Mas o que isso quer dizer?

+

O VIM tem 5 modos:

+

Modo Normal

+

O modo Normal é o modo que o VIM entra normalmente. Neste modo, as teclas são +traduzidas para comandos de alteração do texto. Na configuração padrão, os +comandos sequer são apresentados.

+

Modo de Inserção

+

O modo de Inserção é o modo que a maior parte dos outros editores funciona. +Qualquer coisa editada irá aparecer/alterar o texto atual.

+

Modo Visual

+

O modo Visual é semelhante ao selecionar texto com "shift" em outros +editores1.

+

Modo de Comando

+

O modo de comando serve para ações que começam com ":" (comandos Ex), "/" e "?" +(procura) e "|" (filtro).

+

Modo Ex

+

Semelhante ao modo de comando depois de usar ":", mas permanece no modo Ex.

+

Praticamente todos os modos são utilizados, de alguma forma ou de outra, com +exceção do modo Ex.

+

A pergunta que você deve estar se fazendo agora é: E daí?

+

Você, agora.

+

Existem algumas coisas interessantes que podem ser feitas com VIM que não podem +ser facilmente replicadas em outros editores justamente pela existência destes +modos de operação. Sim, inicialmente, o fato de não poder entrar no editor e +sair adicionando código pode parecer frustante, mas a medida que você for +aprendendo como utilizar cada modo, você verá que eles fazem sentido e que não +é nenhum mistério ficar pulando de modo para modo.

+

A verdadeira lição começa agora.

+
+

Todas as imagens são copyright (C) seus respectivos donos.

+ +
+

1 Apenas a título de informação, praticamente tudo que pode ser feito em +modo visual pode ser feito em modo normal.

+
+ +
+ << Introdução +
+ + +   + + +
+ Modo Normal >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/01-modos/so-what.jpg b/public/books/uma-licao-de-vim/01-modos/so-what.jpg new file mode 100644 index 0000000..20878cf Binary files /dev/null and b/public/books/uma-licao-de-vim/01-modos/so-what.jpg differ diff --git a/public/books/uma-licao-de-vim/01-modos/whatdoesitmean1.jpg b/public/books/uma-licao-de-vim/01-modos/whatdoesitmean1.jpg new file mode 100644 index 0000000..ed355d6 Binary files /dev/null and b/public/books/uma-licao-de-vim/01-modos/whatdoesitmean1.jpg differ diff --git a/public/books/uma-licao-de-vim/02-outros-comandos/index.html b/public/books/uma-licao-de-vim/02-outros-comandos/index.html new file mode 100644 index 0000000..99073d0 --- /dev/null +++ b/public/books/uma-licao-de-vim/02-outros-comandos/index.html @@ -0,0 +1,184 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

02. Outros Comandos

+ +

Esta é a parte em que eu comento alguns comandos que você vai usar +esporadicamente.

+ +

Neste ponto você deve estar entendendo como os modos do VIM funcionam, para que +cada um funciona e tento uma idéia básica de como editar arquivos. Como eu +falei já duas vezes, a quantidade de comandos disponíveis é gigantesca, então +vamos aproveitar esse pequeno momento em que as coisas começam a fazer sentido +para ver mais alguns comandos.

+

[Shift]+j (Modo normal)

+

"Junta" a linha abaixo do cursor com a atual. Pode não parecer muito, mas o VIM +irá colocar um espaço no final da linha atual1 antes de juntar com a linha +abaixo e removerá todo caractere branco da linha de baixo antes de juntar as +duas linhas.

+

x (Modo normal)

+

Apaga o caractere sob o cursor. O mesmo que [Del].

+

gq (Modo normal)

+

Reformata o parágrafo. Não faz muito sentido para código (com algumas +exceções), mas se você tiver configurado a coluna máxima (vou explicar como +fazer isso na parte de configuração do VIM), você pode selecionar um comentário +em modo visual e usar gq para que o VIM alinhe o comentário no espaço definido. +Também serve para quando você estiver editando arquivos de markup (MarkDown, +reSTRUCTURED text, HTML, etc).

+

gg e G (Modo normal)

+

gg move o cursor para o início do arquivo e G move o cursor para o fim do +arquivo. Efetivamente, fazer ggdG (mover o cursor para o início do arquivo, +remover tudo até o final do arquivo) irá remover todo o conteúdo do arquivo.

+

= (Modo normal)

+

Reidenta o código usando a sintaxe atual.

+

u e [Ctrl]+r (Modo normal)

+

Undo e redo, respectivamente.

+

[Ctrl]+y e [Ctrl]+e (Modo normal e Modo de inserção)

+

Dois comandos que funcionam de forma diferente se executados em modo normal ou +modo de inserção.

+

No modo normal, [Ctrl]+y irá rolar o conteúdo do texto para baixo, mantendo o +cursor na mesma posição enquanto que [Ctrl]+e irá rolar o conteúdo para cima, +ainda mantendo o cursor na mesma posição. Se você abusar destes comandos, +movendo a linha onde o cursor se encontra para fora da área visível, o cursor +irá se mover.

+

No modo de inserção, no entanto, [Ctrl]+y irá copiar o caractere da linha de +cima na mesma coluna na posição atual; [Ctrl]+e faz o mesmo, mas com a linha de +baixo.

+

. (Modo normal)

+

Repete o último comando. Note que . irá repetir o último comando completo. Por +exemplo, quando eu falei sobre ggdG, estamos falando, na verdade, de dois +comandos completos: gg e d{movimentação}. ., neste caso, irá repetir o comando +dG. Mais adiante veremos como criar "macros de teclado" e efetivamente permitir +a execução de coleções de comandos.

+

:e e :files (Modo de comando)

+

Edita um arquivo. Se não for passado o nome do arquivo depois do comando, o +mesmo arquivo é recarregado do disco (em outras palavras, o buffer é atualizado +com o conteúdo do arquivo). :e# recarrega o último arquivo aberto (por exemplo, +se você estiver com o arquivo "arquivo" aberto e fizer :e arquivo2, usar :e# +irá recarregar "arquivo" para o editor; usando :e# de novo, "arquivo2" será +apresentado).

+

Você pode ver os últimos arquivos abertos na sessão atual do VIM com :files. Se +quiser recarregar algum destes arquivos de novo, basta usar :e#{número}, onde +{número} é o número do arquivo na lista.

+

:sh (Modo de comando)

+

Abre um shell dentro do VIM. Para retornar ao VIM, basta encerrar o shell.

+

:{número} (Modo de comando)

+

Pula para a linha indicada. Por exemplo, :100 irá para a centésima linha do +arquivo.

+

[Ctrl]+] e [Ctrl]+t (Modo normal)

+

[Ctrl]+] pula para a tag sob o cursor e [Ctrl]+t retorna. Mais adiante veremos +como criar um arquivo de tags para que o VIM consiga navegar pelo código. A +mesma idéia é usada no help do VIM: se você digitar :help irá ver a primeira +página de ajuda do editor; para navegar entre os tópicos apresentados (marcados +de forma diferente, dependendo do esquema de cor utilizado), é utilizado +[Ctrl]+] para avançar e [Ctrl]+t para retornar para a página anterior.

+

~ (Modo normal)

+

Altera o caractere sob o cursor para maiúscula se for minúscula e vice-versa e +move o cursor uma posição pra frente.

+

gu{movimentação}, gU{movimentação} e g~{movimentação} (Modo normal)

+

gu{movimentação} altera todos os caracteres em {movimentação} para minúsculas.

+

gU{movimentação} altera todos os caracteres em {movimentação} mara maiúsculas.

+

g~{movimentação} faz ~ nos caracteres em {movimentação} (ou seja, os caracteres +da posição do cursor até movimentação ficarão em maiúsculas se estiverem em +minúsculas e vice-versa).

+

[Ctrl]+p e [Ctrl]+n (Modo de inserção)

+

Auto-complete. [Ctrl]+p tenta completar a palavra antes do cursor voltando no +texto enquanto que [Ctrl]+n tenta completar com palavras mais a frente no +texto.

+

[Ctrl]+a e [Ctrl]+x (Modo normal)

+

Incrementa ([Ctrl]+a) ou decrementa ([Ctrl]+x) o número sob o cursor. O VIM +automaticamente detecta se o número está em decimal, octal ou hexa.

+

E MAIS!

+

w (Modo normal)

+

Move o cursor para o começo da próxima palavra.

+

e (Modo normal)

+

Move o cursor para o fim da próxima palavra.

+

b (Modo normal)

+

Move o cursor para o começo da palavra anterior.

+

ge (Modo normal)

+

Move o cursor para o fim da palavra anterior.

+

1 ... a não ser que o primeiro caractere (não branco) da linha de baixo seja +um ")"; neste caso, o VIM não adiciona o espaço.

+
+ +
+ << Modo de Comando +
+ + +   + + +
+ Recordar, Copiar e Colar >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/03-recortar-copiar-colar/index.html b/public/books/uma-licao-de-vim/03-recortar-copiar-colar/index.html new file mode 100644 index 0000000..449c9c9 --- /dev/null +++ b/public/books/uma-licao-de-vim/03-recortar-copiar-colar/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

03. Recortar, Copiar e Colar

+ +

Essa é a parte que você não deve fazer muitas vezes quando estiver +programando.

+ +

Assim como outros editores, o VIM tem um sistema de copiar e colar. E, como +vimos vendo desde o começo, o VIM tem seu modo peculiar de lidar com isso.

+

Toda a parte de copiar-e-colar do VIM é feita em modo normal. E sem que você +soubesse, você já stava vendo a parte de recordar textos desde a parte de +comandos do modo normal: Qualquer comando que exclua texto imediatamente +transfere a parte excluído para a área de transferência do VIM. A única parte +que ficou faltando foi como você “cola” estes textos de volta.

+

E, para colar, você usa p (de "paste", veja só!).

+

E, obviamente, existe o [Shift]+p também. E a diferença é facilmente explicada +se voltarmos para o capítulo #2.2.

+

Quando falamos do cursor, eu disse que o cursor encontra-se na parte inferior +esquerda do bloco do cursor. O colar do VIM é feito depois do cursor. Assim, ao +pressionar p, o texto irá aparecer depois do caractere sob o cursor; se for +pressionado [Shift]+p, o texto será colado antes do caractere atual, empurrando +o mesmo pra frente.

+

O funcionamento muda um pouco se você recortar o texto usando o modo visual de +linha (ou recortar usando algum movimento que desconsidere a coluna atual). +Nestes casos, o VIM entende que você quer colar uma linha inteira e, ao invés +de mover o conteúdo da linha atual, o texto é colado abaixo da linha atual, +desconsiderando a posição do cursor. [Shift]+p irá colar o texto antes da linha +atual.

+

(Embora pareça complicado, a medida que você for se aclimatando com o +copiar-e-colar do VIM, você verá que não é tão diferente dos demais editores -- +com a exceção que os outros editores tentam adivinhar quando você quer fazer +copia de linhas inteiras ou apenas pedaços, enquanto que o VIM deixa você mesmo +decidir quando fazer isso.)

+

A única coisa que ficou faltando agora foi como copiar o texto sem remover o +mesmo antes -- porque, vamos admitir, recortar e colar de novo seria muita +burrice.

+

O comando para copiar é y{movimentação}. Normalmente, ele é chamado de "yank" +(arrancar) e por isso muitos chamam o sistema de "copy'n'paste" do VIM de +"yank'n'paste".

+

Para copiar a linha inteira, você pode usar yy. Isto copia toda a linha, +incluindo o marcador de nova linha, e o VIM vai entender que, na hora de colar, +você quer colar a linha inteira, seguindo as mesmas regras que eu expliquei +acima sobre o modo visual de linha.

+

Assim como outros editores, o VIM mantém a área de transferência entre arquivos +(com isso, você pode abrir um arquivo, copiar um texto, abrir outro arquivo e +colar a parte selecionada do primeiro) e, normalmente, o VIM ainda consegue +manter a área de transferência entre execuções. Entretanto, uma coisa que você +pode não gostar é que a área de transferência pertence e é gerenciada +exclusivamente pelo VIM -- ou seja, ele não usa a área de transferência do +sistema operacional1. Assim, você não vai conseguir copiar do VIM e colar no +seu browser ou vice-versa.

+

.. a não ser que você use registradores, que nós vamos ver a seguir.

+

1 E não, o "botão do meio dentro do X" não é a mesma coisa a área de +transferência.

+
+ +
+ << Outros Comandos +
+ + +   + + +
+ Registradores >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/04-registradores/index.html b/public/books/uma-licao-de-vim/04-registradores/index.html new file mode 100644 index 0000000..f0f53f7 --- /dev/null +++ b/public/books/uma-licao-de-vim/04-registradores/index.html @@ -0,0 +1,140 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

04. Registradores

+ +

Essa é a parte que o VIM fica melhor que os outros editores.

+ +

No capítulo anterior eu mencionei que o VIM tem uma área de transferência +própria e que ela não se comunica diretamente com a área de transferência do +sistema operacional, apenas através de registradores.

+

A forma mais simples de pensar em registradores é: são marcadores para áreas de +transferência com nomes1.

+

Para acessar os registradores, você deve usar "{nome do registrador}, onde +{nome do registrador} é uma letra apenas. Assim, para copiar texto para um +registrador, é utilizado "{registrador}y{movimento}; para retirar depois este +texto do registrador, é utilizado "{registrador}p.

+

Enquanto você estava vendo yank'n'paste do VIM, o VIM estava guardando o texto +numa área de transferência apontanda pelo "registrador sem nome". E eu não +estou brincando aqui: O próprio help do VIM chama este registrador de +"registrador sem nome". A letra do registrador sem nome é " (ou seja, ""yy e +yy ambos irão copiar a linha atual para o registrador sem nome).

+

Números são registradores especiais. 0 contém o último texto copiado para área +de transferência; de 1 a 9 ficam os textos excluídos, em forma de pilha (o mais +recente no registrador 1, o anterior a este no 2 e assim por diante; e quando +mais texto é excluído, o conteúdo vai para o registrador 1, o conteúdo do +registrador 1 vai para o registrador 2 e assim por diante).

+

- é um registrador que guarda qualquer coisa excluída que for menor que uma +linha inteira.

+

Registradores com letras de "a" a "z" funcionam exatamente como esperado: "ayy irá +copiar a linha atual para o registrador "a" enquanto que "bp irá colar o conteúdo +do registrador b.

+

Note que até agora eu chamei os registradores normais com minúsculas. O motivo +é que, ao copiar algo para um registrador, o conteúdo anterior é removido, a +não ser que você passe o nome do registrado em maiúsculas. Neste caso, o +conteúdo movido para a área de transferência do registrador é adicionado ao +conteúdo já existente. Assim, você pode copiar linhas não-contíguas usando "ayy +para a primeira linha, "Ayy para as demais e depois colar com "ap (para o paste +não há diferença entre maiúsculas e minúsculas).

+

Outros registradores especiais são:

+

=

+

Registrador de expressões. Você pode entrar fórmulas e depois colar o resultado +no conteúdo com p. Uma coisa a cuidar aqui é que não é possível fazer "=p; o +VIM irá imediatamente abrir espaço para entrar a fórmula ao digitar "=; ainda, +o conteúdo é perdido se depois de digitar a fórmula você utilizar qualquer +comando que não seja p (incluindo os comandos de movimentação).

+

_

+

Registrador "buraco negro" (de novo, eu não estou brincando, o help do VIM +chama esse registrador de "buraco negro"). Qualquer coisa enviada para este +registrador é perdida; paste deste registrador retorna nada. Útil quando você +quer excluir algum texto sem mexer no registrador sem nome.

+

+

+

Registrador da área de transferência do sistema operacional. Somente disponível +para aplicações GUI, já que estas tem acesso direto ao sistema (no caso do VIM +console em Linux, o "sistema operacional" seria o próprio shell, que não tem +uma área de transferência -- se você pensar nas bibliotecas envolvidas, a coisa +faz sentido).

+

1 Registradores também são usados para outras coisas, mas veremos isso mais pra frente.

+
+ +
+ << Recortar, Copiar e Colar +
+ + +   + + +
+ Marcadores >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/05-marcadores/index.html b/public/books/uma-licao-de-vim/05-marcadores/index.html new file mode 100644 index 0000000..ac871c6 --- /dev/null +++ b/public/books/uma-licao-de-vim/05-marcadores/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

05. Marcadores

+ +

Essa é a parte em que você não vai mais precisar se lembrar da última linha +que estava editando.

+ +

Algumas vezes você precisa ficar pulando entre partes diferentes do seu +arquivo. Alguns editores oferecem a funcionalidade de "bookmark" para linhas +específicas e ficam "pulando" entre estes bookmarks. O VIM tem uma +funcionalidade semelhante, chamada "Marcadores". A diferença é que enquanto os +demais editores só tem um estado para marcadores (ativo ou não), o VIM permite +que você tenha até 26 marcadores únicos -- e que podem ser acessados +diretamente.

+

Para marcar uma linha, você deve usar m{nome do marcador} em modo normal, onde +{nome do marcador} é uma letra de "a" a "z". Para ir diretamente para um +marcador, é só usar '{nome do marcador} para simplesmente mover o cursor para o +primeiro caractere não branco na linha do marcador ou \{nome do marcador}` para +mover o cursor exatamente para a posição do marcador (ambos também em modo +normal).

+

Como tudo no VIM, maiúsculas e minúsculas fazem diferença.

+

Criar um marcador com um nome em minúsculas signifca que o marcador é valido +somente dentro do arquivo. O marcador "a" do arquivo "arquivo1" não é o mesmo +marcador "a" do arquivo "arquivo2". Quando um marcador é criado em maiúsculas, +ele se torna global: Se você fizer mA no arquivo "arquivo1" e abrir o arquivo +"arquivo2", \A` irá voltar para o arquivo "arquivo1" (na posição do marcador, +obviamente).

+

E como tudo no VIM, sempre existem os comandos mágicos.

+

`` ou ''

+

Retorna para a última posição onde foi feito um "pulo". Por exemplo, se você +está na linha 100 do arquivo atual, e fizer um pulo para o marcador "a" (com \a, por exemplo), ``\` irá retorna para a linha 100. Note que isso não gera um marcador per se, já que fazer ``\`` de novo irá retornar para a posição do +marcador "a" (pois foi lá que aconteceu o último pulo).

+

`. ou '.

+

Retorna para a última posição onde houve alteração de texto. O exemplo que eu +posso pensar neste caso é quando você está digitando um comando e não se lembra +se fez o #include ou import necessário. Neste caso, você simplesmente termina +de digitar o comando, usa gg para ir para o começo do arquivo para verificar se +o include/import está lá e, se tiver, usa \.` para retornar para a posição +original.

+

`[ ou '[ e `] ou ']

+

Retorna para a posição onde o texto foi copiado ("yanked") para a área de +transferência (qualquer área de transferência). [ irá mover para o primeiro +caractere copiado e ] para o último.

+

`" ou '"

+

Move para a última posição do arquivo quando o arquivo foi fechado. Isto +normalmente é controlado pelo arquivo de inicialização, que veremos mais a +frente.

+

E, para ver onde estão as marcas atuais, você só precisa usar :marks no modo de +comando.

+
+ +
+ << Registradores +
+ + +   + + +
+ Macros de Teclado >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/06-macros-de-teclado/index.html b/public/books/uma-licao-de-vim/06-macros-de-teclado/index.html new file mode 100644 index 0000000..51ac993 --- /dev/null +++ b/public/books/uma-licao-de-vim/06-macros-de-teclado/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

06. Macros de Teclado

+ +

Essa é a parte em que você repete várias coisas sem repetir várias coisas.

+ +

No capítulo #3, eu falei rapidamente do commando ., que repete o último comando +completo. Mas como repetir comandos que são, na verdade, uma composição de +vários outros comandos?

+

A resposta são macros de teclado.

+

Macros de teclado permitem que você grave uma execução qualquer e depois a +repita quantas vezes quiser.

+

Para fazer uma macro de teclado, você deve, em modo normal, executar +q{registrador}. Ao fazer isso, a última linha do VIM irá mostrar "recording", +indicando que o editor está agora gravandos todas as teclas pressionadas no +registrador. Para encerrar a gravação pressione q novamente (desta vez, sem o +registrador). Para "tocar" a macro, é necessário usar @{registrador}.

+

Quem prestou atenção no capítulo #5, deve ter notado que eu usei a palavra +"registrador" de novo. E a base da questão é que realmente os dois são a mesma +coisa: Se você copiar algo para o registrador a ("ayy, por exemplo) e depois +gravar a macro "a", o conteúdo copiado para a área de transferência será perdido. +Em compensação, se você criar a macro no registrador "a", você pode ver +exatamente a sequência de comandos usados usando "ap. Ou ainda, você pode +colocar a sequência de comandos desejada num arquivo (ou no próprio arquivo), +copiar para o registrador necessário e depois só "tocar" o registrador.

+

Como exemplo, imagine que você tem uma lista de constantes que você quer +transformar em uma lista de strings. No caso, você teria que adicionar uma aspa +no começo, uma aspa no final, uma vírgula e passar para a próxima linha. Se +forem apenas 4 constantes, é fácil repetir os comandos em cada linha; mas se +forem 100, a coisa fica diferente.

+

Neste caso, você faria o seguinte: Na primeira linha, executaria +qaI"[Esc]A",[Esc]jq -- ou seja, iniciaria a macro "a", entraria em modo de +inserção no primeiro caractere não branco da linha (I), colocaria uma aspa, +sairia do modo de inserção, entraria novamente no modo de inserção mas desta +vez movendo o cursor para o último caractere antes (A), adicionaria a aspa que +encerra a string e uma vírgula, moveria para a linha de baixo e encerraria a +macro de teclado. Até aqui espero que não tenha nada de surpresas. Agora você +pode repetir @a 99 vezes para as próximas linhas ou simplesmente executar 99@a +e deixar o VIM repetir a macro 99 vezes. No final, bastaria simplesmente +remover a última vírgula.

+

Uma coisa a ter em mente -- além da questão do registrador -- é que o VIM +encerra tanto a macro quanto o número de repetições se houver qualquer +problema. Por exemplo, se no meio da sua macro você colocar um f. para mover +o cursor para o próximo ponto, mas no meio da execução não for encontrado +nenhum ponto, a macro será interrompida e qualquer execução posterior será +encerrada, não importando se for a 99a execução da macro ou a +1a. Se você perceber que a execução não terminou onde deveria, +basta executar u em modo de comando para desfazer a execução da macro.

+
+ +
+ << Marcadores +
+ + +   + + +
+ Procurar em Vários Arquivos >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/07-procurar-varios-arquivos/index.html b/public/books/uma-licao-de-vim/07-procurar-varios-arquivos/index.html new file mode 100644 index 0000000..6dd3911 --- /dev/null +++ b/public/books/uma-licao-de-vim/07-procurar-varios-arquivos/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

07. Procurar em Vários Arquivos

+ +

Essa é a parte em que mais uma vez você vai ter que pesquisar sobre +expressões regulares.

+ +

Já vimos o comando de pesquisa, que tem um modo inteiro só pra si1.

+

Mas como fazer para encontrar ocorrências de uma palavra em mais de um arquivo? +Para isto, existe o comando :grep.

+

O grep é uma ferramente comum em Unixes (e Linux) em geral, mas o VIM tem +scripts que fazem a mesma coisa em outros sistemas operacionais (por exemplo, +Windows). Assim, o mesmo comando vai funcionar da mesma forma não importando +qual sistema você esteja utilizando.

+

Como o :grep usa outras funcionalidades existentes no VIM, iremos ver um pouco +mais do que simplesmente "Procurar", mas isso é necessário.

+

Como o modo de pesquisa, :grep precisa de uma expressão regular. Ao contrário +do modo de pesquisa, o :grep também precisa de uma lista de arquivos a serem +pesquisados. Por baixo dos panos, o que o VIM faz é chamar o comando "grep" (do +Unix), verifica o resultado e permite pular facilmente entre os elementos +encontrados (então todas as opções disponíveis para o grep podem ser passadas +diretamente de dentro do VIM).

+

Por exemplo, para pesquisar por arquivos que contém a palavra "void", você só +precisa executar o comando :grep void * (onde :grep é o comando, void é a +expressão a ser pesquisada e * é a lista de arquivos a serem pesquisados). Como +o grep (o aplicativo do Unix) somente pesquisa arquivos no diretório +especificado (no nosso caso anterior, como não foi passado diretório algum, +será considerado o diretório atual), o :grep (o comando do VIM) também não vai +entrar em nenhum subdiretório (de novo, porque o VIM simplesmente chama o grep +[aplicativo do Unix] e facilita pular entre os elementos encontrados). Para +fazer uma procura que encontre a expressão além do diretório atual, basta +adicionar a opção "-r" para o grep (:grep void -r *).

+

Ok, agora que você sabe usar o :grep... Como é que você vê os resultados?

+

Primeira informação periférica: O VIM tem um tipo de "janela" especial, chamada +"Quickfix". Essa "janela" é, na verdade, um "split" da tela (e mais a frente +veremos como trabalhar com "splits" e abas). Para exibir o Quickfix, é usado o +comando :copen; para fechar o Quickfix, basta usar :copen de novo. Para +passar para o próximo elemento existente no Quickfix, use :cnext (ou +simplesmente :cn); para passar para o elemento anterior, use :cprevious (ou +simplesmente :cp); para mover o cursor para a posição do elemento atual do +Quickfix, use :cc (que é simplesmente :cc mesmo).

+

A segunda informação periférica: Como eu falei, usar :grep {expressão} * irá +procurar "{expressão}" a partir do diretório atual. Para descobrir qual é o +"diretório atual" para o VIM, use :pwd (de "print working directory", que +também é um comando Unix); para mudar para outro diretório, utilize o comando +:cd {diretório}, como você faria num shell normal.

+

(E antes que alguém pergunte: Sim, você pode fazer um grep fora do diretório +atual passando o diretório em questão no próprio comando do grep: :grep void /tmp -r irá procurar por "void" em todos os arquivos existentes no diretório +/tmp.)

+

1 Apenas para lembrar, / entra no modo de pesquisa, onde só é preciso entrar +a expressão regular a ser encontrada; para passar para a próxima +ocorrência, use n em modo normal; para passar para a ocorrência anterior, +use N também em modo normal; para remover o realce das palavras +encontradas, use :noh em modo de comando.

+
+ +
+ << Macros de Teclado +
+ + +   + + +
+ Localizar e Substituir >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/08-localizar-substituir/index.html b/public/books/uma-licao-de-vim/08-localizar-substituir/index.html new file mode 100644 index 0000000..7c51f5e --- /dev/null +++ b/public/books/uma-licao-de-vim/08-localizar-substituir/index.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

08. Localizar e Substituir

+ +

Essa é a parte em que você vai precisar aprender expressões regulares — mais +uma vez.

+ +

Uma coisa relativamente comum quando se está programando é substituir todas as +ocorrências de uma palavra por outra1.

+

Para fazer "localizar e substituir" ("search and replace") existe o comando +:substitute em modo de comando (ou simplesmente :s).

+

Até aí sem problemas, mas existe uma pequena pegadinha (na verdade, duas, mas +uma de cada vez): :s é, na verdade, :{range}s, onde "{range}" é a parte do +texto que o comando :s deve ser executado -- e sim, eu sei que não falei +sobre este tipo de comando antes, mas essa era a melhor oportunidade.

+

Então, {range}. {range} é opcional e, se não for passado, o comando será +executado da linha atual. Isto, obviamente, não é muito útil. {range} é formado +por um par2, separado por vírgulas, indicando o início e o fim da execução do +comando.

+

O uso básico de {range} é "linha inicial,linha final". Por exemplo, :1,5s irá +executar o comando :s entre as linhas 1 (a primeira, não existe linha 0 no +VIM) e 5.

+

E, mais uma vez, existem indicadores especiais, inclusive para {range}.

+

Um número indica o número da linha, como já comentei. "$" é a última linha do +arquivo (assim, :1,$s irá executar :s em todo o arquivo); "%" é um alias +para "1,$" (ou seja, todo o arquivo); '{marcador} irá, obviamente, utilizar +os marcadores (ou seja, :'a,'bs irá executar :s entre o marcador "a" e o +marcador "b" -- E marcadores entre arquivos [em maiúsculas] não são +permitidos).

+

(E existe outros dois marcadores especiais que eu não comentei antes por achar +que não há uso fora do :s que são '< e '> que indicam, respectivamente, o +início e o fim da região visual -- mas o VIM vai adicionar estes dois +marcadores automaticamente se você tiver uma região visual selecionada e +pressionar : e por isso ficaram pra trás. Então não se assuste se o VIM +começar a colocar coisas na linha de comando sem que você tenha digitado.)

+

Daqui pra frente, eu vou colocar o comando como :%s, já que esta é a execução +mais comum do comando. Mas lembre-se que % = 1,$ = do começo ao fim.

+

:%s funciona, assim como a pesquisa, com expressões regulares, só que ao invés +de termos uma expressão, teremos duas: a de pesquisa e a de substituição. Em +casos mais simples, onde você quer substituir "palavra 1" por "palavra 2", o +comando será :%s/palavra 1/palavra 2. Mais uma vez, conhecer expressões +regulares vai ajudar aqui -- e fica a dica para olhar sobre "grupos".

+

A segunda pegadinha é que :%s executa o comando em cada linha do range e, como +padrão, somente a primeira ocorrência é substituída. Assim, se "palavra 1" +existir mais de uma vez em uma linha, somente a primeira será alterada.

+

Para resolver isso, você deve usar o terceiro parâmetro de :%s, {flags}. As +flags mais comuns são:

+
+
g
+
Substitui todas as ocorrências da expressão de procura na linha, não apenas + a primeira.
+
i
+
Ignora maiúsculas e minúsculas ("ignore case")
+
c
+
Pede confirmação em cada alteração.
+
+

Concluindo: para substituir "void" por "int*" em todo o arquivo mas apenas no +começo da linha, ignorando se está em maiúsculas ou minúsculas (porque o +estagiário pensou que estava digitando uma monografia), mas confirmando cada +mudança, você faria :%s/^void/int*/ic (como é apenas no começo da linha e nós +forçamos isso na expressão regular -- o ^ ali -- não precisamos usar a flag "g", +já que não teria efeito nenhum).

+

1 E, mas pra frente, veremos que existem plugins que deixam esta parte mais +fácil.

+

2 Na verdade, não e um par mas, de novo, fazer substituição em apenas uma +linha não é muito útil, principalmente considerando os comandos que o VIM +tem para movimentação do cursor.

+
+ +
+ << Macros de Teclado +
+ + +   + + +
+ Splits >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/09-splits/all.png b/public/books/uma-licao-de-vim/09-splits/all.png new file mode 100644 index 0000000..e96f78d Binary files /dev/null and b/public/books/uma-licao-de-vim/09-splits/all.png differ diff --git a/public/books/uma-licao-de-vim/09-splits/horizontal-split.png b/public/books/uma-licao-de-vim/09-splits/horizontal-split.png new file mode 100644 index 0000000..4f417c7 Binary files /dev/null and b/public/books/uma-licao-de-vim/09-splits/horizontal-split.png differ diff --git a/public/books/uma-licao-de-vim/09-splits/index.html b/public/books/uma-licao-de-vim/09-splits/index.html new file mode 100644 index 0000000..a8db121 --- /dev/null +++ b/public/books/uma-licao-de-vim/09-splits/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

09. Splits

+ +

Essa é a parte em que você vai passar uma hora dividindo a tela em pedacinhos +cada vez mais pequenos.

+ +

Até agora, enquanto falávamos de editar textos no VIM, vimos apenas como editar +um arquivo por vez. Existem formas de editar mais de um arquivo (usando :e e +:e#{número}) mas estas estão longe de serem fáceis de serem utilizadas.

+

Existem duas formas de manter dois (ou mais) arquivos abertos ao mesmo tempo. +Uma delas são "splits". Basicamente, splits permitem que você "reparta" a tela +em pedaços, podendo mostrar outros arquivos (ou até mesmo outra vez o mesmo +arquivo).

+

Para criar splits, existem dois comandos que devem ser usados em modo de +comando: :sp e :vsp. Ambos comandos aceitam o nome do arquivo a ser aberto no +novo split; se não for passado o nome de um arquivo, o arquivo que já está +aberto será carregado.

+

A diferença entre eles é que :sp irá criar um split horizontal...

+

+

... enquanto que :vsp irá criar um split vertical.

+

+

Dentro de cada split, comandos executados irão afetar apenas o buffer atual: :w +irá salvar apenas o arquivo apresentar no split atual, :e irá abrir um arquivo +no split atual e assim por diante.

+

Note que eu falei "buffer atual". Como falei antes, "buffer" é o nome dado para +a representação do arquivo em memória e que tanto :sp quanto :vsp sem +parâmetros irão abrir um split com o arquivo atual -- que, na verdade, é o +buffer atual. Se você fizer isso e começar a editar o texto em um dos splits, o +conteúdo do outro também irá mudar, já que ambos estão apresentando o mesmo +buffer.

+

Para fechar um split, basta fechar o arquivo, tanto com :q quanto :wq ou +qualquer outro comando que feche um arquivo. O split será removido e o cursor +irá para o próximo split. Se não houverem mais splits, o VIM irá fechar, como +já vinhamos vendo desde o começo.

+

E sim, você pode fazer quantos splits e de formas diversas quantas vezes quiser +(até que não sobre mais espaço na tela, quer dizer).

+

+

Para "manusear" splits, você irá utilizar comandos que começam com, em modo +normal, [Ctrl]w. [Ctrl]w, por si só, não faz nada (a não ser que você +repita o comando, mas isso é outra coisa) e requer uma ação a ser executada no +split (assim como alguns comandos requerem uma movimentação).

+

[Ctrl]wj ou [Ctrl]w[direcional para baixo]

+

Move o cursor para o split abaixo do atual. Se não houverem outros splits +abaixo do atual, permanece no mesmo. Aceita um número de repetiçoes, ou seja, +3[Ctrl]wj irá imediatamente pular para o 3o. split abaixo do atual.

+

[Ctrl]wh ou [Ctrl]w[direcional para a esquerda] e [Ctrl]wk ou [Ctrl]w[direcional para cima] e [Ctrl]wl ou [Ctrl]w[direcional para a direita]

+

O mesmo que [Ctrl]wj, mas indo para o split da esquerda, acima ou direita, +respectivamente.

+

[Ctrl]w+ e [Cltr]w-

+

Aumenta ou diminui o tamanho do split em uma linha. Se for passado um número +antes do comando -- por exemplo 3[Ctrl]w+ -- o número de linhas afetas será o +número indicado.

+

[Ctrl]w> e [Ctrl]w<

+

O mesmo que [Ctrl]w+ e [Ctrl]w-, mas altera o número de colunas ao invés do número de linhas.

+

[Ctrl]w_ e [Ctrl]w|

+

Deixa o split com o maior altura possível (ou seja, coloca o máximo de linhas +possíveis para o split) ou com a maior largura possível (ou seja, coloca o +máximo de colunas possíveis para o split).

+

[Ctrl]w=

+

Altera o tamanho dos splits para que estes fiquem o mais equilibrados +possíveis.

+

[Ctrl]wH, [Ctrl]wJ, [Ctrl]wK,/tt> e [Ctrl]wL

+

Move o split atual para o canto mais a esquerda, abaixo, acima ou direita, +respectivamente (note que a letra de movimentação está em maiúsculas).

+

[Ctrl]ww

+

Move o cursor para o split anterior. Se você está em um split qualquer e fizer +3[Ctrl]wj para ir para o 3o split abaixo do atual, [Ctrl]ww irá +mover o cursor de volta para o split original (e [Ctrl]ww irá mover o cursor +de volta para o 3o split abaixo do atual).

+

[Ctrl]wf

+

Abre o arquivo com o nome sob o cursor em um novo split.

+

Quando falei do grep, eu comentei que existe o comando :cope para abrir a +janela do Quickfix. Bom, se você quiser ficar pulando entre a janela do +Quickfix e o texto, os comandos [Ctrl]w acima irão ajudar.

+

Existem ainda alguns outros comandos para splits, mas veremos estes mais a +frente.

+
+ +
+ << Localizar e Substituir +
+ + +   + + +
+ Abas >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/09-splits/vertical-split.png b/public/books/uma-licao-de-vim/09-splits/vertical-split.png new file mode 100644 index 0000000..ca26dba Binary files /dev/null and b/public/books/uma-licao-de-vim/09-splits/vertical-split.png differ diff --git a/public/books/uma-licao-de-vim/10-abas/index.html b/public/books/uma-licao-de-vim/10-abas/index.html new file mode 100644 index 0000000..6a22f8c --- /dev/null +++ b/public/books/uma-licao-de-vim/10-abas/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

10. Abas

+ +

Essa é a parte me que você acha coisas que já fazia antes.

+ +

Além dos splits, que vimos no capítulo anterior, VIM também tem suporte à abas. +O mais interessante é que você pode usar abas tanto no VIM gráfico (também +chamado de GVim) quanto no console.

+

Para abrir um arquivo no VIM, sabemos que temos que usar o comando :e; para +abrir o arquivo em uma aba, o comando é :tabe.

+

Ao contrário de splits, criar uma nova aba sem passar um arquivo não cria uma +nova aba com o buffer atual; :tabe sem um nome de arquivo irá criar uma nova +aba com um buffer em branco. E sim, você pode abrir o mesmo arquivo em mais de +uma aba e as alterações feitas em uma irão refletir na outra.

+

Para pular entre abas, você poder usar o comando gt em modo normal ou :tabn em +modo de comando. Se você usar um número de repetições (p.ex. 3gt ou :tabn 3) o +VIM irá pular diretamente para aquela aba (no caso, para a terceira), não +importando a aba atual. gT em modo normal ou :tabp move o cursor para a aba +anterior.

+

Se quiser mover abas de posição, você deve usar :tabm. :tabm irá mover a aba +atual para ficar depois da aba indicada (p.ex., :tabm 3 irá mover a aba atual +para depois da terceira aba). :tabm também aceita parâmetros considerando a aba +atual: :tabm +2 irá mover a aba atual duas abas pra frente (para a direita) e +:tabm -2 irá mover a aba duas abas pra trás (para a esquerda).

+

Atalhos padrão para mover para a próxima aba do sistema operacional também são +aceitos por padrão. [Ctrl][PageDn] e [Ctrl][PageUp] no Linux e +[Command][Shift]] e [Command][Shift][ no OS X, por exemplo. Como não existe +nenhum padrão para consoles, não há nenhum atalho padrão e devem ser usados os +comandos de seleção de abas que vimos antes.

+

Mais pra frente, quando estivermos falando do arquivo de configuração, eu vou +explicar um "truque" para pular diretamente para a aba desejada, assim como +funciona no Firefox e no Chrome.

+
+ +
+ << Splits +
+ + +   + + +
+ Arquivos de Configuração >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/11-01-vimrc/index.html b/public/books/uma-licao-de-vim/11-01-vimrc/index.html new file mode 100644 index 0000000..e684030 --- /dev/null +++ b/public/books/uma-licao-de-vim/11-01-vimrc/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

11.01. Meu .vimrc

+ +

Essa é a parte em que você vai ver um arquivo de configuração meio +estranho.

+ +

Como falamos sobre arquivo de configuração, eu vou mostrar o que eu tenho hoje +configurado no meu VIM, explicando o que cada comando faz. Boa parte do que eu +tenho veio da configuração global do VIM, que eu copiei apenas para garantir +que não importando onde eu esteja ou qualquer alteração que seja feita neste +arquivo, as funcionalidades que eu estou acostumado continuarão funcionando +como esperado.

+
set encoding=utf-8
+
+

Garante que os arquivos salvos estarão em UTF-8, ao invés de tentar converter +para o encoding do sistema operacional.

+
set nocompatible
+
+

Desativa o modo de compatilidade com o VI original. Existem algumas diferenças +entre ambos (por exemplo, depois de um fazer um undo (u), no VI original fazer +undo de novo desfazia o undo anterior (efetivamente, fazendo um "redo") e para +continuar fazendo undo, o primeiro comando depois de undo deveria ser .; no +VIM, fazer um undo depois de um undo irá continuar desfazendo o que foi entrado +no texto, até retornar ao estado original) e a não ser que você seja fã do VI +original, eu não recomendaria usar o modo de compatilibidade.

+
set backspace=indent,eol,start
+
+

Apenas garante que o backspace consiga remover identações, apagar o fim da +linha e o começo de uma linha (neste último, forçando a linha atual e se juntar +com a anterior). Esse é o funcionamento normal de qualquer editor.

+
" Don’t use Ex mode, use Q for formatting
+map Q gq
+
+" Map Y to do the same (well, almost) as the D command
+map Y y$
+
+

Estes dois mapeamentos eu peguei da configuração global, mas nunca efetivamente +usei. Mas, por via das dúvida...

+

Ainda, uma coisa que eu não havia comentado: Comentários. Você pode comentar +qualquer linha começando a mesma com aspas (") sem as aspas finais (senão o VIM +irá interpretar o conteúdo como string). Então: Uma aspa, comentário; duas +aspas, string; mais de duas, erro.

+
if &t_Co > 2 ||&
+  syntax on
+  set hlsearch
+endif
+
+

Ah, nosso primeiro encontro com ifs. Se o terminal tiver mais de duas cores +(&t_Co > 2) ou estivermos rodando em GUI (has("gui_running")) então o +suporte à sintaxes deve ser ligado (syntax on) e pesquisas devem marcar todas +as ocorrências encontradas no último comando de pesquisa(set hlsearch)1.

+
" ------------------------
+"  Those are my settings
+" ------------------------
+
+set tabstop=4           " tabs are displayed as 4 spaces
+set shiftwidth=4        " by default, when auto-identing, add 4 spaces (or 1 tabstop)
+set foldmethod=marker   " fold on markers
+set scrolloff=1         " always show one line around the cursor
+set laststatus=2        " always show the status bar (’cause I like to see the line and column, always)
+set showtabline=2       " always show the tabline
+set showmatch           " show matching bracket
+set noerrorbells        " no error bells
+set autowrite           " write the file when switching between files or something
+set nowrap              " do not wrap long lines
+set nobackup            " do not keep a backup file, use versions instead
+set history=50          " keep 50 lines of command line history
+set ruler               " show the cursor position all the time
+set showcmd             " display incomplete commands
+set incsearch           " do incremental searching
+set formatoptions=tcq   " wrap with textwidth, wrap comments, insert commend leader (twice), format comments
+set smartindent         " smart identation
+set number              " show line numbers
+set wim=longest,list    " file auto-completion
+set background=dark     " to follow most of the colorschemes I use
+set vb t_vb=            " convert bells to visual bells and do nothing as visual bell
+
+set t_Co=256            " 256 color terminals
+
+let mapleader=","     " use comma to start user-defined (in plugins) functions
+
+

Um grande bloco de configurações. Vamos ver um por um:

+ +
if has("autocmd")
+
+

Eu falei sobre auto-commands, mas na verdade é uma feature que deve ser +adicionada na hora de compilar o VIM. Entretanto, até agora eu não vi um pacote +disponível que não tenha essa feature. Apenas para garantir, verificamos se a +funcionalidade foi adicionada mesmo ou não.

+

Boa parte do que tem daqui pra frente ou eu já falei ou veio do arquivo de +configuração global.

+
  filetype plugin indent on
+
+

Ativa as configurações vindas do arquivo de sintaxe. Quando eu disse que as +configurações de auto-identação vem do arquivo de sintaxe, é esta linha que +garante que isso vai acontecer.

+
  autocmd FileType text setlocal textwidth=78
+
+

Quando o tipo de arquivo for texto ("text") define localmente para aquele +buffer que o tamanho da linha é de 78 colunas. Como "formatoptions" tem um "t", +o VIM irá automaticamente quebrar a linha (adicionando um [Enter] antes da +palavra que passa do limite) na coluna 78.6

+
  " When editing a file, always jump to the last known cursor position.
+  " Don’t do it when the position is invalid or when inside an event handler
+  " (happens when dropping a file on gvim).
+  autocmd BufReadPost *
+    \ if line("’\"") > 0 && line("’\"") <= line("$") |
+    \   exe "normal g`\"" |
+    \ endif
+
+

Este comando existe no arquivo de configuração global, mas é bem interessante. +Lendo exatamente o que ele faz: Depois de carregar qualquer arquivo, se a linha +que o marcador de saída do buffer existir e estiver entre o começo do arquivo e +antes do fim da linha, executa, em modo normal, g\", que efetivamente "pula" +para o marcador de saída do buffer. A diferença entre \`` e g` é que `g não mexe +no jumplist quando pular (logo, ```` não vai funcionar). Como não mexer no +jumplist é algo que não se faz normalmente, nem comentei antes.

+
  autocmd FileType python autocmd BufWritePre <buffer> :%s/\s\+$//e
+
+

Eu falei deste comando antes, mas vamos de novo: Quando o tipo de arquivo for +"python", adicione um auto-comando que antes de gravar o buffer, execute, no +buffer, a expressão regular /\s\+$//e, que basicamente, serve para remover +espaços em branco no final das linhas.

+
  " omni completion
+  au FileType python setlocal ofu=pythoncomplete#Complete
+  au FileType javascript setlocal ofu=javascriptcomplete#CompleteJS
+  au FileType html setlocal ofu=htmlcomplete#CompleteTags
+  au FileType css setlocal ofu=csscomplete#CompleteCSS
+  au FileType xml setlocal ofu=xmlcomplete#CompleteTags
+  au FileType php setlocal ofu=phpcomplete#CompletePHP
+
+  set completeopt-=preview
+
+

Eu não falei do Omni-complete antes porque até o momento o auto-complete +([Ctrl]p e [Ctrl]n em modo de inserção) tem resolvido todos meus problemas. +Mas, em teoria, o omni-complete consegue detectar quais elementos fazem sentido +no contexto atual, "encherga" coisas que estão no arquivo de tags e conhece +toda a sintaxe da linguagem que você está usando. Mas, realmente, o simples +auto-complete já resolve 99% dos problemas que tenho encontrado.

+

E desliga a apresentação dos resultados do omni-complete na janela de preview, +que é semelhante ao quickfix, mas na minha experiência, ela quebra muito o +fluxo de edição do código.

+

Se você quiser tentar, para usar o omni complete basta usar [Ctrl]x seguido de +[Ctrl]o.

+
  " ------------------------
+  "  Auto-commands
+  " ------------------------
+
+  " default python style
+  " (use spaces instead of tabs (expandtab), uses 4 spaces for tabs (tabstop),
+  " when auto-indenting, also use 4 spaces (shiftwidth), when deleting text, 4
+  " spaces are a tab (softtabstop) and break the line at column 78 (textwidth))
+  au FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 textwidth=78
+
+  " reStructured files follow python closely, but use 3 tab stops instead of 4
+  au FileType rst setlocal expandtab tabstop=3 sw=3 sts=3 textwidth=78
+
+  " templates (Jinja2 in this case) will use tabs instead (to reduce file size)
+  au FileType htmldjango setlocal noet tabstop=4 shiftwidth=4 softtabstop=4 textwidth=0
+  au FileType jinja setlocal noet tabstop=4 shiftwidth=4 softtabstop=4 textwidth=0
+
+  " the smarty filetypes doesn’t have any sort of indentation, so we set it to
+  " auto
+  au FileType smarty setlocal ai
+
+  " PHP break lines at column 79, like Python
+  au FileType php setlocal textwidth=79
+
+  " svn (when editing svn commit messages, break lines at
+  " column 70)
+  au FileType svn setlocal tw=70
+
+  " email (mostly mutt stuff)
+  au FileType mail setlocal spell spelllang=en
+
+  " JavaScript (who though those were "good" defaults?)
+  au FileType javascript setlocal expandtab tabstop=2 sw=2 sts=2 textwidth=0
+
+

Uma série de auto-comandos baseados no tipo de arquivo. Como eu falei antes +neste capítulo, você pode botar vários "set" um atrás do outro separados por +espaço e sets tem versões com nomes longos e nomes curtos ("sts" é um atalho +para "softtabstop", "sw" para "shiftwidth", "noet" para "noexpandtabs", "ai" +para "autoindent" e "tw" para "textwidth"). E sim, eu sei que não manti nenhum +padrão no meio, mas pelo menos agora você alguns nomes curtos para algumas +opções.

+
else
+  set autoindent                " always set autoindenting on
+endif " has("autocmd")
+
+

E, se autocmd não estiver disponível, simplesmente seta auto-indent.

+
" ------------------------
+" mapings
+" ------------------------
+
+" Easy switching between tabs (just use Alt+<tab number>)
+if has(‘mac’)
+    map <D-1> :tabn 1<CR>
+    map <D-2> :tabn 2<CR>
+    map <D-3> :tabn 3<CR>
+    map <D-4> :tabn 4<CR>
+    map <D-5> :tabn 5<CR>
+    map <D-6> :tabn 6<CR>
+    map <D-7> :tabn 7<CR>
+    map <D-8> :tabn 8<CR>
+    map <D-9> :tabn 9<CR>
+    map <D-0> :tabn 10<CR>
+
+    imap <D-1> <ESC>:tabn 1<CR>a
+    imap <D-2> <ESC>:tabn 2<CR>a
+    imap <D-3> <ESC>:tabn 3<CR>a
+    imap <D-4> <ESC>:tabn 4<CR>a
+    imap <D-5> <ESC>:tabn 5<CR>a
+    imap <D-6> <ESC>:tabn 6<CR>a
+    imap <D-7> <ESC>:tabn 7<CR>a
+    imap <D-8> <ESC>:tabn 8<CR>a
+    imap <D-9> <ESC>:tabn 9<CR>a
+    imap <D-0> <ESC>:tabn 10<CR>a
+else
+    map <M-1> :tabn 1<CR>
+    map <M-2> :tabn 2<CR>
+    map <M-3> :tabn 3<CR>
+    map <M-4> :tabn 4<CR>
+    map <M-5> :tabn 5<CR>
+    map <M-6> :tabn 6<CR>
+    map <M-7> :tabn 7<CR>
+    map <M-8> :tabn 8<CR>
+    map <M-9> :tabn 9<CR>
+    map <M-0> :tabn 10<CR>
+
+    imap <M-1> <ESC>:tabn 1<CR>a
+    imap <M-2> <ESC>:tabn 2<CR>a
+    imap <M-3> <ESC>:tabn 3<CR>a
+    imap <M-4> <ESC>:tabn 4<CR>a
+    imap <M-5> <ESC>:tabn 5<CR>a
+    imap <M-6> <ESC>:tabn 6<CR>a
+    imap <M-7> <ESC>:tabn 7<CR>a
+    imap <M-8> <ESC>:tabn 8<CR>a
+    imap <M-9> <ESC>:tabn 9<CR>a
+    imap <M-0> <ESC>:tabn 10<CR>a
+endif
+
+

Ok, este é um mapeamento que eu sempre achei interessante:

+
    +
  1. +

    Existe uma diferença entre OS X e outros sistemas que a tecla "Command" é +usada para praticamente tudo, inclusive trocar as abas nos browsers; já em +outros sistemas, a tecla para isto é "Alt". Um VIM compilado para OS X tem, +estranhamente, uma feature chamada "mac"; checando isso você consegue +descobrir se está rodando num OS X ou não.

    +
  2. +
  3. +

    Mapeamentos diferentes para modo normal e de inserção: Se estiver no modo +normal, basta usar :tabn {número} para pular diretamente para uma aba (:tabn {número} é a versão de modo de comando do {número}gt do modo normal78); +quando estiver em modo de inserção, saida do modo de inserção (simulando +pressionar [Esc] com , execute o mesmo comando usado no modo normal +para pular para uma aba específica e volte para o modo de inserção ("a").

    +
  4. +
+

BOOM! Você acabou de adicionar no VIM uma feature que existe nos browsers.

+
" custom PHP syntax file configuration
+let php_smart_members=1
+
+

Essa é uma das coisas que eu falei antes: "let" permite definir variáveis, +incluindo algumas dentro do arquivo de sintaxe. No caso "php_smart_members" +altera a forma como funções membro de uma classe em PHP seja coloridas de forma +diferente.

+

O resto do meu arquivo de configuração é usado para manter plugins, que eu vou +explicar o que cada um faz mais pra frente. Se você quiser ver o arquivo +original, ele pode ser encontrado no meu repositório de configurações (que eu +uso para manter as configurações sincronizadas entre meu computador pessoal e o +computador do trabalho).

+

1 Apenas para fazer um gancho com o que foi falado anteriormente: No +capítulo #2.5, quando estava falando de comandos do modo de comando, eu +comentei sobre :noh para desmarcar as ocorrências encontradas no último +comando de pesquisa. Bom, hlsearch faz com que estas ocorrências sejam +marcadas e se você colocar set nohlsearch, nenhuma ocorrência será marcada +e você nunca irá precisar usar :noh.

+

2 ... ou quando você usar >{movimentação} ou <{movimentação} em modo normal, +que eu não havia mencionado antes porque estávamos falando de edição de +qualquer texto e não de código fonte. >> irá adicionar um "shiftwidth" +para a direita e << irá remover um "shiftwidth" na esquerda.

+

3 Aqui acabamos de ver duas configurações de flags: Uma ativando uma +configuração ("showmatch") e outra desligando ("noerrorbells").

+

4 Uma pequena nota sobre as posições apresentadas: algumas vezes, você verá +o VIM apresentar a coluna como "{número}-{número}". Isso acontece +principalmente quando se está usando tabulações ao invés de espaços e o +VIM está indicando a contagem de caracteres na esquerda e a coluna de +exibição na direita (ou seja, o valor da direita é {quantidade de +caracteres menos tabulações} + ({quantidade de tabulações} * {"tabstop"}).

+

5 E quando digo "quebrar" eu quero dizer "quebrar" mesmo: Enquanto que +"wrap" irá cuidar apenas da apresentação do texto, "textwidth" com +"formatoptions=t" irá inserir um caractere de nova linha quando a palavra +digitada ultrapassar o limite indicado.

+

9 Note que o VIM define uma variável para isso, mas nada garante que o autor +do plugin utilizou essa tecla. Existe um padrão em usar "mapleader" como início +de comando normal de um plugin, mas nada obriga o autor do plugin à usar +esta tecla.

+

6 E, recapitulando, para reformatar o parágrafo caso você altere alguma +coisa no texto, use gq sobre a região do mesmo. O VIM irá considerar o +"textwidth" na hora de reformatar.

+

7 E não, não são todos os comandos que tem versões tanto em modo normal +o quanto em modo de comando.

+

8 E porque eu usei :tabn {número} ao invés de {número}gt? Porque quando eu +pesquisei como pular de abas, este foi o primeiro resultado que eu encontrei.

+
+ +
+ << Arquivos de Configuração +
+ + +   + + +
+ Meu .gvimrc >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/11-02-gvimrc/index.html b/public/books/uma-licao-de-vim/11-02-gvimrc/index.html new file mode 100644 index 0000000..504cf35 --- /dev/null +++ b/public/books/uma-licao-de-vim/11-02-gvimrc/index.html @@ -0,0 +1,184 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

11.02. Meu .gvimrc

+ +

Essa é a parte em que veremos mais do mesmo.

+ +

Na parte de configurações, eu falei de dois arquivos, "vimrc" e "gvimrc". Vocês já +viram o que eu fiz com meu vimrc, então acho justo que vejam também o que eu +fiz com o meu gvimrc.

+

Para que fique claro, vimrc sempre é lido, não importa qual executável do VIM +você está usando. gvimrc é lido depois do vimrc somente quando você iniciar um +VIM gráfico.

+

Como o arquivo é bem menor (já que o grosso da configuração fica no vimrc), +este é o arquivo inteiro que eu estou usando:

+
set guioptions=aegit    " basically, all options, except the scrollbar, menu and toolbar
+set columns=116         " number of columns (uses most of my screen, in this case)
+set cursorline          " highlight the line with the cursor
+set colorcolumn=+2      " put a marker at textwidth + 2
+set linespace=1         " spread the lines a bit, adding a 1px line above all
+
+if has('mac')
+    set gfn=monofur:h15     " My screen size sucks, mkay?
+    set lines=63            " number of lines, based on my screen size and font
+else
+    set gfn=monofur\ for\ Powerline\ 12
+    set lines=54
+endif
+
+

E explicando:

+ +

1 E, lembrando mais uma vez: Para desligar opções deste tipo, coloque "no" na +frente. Para desligar o highlight da linha atual do cursor, use :set nocursorline; para desligar o highlight da coluna atual do cursor, use +:set nocursorcolumn.

+
+ +
+ << Meu .vimrc +
+ + +   + + +
+ Modelines >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/11-config/index.html b/public/books/uma-licao-de-vim/11-config/index.html new file mode 100644 index 0000000..2a57ca1 --- /dev/null +++ b/public/books/uma-licao-de-vim/11-config/index.html @@ -0,0 +1,198 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

11. Arquivos de Configuração

+ +

Essa é a parte em que eu menti.

+ +

Lembram que bem no começo, quando estávamos falando dos modos de execução, eu +comentei que o modo Ex não era usado?

+

Bom, eu menti. MUAHAHAHAHA!

+

+

Na verdade, o Modo Ex não é chamado comumente, mas os arquivos de configuração +do VIM são um grande amontoado de comandos executando em modo Ex.

+

E o que é o modo Ex, afinal de contas? O modo Ex nada mais é que o modo de +comando sem a necessidade de usar : na frente de todos os comandos. Como +ficaria complicado para, por exemplo, entrar no modo Ex, executar e arquivo, +sair do modo ex e entrar em modo de inserção, até o momento temos usado o modo +de comando para isso, já que economiza um monte de tecladas. Como não iremos +ficar indo para o modo de inserção o tempo todo, e não faz sentido fazer um +arquivo gigantesco com várias linhas começando com :, também faz sentido que o +arquivo de configuração seja executado em modo Ex.

+

O VIM tem um arquivo de configuração global (conhecido com "vimrc") e um arquivo +para execução em modo gráfico ("gvimrc")1. Ainda, existem duas versões de cada +um destes arquivos: uma versão global para todos os usuários e uma versão +definida para o usuário atual. Daqui pra frente, iremos ver as configurações do +usuário, já que estas sobrepõem as globais.

+

"vimrc" e "gvimrc" ficam no diretório dos dados do usuário; em qualquer um dos +sistemas operacionais hoje, você consegue descobrir o diretório destes arquivos +com :echo $HOME dentro do próprio VIM. Apenas note que embora eu venho chamando +os arquivos de vimrc e gvimrc, os nomes são, na verdade, ".vimrc" e ".gvimrc" (ou +"_vimrc" e "_gvimrc" no caso do Windows).

+

Como existem muitas opções, não vou aqui explicar cada uma delas -- mas, no +próximo capítulo eu vou mostrar o arquivo que eu estou usando para servir de +guia.

+

O que você vai ver quando abrir um arquivo de configuração:

+

set

+

set é, efetivamente, a forma de "setar" alguma configuração no VIM.

+

Existem dois tipos de configurações: As com valores e flags.

+

Flags é mais fácil de ser explicado: você simplesmente seta a configuração. Por +exemplo, fazer com que o VIM mostre uma coluna com o número de cada linha, +você pode usar :set number (ou simplesmente set number dentro do arquivo de +configuração). Para desligar uma opção deste tipo, você só precisa adicionar +"no" na frente (para desligar number é usado :set nonumber).

+

"Valores" é exatamente o que significa: Ao invés de ser uma simples flag, a +opção recebe uma string ou número. Por exemplo, :set tabstop=4 irá definir que +o tamanho da tabulação é de 4 espaços. :set notabstop não tem efeito aqui, já +que não é uma flag.

+

Para fazer com que uma configuração volte ao seu valor/estado original, use +:set {opção}&; para verificar o valor de uma opção, use :set {opção}?.

+

Talvez a coisa não esteja muito clara aqui, mas quando examinarmos um arquivo +de configuração real, as coisas irão clarear.

+

let

+

let é usado para definir o valor de uma variável. Uma variável tem sempre um +valor -- ou seja, não existem "variáveis flags". Variáveis são normalmente +utilizadas por plugins ou arquivos de sintaxe e, portanto, as variáveis que +você terá que usar vão depender do que você está usando.

+

(Obviamente, se você estiver escrevendo seu próprio plugin — que eu não vou +abordar aqui — o uso de variáveis vai ser praticamente obrigatório.)

+

if

+

if, como em qualquer linguagem de programação, serve para execução +condicional. Você pode, por exemplo, verificar se alguma feature foi ativada na +compilação do binário, se alguma opção está ligada, etc.

+

Por exemplo, para verificar se o suporte à scripts Python foi adicionado, você +pode fazer:

+
if has('python')
+   " configuração em python vai aqui
+end
+
+

Para verificar se alguma opção está ativa:

+
if &compatible
+   " configuração em modo de compatibilidade com o VI original
+end
+
+

ou para conferir um valor:

+
if &t_Co > 2
+   " configuração quando há suporte a mais de 2 cores.
+end
+
+

E assim por diante.

+

map, imap (e outros)

+

map pode ser usado para mapear teclas para outras funções. Por exemplo :map Y y$ irá mapear "Y" para executar y$ (copiar da posição atual do cursor até o fim +da linha). Com excessão de [Shift], qualquer modificador pode ser usado:

+ +

Por exemplo, :map C-m yy irá adicionar [Ctrl]m para copiar a linha inteira.

+

Ainda, a diferença entre map e imap é que map é global enquanto que +imap só irá funcionar em modo de inserção (e assim você pode imaginar o que +nmap e vmap fazem, certo?)

+

au (ou autocmd)

+

Comandos que são executados em determinadas condições. Condições podem desde +"FileType" para ações confirme o tipo de arquivo e "BufRead", "BufWrite" e +relacionados quando um buffer for aberto ou fechado.

+

O que seriam os "relacionados"? Bom, alem de ser na leitura/escrita do arquivo, +podem ser adicionados comandos antes da execução ("BufReadPre", "BufWritePre"), +depois da execução ("BufReadPost", "BufWritePost") e durante ("BufReadCmd", +"BufWriteCmd").

+

(Existem ainda auto-comandos para quando o editor entrar em modo de edição, +abrir o VIM gráfico, VIM está fechando, e assim por diante. Para ver todos os +eventos, digite :help autocmd-events.)

+

Por exemplo, au FileType smarty set ai para ligar a auto-identação quando VIM +detectar que você está editando um arquivo Smarty (engine de templates para +PHP). Ou ainda au BufRead set nocompatible irá configurar o editor para entrar +em modo de não-compatibilidade com VI depois de abrir qualquer arquivo.

+

Ainda, é possível encadear auto-comandos, por exemplo, autocmd FileType python autocmd BufWritePre :%s/\s+$//e irá fazer com que quando o tipo de arquivo for +"python", seja criado um auto-comando que antes de salvar o arquivo, seja +executado um comando de substituição no buffer -- que remove espaços em branco +no final da linha).

+

(Se você está perdido com o que está vendo aqui, não se preocupe -- a tendência +é que, ao ver um arquivo de configuração real, você entenda o que está +acontecendo).

+

1 Existe um terceiro, .exrc, mas honestamente, em todo esse tempo usando o +VIM, eu nunca tinha ouvido falar que este arquivo sequer existia.

+
+ +
+ << Abas +
+ + +   + + +
+ Meu .vimrc >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/11-config/muahaha.jpg b/public/books/uma-licao-de-vim/11-config/muahaha.jpg new file mode 100644 index 0000000..1621b2c Binary files /dev/null and b/public/books/uma-licao-de-vim/11-config/muahaha.jpg differ diff --git a/public/books/uma-licao-de-vim/12-modelines/index.html b/public/books/uma-licao-de-vim/12-modelines/index.html new file mode 100644 index 0000000..5bfb4a6 --- /dev/null +++ b/public/books/uma-licao-de-vim/12-modelines/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

12. Modelines

+ +

Essa é a parte em que você ignora seus arquivos de configuração.

+ +

Bom, agora você sabe como configurar seu VIM, mudar configurações baseadas no +tipo de arquivo... Mas o que fazer se um arquivo tem uma configuração +completamente diferente do resto?

+

A solução são modelines. Modelines são linhas que você pode adicionar no seu +arquivo e o VIM, quando carregar o arquivo, irá mudar suas configurações +baseadas nesta linha.

+

A sintaxe da linha é, simplesmente: vim: set {configurações}:.

+

"Mas é um código fonte e se eu colocar um 'vim' no meio, o compilador vai +reclamar!", você deve estar pensando agora. Acontece que o VIM procura uma linha +válida em qualquer lugar, desconsiderando a sintaxe atual. Se você colocar o +modeline dentro de um comentário, o VIM ainda vai encontrar e ainda vai +processar o modeline e ainda vai trocar as configurações do editor (apenas para +aquele arquivo).

+

Por exemplo, para garantir que meus templates Jinja fiquem com a sintaxe +correta (usando a sintaxe de templates do Django), eu tenho colocado, como +última linha do arquivo

+
{# vim: set ft=htmldjango: #}
+
+

"ft", no caso, é o nome curto para "filetype", que define o tipo de arquivo que +está sendo usando e qual sintaxe será utilizada. E o par {# e #} são +comentários do template e completamente ignorados no resultado final.

+

Assim como vimos antes, várias configurações podem ser usadas no mesmo set. +Usando o exemplo acima, se eu quisesse que meus templates usassem tabulações ao +invés de espaços para identação mas fossem apenas 2 espaços por tabulação, eu +poderia colocar, no final do arquivo:

+
{# vim: set ft=htmldjango noet ts=2 sts=2 sw=2: #}
+
+

O VIM ainda aceita que as opções sejam separadas em vários comandos, com a +adição de ":":

+
{# vim: set ft=htmldjango:set noet:set ts=2:set sts=2:set sw=2: #}
+
+

Mas realmente não faz sentido, faz?

+

E apenas um aviso: Algumas distribuções Linux desligam modelines no arquivo +global (adicionando set nomodeline no arquivo global) e, assim, modelines são +completamente ignorados, sob a desculpa de "segurança". Tentando descobrir o +porque descobri o seguinte: O único comando que pode ser usado em modelines é +"set", ou seja, não é possível colocar um modeline que abra outro arquivo, ou +mude o diretório atual ou qualquer outra coisa; nem todas as configurações pode +ser alteradas (infelizmente, o help do VIM não lista quais são e quais não são +permitidas); e, aparentemente, a pior forma de "ataque" seria alguém colocar um +"textwidth" e seu código ficar torto na primeira edição. Se você achar que +modelines não estão sendo executados, você pode adicionar no seu vimrc set modelines para que modelines sejam processados (ou troque por uma distribuição +que não tenha configurações que não fazem sentido).

+
+ +
+ << Meu .gvimrc +
+ + +   + + +
+ Tags >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/13-tags/index.html b/public/books/uma-licao-de-vim/13-tags/index.html new file mode 100644 index 0000000..ec11a6a --- /dev/null +++ b/public/books/uma-licao-de-vim/13-tags/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

13. Tags

+ +

Essa é a parte em que você vai entender Unix um pouco.

+ +

Eu expliquei antes que haviam dois comandos para utilizar tags, [Ctrl]] e +[Ctrl]t. Existem duas coisas que eu não expliquei: O que são tags e de onde +elas vem.

+

Primeiro, tags são qualquer palavra que o editor encontre no arquivo de tags. E +o arquivo de tags pode ser definido em :set tags. Por padrão, são verificados +os arquivos ./tags ("tags" no diretório atual do editor), ./TAGS, tags +(arquivo "tags" em algum diretório de pesquisa) e TAGS.

+

Acontece que não é qualquer arquivo com este nome que o torna válido. Existem +um formato específico em que as coisas devem estar declaradas para serem +detectadas como tags. E o formato é

+
{tagname}{tagfile}{tagaddress}
+
+

(onde "tagname" é a tag em si, "tagfile" é o nome do arquivo onde a tag se +encontra e "tagaddress" é uma expressão Ex para encontrar a tag -- por exemplo, +"89" para ir para linha 89).

+

Sim, só isso. E eu sei que manter um arquivo assim é chato horrores, e por isto +existem ferramentas que já fazem isso. A mais completa de todas é "Exuberant +CTags"" e pode ser encontrada em praticamente todas as distribuições Linux +atuais, gerenciadores de pacotes do OS X e ainda vem um pacote para Windows.

+

A grande vantagem do Exuberant é a quantidade de linguagens suportadas. Assim, +se você estiver num projeto em Python e depois passar para um projeto em C, +você ainda pode usar o mesmo aplicativo.

+

A sintaxe gerado do Exuberant é "ctags {arquivos}", onde "{arquivos}" são os +arquivos a serem processados (expressões como "*.py" são válidas) ou, da forma +mais simples "ctags -R", para que todos os arquivos do diretório atual e +subdiretórios sejam processados.

+

Uma vez que este arquivo tenha sido criado, dentro do editor você pode usar +[Ctrl]] para tentar achar a definição da tag (que, com o uso do Exuberant +significa definição de funções ou definições de variáveis) e [Ctrl]t para +retornar para a localização anterior. Se houver mais de um arquivo com uma +definição válida, o VIM irá mostrar uma lista das localizações e você poderá +selecionar qual deve ser acessada.

+

A única dica que sobra aqui é cuidar com arquivos minificados. Isso porque o +Exuberant entende arquivos CSS. Não que arquivos CSS sejam um problema, mas o +Exuberant coloca a expressão regular da linha onde a tag se encontra e, num +arquivo minificado, a expressão acaba sendo uma linha gigantesca, que fica se +repetindo em vários lugares do arquivo, deixando-o gigantesco. Se você tiver +algo desse tipo, use a opção "--exclude={expressão}", onde "{expressão}" é a +expressão regular que define o nome dos arquivos que devem ser ignorados.

+
+ +
+ << Modelines +
+ + +   + + +
+ Plugins - Vundle >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-01-vundle/index.html b/public/books/uma-licao-de-vim/14-01-vundle/index.html new file mode 100644 index 0000000..c9355ef --- /dev/null +++ b/public/books/uma-licao-de-vim/14-01-vundle/index.html @@ -0,0 +1,170 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.01. Plugins - Vundle

+ +

Essa é a parte em que começamos a mexer ao redor do VIM.

+ +

Vamos começar a ver como adicionar funcionalidades no VIM com plugins. E, para +isso, vamos ver Vundle, que é um gerenciador de plugins.

+

A pergunta que você deveria estar se fazendo agora é "E por que usar o +Vundle?". Na verdade, esta pergunta tem duas respostas:

+

A primeira é: Apesar de ser extremamente fácil de adicionar um plugin no VIM -- +normalmente é uma questão de descompactar um arquivo dentro do diretório +$HOME/.vim -- a parte chata é manter os scripts atualizados (e ficar preso à um +arquivo compactado) e removê-los depois, se você encher o saco de um.

+

A segunda é: Vundle não é o único gerenciador de plugins para VIM, mas consegue +instalar plugins por conta própria (Pathogen requer que você baixe os plugins +manualmente, assumindo depois o controle para manter atualizado); a desvantagem +é que Vundle requer que os scripts tenham uma determinada estrutura de arquivos +e diretórios, mas praticamente todos os scripts hoje utilizam esta estrutura.

+

Então vamos lá, instalar o Vundle:

+

Primeiro, você deve baixar o plugin em si. Para isso, você tem que ter o Git +instalado e executar:

+
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
+
+

Simplesmente, você está copiando o repositório do vundle para um diretório do +próprio VIM. Até aqui nenhuma surpresa, exceto que o diretório de plugins é +$HOME/.vim/plugin (ou ~/.vim/plugin) e o clone colocou no diretório +~/.vim/bundle. Ou seja, o Vundle não está ativo como um plugin do VIM (ainda). +O Vundle faz isso de propósito, para que os scripts instalados com o Vundle não +se misturem com os plugins instalados manualmente.

+

A seguir, é preciso ativar o Vundle. Para isso, nós vamos adicionar o diretório +do Vundle no path do VIM e chamar o script de inicialização. Para isto, +adicione as seguintes linhas no seu vimrc:

+
set rtp+=~/.vim/bundle/vundle/
+call vundle#rc()
+
+

Explicando: "rtp" é a forma curta de "runtimepath", que identifica os +diretórios onde o VIM irá procurar scripts, se preciso. No caso, estamos +adicionando o diretório do Vundle, que clonamos anteriormente. A seguir é +chamado o script de inicialização do Vundle.

+

Pronto! Agora o Vundle está instalado.

+

A questão é: E agora que o Vundle está instalado, "faz o que?"

+

O Vundle tem mais comandos disponíveis, entre eles :Plugin "{bundle}"1. Este +comando adiciona um bundle/plugin/script na lista de bundles/plugins/scripts +gerenciados pelo Vundle. A única coisa que esse comando faz é adicionar o +bundle na lista; ele não vai instalar o bundle ainda, ele não vai remover o +bundle, ele não vai atualizar o bundle. Apenas adicionar na lista.

+

O parâmetro do comando, {bundle} pode ser:

+ +

Uma vez que você tenha a lista de plugins que você quer no sistema, você pode +instalar todos usando :PluginInstall; se quiser remover um plugin, você +simplesmente o deixa fora da lista de plugins desejados e executa :PluginClean; +e, para atualizar os plugins que estão instalados, :PluginUpdate.

+

Acho que você já percebeu que o problema de se manter uma lista de plugins +manualmente é meio chato: Toda vez que você quiser verificar se há atualizações +dos plugins, você tem que entrar a lista inteira; se você esquecer de um plugin +e fizer :PluginClean irá remover esse plugin. Para evitar essa complicação, +você pode adicionar os comandos Plugin diretamente no seu vimrc2. Assim, cada +vez que você usar qualquer comando do Vundle, você não precisa se preocupar em +lembrar de todos os plugins instalados.

+

E, como última dica, fica o seguinte: Logo após a linha do "call vundle#rc()", +adicione

+
Plugin 'gmarik/vundle'
+
+

.. que nada mais é que o repositório que fizemos o clone logo no começo; desta +forma, quando você fizer um :PluginUpdate, o próprio Vundle poderá ser +atualizado com a última versão disponível.

+

1 Lembram que eu falei que plugins poderiam adicionar novos comandos e que +estes teriam pelo menos a primeira letra em maiúsculas? Pois é...

+

2 Lembre-se também que o vimrc é um arquivo executado em modo Ex e o modo Ex +nada mais é que o modo de comando sem precisar colocar : na frente de cada +comando.

+
+ +
+ << Tags +
+ + +   + + +
+ Plugins - Airline >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-02-airline/airline-everything.png b/public/books/uma-licao-de-vim/14-02-airline/airline-everything.png new file mode 100644 index 0000000..112be77 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-02-airline/airline-everything.png differ diff --git a/public/books/uma-licao-de-vim/14-02-airline/airline-laststatus.png b/public/books/uma-licao-de-vim/14-02-airline/airline-laststatus.png new file mode 100644 index 0000000..f91d4c5 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-02-airline/airline-laststatus.png differ diff --git a/public/books/uma-licao-de-vim/14-02-airline/airline-nofonts.png b/public/books/uma-licao-de-vim/14-02-airline/airline-nofonts.png new file mode 100644 index 0000000..ce8a973 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-02-airline/airline-nofonts.png differ diff --git a/public/books/uma-licao-de-vim/14-02-airline/index.html b/public/books/uma-licao-de-vim/14-02-airline/index.html new file mode 100644 index 0000000..485897c --- /dev/null +++ b/public/books/uma-licao-de-vim/14-02-airline/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.02. Plugins - Airline

+ +

Essa é a parte em que o "laststatus" fica interessante.

+ +

Quando estávamos falando de configurações, falamos de uma configuração chamada +“laststatus”. Esta configuração tem 3 valores possíveis:

+ +

E, conforme eu mostrei no meu arquivo de configuração, eu sempre deixo com 2".

+

Acontece que a barra de status não é tããão informativa assim.

+

+

Ela tem o básico, mas o básico não é o suficiente, sejamos honestos. É possível +adicionar mais informações setando "statusline" (que eu não vou entrar em +detalhes aqui, mas para configurar, você tem que usar letras únicas indicado +para cada coisa que deseja apresentar tal como se faz com "guioptions") mas, +mesmo assim, certas coisas tem que vir de scripts externos (por exemplo, para +mostrar o branch atual que você está) e, como eu falei, essa parte é meio +chata.

+

Para aliviar essa confusão, existe um plugin chamado "Vim-Airline", que tem uma +apresentação mais complexa e oferece mais informações, baseados plugins que +você tem instalado.

+

Ainda, o Airline é uma versão mais leve do Powerline, que na verdade passou de +ser um simples plugin para VIM para ser um plugin para praticamente tudo (hoje +eu uso o Powerline para configurar meu prompt do terminal, por exemplo) e +algumas coisas ainda são usadas do Powerline (por exemplo, as fontes, mas +esperem aí que eu já explico o porque o Airline usa fontes especiais.)

+

(Conforme formos passando a lista de plugins que eu tenho, vocês vão ver o +Airline mudando de formato com o tempo.)

+

Como falei do Vundle como gerenciador de plugins, vamos usar o mesmo para +instalar (e manter, no futuro) o Airline.

+

No seu vimrc, adicione o seguinte:

+
Plugin "bling/vim-airline"
+
+

E, revisando: :Plugin adiciona um plugin na lista de plugins gerenciados pelo +Vundle (e apenas isso, nada mais); por ter uma barra no meio, estamos falando +de um repositório do Github; para instalar o plugin, você precisa ou adicionar +o plugin na lista manualmente (com o comando :Plugin) ou reiniciar o VIM caso +você queria conferir se a configuração no seu vimrc está certa e fazer +:PluginInstall.

+

Se nada apareceu, é porque o seu "laststatus" não está em "2".

+

Se tudo deu certo, você verá o seguinte:

+

+

Não que tenha melhorado muito, mas agora você tem informações sobre qual o modo +que você está atualmente (que vai mudar de cor conforme você passa para o modo +de inserção ou visual), o nome do arquivo, o tipo de arquivo (que define qual a +sintaxe está sendo usada), posição do cursor em relação ao todo do arquivo (em +percentual) e a posição absoluta do mesmo (em linhas em colunas).

+

Ok, duas coisas: Ainda não é muito melhor (embora a parte de mostrar o modo +ajude, acredite), mas temos alguns caracteres estranhos na barra.

+

É aí que entra a história do Powerline de novo: Os criadores do Powerline +usaram "posições" não usadas nas fontes unicode para adicionar outros +caracteres que são usados para melhorar a apresentação do status. Eles mantém +um repositório com fontes já com os caracteres especiais +e, caso a fonte que você queria não esteja na lista deles, eles tem um script +para "patchear" a fonte desejada.

+

Uma vez que você tenha a fonte disponível no seu sistema, você deve adicionar no seu vimrc

+
let g:airline_powerline_fonts = 1
+
+

E o seu Airline, na próxima execução, deve ficar

+

+

Que é mais bonito, mas ainda continua mostrando as mesmas informações. Mais pra +frente veremos ã integração com “Fugitive” (um plugin para VIM para Git) e o +Syntastic (para validar o código com ferramentas externas) e como ambos são +suportados pelo Airline, você terá todas as informações ao alcance do rodapé da +janela.

+

+

Uma última nota: O Airline vem com suporte a temas, que você pode trocar usando +:AirlineTheme (e um duplo [Tab] depois disso irá mostrar os temas instalados). +Depois que escolher um, você pode definir

+
let g:airline_theme = '{nome do tema}'
+
+

no seu vimrc.

+
+ +
+ << Plugins - Vundle +
+ + +   + + +
+ Plugins - Fugitive >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-02-airline/laststatus.png b/public/books/uma-licao-de-vim/14-02-airline/laststatus.png new file mode 100644 index 0000000..018b299 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-02-airline/laststatus.png differ diff --git a/public/books/uma-licao-de-vim/14-03-fugitive/index.html b/public/books/uma-licao-de-vim/14-03-fugitive/index.html new file mode 100644 index 0000000..53124c8 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-03-fugitive/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.03. Plugins - Fugitive

+ +

Essa é a parte que só faz sentido se você usa Git.

+ +

O terceiro plugin que eu vou comentar é +Fugitive, que adiciona comandos para +gerenciar seu repositório Git dentro do VIM.

+

Para instalar, ou você baixa a versão do Github (no link acima) ou usa o Vundle:

+
Plugin "tpope/vim-fugitive"
+
+

(E, de novo: depois de adicionar essa linha no seu vimrc, você deve sair do VIM +-- ou, se não quiser fazer tudo isso, basta usar o comando acima em modo de +comando -- e usar :PluginInstall para instalar o plugin.)

+

A princípio, nada de diferente deve aparecer. Mas você agora pode usar qualquer +comando do Git com :Git {comando}, como faria no shell.

+

Mas só adicionar um comando não é o que o Fugitive faz. Ele também adiciona +outros comandos:

+ +

Existem outros, mas você vai usar principalmente estes. E cuide para que você +esteja dentro de um repositório Git antes de tentar usar os comandos; se o VIM +não estiver num diretório com um repositório válido, nenhum dos comandos do +Fugitive ficarão disponíveis1.

+

E, como última dica: Se você estiver usando o Airline (comentado no capítulo +anterior), adicione

+
let g:airline_enable_branch = 1
+
+

... no seu vimrc e o branch atual será apresentando dentro do status do +Airline, logo após o indicador de modo.

+

1 Eu só preciso adimitir que não testei para ver o que acontece se você +abrir o VIM fora de um repositório e depois usar :cd para mudar para um +diretório que tem um repositório ou tentar abrir um arquivo que está +dentro de um repositório para verificar se os comandos se tornam +disponíveis.

+
+ +
+ << Plugins - Airline +
+ + +   + + +
+ Plugins - Commentary >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-04-commentary/index.html b/public/books/uma-licao-de-vim/14-04-commentary/index.html new file mode 100644 index 0000000..80482f5 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-04-commentary/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.04. Plugins - Commentary

+ +

Essa é a parte em que automatizamos a técnica de sumir código sem sumir com o +código.

+ +

O quarto plugin da lista de plugins é +Commentary.

+

Como de costume, para instalar, você pode baixar o conteúdo do repositório +acima para dentro do seu ~/.vim/ (o diretório, não o arquivo de inicialização) +ou usar o Vundle:

+
Plugin "tpope/vim-commentary"
+
+

Commentary não é um plugin visual, o que significa que, mais uma vez, depois de +instalado você não verá nada de novo.

+

O que o Commentary faz é adicionar um atalho para comentar linhas de código, +baseado no tipo de arquivo atual. O atalho é \\{movimentação} ou \\\ para +comentar a linha atual (ou você pode entrar em modo visual para selecionar as +linhas e fazer \\ e a parte selecionada vai ficar comentada); para descomentar, +basta fazer a mesma coisa (ou seja, se o pedaço selecionado não estiver +comentado, ele será comentado; se já estiver comentado, o comentário será +removido.)

+

E era isso.

+

A única ressalva aqui fica por conta de um comportamento padrão do VIM: O VIM +tem apenas um tipo de arquivo (definido com :set filetype={sintaxe}) que vale +para todo o arquivo. Assim, se você estiver usando a sintaxe de HTML, +Commentary provavelmente não irá comentar seu código JavaScript corretamente. A +coisa fica pior se você estiver editando um arquivo com sintaxe de template, já +que o tipo de arquivo é o template, não HTML ou JavaScript ou CSS.

+

Ainda, aproveitando o gancho, existem sintaxes e sintaxes. Algumas sintaxes são +antigas e estão definidas de uma forma que o VIM perde o contexto do código +apresentado e apresenta com a coloração errada (andar no texto em direção ao +começo do arquivo, com [PageUp], normalmente resolve esse problema, pois o VIM +encontra um ponto onde a sintaxe volta a fazer sentido). Por exemplo, a sintaxe +"htmldjango", que funciona também para arquivos Jinja2 tem a leve tendência de +se perder em arquivos muito longos; usando uma sintaxe externa para Jinja2 +(usando :Plugin "Glench/Vim-Jinja2-Syntax") esse problema não acontece.

+

Então lembre-se: Se a sintaxe "pirar", voltar um pouco para o começo do arquivo +deve resolver (e, depois disso, o VIM carrega o contexto a medida que você for +voltando para o ponto original) e sempre verifique se não há um arquivo de +sintaxe que corresponda melhor às suas necessidades.

+
+ +
+ << Plugins - Fugitive +
+ + +   + + +
+ Plugins - Tabular >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-05-tabular/index.html b/public/books/uma-licao-de-vim/14-05-tabular/index.html new file mode 100644 index 0000000..1c153d1 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-05-tabular/index.html @@ -0,0 +1,156 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.05. Plugins - Tabular

+ +

Essa é a parte em que deixamos as coisas alinhadas.

+ +

O quinto plugin da lista de plugins é +Tabular, um plugin para alinhar +elementos baseados em expressões regulares (calma, não é tão complicado quando +parece.)

+

Mais uma vez, para instalar pelo Vundle:

+
Plugin "godlygeek/tabular"
+
+

Assim como Fugitive e Commentary, Tabular não é um plugin visual, mas adiciona +um novo comando :{range}Tabularize {expressão regular}.

+

(Apenas lembrando de {range}: são dois indicadores separados por vírgula, +números são linhas, "$" é a última linha do arquivo, "%" é igual à "1,$" (todo o +arquivo), "'{marcador1},'{marcador2}" vai do marcador1 até o marcador2 e, se você +selecionar uma região no modo visual, ao pressionar :, o prompt deve ficar "'< +,'>" que são os marcadores especiais de início e fim, respectivamente, da área +visual. Todos os exemplos que eu vou mostrar daqui pra frente vão usar o +{range} de início e fim do bloco visual, porque faz mais sentido.)

+

A forma mais simples de usar o Tabular é passar um único caractere, que indica +qual o ponto onde os elementos serão alinhados. Por exemplo, com o seguinte +trecho de código:

+
var pos = 1;
+var element = $(this);
+var i = 0;
+
+

Se você selecionar o mesmo visualmente e fizer :'< ,'>Tabularize /=, o resultado será:

+
var pos     = 1;
+var element = $(this);
+var i       = 0;
+
+

Ao contrário da pesquisa (e da substituição), Tabularize aceita um segundo +parâmetro que indica como os elementos devem ser alinhados e qual o espaçamento +que deve existir entre os elementos. Este parâmetro pode ser até 3 pares, no +formato {alinhamento}{espaços depois do elemento} que, apesar da minha péssima +descrição, não é tão complicado assim.

+

Por exemplo, imagine que eu tenho o seguinte pedaço de código em HTML:

+
<input class='block-size disabled'
+    id='input-box'
+    name='login'
+    value=''
+    placeholder='Enter your login'>
+
+

No caso, eu estou quebrando cada um dos elementos para diminuir o tamanho da +linha, já que ainda não coloquei minhas opções de templating e cada uma destas +linhas deve ficar bem maior. Mas, como exemplo, serve.

+

O que eu quero é que os "=" fiquem alinhados (mais ou menos o que o Xcode faz +com código Objective-C). Assim, eu posso fazer :'< ,'>Tabularize /=/r0c0l0 para +obter:

+
   <input class='block-size disabled'
+             id='input-box'
+           name='login'
+          value=''
+    placeholder='Enter your login'>
+
+

A explicação está no parámetro: o primeiro par, "r0" siginfica que o elemento +antes do alinhamento deve ser alinhado à direita ("r") com 0 espaços depois do +elemento; "c0" significa que o elemento de alinhamento (no nosso caso, "=") +deve ser centralizado ("c") também com 0 espaços depois; e finalmente "l0" +significa que o elemento depois do alinhamento deve ficar à esquerda ("l") e +nenhum espaço deve ser adicionado.

+

Se eu quisesse que o espaço não ficasse grudado tanto na esquerda quando na +direita, eu teria que fazer :'< ,'>Tabularize /=/r1c1l0 para obter:

+
   <input class = 'block-size disabled'
+             id = 'input-box'
+           name = 'login'
+          value = ''
+    placeholder = 'Enter your login'>
+
+
+ +
+ << Plugins - Commentary +
+ + +   + + +
+ Plugins - Auto-pairs >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-06-autopairs/index.html b/public/books/uma-licao-de-vim/14-06-autopairs/index.html new file mode 100644 index 0000000..d9966e9 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-06-autopairs/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.06. Plugins - Auto-Pairs

+ +

Essa é a parte em que o VIM fecha as coisas pra você.

+ +

O sexto plugin da lista de plugins que eu vou falar é +Auto-Pairs. Como de costume, para +instalar o plugin pelo Vundle:

+
Plugin "jiangmiao/auto-pairs"
+
+

Uma vez instalado o plugin, você verá que cada ', ", (, [ e { irá, +automagicamente, gerar o seu respectivo ', ", ), ] e }. Simples assim.

+

Entretanto, Auto-Pairs não funciona bem com o modo visual (se você já usou +TextMate ou Sublime Text, deve ter percebido que se você usar uma das +combinações acima com uma área selecionada, o editor vai "circular" a área +selecionada com o par indicado). O que existe é [Alt]e em modo de inserção que +faz a troca rápida entre o caractere de fechamento de pair com a próxima +palavra.

+

Por exemplo, se você tiver

+
''auto
+
+

... com o cursor posicionado entre as duas aspas e usar [Alt]e, você irá ficar com

+
'auto'
+
+

Ainda, o Auto-pairs tem um controle para "pular" sobre os caracteres de +fechamento já existentes. Se ele adicionar um ")" (que deve ficar antes do +cursor), quando você pressionar ")" no seu teclado, ao invés de adicionar mais +um ")", o cursor irá pular o ")" existente.

+

Embora isso pareça bom, em certos casos pode ser um problema. Por exemplo, caso +você tenha o seguinte trecho de código:

+
$(function () {
+  $('#button').on('click', function () {
+
+})
+
+

Se você tentar fechar a função interna, o Auto-Pairs irá, na verdade, saltar +para o fechamento da função externa, efetivamente "proibindo" que você feche as +funções corretamente. Soluções são:

+ +
+ +
+ << Plugins - Tabular +
+ + +   + + +
+ Plugins - Syntastic >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-07-syntastic/index.html b/public/books/uma-licao-de-vim/14-07-syntastic/index.html new file mode 100644 index 0000000..1da30de --- /dev/null +++ b/public/books/uma-licao-de-vim/14-07-syntastic/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.07. Plugins - Syntastic

+ +

Essa é a parte que o VIM ajuda você a achar o que tem de errado no seu +código.

+ +

O sétimo plugin discutido é o Syntastic. +Para instalar com Vundle:

+
Plugin "scrooloose/syntastic"
+
+

Inicialmente, Syntastic não faz nada. O que ele faz é, depois de salvar o +arquivo em disco, chama a função de lint para o tipo de arquivo atual e mostra +os problemas encontrados no canto esquerdo do código; ao passar pela linha com +problema, o erro encontrado é reportado na linha de comando.

+

+

Para ver quais são todos os erros encontrados pelo aplicativo de lint, use +:Errors, que irá abrir uma janela de quickfix com a lista de erros encontrados. +Ações de janelas e de quickfix, que já vinhamos vendo, continuam valendo. É só +o comando para abrir o quickfix que é diferente neste caso.

+

Você pode selecionar quais lints serão usados adicionado com let g:syntastic_{linguagem}_checkers=[''] (por exemplo, para verificar arquivos Python apenas +com PyLint, você deve usar let g:syntastic_python_checkers=['pylint'] mas nunca +tive problemas com os lints atuais).

+

Uma coisa que deve ser cuidada é que o lint deve estar disponível no momento +que o VIM abriu o arquivo, senão ele não será usado. Por exemplo, se você tiver +pylint disponível apenas dentro de um virtualenv, chamar o VIM antes de estar +no virtualenv fará com que Syntastic não encontre o pylint e, com isso, nenhum +erro será reportado.

+

Ainda, assim como aconteceu com Commentary, Syntastic usa o tipo de arquivo +atual, não o do bloco. Por exemplo, ao editar um arquivo de template de Django, +que tem partes na linguagem de template do Django, HTML, CSS e JavaScript, +mesmo que você tenha os lints para HTML, CSS e JavaScript instalados, estes não +serão executados -- porque o VIM considera o arquivo um tipo inteiro, não um +conjunto de pequenos blocos de tipos diferentes.

+

E, por último, Airline tem suporte para mostrar os erros encontrados pelo +Syntastic na barra de status. Se você adicionar

+
let g:airline_enable_syntastic = 1
+
+

... no seu vimrc, o canto direito da barra de status irá mostrar a primeira +linha com erro e a quantidade de erros encontrados.

+

+
+ +
+ << Plugins - Auto-Pairs +
+ + +   + + +
+ Plugins - SnipMate >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-07-syntastic/syntastic-airline.png b/public/books/uma-licao-de-vim/14-07-syntastic/syntastic-airline.png new file mode 100644 index 0000000..5c0a280 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-07-syntastic/syntastic-airline.png differ diff --git a/public/books/uma-licao-de-vim/14-07-syntastic/syntastic.png b/public/books/uma-licao-de-vim/14-07-syntastic/syntastic.png new file mode 100644 index 0000000..d985ae0 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-07-syntastic/syntastic.png differ diff --git a/public/books/uma-licao-de-vim/14-08-snipmate/index.html b/public/books/uma-licao-de-vim/14-08-snipmate/index.html new file mode 100644 index 0000000..4b0df66 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-08-snipmate/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.08. Plugins - Snipmate

+ +

Essa é a parte que automatizamos a digitação de coisas repetidas.

+ +

Para o oitavo plugin, iremos falar sobre SnipMate.

+

Como de costume, instalando pelo Vundle:

+
Plugin "msanders/snipmate.vim"
+
+

SnipMate adiciona a funcionalidade de snippets dentro do VIM. Para quem não +sabe, snippets são trechos de código que são adicionados automaticamente (ou +com a ação de alguma combinação de teclas) a partir de uma simples palavra.

+

Por exemplo, um dos snippets que já estão inclusos no pacote do SnipMate, você +pode, num arquivo JavaScript, simplesmente digitar:

+
fun
+
+

... e, ao pressionar [Tab], o SnipMate irá adicionar, automaticamente

+
function function_name (argument) {
+  // body...
+}
+
+

... posicionando o cursor diretamente sobre "function_name" para que você coloque +o nome da função; pressionando [Tab] irá posicionar o cursor sobre "argument" e +pressionando [Tab] de novo, o cursor ficará sobre "// body..." (depois disso, +[Tab] irá funcionar como tabulação, como normalmente é).

+

Para criar seus próprios snippets, você tem duas opções e ambas devem ficar no +diretório $HOME/.vim/snippets:

+

A primeira forma é através de um único arquivo, com o nome do tipo de arquivo +em que os snippets serão válidos (que você pode ver usando :set ft) com a +extensão snippets (por exemplo, para snippets para arquivos Python, você teria +um arquivo "$HOME/.vim/snippets/python.snippets"). Neste arquivo você deve +iniciar os snippets com a palavra snippet, seguida da palavra que será +utilizada para identificar o snippet, seguido pelo snippet em si, com uma +tabulação na frente (quando não houver tabulação, SnipMate considera que o +snippet terminou). Os pontos onde você quer que o cursor pare devem ser +identificados por "${{número}:{texto}}" e, se ficou confuso, é porque eu estou +usando "coisas que você substituir" com {} e o próprio SnipMate usa {} para +blocos, mas deve ficar mais claro com este exemplo:

+
snippet for
+    {% for ${1:record} in ${2:list} %}
+        ${3:content}
+    {% endfor %}
+
+

Este snippet, para Django e Jinja, faz um loop "for". Ao digitar "for" e +pressionar [Tab], o conteúdo será adicionado, o cursor será posicionando onde +${1:record} está permitindo a alteração do mesmo, pressionando [Tab] de novo +irá posicionar em ${2:list} e assim por diante.

+

E, caso você esteja se perguntando "E o que acontece se eu colocar o mesmo +número em dois lugares diferentes?", a resposta é: lugares com o mesmo número +são alterados ao mesmo tempo. Por exemplo, o snippet:

+
snippet block
+    {% block ${1:blockname} %}
+        ${2:{% content %}}
+    {% endblock $1 %}
+
+

... tem o número "1" duas vezes (uma depois de "block" e outra depois de +"endblock"). Quando você colocar o nome do bloco no primeiro (do lado de +"block"), o outro (depois de "endblock") será preenchido automaticamente.

+

A segunda forma de adicionar snippets é através de arquivos individuais. Ao +invés de ter um arquivo com o tipo de arquivo com todos os snippets dentro, +você irá criar um diretório com o tipo de arquivo e cada arquivo dentro deste +diretório deve ser "{palavra}.snippet". Assim, como no exemplo anterior tínhamos +um arquivo "$HOME/.vim/snippets/htmldjango.snippets", poderíamos ter, na verdade, +um diretório "$HOME/.vim/snippets/htmldjango/" e, dentro deste diretório, um +arquivo chamando "block.snippet" com o conteúdo do snippet, sem as tabulações (já +que agora o SnipMate sabe exatamente onde termina o snippet: no final do +arquivo).

+

E quando usar um ou outro? Você deve usar arquivos individuais se o SnipMate já +tiver um arquivo de snippets para o tipo de arquivo especificado. Assim, se +você quiser adicionar novos snippets para Python, que já tem uma série de +snippets prontos incluídos no pacote do próprio SnipMate, você deve usar a +segunda forma. Caso contrário, fica por preferência pessoal.

+

E, para concluir: Ao escrever este post, descobri que existe um fork da versão +apresentada aqui. A versão do "msanders" não é atualizada a 4 anos -- mas +funciona perfeitamente e tenho usado sem problemas a bastante tempo. Se você +quiser algo mais recente (por algum motivo), o fork está em +github.com/garbas/vim-snipmate (e requer mais dependências que a versão +original).

+
+ +
+ << Plugins - Syntastic +
+ + +   + + +
+ Plugins - CtrlP e CtrlPFunky >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-09-ctrlp/ctrlp.png b/public/books/uma-licao-de-vim/14-09-ctrlp/ctrlp.png new file mode 100644 index 0000000..ac3c4c7 Binary files /dev/null and b/public/books/uma-licao-de-vim/14-09-ctrlp/ctrlp.png differ diff --git a/public/books/uma-licao-de-vim/14-09-ctrlp/index.html b/public/books/uma-licao-de-vim/14-09-ctrlp/index.html new file mode 100644 index 0000000..7ffd8f2 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-09-ctrlp/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.09. Plugins - CtrlP and CtrlPFunky

+ +

Essa é a parte em que você vai ter a impressão de estar programando em Perl, +porque qualquer caractere é válido.

+ +

O nono e penúltimo plugin (na verdade os nonos e penúltimos plugins) discutido +é o CtrlP e seu plugin (sim, um plugin do +plugin1) CtrlPFunky

+

Para instalar os dois, com Vundle:

+
Plugin "kien/ctrlp.vim"
+Plugin "tacahiroy/ctrlp-funky"
+
+

CtrlP é um plugin que facilita encontrar e abrir arquivos, com procura fuzzy. +E, por procura fuzzy eu quero dizer que ele encontra qualquer arquivo que tenha +as letras digitadas na ordem que você digitou.

+

+

Para acionar o CtrlP, você deve digitar, logicamente, [Ctrl]p. Ao fazer isso, +uma janela parecida com a Quickfix irá aparecer, mostrando alguns arquivos e um +prompt para que você digite o que quer encontrar. No exemplo acima, como que +digitei "vim", ele encontrou todos os arquivos a partir do diretório atual que +começavam com "v", tinham um "i" no meio e terminavam com "m" (seria +basicamente o mesmo que pegar a lista de arquivos a partir do diretório atual e +seus sub-diretórios e procurar pela regex "v.*i.*m".)

+

Uma vez que você encontre o arquivo desejado na lista (ela não tem rolagem, +então se você ainda não estiver vendo o arquivo, continue adicionando +caracteres para que o arquivo desejado apareça na lista -- uma vez lá, você pode +selecioná-lo com as setas), você pode:

+ +

Um problema que você talvez encontre é que o CtrlP costuma listar tudo que se +encaixar na expressão utilizada, inclusive arquivos binário, objetos +intermediários, etc. Para remover estes arquivos da listagem, você pode usar +:set wildignore, que também afeta a lista de arquivos que o VIM mostra quando +você estiver usando os comandos normais de abertura de arquivo (:e, :tabe, +etc).

+

Como a configuração do wildignore é uma lista, você pode adicionar ou remover +usando += e -=. Por exemplo, para ignorar os arquivos de objetos compilados do +Python e o diretório que o setup.py constuma usar para construir o pacote de +distribuição do módulo, você teria:

+
set wildignore+=*.pyc
+set wildignore+=*/build/*
+
+

ou ainda, para economizar uma linha:

+
set wildignore+=*.pyc,*/build/*
+
+

CtrlP tem um plugin, chamado CtrlPFunky. O que ele faz é basicamente o mesmo +que o CtrlP, mas procurando funções, não arquivos.

+

Para ativar o CtrlPFunky, você precisa primeiro adicionar o mesmo como uma +extensão do CtrlP (e, só pra avisar, isso é específico do CtrlP, não algo que +funciona com todo e qualquer plugin):

+
let g:ctrlp_extensions = ['funky'] 
+
+

Uma vez instalado, você pode usar :CtrlPFunky para mostrar a lista de funções +no fonte (e a procura continua igual). O problema com CtrlPFunky é que, assim +como todas as demais coisas que vínhamos vendo, ele se basea no tipo de arquivo +atual (:set ft) e para arquivos em que o conteúdo e uma mistura de várias +linguagens (p.ex., arquivo template com a linguagem de template, HTML, CSS e +JavaScript), a listagem de funções pode não ser o que você está esperando (ou +sequer vai funcionar).

+

Para facilitar a sua vida, você pode fazer um mapeamento do comando para um +atalho de teclado. Por exemplo, eu coloquei [Ctrl]o para chamar o CtrlPFunky +com

+
nnoremap <C-O> :CtrlPFunky<CR>
+
+

1 "Plugin-ception" har har har2.

+

2 Eu não consigo entender porque as pessoas utilizando tanto o "ception" +quando encontram um meta desta jeito. Um "inception" é a inserção de uma +idéia de forma que a pessoa pense que a idéia é dela, não uma +"Matrioska".

+
+ +
+ << Plugins - SnipMate +
+ + +   + + +
+ Plugins - Vim-Multiple-Cursors >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/14-10-multiple-cursors/index.html b/public/books/uma-licao-de-vim/14-10-multiple-cursors/index.html new file mode 100644 index 0000000..8152b48 --- /dev/null +++ b/public/books/uma-licao-de-vim/14-10-multiple-cursors/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

14.10. Plugins - Vim-Multiple-Cursors

+ +

Essa é a parte em que você pode repetir várias coisas, visualmente.

+ +

O último plugin da lista de plugins é o Vim-Multiple-Cursors.

+

Já que sempre falamos em usar Vundle...

+
Plugin "terryma/vim-multiple-cursors"
+
+

Assim como outros plugins já comentados, Vim-Multiple-Cursors não tem nenhuma +apresentação inicial. O que este plugin faz é permitir que você tenha várias +cursores no texto ao mesmo tempo, aplicando a mesma transformação em todos os +lugares.

+

A forma mais simples de usar Vim-Multiple-Cursors é ir até a palavra que você +quer alterar e pressionar [Ctrl]n. Você vai notar que o VIM irá mostrar como se +você tivesse entrado em modo visual e selecionado apenas aquela palavra, o que +não é nada impressionante. No entanto, se você pressionar [Ctrl]n de novo, você +verá que o cursor irá para a próxima ocorrência da palavra. Na verdade, o que +você tem agora são dois cursores e tudo que você fizer em um será repetido no +outro. Por exemplo, se você fizer ce sobre a palavra, você verá as duas +palavras mudando ao mesmo tempo.

+

De certa forma, o que você está fazendo é um "search and replace" só que está +vendo exatamente o que vai ser alterado.

+

Teoricamente, você poderia fazer I"[Esc]ea" para adicionar aspas ao redor da +palavra, mas há um pequeno inconveniente: [Esc], que você precisa usar para +retornar para o modo normal depois de entrar em modo de inserção com I irá +também terminar o modo de múltiplos cursores.

+

A segunda forma de usar Vim-Multiple-Cursors é fazer uma seleção visual e usar +[Ctrl]n. Para cada linha da seleção, será adicionado um novo cursor. E, +novamente, o que você fizer em um deles será repetido em todos.

+

Simples assim.

+

A única coisa que eu posso deixar de aviso é que, por algum motivo, utilizando +uma seleção visual de várias linhas ([Shift]v), entrando em modo de múltiplos +cursores ([Ctrl]n) e usando aspas (com o Auto-Pairs), meu undo acabou sendo +perdido (u removia o texto inteiro, não a alteração feita com +Vim-Multiple-Cursors).

+
+ +
+ << Plugins - CtrlP e CtrlPFunky +
+ + +   + + +
+ Conclusão >> +
+ +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/15-conclusao/index.html b/public/books/uma-licao-de-vim/15-conclusao/index.html new file mode 100644 index 0000000..5f52c7c --- /dev/null +++ b/public/books/uma-licao-de-vim/15-conclusao/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

15. Conclusão

+ +

Essa é a parte em que nos despedimos.

+ +

Pessoalmente, a palavra que eu usaria para descrever o VIM é extensível. Não +apenas pela quantidade de plugins criados e aperfeiçoados nestes 20 anos de +editor (na verdade, 22 se você considerar a primeira versão +disponibilizada em 1991 ou +25 se você considerar quando Bram Moolenaar fez a versão 1.0 para o Amiga), mas +pela forma como os comandos foram projetados: Você sabe que uma movimentação do +cursor com um número da frente “pula” outras ocorrências, então qualquer +comando que você descobre como movimentação repete esse comportamento; Você +sabe que comandos que requerem movimentação aceitam qualquer comando de +movimentação (incluindo a quantidade, discutido antes); e assim por diante. +Claro que isto permite várias formas diferentes de fazer a mesma coisa, mas +isto também garante que você vai achar uma forma que se encaixe com o seu +workflow de desenvolvimento.

+

E não que, como eu falei lá no começo, VIM seja o editor perfeito para todas as +condições: Existem coisas novas surgindo a todo momento (por exemplo, a idéia +de múltiplos cursores só foi popularizado quando o TextMate foi lançado no OS +X) e que o editor base não consegue fazer -- mas como o editor é extensível em +várias formas, alguém já fez um plugin para repetir o comportamento no editor. +Existem arquivos de sintaxe que são terríveis, e mesmo assim fazem parte do +pacote original -- e existem formas de atualizar por versões melhores. Existem +plugins que baseiam-se unicamente no tipo de arquivo inteiro e não no bloco -- +mas não há nada que não garanta que, no futuro, alguém consiga fazer um plugin +que troque automaticamente de modo baseado no contexto atual.

+

Na contrapartida, existem certas coisas que o VIM consegue fazer que outros +editores não fazem: Pular para o ponto onde o texto foi inserido da última vez +é o que sempre me faz voltar a usar o VIM e que eu sinto uma tremenda falta nos +outros editores -- que, diga-se de passagem, é fácil do editor controlar pela +existência dos modos.

+

E, como dicas de despedida: Quando alguém comentar sobre uma feature em outro +editor, lembre-se de procurar por "vim {feature}" na internet; muito +provavelmente a feature já existe em alguma forma para o VIM ou já tem alguém +tentando escrever um plugin para fazer a mesma coisa. E lembre-se sempre que +:wq só funciona no VIM, não nos demais editores ou no seu emulador de +terminal1.

+

1 Você pode perguntar para qualquer usuário de longa data quantas vezes eles +tentaram fechar o terminal ou mesmo um editor de textos como Word ou +LibreOffice com :wq e a resposta provavelmente vai ser "mais vezes que eu +posso lembrar".

+
+ +
+ << Plugins - Vim-Multiple-Cursors +
+ + +   + + +
+ +
+ + + + +
+ + + + diff --git a/public/books/uma-licao-de-vim/index.html b/public/books/uma-licao-de-vim/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/books/uma-licao-de-vim/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/code/agile-vs-culture/index.html b/public/code/agile-vs-culture/index.html new file mode 100644 index 0000000..ce67ccf --- /dev/null +++ b/public/code/agile-vs-culture/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Agile vs Culture: The Story of Outliners

+ +

When the culture goes against agile.

+ +

The Agile cycle

+

In some recent agile conferences I went this year, I've been recalling and +telling one story from +Outliners +(which I wrongly assumed it was part of +Freakonomics +about the number of accidents in Asian and South American +airlines. The book points that there is a cultural difference between those +two and American people, in which the former see a larger distance between +them and their superiors than the later.

+

Why I keep recalling this? Because in agile teams, there is no hierarchy: the +PO is as important as the junior developer; the tester has the same input +value as the senior developer. This means that the team doesn't need to wait +for someone higher in the chain to make a decision: the team is free to make +their own decisions on how to better reach the value requested by the PO.

+

In all events I went, there is a constant problem on "how do I make my team +see the value in Agile" and "why Agile doesn't work". Again, it seems that +Agile goes straight against the cultural reference South Americans  -- in this +case, me and my colleagues  --  because we are cultural trained about that guy +who is in a higher place in the chain and, thus, I depend on him on the +important questions (for whatever value of "important" I believe a solution +is). 

+

In the end, it's not as much as changing a company development model and +explaining to managers and directors on how the software  -- and its value + -- will be delivered, but fighting against the cultural norm of having +someone in a very high place that can make decisions while people think they +are very low in the chain to make a decision. Not counting the constant fear +of being wrong (which is actually good in agile).

+

The problem revolves not only on this point, but also in the assumed position +based on role name. Someone will assume that because their position is +"developer", it means that they are below  --  and receive orders from  --  +the PO; someone will assume that because someone's else role is tester and +their are designed as developer, they are up in hierarchy and, thus, can order +the tester to do whatever they think it must be done.

+

Here we have a second problem: we need to detect and empower those who think +they are below in the chain and "disenfranchise" those who think they are +above everyone else due the role name.

+

My plan for 2016 is to read some books about those topics and bring this +discussion to future events. Which me luck. ;)

+ +
+ + + + +
+ + + + diff --git a/public/code/cargo-cult.jpg b/public/code/cargo-cult.jpg new file mode 100644 index 0000000..6d52f90 Binary files /dev/null and b/public/code/cargo-cult.jpg differ diff --git a/public/code/command-pattern-rust/index.html b/public/code/command-pattern-rust/index.html new file mode 100644 index 0000000..59cd772 --- /dev/null +++ b/public/code/command-pattern-rust/index.html @@ -0,0 +1,179 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Command Pattern Experiments in Rust

+ +

I've been doing some experiments in using the command pattern in Rust and found +at least two ways to write it.

+

But first... Why?

+

There is one thing I'm trying to do in which the command pattern fits +perfectly: I want to have a library with all the actions and then plug +interfaces on top of, being either a CLI interface or a Web interface or +whatever interface. For that, the logic behind the action should be somewhat +isolated from whatever source it is calling it.

+

What It Is

+

The Command Pattern is described as having one object for each action ('cause, +you know, the patterns focused more on OO designs) and each of those have an +execute method which... well... execute the command.

+

The Enum Solution

+

As what you have is a list of actions, one of the ideas was to use Enums, +even if it is not exactly what the pattern describes.

+

Say, we have two actions can be called: deposit money and withdraw money. +Simple.

+

So one could have the following Enum1:

+
enum Command {
+    Deposit(Decimal),
+    Withdraw(Decimal),
+}
+
+

Because Rust allows enum variants to carry a value with them, the amount to be +deposited/withdraw is attached directly to the variant.

+

And then you have the execute() function. And, again, 'cause Rust allows +adding functions to almost everything, what I did was add a method in the Enum:

+
impl Command {
+    fn execute(&self) -> Result<...> {
+        match self {
+            Deposit(value) => do_the_deposit(value),
+            Withdraw(value) => withdraw_money(value),
+        }
+    }
+}
+
+

... and so on.

+

To use it, I put something pretty close to this in my interface layer:

+
let value = incoming_external_request.value()
+let command = match incoming_external_request.command() {
+    "deposit" => Command::Deposit(value),
+    "withdraw" => Command::Withdraw(value),
+}
+command.execute();
+
+

It feels fine and all, but it tends to make a mess with the amount of content +that goes in or around the impl, in my opinion. But, at the same time, the +dispatch layer (between the service/enum layer and the interface layer) is +pretty basic.

+

One solution to the amount of "content in or around impl" could be use +multiple impl: So I could have a module deposit.rs which impls the +do_the_deposit and another module withdraw.rs which also impls inside the +enum with the withdraw_money content. But I'd still need the center execute +to do the proper "dispatch" of the calls.

+

The Trait Solution

+

The trait solution is very close to what the pattern is: You create a trait +(interface) and "impl" it for all the commands, which are just structs. For +example:

+
trait Command {
+    fn execute(&self) -> Result<...>;
+}
+
+
struct Deposit(Decimal);
+impl Command for Deposit {
+    fn execute(&self) -> Result<...> {
+        // what was `do_the_deposit` now goes here.
+    }
+}
+
+struct Withdraw(Decimal);
+impl Command for Withdraw {
+    fn execute(&self) -> Result<...> {
+        // what was `withdraw_money` now goes here.
+    }
+}
+
+

... which feels a bit cleaner, since all related things to Deposit or Withdraw +are now tied together.

+

However, this causes a slight problem with the interface layer: Now it can't +just return one sized thing: It needs to return a dynamic dispatchable content, +like Box<dyn Command>, which isn't as pretty as the direct Enum/Struct/sized +content.

+

On the other hand, since Box implements Deref, once the interface throws +something-that-implements-Command, one could just call execute() directly on +it.

+
let command = interface_that_returns_a_box_dyn_command();
+command.execute();
+
+

Where I see those two

+

I can see the Enum being used for simple, single domain architectures. Since +all things are related, they can reside correctly under the Enum.

+

But when dealing with multiple domains, the trait/dynamic dispatch feels more +at home: Related things get into their own module, in their own space and the +idea of mixing them (for example, if you have a money domain and a tag domain, +and you want to tag money operations) goes on layer above.

+
+
1 +

Decimal is not part of Rust Standard Library, but can be used from the +rust_decimal crate.

+
+ +
+ + + + +
+ + + + diff --git a/public/code/command-test/index.html b/public/code/command-test/index.html new file mode 100644 index 0000000..d6ca1ea --- /dev/null +++ b/public/code/command-test/index.html @@ -0,0 +1,209 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Running a Command and Saving Its Output to File in Rust

+ +

I had an issue: I needed to run a command inside Rust, but I needed that all +its output should go to a file, and I needed to check if there were certain +phrases in it.

+ +

So, first step: Create a script that could "replicate" the output of a command, +with the expected strings to be captured:

+
#!/usr/bin/env bash
+
+for loop in {1..1000}
+do
+	echo "Hello, I'm a script!"
+	echo "I write stuff in the output."
+	echo "Everything should go to a file."
+	echo "But also, you need to capture warnings:"
+
+	if (( $loop%7 == 0)); then
+		echo "WARNING: This is a warning"
+		echo "   It continues if the line starts with spaces"
+		echo "   And keeps going till there are no more spaces-prefixes"
+	fi
+
+	if (( $loop%8 == 0)); then
+		# ERR is just to make sure we find it easily in the logs
+		echo "ERR: Sometimes, I also write in stderr!" >&2
+		echo "ERR: Just for funsies!" >&2
+	fi
+
+	echo "Like this."
+	echo "Then you're good to go."
+	echo ""
+done
+
+

What this script does is to print a message over 1,000 times, and sometimes it +will display a "WARNING" text -- which is the special output I need to capture -- +and sometimes it will print things to stderr.

+

For the code, what we need to do is:

+
    +
  1. Spawn the command;
  2. +
  3. Take the stdour (and stderr) from it.
  4. +
  5. Spawn a thread that will keep listening to the output, doing the search, +and writing everything to a file (our log).
  6. +
  7. The thread returns the list of captured messages, which we can get back +when we .join() it.
  8. +
  9. Since I was expecting stderr to be smaller enough, I did the capturing of +it after the thread completes (which would also close the file, so we can +be sure that we can open it again without any issues).
  10. +
+

The first step is quite easy: Just use std::process::Command and use the +.spawn() function to create the Child controller.

+

For the second step, we use the Child structure and use .take() on both +stdout and stderr. This will give us the file descriptor for both (think about +them as Files).

+

The third step is quite easy, actualy: std::thread::spawn() to create a +thread, and just read the content from the file descriptors from step 2. In +this, I used BufReader, which gives access to reading the content line by +line, which is way easier than reading to a buffer and processing it.

+
use std::fs::{File, OpenOptions};
+use std::io::{BufRead, BufReader, Read, Write};
+use std::path::PathBuf;
+use std::process::Command;
+
+fn main() {
+    // this requires always running with `cargo run`
+    let base = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
+    let the_script = base.join("src").join("the_script.sh");
+
+    let mut cmd = Command::new("bash")
+        .arg(the_script)
+        .stdout(std::process::Stdio::piped())
+        .stderr(std::process::Stdio::piped())
+        .spawn()
+        .unwrap();
+
+    // capture both the stdout and stderr as File structs (actually FDs, but basically the same
+    // thing)
+    let stdout = cmd.stdout.take().unwrap();
+    let mut stderr = cmd.stderr.take().unwrap();
+
+    // spawn a thread to keep capturing and processing the stdout.
+    let writer_pid = std::thread::spawn(move || {
+        let reader = BufReader::new(stdout);
+        let lines = reader.lines();
+        let mut log_file = File::create("script.log").unwrap();
+        let mut in_warning = false;
+        let mut result = Vec::new();
+
+        for line in lines {
+            let line = line.unwrap();
+            log_file.write(line.as_bytes()).unwrap();
+            log_file.write(b"\n").unwrap(); // 'cause lines() eat it
+
+            if line.starts_with("WARNING:") {
+                in_warning = true;
+            } else if line.starts_with("   ") && in_warning {
+                result.push(line);
+            } else if in_warning {
+                in_warning = false;
+            }
+        }
+
+        result
+    });
+
+    // run the command till it finishes
+    cmd.wait().unwrap();
+
+    // ... and wait till the thread finishes processing the whole output.
+    let warnings = writer_pid.join().unwrap();
+
+    // this is somewhat a hack: Instead of spawning a thread for stderr and trying to fight with
+    // stdout for the lock to be able to write in the log file, we do this after the thread ends
+    // (which closes the file) and then open it again and write the stderr in the end. We do this
+    // 'cause we expect that the stderr is way smaller than stdout and can fit in memory without
+    // any issues.
+    let mut buffer = String::new();
+    stderr.read_to_string(&mut buffer).unwrap();
+
+    let mut file = OpenOptions::new().append(true).open("script.log").unwrap();
+    file.write(buffer.as_bytes()).unwrap();
+
+    // This is purely for diagnostic purposes. We could put the warnings in another file, or pass
+    // it along to something else to process it. Here, we just display them.
+    // Same for stderr: Since we already put them in the file, this is used just to make sure we
+    // are capturing the errors without looking at the file.
+    println!("Warnings:\n{:?}", warnings);
+    println!("ERR:\n{:?}", buffer)
+}
+
+ +
+ + + + +
+ + + + diff --git a/public/code/couchbase-example-and-rest/index.html b/public/code/couchbase-example-and-rest/index.html new file mode 100644 index 0000000..935cc10 --- /dev/null +++ b/public/code/couchbase-example-and-rest/index.html @@ -0,0 +1,287 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Couchbase Example and REST

+ +

Using the example Couchbase to show how REST works.

+ +

Let me start this by pointing that I'm a RESTnazi: I'm the kind of guy that +will get into a fight with anyone that says things like "Ok, that's because +this is just REST, not RESTful" because... well, because, there is no +diference between REST and RESTful.

+

And today I found something weird while reading +the Couchbase documentation +with them claiming that their example is REST while... well, it isn't.

+

But hey, that's a good opportunity to explain a bit what is REST (and what is +not).

+

What is REST?

+

REST is an architecture/design pattern/pick your buzzword built on top of HTTP +to provide information. It has two components:

+ +

There is no true "guideline" on how to write resources. It's usually done with +nouns in their plural form (or, at least, that's what Apigee +concluded after checking a bunch of APIs around). Those resources are mapped +through URLs with some base.

+

Let's pick the example from Couchbase: It's a travel app, with airports, +flights and flight paths. We could use a base URI scheme of +/travel/api/v1.0/ because:

+
    +
  1. +

    The travel app could also provide a user interface through /travel/, so +we keep the API endpoint on api to not mix things.

    +
  2. +
  3. +

    We are versioning the API (here, v1.0). This is a recommendation from +Apigee and, again, not part of the architecture/design patter/buzzword.

    +
  4. +
+

On the top of this base URI, we'll build our resource URLs:

+ +

"Where is the flight path endpoint?", you must be asking? Well, I'll tell you +later about it, hold on a second, but we'll use those two to explain the very +basic of REST first, ok?

+

Besides those two URIs, we need two more: One for each resource to access +direct elements. So now we have:

+ +

So, now that we have our resources, we need ways to manage their contents. For +this, we use the "verbs" I mentioned before. The thing about rest is that +those actions are directly tied to the HTTP verbs:

+ +
+

If you want an easy mnemonic, "PUT" has and "U", for "update". Yes, it's silly, +but it works (at least, for me). Also, a "PUT" directly on a resource means +"replace the whole database with this information" and, thus, not not really +widespread.

+ +
+
+

You can add a DELETE for your whole resource, if you're crazy and bold enough.

+ +
+

And adding those two we have:

+ +

... and so on.

+

Easy as pie, right?

+

The "Flight Path" resource

+

Now let's go back to the "flight path" resource, which I left behind. Thing +is, a flight path does not exist on its own. If a flight doesn't exist, the +flight path doesn't exist either, right? And if I flight exist, it should have +a path, right?

+

So a flight path is a resource linked directly to our resource of flights. For +this, REST allows resource chaining by just adding another layer on top of +existing URIs. As we pointed before, a flight path needs a flight (a +flight element, just to make more clear where I'm going for with this), so +we should build the resource on top of an element URI:

+ +

... although the last one only makes sense if a flight could have two (or +more) different paths, which would make sense if it goes one way in a path and +goes back in a different path, which I do not know enough about flights to +know if this is possible, but for the sake of explaining everything about +REST, let's go with it, mkay?

+

And now you may be wondering: Why not simply do +/travel/api/v1.0/flightpaths/{path_id}? Again, because flight paths are tied +to flights, this means the base resource for the flight won't even exist and, +thus, it's sub-resources won't be available, which makes a lot of sense.

+

Filtering results

+

Ok, now we know how to retrieve all airports, which is nice, but we don't want +them all: the user will type something and we'll show them only the airports +that match their search. We could screw the user and send the whole list to +them and let the application filter it locally, abusing the user bandwidth and +CPU power -- which isn't nice, since we have a database on our side that can +do this filtering faster.

+

Because we can use URIs only to point to resources and resource elements, we +need a different way of passing this to the server. And guess what? HTTP have +the proper way to do this: querystrings and forms.

+

Querystrings, for those unfamiliar with HTTP, are the things can come after +the "?" in the URL. For example, in the URL: +"http://example.com/sayname?name=julio", "name=julio" is the querystring. +It provides a key ("name") and a value ("julio"). Forms are basically the +same, but instead of being part of the URL, they are sent in the body of the +HTTP request (and can be much, much larger than querystrings).

+

There is one more thing about querystrings and forms: The only way to send +information to the server in a GET request is through querystrings, since +GETs do not have a body. DELETEs can have a body, but the RFC says it should +be ignored. POST and PUT do have bodies and, thus, information about the +element to be added/updated should come in there.

+

So, for filtering, we could have a "filter" querystring to filter elements. +Couchbase filters airports with a single querystring, so we could simply do

+

GET /travel/api/v1.0/airports/?filter=<user input>

+

So the user will see a bunch of airports with their input. And, since we have +all the airport, we could also link the flights as a subresource of it, with:

+

GET /travel/api/v1.0/airports/<airport_id>/flights/

+

... which we didn't mention before, but it is now making sense, right?

+

Couchbase example also allows showing which flights connect two airports and +the REST way is, again, using querystrings:

+

GET /travel/api/v1.0/airports/<airport_id>/flights/?connectedTo=<airport_id>

+

And, if you want to be nice enough, you could even add a "fields" parameter, +so your API consumers could filter out fields they don't want in the results, +to reduce the bandwidth required. But it's all up to you.

+

Weird how things make absolute sense here, and we never called the "flights" +resource, right? That's one of the things about REST: you build resources in a +way that make sense for the consumer of the API, not to reflect your +database.

+

Pagination

+

Just for the sake of completeness, let's talk a bit about pagination.

+

Pagination, in REST, works for getting all the elements in the resource, so +it's used in the GET request for the resource. And, because it's part of the +GET request, it should come in the querystring.

+

There are a couple of ways of doing pagination, in this case:

+ +

The type of response

+

Again, for the sake of completeness, you may have noticed that not even once I +mentioned the type of data to be returned in each step. That's because REST +does not have a format: You could build a whole service that returns HTML +pages in REST format, and that's ok; you could return JSON, which the +Couchbase documentation points correctly that it is the most widely used +format; you could return XML; if you're crazy enough and want to return in +COBOL format, go for it!

+

So, where the example fails to be REST?

+
    +
  1. +

    All paths are marked with "findAll". "findAll" is not a resource and, +thus, shouldn't be in the URL.

    +
  2. +
  3. +

    As I pointed, flight paths are actually a sub-resource of flights and +should be linked. Flight paths should not exist if the flight doesn't +exist.

    +
  4. +
+

The flight path query uses querystrings to retrieve the information for paths +that go through two airports, which is the right way of doing, but again, it +shouldn't be a resource on itself.

+

How to fix the documenation

+

Easy way? Remove the "REST" mention in the pages. I am nitpicking the word +"REST" there, I fully reckonize it, and I understand that for the sake of +example it doesn't have to be REST, but it seems wrong to tell people +something is REST when it isn't.

+

If Oracle decided to say "we added a field type that can store huge amounts +of JSON data, and although you can't query its content, we can now say +OracleDB is a NoSQL database", people would lose their minds. But that's kinda +like I'm feeling about this whole thing.

+ +
+ + + + +
+ + + + diff --git a/public/code/dear-github-maintainers/index.html b/public/code/dear-github-maintainers/index.html new file mode 100644 index 0000000..2a5e441 --- /dev/null +++ b/public/code/dear-github-maintainers/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Dear Github Maintainers

+ +

A rebuttal to "Dear Github".

+ +

So recently in Reddit, there is this thread going around about +Dear Github, +which points some problems with Github issues pages.

+

Thing is, most of the problems are not problems with Github itself, but by the +community that grew around it.

+

For example, the most annoying one is the huge amount of "+1" in comments. I've +seen this and yes, it's annoying as hell. Lots of people come around and post +a simple "+1" instead of really contributing. This is not an issue with +Github, it is an issue with the community that instead of helping fixing a +problem, thinks that posting "+1" to point that it is important to them is +actual help. It isn't. I've seen issues with so many "+1" that if everyone +who posted a "+1" actually submitted a single change, the bug would be fixed +with spare lines.

+

(Unpopular opinion: Github should have support for "+1", but actually ban it. +It is unhelpful. If it's important to you, you should at least give a try to +fix the issue instead of "+1" and giving yourself a pat in the back for +"helping out".)

+

Issues missing important information surely is a problem, but that's why you +need to triage your issues. Is there any missing information? You can reply to +the poster. "But why should I ask when I can put a form for the user to fill +issues?" Dude, seriously? You're worried that you will lose 30 seconds of your +life to ask something? Why don't you want to talk to your community, why you +don't want to teach people how to properly report errors? Is it that hard to +be part of a community?

+

But the hurting point is the "if Github was open source, we would fix this +ourselves". Gitorious was open +source and never had that much contribution from the community, to the point +it was closed and moved to Gitlab. So I have to ask: If Bitbucket implemented +this, would all of you move to it? My guess is an indignant "No", because +Github means exposure while all the other public Git sites are not.

+

To me, the whole list is not a list of problems with Github itself, but a +problem with the open source (in the general, broad term) community that's +growing around Github. We should worry about building communities, not building +code with 400 forks, 1000s of "+1" comments and a single maintainer.

+ +
+ + + + +
+ + + + diff --git a/public/code/dont-diminish-types/index.html b/public/code/dont-diminish-types/index.html new file mode 100644 index 0000000..ce8b752 --- /dev/null +++ b/public/code/dont-diminish-types/index.html @@ -0,0 +1,212 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Don't Diminish Types

+ +

In a previous life, I had a long discussion on why adding booleans was a bad +idea. And just recently one of the core Python developers suggested the same +thing -- adding booleans, that is. This is a long rant on why such things are +bad.

+ +

Once at some previous job, I blocked a code review in which the other developer +did something like

+
if boolean1 + boolean2:
+	do_thing()
+
+

Why this was bad, in my view? 'Cause it was reducing the booleans into simple +integers. While it is true that booleans are, internally, in Python, integers, +what they represent is not integers, but actually true or false. People got +it -- or, at least, they say they got it, but the code changed, anyway -- and +live moved on.

+

But, last month, I had to see Raymond Hettinger, one of the core Python +developers, post +this on twitter:

+
+

#python tip: The boolean values False and True are equal to zero and one.

+

Replace: +sum(1 for x in data if pred(x))

+

with: +sum(pred(x))

+
+

Obviosly, what he meant was to use

+
sum(pred(x) for x in my_list)
+
+

... instead of

+
sum(1 if pref(x) else 0 for x in my_list)
+
+

Again, basing on the fact that Python uses integers behind the scenes to deal +with booleans.

+

And, as you can guess, that really annoyed me.

+

What Are Types

+

Let me explain, in a long rant, why "booleans are integers" is bad.

+

Imagine the computer memory. Imagine one specific memory location, being used, +with this value:

+
+

65

+
+

What does it mean? That's where languages and their types come in.

+

For example, let's imagine that this location is being managed by a C program +and the program and this program marked this value as a char. While chars +in C represent 8 bit integers1, they have being for a long time used to +represent one character in a string -- a sequence of chars actually +represents a string2. So, when other developers see char, they think "Ok, +this is the character with code 65" (which is "A", by the way).

+

If the same code use int, other developers would think "Yeah, this is the +number 65".

+

And, just to screw things up, it could be an enum, in which the value +represents the 65th variant (element) of that enum.

+

And that's the reason types exist: -- instead of, say, developers managing +memory directly and just changing their representation, like in Assembly -- +they provide consistent representation over the internal storage.

+

The Problem With Adding Booleans

+

So, we saw that memory is just a bunch of bytes and what gives meaning for +those bytes -- in programming languages, that is -- are types3.

+

Now let's see another developer seeing the code above; they go from the top of +the code to the bottom, and reach the line of sum(pred(x) for x in my_list. +The first thought they come is that sum acts on numbers, so obviously pred +is a function that return numbers. But what number it represents? So they go +check pref and see it returning True or False. Now they have to trace +back and rethink what the line did, leaving them with cognitive +dissonance, which is a +clever way of saying "they have to rethink what they already though".

+

And too many situations with cognitive dissonance is what makes code +"unreadable" -- the line above is still readable, but it doesn't actually +represent what it shows.

+

Respect Your Types

+

Python is very loose with its type system4, but it doesn't mean one could +play "fast and furious" over it. Let's say that, at some point, Python +developers decide to change True and False from their integer roots to be +actually symbols -- things that simply "exist" and have no value56. Then +everyone that managed booleans as integers would see their code misbehaving or +crashing, simply because they didn't thread booleans as booleans.

+

Now let's see the other option: sum(1 if pred(x) else 0 for x in my_list). +This line is (a) longer and (b) slower due the branching during execution (the +if). But when you read something like this you see that there is a function +where its value isn't being checked, which probably means it returns a +boolean7; if it is true, returns 1; if it is false, returns 0; and you're +actually doing a sum of ones and zeroes -- as numbers.

+

No cognitive dissonance, no messing around and just because we treated types +as types.

+

PS: After a small discussion about what's better, I came with a better line +than the 1 if pred(x) else 0:

+
sum(1 for x in my_list if pred(x))
+
+

Why this would be better? Because, when you think what you actually want -- +count the number of Trues in the list -- you can actually use a feature in +list comprehensions for filtering: the if at the end. This will count 1 (a +number) only if the element being processed "agrees" with the predicate.

+

That line could be translated like something as

+
myList.stream()
+	.filter(x -> pred(x))
+	.map(x -> 1)
+	.sum();
+
+

... in Java 8: You remove the non-True values of the list, convert the Trues +to 1 (a number) and sum the total.

+
+

Footnotes:

+
1 +

They could use more than 8 bits, depending on the architecture, and due +the fact that the C Standard is very flexible in this concept

+
+
2 +

It doesn't mean that every single char is a character in a string, it +could be used exactly as an 8 bit integer

+
+
3 +

I'm being very lose here about types, there is a lot more complex +context in them, but I'm going to stick with this "representation" for now.

+
+
4 +

Maybe nose as loose as C, which lets you "convert" a memory that +represents a float into a integer with no sign.

+
+
5 +

Or, better yet, that can have any value and would still work.

+
+
6 +

As far as I know, Python standard already forced booleans to be +integers, so that will never happen, but let's add this for the sake of +discussion.

+
+
7 +

This is one of times I feel jealous of Clojurist, which can use ? in +their functions and actually have a coding style that says that predicates +-- functions that either return True or False -- end with ?; so not only +someone reading a piece of Clojure code seeing a is_valid? knows it +returns a boolean, it actually reads like a boolean check.

+
+ +
+ + + + +
+ + + + diff --git a/public/code/index.html b/public/code/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/code/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/code/lets-not-call-it-unittests-anymore/index.html b/public/code/lets-not-call-it-unittests-anymore/index.html new file mode 100644 index 0000000..717a705 --- /dev/null +++ b/public/code/lets-not-call-it-unittests-anymore/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Let's Not Call It "Unit Tests" Anymore

+ +

I keep seeing people call tests "integration tests", while they are perfect +unit tests. So maybe what we call "unit tests" shouldn't be called unit +tests.

+ +

For example, one thing I always mention is that your tests should reflect your +requirements for the product and nothing more. And a lot of people think this +is counter productive.

+

Another thing is that I keep pointing over and over again that the definition +of "unit test" is a test that doesn't depend on anything else (like any other +test); if it starts from an empty plate, creates the whole environment +required for the functionality to be tested, runs something and checks the +result, it is a unit test.

+

But here is the kicker: A lot of people will say that if you test your class +or function, then it is a unit test; if you test the whole thing, like a black +box, it's an integration test.

+

Hold on a sec. If I'm testing the whole pipeline of functions and classes, +believing they build a black box of sorts -- something I have no idea how it's +built inside or how many functions are called or how those functions are +called and designed -- so it is an integration test; but if the test also +builds the whole environment and doesn't require anything else to check its +results, it is also a unit test.

+

So far, I hope you're following where I'm going. 'Cause I'm going to take +another detour -- it's quick, I promise.

+

Remember the first that I mentioned that I believe that tests should reflect +the requirements of the product? That's basically "When the user types its +birth day, we should display their age" and "If the user does not have the +required license for a product in their account, the action should not be +displayed". This is usually where people fall back to BDD and write tests in +Gherkin and such.

+

And that's the first thing people will complain: If the code is a mess and +completely messes with all the layers and it's not extensible and such problem +and such problem but it follows the requirements, then it's ok?

+

And the answer is "yes" -- or, at least, I truly believe it is "yes".

+

Heck, you're giving value to your users, why isn't that valid?

+

"It is valid, but it shouldn't be just that."

+

Ok, here is where the two roads join:

+

If you write a test that checks the product requirement, it doesn't depend on +anything else and proves that your changes add value to the product... then +why write tests for the classes and functions and everything else?

+

No, seriously. There is an answer, but you'll let you think a bit about +this.

+

Seriously, why you're checking a single class when it, alone, provides no +final value to the product, as it requires coordinated work with other classes +and functions to actually provide something useful?

+

The answer for this is kinda hidden in a problem I pointed before: "the code +is a mess and completely messes with all the layers and it's not extensible and +such problem and such problem". How do you prevent your code to become a mess, +to make it still be extensible and not throwing things in the wrong place?

+

You write well defined layers and make sure those boundaries are respected. +You break things apart to make sure expected internal behaviors are +followed.

+

You're still not providing product value, but you're checking if your +perceptions of a good design are being followed. This is why +you don't test every single function and class, unless every single function +and class follows your design; you usually don't need to test your util +class/module because it's just something you do to be DRY and that's +not part of your design.

+

You may write tests to check if your model/repository layer is doing it's work +of hiding the implementation of the storage; you may write tests to your +controller classes/functions to make sure you're trying to add display filters +on it because that's the view job and you're not trying to go directly into +the file system to retrieve data because that's the model layer job; and so +on.

+

So... It's more like a developer tests, isn't it?

+

I mean, it's not related (at least, not directly related) to the product +value; it's directly related to the code value developers perceive in +their design.

+

And heck, it should be as much as a unit test like the integration tests are.

+ +
+ + + + +
+ + + + diff --git a/public/code/microservices-artifact-ejection/index.html b/public/code/microservices-artifact-ejection/index.html new file mode 100644 index 0000000..9a18ac5 --- /dev/null +++ b/public/code/microservices-artifact-ejection/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices: Artifact Ejection

+ +

As I was discussing about artifacts in +microservices, I guess I forgot to +discuss some important point: How those artifacts are "ejected" from the +microservice?

+ +

"Ejected", in this case, means "pass it to the next necessary stage", which +can mean a lot of stuff (sometimes, more than one). Also, I needed some catchy +word for it 'cause simply "produces" isn't that fashionable.

+

For example, if your microservice is producing intermediate data -- say, it +connects to an external service and retrieves information, which is then +processed by different microservices -- then you probably want to use a +message broker as the ejection route for the artifact. Using a message broker +will allow another services to keep listening to the creation of those +artifacts and do their thing -- producing new artifacts.

+

Another possibility is that this microservice is the end of the production +line and, thus, it just keeps the artifact in order to by consumed in a +non-asynchronous way. For example, the microservice may produce elements that +are later requested by a web request, so what its needs is to produce said +artifact and keep it around, responding requests later.

+

This, again, is akin to the way CQRS (command-query response segregation) +works: You have one side of your microservice receiving data and processing +its artifact, and another that allows querying the artifacts.

+

You can even do both: When the artifact is produced, the microservice ejects +it through a message broker to be processed by other microservices and still +stores it internally to be queried.

+

There is even the possibility of the query part be just another microservice: +It gets the artifact from another microservice and stores it, with no +processing (if you don't count as "saves in a permanent storage" a +processing). This is interesting 'cause the "query" part of the microservice +is just another microservice, instead of being some sort of specialized +microservice that produces, ejects and stores artifacts.

+

When I mentioned we saved our artifacts in Firebase, we are basically building +this split microservice: While we have microservices that produce the +artifacts, the "storage and query" part is giving to Firebase -- but you can +consider this as any other service.

+

(This whole post is just to give some pointers on what I want to discuss next, +which are some thoughts about self-healing microservices -- and what I meant +by that.)

+ +
+ + + + +
+ + + + diff --git a/public/code/microservices-artifact-input-state/index.html b/public/code/microservices-artifact-input-state/index.html new file mode 100644 index 0000000..f023691 --- /dev/null +++ b/public/code/microservices-artifact-input-state/index.html @@ -0,0 +1,156 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices: Artifact = Input + State

+ +

Designing microservices is a bit complicated because you have to think about +different things when deciding which "domain" it will occupy. A recent +discussion with coworkers about our current microservices design led me to +rethink how to think about microservices.

+ +

This may sound a bit weird for those already working with microservices -- or +that managed to build a good view of the building of microservices -- but when +the word "artifact" popped up in a discussion, it "clicked" with a bunch of +other stuff I had in mind about the topic.

+

One fact that kept confusing me was that a lot of literature about +microservices talk about "domain separation" and how to figure out each +domain. Now, although there are a few tricks -- like "if it is a noun, it is a +domain" -- not everything is clear cut. Some domains are actually subdomains +of a larger domain, so you keep wondering if you should split those or keep +them into a single microservice, since splitting them would, invariably, +making the microservices coupled (something you want to avoid when building +microservices).

+

And that's where "artifact" felt into place. For a while, I had the impression +that microservices had to be built "backwards", in the sense that first you +have to think in what you need and then check what you have -- in other +words, you have to think on your outputs before checking your inputs. And an +"artifact" is, in the end, just the output of the microservice.

+

In our case, we are dealing with games. Each game has a narration, it has an +score, it has statistics and it has a roster. Even if it falls into the "it's +a noun!" rule, it actually resembles the required output of our system: we +have a request that gets the current narration of a game (which can be polled +from time to time or -- as we are currently working on -- pushed towards +clients); one request returns the match score (which, again, can be polled or +pushed); one request retrieves the match statistics, which is not frequently +updated or displayed, so it doesn't need constant updates; and so on. Each one +of those is a different microservice, because each one of those is a different +artifact.

+

Just to be clear: our artifacts are kept in a Firestore database, which our +clients query directly, most of the time receiving the real time notifications +for changes. But another way to keep those artifacts is to have separate +services, which the clients would query -- which is really akin to what CQRS +describes (well, that is, if your microservice receive commands to change the +data, that is; I won't claim them to be CQRS if your microservices are dealing +with events directly.)

+

Alright, if those are artifacts, where does "state" gets into this? The state +is the amount of information a microservice has to keep in order to build the +artifact. For example, in the narration, each time a new narration comes in, +it has to be added to a game list of narrations in order to produce the +narration of the whole match. The state can also help this microservice into +dropping duplicate narrations.

+

One "nice" effect of the state is that you can, in theory at least, be able to +recognize that even with an input, if there was no change in the state, there +should be no change in the artifact and, thus, no output is necessary.

+

Another thing to keep in mind about the state is that you don't need to keep +it in memory; you can use any kind of storage: keep the narrations in a +database, keep it on a disk, keep in memory as a cache, or all the above. You +pick whatever it is easier to manipulate said state to produce the artifact. +The thing to keep in mind is "If this microservice crashes, will it be able to +rebuild its previous state when it restarts?"

+

And, finally, the inputs. Those may sound a bit obvious at first (is your +microservice generating data out of thin air?), but keep in mind is that one +input can be be the source of more than one microservice. For example, a +narration may be consumed by the narration microservice to produce the whole +game narration, but it may also be consumed by the score microservice, +listening to goal narrations to update its state (if the narration is not a +goal, there is no change in score, there is no change in the state and there +is no artifact generation).

+

Returning to artifacts, do not worry if more than one microservice doing +almost the same thing, but generating a complete different artifact. As an +example, imagine that you want to use push notifications to report new goals. +Although this is very close to the score microservice, it produces a different +artifact (the push notification vs the update score request) and, by this, +should be a complete different microservice. It may even sound wasteful (doing +the same thing twice), but it would decouple things if you need some other +information in the score (say, adding the name of the players who did the +goals) or if you change the artifact consumer (say, you change from an in-hour +implementation of pushing to Apple and Google to using a service for this, +like Azure).

+

This change in the my way of thinking about microservices design help me +rethink the way we are building our microservices at work, and it is also +helping me rethink some things on a personal project (which I hope to finish +and show it next year).

+ +
+ + + + +
+ + + + diff --git a/public/code/microservices-chassis/index.html b/public/code/microservices-chassis/index.html new file mode 100644 index 0000000..1656060 --- /dev/null +++ b/public/code/microservices-chassis/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices: Chassis

+ +

The chassis for a microservices fleet is defined as the libraries and +frameworks that one should use when creating a new microservice.

+ +

The "chassis" is actually a known +pattern, but the +literature points it as a decision about the libraries and frameworks that +should be used when creating microservices.

+

For example, if you're working with Java, you'd probably pick something like +Spring Boot as a chassis for your microservices, in a way that anyone creating +a new microservice already have the library (and local knowledge) on how to +build it.

+

And, for each language, you need to pick a different chassis -- you can't use +Spring Boot with Python, for example.

+

You may have noticed that "but" in the second paragraph. Personally, I think +the choice of chassis go way beyond just creating a microservices.

+

Shared Knowledge

+

One of the major factors of using chassis for your microservices is the shared +knowledge between teams. Teams that are using the same chassis can exchange +solutions on how to solve some problems, how to make processing faster, new +releases information and so on.

+

Even if the teams will never touch each other's code, the simply fact that +they can share these information between them is a huge boom.

+

And even for teams using different languages is a major point: One team can +point that their framework allows them to do things in a more simpler way that +can be researched by some other team, using a complete different framework, in +a complete different language, on how to build the same stuff.

+

Applying a Common View

+

While the pattern describes only frameworks and libraries, the choices of +surrounding services also makes part of the chassis, in my opinion.

+

For example, the teams pick Kafka as a messaging broker between services -- +which would allow any team, on any framework, on any language, to use the same +service for exchanging messages -- allowing any team that has a need +for a message broker can use the same install (but using different +topics) and reduce maintenance costs. But what happens when one team decides +to use Kafka as a database and put a retention to "forever"? That would +utterly confused everyone else. "Why is this topic getting bigger and +bigger?" Worse, without a well described DevOps documentation, someone may see +that growing topic, check it out, see that is has no retention policy and add +one based on the other projects.

+

Another example: For highly relational data, there is a PostgreSQL +installation for everyone. Each team have their own database and users. But +one team, which got responsible for two microservices, have one with data +which is relational and another that basically requires a key-value store. +Instead of asking for key-value store, they decide to create a database with a +single table, with a key field and a large text field for storing JSONs. +This, again, breaks the defined chassis, as one would expect PostgreSQL to be +the relational database and not as a key-value store.

+

Conclusion

+

Chassis are good for microservices development due their quick development +start up and shared knowledge, but they go way beyond just frameworks and +libraries: They related to everything around the services and the way they are +viewed by each microservice.

+ +
+ + + + +
+ + + + diff --git a/public/code/microservices-self-healing/index.html b/public/code/microservices-self-healing/index.html new file mode 100644 index 0000000..afa4636 --- /dev/null +++ b/public/code/microservices-self-healing/index.html @@ -0,0 +1,198 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Self-Healing Microservices

+ +

All the previous +discussions I bought about +microservices was just a prelude to something I still don't have a fixed +solution: how do microservices "heal" themselves in case of missing data?

+ +

Quick recap before jumping into the problem: Microservices produce artifacts; +artifacts are either send downstream through some message broker to other +microservices or kept in the same microservice for future requests; +microservices can listen to more than one data input to build their artifact.

+

Previously I mentioned an example of a score microservice that produces an +artifact with the current game score for each team and the names of the +players that scored. This microservice could listen to:

+
    +
  1. The teams queue: this may be needed so we can show the team name or its +abbreviation in the score request; once a team appears in the championship, +the microservice adds it to its state for future reference1.
  2. +
  3. The players queue: same as above, so the microservice can return the player +name, nickname, shirt number or something player related if the player +scores; again, it keeps listening to the player queue and stores the +players in its state.
  4. +
  5. The match queue: if a match will happen, it has to have a score, probably +starting at 0 with no players in the goal list; this is just to avoid any +issues with the services requesting scores of matches that didn't start +or haven't had any goals yet; in any case, the artifact will be ready to be +retrieved.
  6. +
  7. The narration queue: by listening to the narration queue, the score +microservice will detect any goals, update its state and generate the new +artifact.
  8. +
+

The keyword to take from the above list is "could": Depending on the way the +microservice and the messages are built, it may not be necessary to have all +this.

+

Using full-blown messages

+

Let's start with the easiest way to avoid listening to all those queues: +Full-blown messages.

+

In a full-blown message, all the related data is sent along with the main +information. Using the previous example, the service could listen to just the +match and narration queue, but expect that the "NewMatch" message will contain +the names of the teams, their abbreviation, logo, probably some id and so on; +the same for the "NewNarration" message: it will contain the player name, +nickname, shirt name, player id and so on.

+

The problem with full-blown messages is that they tend to become bigger and +bigger: As more microservices are plugged in the system, more fields may be +required -- and dropped by services that don't need those fields.

+

The pro side of full-blown messages is that a microservice will always have +all the information necessary, while keep the number of listening queues low. +This would also help if you just add a new service in the pool: if it starts +with a blank state, it will be able to build all the state from scratch, +'cause all the information is already there.

+

Listen to base queues, request the rest

+

Almost like the solution before, the service would listen to the narrations +and matches, but once it detects a missing information (for example, the +narration event says player with ID, but this ID doesn't exist in its state), +the service would request the more "stale" information (players, teams and +products are not added all the time, for example) for some other service and +fill the lacking information in its state.

+

This means that this microservice now, instead of knowing only about queues, +now has to have information about other services (the ones that process and +store the "stale" data) and their interfaces -- and, in general, it would also +require some service discovery in the system. Those microservices would be +the "two faced" type of microservice, which receives information, store in the +state, build the artifact but also has an interface for it to be retrieved +instead of simply receiving, processing and passing it along. Caching would +also be advised here, so one service can't flood the other requesting the same +data over and over -- and updates from time to time would make sense in some +situations.

+

The messages are shorter now ('cause you receive only the team/player ID +instead of everything) and retrieval of information happen when necessary, but +where you reduce the number of listeners, you increase the number of requests. +As will full-blown messages, a new service can easily build its own state from +scratch without any issues -- it will do a lot of requests, but it will, +eventually, have all the necessary information.

+

Listen to all

+

This is exactly same solution as presented in the example above: the +microservice keeps listening to the queues of all related events and build the +state with them.

+

One problem with this solution: since the queues are asynchronous, +there could be a problem with the ordering of the data, with goals coming +before players (for different reasons). In this case... what would the service +do? Reject the goal in the hopes the player will appear, to avoid any +inconsistencies, and that the message broker requeue the event?

+

One solution would have services that, along with this one, listen to one +specific data: the score microservice listens to all four, but one +microservice listens only to the player queue. This service would +process things way faster than the score, and serve as sort of "fallback" in +case some data is missing, kinda like the solution above. This will reduce the +traffic in the network, but it'd create have duplicate data in different +services -- although that last point shouldn't be a problem in the first +place.

+

New services will find it problematic, 'cause although they are receiving the +main data, they are were not alive when the more "stale" data was processed; +they will need to either communicate with other services to get this +information, or someone +will have to manually duplicate the sources.

+

Single queue

+

I just describe solutions in which every data has its own queue, but what if +we put all the events in the same queue? This way, order is assured (players +will be queue before the goals, and the services will process players before +they even see there is a goal).

+

This reduces the number of listeners, but it requires some good +message design, specially in statically typed languages, which usually require +a well-defined structure for serialization and deseralization.

+

But it solves almost everything else: there is no issue with the processing +order, the number of listeners is low and the messages are small. But it will +also make new services suffer from the lack of stale data, forcing them to +communicate with other services or to have the data manually copied when they +are brought up.

+

The best one?

+

Honestly, I have no idea. I'm siding with "Full-blown messages" simply 'cause +it simplifies the structure of the services, even knowing that network is not +free; if I used some non-statically typed language, I'd probably side with the +single queue one. But, again, I don't think there is any "one size fits all".

+

Probably there are more architectural options for this, and those are the ones +I can remember discussing with my coworkers.

+
1 +

It's worth noting that the microservice may simply drop some of the +information. For example, if the artifact produced only requires the +abbreviated name, it full name may be completely dropped from the state.

+
+ +
+ + + + +
+ + + + diff --git a/public/code/microservices-source-of-truth/index.html b/public/code/microservices-source-of-truth/index.html new file mode 100644 index 0000000..12cc699 --- /dev/null +++ b/public/code/microservices-source-of-truth/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices: Where Is the Source of Truth?

+ +

When we are talking about a system, there is one point that we need to discuss +where the "Source of Truth" of it is. In Monoliths, the source of truth is the +storage itself. But where does it sit in a system that is composed by multiple +parts?

+ +

Just to be clear here: What I mean by "source of truth" is whatever you can +use to check if the system is producing the correct values. For example, in a +pipeline to count how much users transfer in a CDN, the source of truth could +be the logs (you can read the logs and check if the service responsible for +summing the results is correct); in an e-commerce site, we could assume the +source of truth to be the items in every invoice for the total revenue (if you +sum all the items quantities by their prices, you'll get the revenue back).

+

One important factor of a source of truth is that not only you can use it to +check if your services are correct, but you can also re-apply its content back +to the system to rebuild artifacts.

+

But here is a problem: If your system is distributed and each microservice is +building a different artifact, where +is the source of truth?

+

Previously, I mentioned that microservices could keep an state in order to +produce the artifact. That could be the source of truth for that microservice, +as long as it doesn't delete old data -- in which case, how would you rebuild +old artifacts if you can't return the state to an old... state?

+

Another solution is to make the insertion microservice (the one that captures +data from an external source) to build this source of truth; in case of the +need to rebuild the data, you can just add an API in that microservice for it +to republish data related to a certain object, which will go down the pipeline +and every microservice will rebuild their artifacts.

+

And, finally, if you build an event source pipeline correctly, you can build a +single service that will listed to every event and keep a global event +source, which you can again expose an API to replay all events of an object.

+
+

.. although I have a feeling that certain events should be changed; for example, +if you make the event source replay everything related to an invoice -- in +order to reproduce the complete invoice artifact -- you may have to replay a +"create user" event, which won't make sense 'cause the object already exists, +and it shouldn't create a new user with the same information.

+

Either that, or you could make the invoice service request the costumer +service the data if it doesn't have it already.

+ +
+

Anyway, one recommendation that I have is to always build something that can +keep track of your data, in case you need to rebuild your artifacts and your +state removes old data (which is perfectly normal, I must add).

+ +
+ + + + +
+ + + + diff --git a/public/code/mocking-a-mock/index.html b/public/code/mocking-a-mock/index.html new file mode 100644 index 0000000..d292784 --- /dev/null +++ b/public/code/mocking-a-mock/index.html @@ -0,0 +1,160 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mocking A Mock

+ +

Mocks are an important part of testing, but learn how to properly mock stuff.

+ +

A few weeks ago we had a test failing. Now, tests failing is not something +worth a blog post, but the solution -- and the reason it was failing -- is.

+

A few background information first: The test is part of our Django project; +this project stores part of the information on MongoDB, because the data is +schemaless -- it comes from different sources and each source has its own +format. Because MongoDB is external to our project, it had to be mocked +(sidenote: mocks are there exactly to do this: the avoid having to manage +something external to your project).

+

PyMongo, the MongoDB driver for Python, has a find() function, pretty much +like the MongoDB API; this function returns a list (or iterator, I guess) with +all the result records in the collection. Because it is a list (iterator, +whatever), it has a count() function that returns the number of records. So +you have something like this:

+
connector.collection.find({'field': 'value'}).count()
+
+

(Find everything which has a field named "field" that has a value of "value" +and count the results. Pretty simple, right?)

+

The second hand of information you need is about the mock module. Python 3 +has a module for mocking external resources, which is also available to Python 2. +The interface is the same, so you can +refer to the Python 3 documentation +for both versions.

+

An usage example would be something like this: If I had a function like:

+
def request():
+  return connector.collection.find({'field': 'value'})
+
+

and I want to test it, I could this:

+
class TestRequest(unittest.TestCase):
+   @patch("MyModule.connector.collection.find")
+   def test_request(self, mocked_find):
+      mocked_find.return_value = [{'field': 'value', 'record': 1},
+                                  {'field': 'value', 'record': 2}]
+      result = request()
+      self.assertDictEqual(result, mocked_find.return_value)
+
+

Kinda sketchy for a test, but I just want to use to explain what is going on: +the @patch decorator is creating a stub for any call for +MyModule.connector.collection.find; inside the test itself, the stub is +being converted to a mock by setting a return_value; when the test is run, +the mock library will intercept a call to the collection.find inside +MyModule.connector (because that module imported PyMongo driver to its +namespace as connector) and return the return_value instead.

+

Simple when someone explains like this, right? Well, at least I hope you got +the basics of this mocked stuff.

+

Now, what if you had to count the number of results? It's pretty damn easy to +realize how to do so: just call count() on the resulting list, or make it +return an object that has a count() property.

+

The whole problem we had was that the result of find() was irrelevant and +all we wanted was the count. Something like

+
def has_values():
+   elements = connector.collection.find({'field': 'value'}).count()
+   return elements > 1
+
+

First of all, you can't patch MyModule.connector.collection.find.count +because you'll only stub the count call, not find, which will actually try +to connect on MongoDB; so the original patch is required. And you can't patch +both find and count because the first patch will return a new MagicMock +object, which will not be patched (after all, it is another object). The +original developer tried to fix it this way:

+
mocked_find.count.return_value = 0
+
+

... which, again, doesn't work because the call to find() will return a +MagicMock that doesn't have its count patched. But the developer never +realized that because MagicMock tries its best to not blow up your tests, +including having return values to conversions like... int. And it will always +return 1.

+

Is your head spinning yet? Mine sure did when I realized the whole mess it was +being made. And let me repeat this: The problem was not that MongoDB was +being mocked, but that it was being mocked in the wrong way.

+

The solution? As pointed above, make find return an object with a count +method.

+
count_mock = MagicMock(return_value=0)
+mocked_find.return_value = MagicMock(
+    **{'count': count_mock})
+
+ +
+ + + + +
+ + + + diff --git a/public/code/multiple-distros-with-toolbox/index.html b/public/code/multiple-distros-with-toolbox/index.html new file mode 100644 index 0000000..aa1cd58 --- /dev/null +++ b/public/code/multiple-distros-with-toolbox/index.html @@ -0,0 +1,203 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Multiple Distros with Toolbx

+ +

When I switched from Fedora to +Silverblue, I got used to use +toolbox to check for packages and whatnot. But when I needed to test a +project in multiple distributions, I decided it was time to explore Toolbx a +little deeper.

+

What's it?

+

First of what, Toolbx (or toolbox) is a tool created to make it easier to +play with Podman images. You know when you use Docker to +create an image that you can work along your normal install, so you can break +as much as you want without damaging the external system, and still have access +to your data? Well, that's Toolbx.

+

By default, on Silverblue, there is basically just one image: fedora-toolbox. +It is the default Fedora Workstation install, but you can pick any version you +want. You can do

+
toolbox create
+
+

... to create an environment with a Fedora install in the same version of the +current Silverblue install and then

+
toolbox enter
+
+

... to get into the image. So now you can install whatever you want without +burdening your system.

+

toolbox create have an option to select an image, and that's when I got the +idea of using it to have different distributions in my system, each in their +own container, with their own tools, so I could break them as much as I wanted +without breaking my base system.

+

Getting Other Images

+

To use a different image for your Toolbx, you can simply download them with +podman pull and an image name. Unfortunately, not every image is ready to be +used, 'cause there are some requirements that Toolbx needs to interact with the +image.

+

Requirements

+

First, you'll need capsh to be available inside the image. The name of the +package depends on the distribuition, but in the images I tried, none had it +installed by default.

+

Second, you'll probably need "sudo" so you can install packages on the +container and, again, it doesn't seeem to be part of the base images.

+

Third, because "sudo" is not available, there will be no sudoers file, +requiring that you create one.

+

Fourth, the sudo group can change from distribuition to distribution; some call +it "sudo", others call it "wheel". But the group must exist.

+

And fifth, Toolbx will mess with the entrypoint of the container, so you must +be sure that there is no command in the entrypoint.

+
+

There is a line that basically removes the entrypoint no matter what the base +image uses, and I added it in all examples, just to be in the safe side.

+ +
+

An OpenSuse Image

+

Let me start with an OpenSuse image: Suse doesn't have a sudo group, doesn't +come with capsh installed not sudo. So I had to create my own image. +This can be done with a Containerfile file or, if you prefer, you can create +it with the name Dockerfile, which Podman is pretty chill in using without +issues.

+

So I have this Containerfile:

+
FROM opensuse/leap:15.1
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN groupadd wheel
+RUN zypper install -y libcap-progs sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

The labels are just to inform Toolbx that the image is a Toolbx image. Because +there is no sudo group, I had to need to create a wheel group; libcap-progs +is the source for the capsh app; a sudoers file that was added to allow +using sudo without a password.

+
+

If you're curious, the whole sudoers I use have just one line:

+
%wheel        ALL=(ALL)       NOPASSWD: ALL
+
+ +
+

With that in place, the image can be created with podman create . -t suse51, +where "suse51" will be the image name.

+

Image created, the Toolbx environment can created with toolbox create -i <hash> suse; the <hash> part is the image ID and suse is the toolbox name. +Dunno why, but sometimes referring to the image by its name (the one used in +the build part) doesn't seem to work, but the hash always do.

+

And then, to use the environment, simply do toolbox enter suse.

+

Other distributions I build images:

+

Ubuntu Image

+

Similar to OpenSuse, Ubuntu default image also doesn't come with capsh and +sudo, but this can fixed with this Containerfile:

+
FROM ubuntu:18.04
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN apt update && apt upgrade -y
+RUN apt install -y libcap2-bin sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

Also, the sudo group is "sudo", so the sudoers file had to reflect this.

+

Centos 7 Image

+

Centos 7 comes with capsh, but not sudo. So another custom image needs to +be used:

+
FROM centos:7.3.1611
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN yum -y update yum-skip-broken
+RUN yum install -y sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

sudo group is "wheel", so sudoers had to be adjusted.

+

Conclusion

+

That's basically it. I had to mess a bit with the images, check the logs trying +to create the environment with toolbox create -i <image> <somename> --log-level DEBUG to see any complains, figure out how to fix those but once +the first image (the Suse one) was created, figuring out what was needed was +pretty easy.

+

And now I don't need to do distro hopping to figure out if our project work on +them.

+ +
+ + + + +
+ + + + diff --git a/public/code/on-unittests-and-layers-2/index.html b/public/code/on-unittests-and-layers-2/index.html new file mode 100644 index 0000000..82e9adc --- /dev/null +++ b/public/code/on-unittests-and-layers-2/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

On Unit Tests and Layers, Part II

+ +

After coming with a discussion about unit tests and layers, I got a +bunch of other insights, specially from a video of Gary Bernhardt +about "Fast Test, Slow Test".

+ +

Just after posting about +who one could see the layers through unit testing, +I finally watched a video of Gary +Bernhardt (of the "DestroyAllSoftware" fame) about "Fast Test, Slow Test".

+

Basically, what Gary is going after is saying "write tests for the layer ONLY, +so all your tests are fast". Ok, I can get behind it, in a way. Because layers +have their behaviour -- in a "mechanical" sense, since they don't require +human interaction, but behaviour nonetheless -- so you're testing behaviour.

+

But that also rises one question: What are you testing? Are you testing the +component or the application? What do you deliver, anyway? Components or +an application? How do you make sure you're delivering an application in the +proper way?

+

Testing layer behaviour also has a bad side effect: If you're application +doesn't need a certain part of your layer -- say, you wrote a validator in the +model layer, but the powers to be decided it wasn't required anymore --, how +do you make sure it will go away? Your tests will still test those validators +-- after all, you're testing your model layer -- and your coverage will still +point that that piece of code is needed and you'll end up with a bunch of dead +code that is kept alive only because the tests require them.

+

Also, because Gary points out that the "integration tests" are still required, +you'll end up with a lot more tests than necessary. Why not focus on the +behaviour your application should have instead of the behaviour your +layers have?

+

I'm not against layer testing per-se, I'm just against writing tests that do +not reflect the general expected behaviour of the application and duplicating +tests because you're testing layer after layer and then testing them all +together. You should test the value of your application, not its components.

+

On a side note, Gary still does the same mistake everyone does, calling the +"all layers" tests "system tests". That's wrong. Just because you're going +through different layers it doesn't mean it can't be a unit test. It depends +only on itself? Does it test behaviour? Congratulations, you have a unit test.

+ +
+ + + + +
+ + + + diff --git a/public/code/on-unittests-and-layers/index.html b/public/code/on-unittests-and-layers/index.html new file mode 100644 index 0000000..bddc498 --- /dev/null +++ b/public/code/on-unittests-and-layers/index.html @@ -0,0 +1,149 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

On Unit Tests and Layers

+ +

On a recent discussion about testing, I think I came up with a +reason why some people really think we need to test everything: they +are thinking in layers, without even realizing it.

+ +

This weekend I had an idea on why some people insist on writing tests for +every single function and object, but first you must know that 3 things +happened:

+

First, I told someone a programmer-joke like this: "You can't teach top-down +development to newcomers 'cause they don't know which side is up." (Actually, I +heard from someone else; I'm not that smart to come with a line like this). +Yes, it is a joke; yes, it is somewhat fun, but at the same time, it is a +reality: we should let newcomers get wet before telling them how to properly +design their project.

+

The second is that I got "drafted" to do a tutorial on DjangoRestFramework and, +because I was expecting someone to ask how to manage validation on forms and +serializers and decided to learn a bit more about "fat models", which basically +says you should put all your business rules on the model layer. And here is the +part that stuck with me: the model is not an object, but a layer.

+
+

"forms" are responsible for validating incoming HTML form content; +"serializers" are responsible for validating incoming data from the API -- +although "serializers" are also responsible for serializing the output data +back to the client.

+ +
+

The third is that I was summoned to explain to a group to explain what should +be tested. Thing is, they did a "fizzbuzz" code in which they had +multiple_of_3, multiple_of_5, multiple_of_15 and someone mentioned +that we should test them too.

+

And that's what got me thinking: Should we test it? My response for this +question is always "no, think your project is a black box in which you press a +button and some light goes on; you don't need to know if there is a nerve +somewhere in your knee that you hit it and your leg does some kicking or if +the signal is sent all the way to your brain and it sends a response back to +the muscle to make it kick, all you need to know -- and test -- is that when +you hit someone in the knee, they kick and that's your requirement and +that's what you should test." But what if it is not that simple?

+

The model layer has a responsability and has its own requirements: It should +receive the data and store it somewhere; it can expose some business rules (as +validation of said data) but shouldn't run those rules. The controller layer +also has its own responsabilities and its own requireements: it gets the data +from somewhere, do the checks, validate the business rules and then sends it +to the model layer to be store. The view layer, again, has its own +responsabilities and its own requirements: exposes the data to the user and +receives data from the user and passes it to the controller layer, exposing +the errors back to the user.

+

In a way, all those layers could be separate projects: because they have a +defined API, one could replace each layer independently -- I could have a +model layer that stores all that in JSON and then replace it to one that +stores in a Stream Processing Database and the controller and view layers will +never know about. All those layers could be separate libraries -- a lost art +of getting code with a single functionality and giving it its own space, with +its own build tools and a well defined interface and which is its used by other +projects as a black box: they know the interface, but they don't know how, +internally, the library does whatever it does.

+

And, because each library has its own code, it will have its own tests.

+

And that's what people were seeing: They were seeing, unconciously, "this is +another layer in the project, this layer should be tested because it can be +replaced any time". Each multilple_of function was an API exposed from +the model layer and, thus, should be tested. Even if the design doesn't seem +to be layered and appear all around the code.

+

Thing is, each layer is nothing by itself: There is no use for exposing +business/validation rules without a controller to send the data; there is no +use for something to validate incoming data and apply business rules if there +is noone sending the data and noone to store it; there is no use for something +responsibile for calling business rules check if there isn't business rules. +All three layers are required to do the word -- and that's probably why I +believe you should test them all as a single unity.

+

But, in the very end, it seems that going full force into unit tests and what +should be tested can actually help people see they layers of their projects.

+ +
+ + + + +
+ + + + diff --git a/public/code/overthinking-rust-iterators/fat-iterator.png b/public/code/overthinking-rust-iterators/fat-iterator.png new file mode 100644 index 0000000..99e959f Binary files /dev/null and b/public/code/overthinking-rust-iterators/fat-iterator.png differ diff --git a/public/code/overthinking-rust-iterators/index.html b/public/code/overthinking-rust-iterators/index.html new file mode 100644 index 0000000..55d9401 --- /dev/null +++ b/public/code/overthinking-rust-iterators/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Overthinking Rust Iterators

+ +

I had some issue recently with Rust iterators, and that led me to think a lot +about iterators in Rust.

+ +

What I wanted to do was something not exactly direct in Rust:

+ +
let service = Service(connection_information);
+let data = service.data();  // This provides the iterator
+while let Some(record) = data.next() {
+    do_something(&record);
+}
+
+ +

Notice that the iterator I want have two sides: One is to spew information from +previous request from memory/cache; the second is requesting (or triggering the +request somewhere) for more data.

+

Back to Iterators

+

Basic iterators work like this:

+

+

... which you have a dataset, create an iterator over them and each call of +.next() on it will advance the iterator over the next element of the data and +return a reference to that data; once it reaches the end of data, it returns a +None, indicating that there are no more data.

+

The fun thing about iterators is that they need to hold their own state: Which +is the current element that I'm pointing to? The .next() receives a mutable +reference of self exactly due this: It changes its state on each call of +.next().

+

What I need is, basically, an iterator that does that and, once it sees +None, retrieves more data and starts over. This raises the question: How does +the iterator gets more data?

+

The Fat Iterator Approach

+

The idea I had was to create a fat iterator that would "hold" its own data and +iterate over it.

+

+

Because the data is simply a Vec<>, I could do something like:

+
    +
  1. Pull data from service;
  2. +
  3. Update the data inside the iterator;
  4. +
  5. Create a new iterator over said data;
  6. +
  7. Call .next() on the iterator till it turns into None;
  8. +
  9. If there is more data, do the request and jump to 2.
  10. +
+

If we jump back to the fact that .next() updates the iterator internal state, +this means that I'd need to keep the data and its iterator in the same +structure. And that causes issues with the borrow checker, 'cause I can't own +part of the data when I own the whole data (yes, it feels like a problem with +the borrow check, but still).

+

The idea seems solid, except I'd be fighting the borrow checker to a point I'm +not capable yet.

+

The "Request Someone Else" Iterator

+

The other idea I had (but couldn't figure out how it would work) was to, +instead of service.data() return an iterator, it would return the data holder +and that could create an iterator over itself. The weird thing about this is +that the iterator would have to have a mutable reference to the source data, so +it could call the parent when it reached the end of the data, and the parent +would get a new data source and the iterator would "reset itself" after calling +it -- which sounds more complex than it should.

+

(I could also make the parent holder have a Cell<> over data to have just +internal mutability over it, but again, sounds more complex than it should).

+

The Solution

+

Sorry, no solution (yet). I'm still tinkering with it and I'll update this +once I find something that works and it doesn't require two (or more) things +(mutably) interacting between themselves.

+ +
+ + + + +
+ + + + diff --git a/public/code/overthinking-rust-iterators/normal-iterator.png b/public/code/overthinking-rust-iterators/normal-iterator.png new file mode 100644 index 0000000..cdbbd2c Binary files /dev/null and b/public/code/overthinking-rust-iterators/normal-iterator.png differ diff --git a/public/code/publishing-books-on-zola/index.html b/public/code/publishing-books-on-zola/index.html new file mode 100644 index 0000000..8df11a1 --- /dev/null +++ b/public/code/publishing-books-on-zola/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Publishing Books on Zola

+ +

A long time ago I wrote a couple of posts on a WordPress, then moved them to +GitBook. Unfortunately, GitBook changed its layout to something a bit more +confusing and now I'm bringing them back to this blog, which runs Zola.

+ +

Zola is a blog system; a static blog generator. It wasn't projected to be a +publishing tool, but because it has support for publishing stuff without +appearing in the main page, specialized templates for each page and +shortcodes, I managed to come with a clever solution.

+

But let's see how I did:

+

The Theme

+

The first problem is tied to the current Zola themes: some of them lack +support for tags, some for sections and some to both. For After +Dark, I +had to add support for both, but renamed it to +Nighttime. This allows +putting the books in their own sections, which helps the general organization +of the content.

+

Hiding Book Posts From Main Site

+

Each Zola section needs a _index.md file with the meta information for the +section; for example, it's title.

+

To make posts in a section not appear in the main site (you know, the site +index), you need to set a property in its meta information: transparent. +When a section is transparent, posts inside the section will not appear in the +main index and, thus, will be contained only on the section.

+

... unless you want to make some "episodic" chapters and allow them to appear +in the main site. That's up for you.

+

Post Order in the Section

+

By default, posts in sections are ordered from the most recent to the oldest, +based on their published date. You can change this by changing the sort_by +property in the section to weight, which will show posts by weight, from the +lightest to the heaviest.

+

Why would you want to change the order of posts in the section? 'Cause the +section content works pretty damn fine as a general index for your book, which +each post as a chapter.

+

All fine and dandy, but the fact is that posts titles, with their dates and +summaries, is not a very good index. But Zola has a workaround for this: Each +section data can also have a template option, which allows using a different +template for that section alone. In my case, I created a template on +"Nighttime" that have all the meta information but not the posts in it, called +section-contentless.html.

+

But what is good about a section/book with a title and an empty index? That's +another thing Zola can do: If you add any content in the _index.md, it will +be rendered normally. So you can write the index yourself (which is not +optimal, but it works).

+

As a side note, you can also create a template which shows only the post +title, no summary or date, and use the weight solution.

+ +

Although you can now display the book with its chapters, it still is a bit +hard for readers to do a nice, continuous reading if they need to go back to +the index after reading a chapter to get to the next.

+

For that, you can use a shortcode to add the navigation at the bottom of each +post. Something like this:

+
<div>
+	{% if prev_chapter_link %}
+		<div style="float:left">
+			&lt;&lt; <a href="{{ prev_chapter_link }}">{{ prev_chapter_title }}</a>
+		</div>
+	{% endif %}
+
+	&nbsp;
+
+	{% if next_chapter_link %}
+		<div style="float:right">
+			<a href="{{ next_chapter_link }}">{{ next_chapter_title }}</a> &gt;&gt;
+		</div>
+	{% endif %}
+</div>
+
+

And then, adding in the end of each post a +{ { nav(prev_chapter_link="<link>", prev_chapter_title="Title", next_chapter_link="<link>", next_chapter_title="Title") }} +and Zola will add the HTML (with the parameters) at the bottom of each post, +making navigation easier.

+

And that's basically it!

+ +
+ + + + +
+ + + + diff --git a/public/code/redid-my-nvim-config/index.html b/public/code/redid-my-nvim-config/index.html new file mode 100644 index 0000000..f561d02 --- /dev/null +++ b/public/code/redid-my-nvim-config/index.html @@ -0,0 +1,136 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

I Redid My NeoVim Configuration

+ +

For some obscure reason, my NeoVim install decided it didn't want to +display LSP warnings anymore. So I redid the whole configuration.

+ +

Believe me, I didn't do 'cause "OMG, so broken". I guess I could have tracked +the problem to the way +LanguageClient was +installed -- it could be even out-of-date, 'cause I updated to NeoVim 0.6 +recently -- but I also wanted to install the TreeSitter support, for better +highlight. Those two factors were enough to me to try a different +configuration, so I decided to do the full thing and rewrite the whole +configuration file, using the Lua format.

+

I started with the post of Takuya +Matsuyama, +just as reference -- I'm not a user of a package manager (and +there may lie the problem with some outdated plugin) and I really prefer to +work with submodules and whatnot -- a way that is pretty close to what +Pathogen does.

+

As I wanted to move some things from my old configuration to the new, I had to +search on how to "translate" those. That's where I found a post by Heiker +Curiel, +which lists old configuration options and how they appear in the Lua config.

+

The result is that I have a brand sparkling NeoVim install, with all the bells +and wristles:

+

+

The whole configuration file is in my personal Git +repo.

+

What was left out?

+

When migrating, I few things I did not add in this new configuration:

+ + +
+ + + + +
+ + + + diff --git a/public/code/redid-my-nvim-config/vim6.png b/public/code/redid-my-nvim-config/vim6.png new file mode 100644 index 0000000..e2c86f9 Binary files /dev/null and b/public/code/redid-my-nvim-config/vim6.png differ diff --git a/public/code/seek-test/index.html b/public/code/seek-test/index.html new file mode 100644 index 0000000..9f37bb7 --- /dev/null +++ b/public/code/seek-test/index.html @@ -0,0 +1,171 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Seek Test

+ +

How to use .seek() in Tokio BufReaders.

+ +

What was the issue:

+

I needed to read a file that have a header, marked with # and then followed +by the data itself; all the data is TSV (tab-separated-values). Note that there +is just one header and one data; it is not expected to find more headers/header +information after you start reading the data.

+

The easy solution could be:

+
    +
  1. Open file;
  2. +
  3. Read all the lines till there is one that doesn't start with #;
  4. +
  5. Close file;
  6. +
  7. Open the file again;
  8. +
  9. Skip all lines that start with #;
  10. +
  11. Process the result.
  12. +
+

Because I didn't want to read part of the file again, I wanted to rewind the +cursor and have only one open. The general idea would be:

+
    +
  1. Open file.
  2. +
  3. Read all the lines till there is one that doesn't start with #;
  4. +
  5. Rewind the file reader the number of bytes of this line, thus returning to +the very start of it;
  6. +
  7. Consider the header read; the next reads would always produce the data.
  8. +
+

Example souce file:

+
# This is a header
+# Each field is tab-separated.
+# But so is the data, so it is all good.
+# field1	field2	field3	field4
+0	1	2	3
+1	2	3	4	
+2	3	4	5
+3	4	5	6
+
+

And the file that actually reads it:

+
use std::io::SeekFrom;
+use std::path::PathBuf;
+
+use tokio::fs::File;
+use tokio::io::AsyncBufReadExt;
+use tokio::io::AsyncSeekExt;
+use tokio::io::BufReader;
+
+#[tokio::main(flavor = "current_thread")]
+async fn main() {
+    let file_name = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+        .join("resources")
+        .join("the_file.tsv");
+
+    let file = File::open(&file_name).await.unwrap();
+    let reader = BufReader::new(file);
+    // Here is why we need to the the `.into_inner()` later:
+    // `.lines()` takes `self` and not `&self`.
+    let mut lines = reader.lines();
+
+    println!("Finding headers...");
+    while let Some(line) = lines.next_line().await.unwrap() {
+        println!("\tGot line: {}", line);
+        if !line.starts_with('#') {
+            println!("\t\tOops, headers are done!");
+            // XXX issue here:
+            // We are assuming "+1" 'cause that the `\n` character that `.lines()` "eat" on every
+            // read. But, on DOS files, it would be `\r\n`, or 2 bytes.
+            // Need to find out a way to figure the line ending before doing "1+" or "2+" here.
+            let bytes = (1 + line.bytes().len() as i64) * -1;
+            println!("\t\tMust rewind {bytes} positions...");
+
+            let mut inner = lines.into_inner(); // get back our BufReader
+            inner.seek(SeekFrom::Current(bytes)).await.unwrap();
+
+            lines = inner.lines(); // build a line reader from the rewinded Reader
+            break;
+        }
+    }
+
+    println!("Now it should be data...");
+    while let Some(line) = lines.next_line().await.unwrap() {
+        println!("\tGot line: {}", line);
+    }
+}
+
+
+

The actual effect for using this is that I need to walk two of those files at +the same time. By walking the first file, grabbing the headers and then +returning to the actual data and doing the same with the second file, I could +avoid an issue of files with different header sizes (e.g., the second file was +updated with new comments before the actual header).

+ +
+ +
+ + + + +
+ + + + diff --git a/public/code/the-day-i-found-my-old-code/index.html b/public/code/the-day-i-found-my-old-code/index.html new file mode 100644 index 0000000..c671f33 --- /dev/null +++ b/public/code/the-day-i-found-my-old-code/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Day I Found My Old Code

+ +

Found a piece of code I wrote 2 years ago, following a lot of linters. I'm +amazed how readable the code still is.

+ +

Today, walking across a client repository, I found a module I wrote two years +ago in Python. At the time, we lacked the knowledge to write proper tests, but +we used a lot of other tools: PEP8 and Pylint, mostly.

+

Today-me is pissed with two-years-ago-me for the lack of tests, but where my +memory forgot the nuances of the project, the huge amount of comments and +proper documentation makes it for.

+

For example, every pylint disable have an explanation about why it was +disabled:

+
# flask has a weird way to deal with extensions, which work fine but confuses
+# the hell out of PyLint.
+
+

Related modules are loaded in sequence, with line breaks between different +sources:

+
from flask.ext.babel import Babel
+from flask.ext.babel import refresh
+
+from flask.ext.gravatar import Gravatar
+
+from werkzeug.routing import NotFound
+from werkzeug.routing import RequestRedirect
+
+

Every variable, every function, is documented in proper Sphinx format, which +contributes to understanding what the variable/function do:

+
#: Session duration time
+#: The time is given as number and a time interval ("m" for minutes, "h" for
+#: hours, "d" for days and "w" for weeks), e.g., "3d". A value of "None" will
+#: make the session last till the user closes the browser.
+SESSION_EXPIRATION = "1d"
+
+
def reroute(route):
+    """Route control. The route must exist in the known routes list to return
+    a valid result; unknown routes will be redirected to the 404 page; if the
+    route exists but it's marked as "maintenance", the request will be
+    redirected to the 503 page."""
+
+

Also, I found a class with a docstring of about 20 lines. It explains every +single parameter in its __init__ function, which makes perfect sense when +you generate the documentation.

+

Where the functions lacked a good name (due having a good name inside their +own objects/modules), a comment was added to explain what the function was +actually doing:

+
inject(current_app)         # inject values if run stand-alone modules
+load_routes(current_app)    # load the routing information
+register_filters()          # register jinja filters
+register_functions()        # register jinja functions
+register_tests()            # register jinja tests
+set_session_time()          # define the cookie time
+
+

Also, I had the slight habit of putting large comments in the code when +something was kinda hacky:

+
# Now you're asking yourself: "Why heuristic find?" The reason is
+# simple: in _function() , we add a new endpoint on top of one
+# existing endpoint; because we do that on top of anything, we don't
+# know, for sure, which one of the parameters the user (the other
+# programmer, in this case) used in their URLs. So we need to through
+# all parameters they expect to receive in their detail function in
+# the hopes of finding something that actually matches a "pk".
+
+

It doesn't make much sense here, but believe me, it works. I was just reading +the code with a function called heuristic_find and I was "Man, which drugs I +took to call it 'heuristic_find'?" And BOOM, there it was why it was called +like that.

+

Ok, honesty time: I wasn't the only one writing this code. But thanks to the +client input, I started and enforced all those rules (and wrote a huge part of +the base code), the code is still readable two years later.

+

Yeah, I'm proud of it.

+ +
+ + + + +
+ + + + diff --git a/public/code/thinking-about-rust-actors/actors.png b/public/code/thinking-about-rust-actors/actors.png new file mode 100644 index 0000000..bb75425 Binary files /dev/null and b/public/code/thinking-about-rust-actors/actors.png differ diff --git a/public/code/thinking-about-rust-actors/index.html b/public/code/thinking-about-rust-actors/index.html new file mode 100644 index 0000000..0e61327 --- /dev/null +++ b/public/code/thinking-about-rust-actors/index.html @@ -0,0 +1,170 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Thinking About Rust Actors

+ +

I recently wrote an application for work (so, sorry, can't show you the code) +that, 'cause it was heavily I/O based, I decided to write it using +Tokio and the idea of Actor Model with +it.

+

... which gave me some things to think about.

+ +

Before anything, actors in Rust are very different from the actors in languages +with the actual Actor Model. In summary, you have your actors, which running +independently, each actor have an Inbox for things to be processed and an +"outbox" -- in quotes, 'cause that's not really it. An actor can receive a +message, process it and then it can just be done with it or it can produce +something that it is send to another actor -- that's its outbox, which usually +differs from the Inbox 'cause the Inbox need to have a queue of sorts, but the +Outbox doesn't (and that's why I've been using "outbox" with quotes before).

+

All the messages are delivered by a "post office" of sorts, that connects all +Actors:

+

+

On my implementation, the actor is actually a module with a run() function; +this function exposes the Sender part of a MPSC +(Multiple-Producer-Single-Consumer) channel which acts as the Inbox of it and +the task PID, so the can .await the actor processing loop to avoid the main +application from finishing with the actor still running.

+
+

For now, I'm ignoring Tokio and async for next examples.

+ +
+

And because there is no "Post Office" kind of solver in Rust, I short-circuited +the actors by giving the Sender channel of an actor as parameter to a second, +so it knows where to send its messages. Something like:

+
let channel3 = actor3::run(...);
+let channel2 = actor2::run(channel3);
+actor1::run(channel2);
+
+

In this short sample, whatever "actor1" produces, it sends directly to "actor2" +though the channel the latter created; "actor2", on its part, produces +something that is received by "actor3". And, with more actors, things just keep +chaining.

+
+

I am intentionally ignoring the internals of each actor and their run() +function, but they are some variations of:

+
fn run(..) -> (task::JoinHandle<()>, mpsc::Sender<TheKindOfMessageTheActorAccepts>) {
+    let (tx, mut rx) = mpsc::channel::<TheKindOfMessageTheActorAccepts>(SOME_SIZE);
+    let task = tokio::spawn(async move {
+        while let Some(incoming) = rx.recv().await {
+            let conversion = actor_process(incoming);
+            // maybe send the conversion to the next actor?
+        }
+    });
+    (task, tx)
+}
+
+ +
+

But... 'cause the actors have (very similar) interfaces, that looks like a +trait!

+

So, what should be the Actor trait?

+

First thing, its run() or similar function should expose its PID and its +receiving channel. Something like:

+
pub trait Actor {
+    fn run() -> (task::JoinHandle<()>, Sender<TheKindOfMessageTheActorAccepts>);
+}
+
+

Why TheKindOfMessageTheActorAccepts? That's because each actor may have a +different input message. If we take our short sample above, "actor2" may be +receiving usizes and sending them as Strings to "actor3".

+

Because that type may change from actor to actor, it should be an associated +type:

+
pub trait Actor {
+    type Input;
+
+    fn run() -> (task::JoinHandle<()>, Sender<Self::Input>);
+}
+
+

So the basic idea is that, once the trait is implemented in a struct, we could +managed it like:

+
let actor3 = Actor3::new(..);
+let (actor3_pid, actor3_channel) = actor3::run();
+
+

Wait, what about the chaining? We could do something simple like:

+
let actor3 = Actor3::new(..);
+let (actor3_pid, actor3_channel) = actor3::run();
+let actor2 = Actor2::new(actor3_channel);
+let (actor2_pid, actor2_channel) = actor2::run();
+
+

... which is kinda verbose, but does work.

+

I have some ideas to make this part more fluent, but I need to do some more +exploration about the topic (specially since I think we can leverage the type +system to not allow connecting actors whose input type is not the same as the +output type of the previous actor). Once I get those hammered down, I'll get a +follow up post.

+ + +
+ + + + +
+ + + + diff --git a/public/code/tokio-command-timeout-test/index.html b/public/code/tokio-command-timeout-test/index.html new file mode 100644 index 0000000..aee52f6 --- /dev/null +++ b/public/code/tokio-command-timeout-test/index.html @@ -0,0 +1,139 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Timeout With Command in Tokio

+ +

How to spawn an external command and give it a timeout in Rust, with Tokio

+ +

The entry point for running external applications in Rust is the +Command structure, +in the process module. This whole structure is duplicated on Tokio, with +async.

+

But there is one thing that exist in other languages (like Python) that Rust +doesn't have: Having a timeout for the command (and killing it if it runs over +the timeout). The usual solution is to run the command on a specialized thread +and, with another thread, make sure to kill the first if the second finishes +first.

+

But Tokio have a funcionality that saves a lot of code when dealing with this: +timeout. While it +doesn't apply to the Command itself, it applies to Futures, and waiting for a +command is an async function, which means it is wrapped around a Future, and we +can leverage this.

+
use std::time::Duration;
+
+use tokio::process::Command;
+use tokio::time::timeout;
+
+#[tokio::main(flavor = "current_thread")]
+async fn main() {
+    let sleep = "sleep";
+
+    println!("Run 3 secs");
+    let mut cmd = Command::new(&sleep).arg("3s").spawn().unwrap();
+    if let Err(_) = timeout(Duration::from_secs(4), cmd.wait()).await {
+        println!("Got timeout!");
+        cmd.kill().await.unwrap();
+    } else {
+        println!("No timeout");
+    }
+
+    println!("Run 25 secs");
+    let mut cmd = Command::new(&sleep).arg("25s").spawn().unwrap();
+    if let Err(_) = timeout(Duration::from_secs(4), cmd.wait()).await {
+        println!("Got timeout");
+        cmd.kill().await.unwrap();
+    } else {
+        println!("No timeout");
+    }
+}
+
+

The thing here is .wait(). That's when Tokio wraps the command call into a +Future. But, because the task is dead, it doesn't actually kill the command, +and that's why we need to call .kill() in case of timeout -- otherwise the +command will still run (you can check this by removing the .kill() call on +the 25s block, and calling ps after the application finishes).

+

Just note that the if let Err(_) is for timeout; .wait() also returns a +Result, and that's the one that needs to be checked for the actual success of +the execution.

+ +
+ + + + +
+ + + + diff --git a/public/code/using-alternatives/index.html b/public/code/using-alternatives/index.html new file mode 100644 index 0000000..dd4ac8a --- /dev/null +++ b/public/code/using-alternatives/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Using `alternatives`

+ +

alternatives allows one to select a different executable for a normal command +line program, but how does it work?

+ +

I'll give an example: I enjoy using NeoVim instead of Vim for different +reasons. But there is a nag that I keep hitting: NeoVim executable is called +nvim instead of the vim for... Vim.

+

I could change two different environment variables, VISUAL and EDITOR to +nvim, so any application that wants to open an external editor would call +NeoVim instead. But, unfortunately, my muscle memory doesn't work with +environment variables, so either I keep correcting myself to type nvim +instead of vim or I find a way to, when I call vim, it should actually call +nvim.

+

The initial solution is to use aliases, so alias vim nvim (in Fish) would +make vim actually run nvim... except when I use sudo, which doesn't +expand the alias before its call. The actual solution would be something +global, that takes care of this.

+

And that's what alternatives do.

+

In my case, what I actually need to do is run the follow command:

+
sudo alternatives --install /usr/bin/nvim vim /usr/bin/vim 1
+
+

What does it do:

+ + +
+ + + + +
+ + + + diff --git a/public/code/when-i-used-pep8-to-fuck-up-code/index.html b/public/code/when-i-used-pep8-to-fuck-up-code/index.html new file mode 100644 index 0000000..5eff0ef --- /dev/null +++ b/public/code/when-i-used-pep8-to-fuck-up-code/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

When I Used PEP8 To Fuck Up Code

+ +

We "inherited" some Python code recently. Although another team was working on +it, we now should support it and keep it going. The previous team at least +tried to use Pylint and follow PEP8. And I say "tried" because their +pylintrc has a couple of exceptions and their PEP8 extended the +maximum column to 100.

+
+

Pylint exceptions are almost common case these days, specially in +a Django project. But plain, pure pylintrc exclusion without giving any +pointers on why you're adding that exception are dumb, IMHO. I had a +project were we decided to add pylint exceptions inside the code, but for +every exception there should be a comment preceeding it explaining the +reason for the exception ("the framework doesn't expose this directly", +"pylint can't see this variable, but it is there", "It's the common place +to name the variable this way" and so on).

+ +
+

Quick pause here 'cause I know a bunch of people will complain with a "But +monitors these days are very large and you don't need to focus on column 80; +we don't use CGA anymore, old person!". The thing about the maximum column at +80 is not about "being visible on every CGA" but actually a measure of +readability: If you speak shorter, concise sentences, people will get the idea +quickly; if you keep an stream of words non-stop without reaching a conclusion +and without any punctuation to keep the ideas flowing, you will end up with +something that it is easier to forget and which the central idea will be lost +(and I freaking hope you got what I just did). It's tiring to read a very long +sentence; it's easy to keep the context on a short sentence.

+

In the spirit of "proper" PEP8, I reformatted one of the failing tests +to follow the 80 column limit. And now the code looks like crap. And +I'll commit like that. It's not because I hate my coworkers, but to point out +that, because it's a pain to read, it means the structured of the code is too +complex. If someone comes and say "damn, this test is hard to read", I'll be +able to point that it is not the test that it is hard to read, but the code +that reached the point where its complexity is leaking to the test code; it is +now a good time to refactor this to simplify things and make them easier to +read.

+
+

Actually, the reason for it to fail is too damn fun and worth a proper blog +post about it. Stay tunned!

+ +
+

Not that we can simply stop working and fix the damn architecture of it, but we +can at least keep this beast around till everybody gets pissed and realize it +desperately needs a refactor.

+
+

Weird thing, people usually assume some countries are the center of bad code; +this baseline is coming from a "first world country" and, heck, it has one of +the worst designs I ever saw. I'll not name names here to protected the (maybe) +innocent. But in the second week of training, I realized this whole project +has, at least, 6 months of technical debt already.

+ +
+ +
+ + + + +
+ + + + diff --git a/public/code/why-mixing-tabs-and-spaces-is-a-big-deal/index.html b/public/code/why-mixing-tabs-and-spaces-is-a-big-deal/index.html new file mode 100644 index 0000000..48d6ebb --- /dev/null +++ b/public/code/why-mixing-tabs-and-spaces-is-a-big-deal/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Why Mixing Spaces and Tabs IS a Big Deal

+ +

Why something so small is actually a big deal.

+ +

Reading Reddit comments about How terrible code gets written by perfectly +sane people +when I read this comment:

+
+
+

spaces/tabs for indentation

+
+
+
+

Is this a joke? I've been programming professionally from 2008 and I've not +yet found an actual case where this was an actual problem. The code looks +the same on everyone's screen if you set tab length in the editor to same +as the amount of spaces in your indentation. It would take seconds to fix +this :) I've never seen a tabs vs spaces argument go anywhere. It's such a +dumb thing to complain about. Maybe because I'm young I don't have +experience of bad code editors of old days but it's 2016 now. It's not a +big deal anymore.

+
+

Unfortunately, I lost the time to properly reply to this comment, but here it +goes:

+

No, it isn't a joke. If you've read Clean Code, +you'd see that, at some point, Uncle Bob mentions that there isn't an actual +experiment about it, but his team personally found that a programmer that cares about +consistency and follows coding standards are prone to write less buggy code.

+

I get what he means: If someone cares about the small stuff, +they also care about the big stuff. It doesn't mean that people that ignore +coding standards (and the difference between using tabs and using spaces) +doesn't care about the big stuff; but on my own experience in those 28 +years in the field proved the opposite: people who cared about +"putting the code at the door" without worrying about following coding standards +(and we can add tabs vs spaces here), proper code documentation, +separation of concerns, a good level of abstraction, tend to write +horrible/unmaintable code.

+

This is why mixed spaces/tabs is bad: it means that whoever didn't care enough +with something so small as the coding standard, probably didn't care +about the bigger stuff. Their only worry was to deliever stuff, no matter +what. "And no matter what" usually results in terrible code.

+

So, while not an "actual problem", it is an indicator that something really +terrible is going on. So, no, it isn't a joke and yes, it is a big deal. And +it has absolutely nothing to do with "bad code editors", it's a problem with +"bad coders".

+ +
+ + + + +
+ + + + diff --git a/public/code/you-dont-need-range/index.html b/public/code/you-dont-need-range/index.html new file mode 100644 index 0000000..c3ae0ed --- /dev/null +++ b/public/code/you-dont-need-range/index.html @@ -0,0 +1,267 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

You Don't Need range()

+ +

Beginners in Python tend to use range() for iterating over lists. This is +not really necessary.

+ +

When people start programming Python, they tend to use constructions coming +from other languages, so they iterate over a list with something like:

+
a_list = [1, 2, 3, 4]
+for i in range(len(a_list)):
+    print(a_list[i])
+
+

But Python have the concept of "iterable", meaning some things can be iterated +over, without the need of accessing each element individually. For example, +our previous list can be iterated with:

+
a_list = [1, 2, 3, 4]
+for value in a_list:
+    print(value)
+
+

"For every element in a_list, retrieve it and name it value."

+

A lot of elements are iterable: Strings are iterable, returning every +character in them; dictionaries are iterable, returning every key in them; +sets are iterable, returning every element in them; tuples are iterable, +returning every value in them; generators are iterable, return the next value +they can produce.

+

But what if you need to iterate over more than one iterable at the same time?

+

Enters zip()

+

That's where zip() comes in. zip() allows you to merge iterables:

+
a_list = [1, 2, 3, 4]
+a_tuple = ('a', 'b', 'c', 'd')
+for mixed_tuple in zip(a_list, a_tuple):
+    print(mixed_tuple)
+
+

This code prints out:

+
(1, 'a')
+(2, 'b')
+(3, 'c')
+(4, 'd')
+
+

What zip() does is create a tuple with the first element of the first +iterable and the first element of the second iterable; then the second element +of the first iterable and the second element of the second iterable; and so +on. You can put as many iterables as you want in zip() and it will just +create larger tuples for each interaction.

+

Interlude: Destructuring

+

One of the cool things in Python is "destructuring". Destructuring +(de-structuring or more like "breaking apart a structure") allows one to +extract elements from a iterable directly.

+

For example, if you have a tuple with two elements:

+
a_tuple = (1, 2)
+
+

... you'd probably take every element of it in separate variables with +something like

+
a = a_tuple[0]
+b = a_tuple[1]
+
+

But with destructuring, you can do this in a single pass with

+
(a, b) = a_tuple
+
+

This code and the one above it will do exactly the same thing.

+

But why destructuring is important if we are talking about iterating over +elements? 'Cause for also has the destructuring capabilities:

+
a_list = [1, 2, 3, 4]
+a_tuple = ('b', 'c', 'd', 'f')
+a_string = 'aeio'
+
+for (a_number, lowercase_char, uppercase_char) in zip(a_list, a_tuple, a_string):
+    print(a_number)
+    print(lowercase_char)
+    print(uppercase_char)
+    print()
+
+
+

Remember that I said that strings are also iterables and each iteration would +return a character? That's it.

+ +
+

But what happens when one of the iterables is smaller than the other one?

+
a_short_list = [1, 2]
+a_long_list [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (small, big) in zip(a_short_list, a_long_list):
+    print(small, big)
+
+

That will print

+
1 10
+2 20
+
+

zip() stops when the shortest iterable have no more elements. To go as far +as the longest iterable, you need itertools.zip_longest().

+

itertools.zip_longest()

+

zip_longest(), part of the itertools module, will transverse the iterables +till every one of them have no more elements. What happens with the shortest +of those is that its value will be replaced with None. Using our previous +example:

+
import itertools
+
+a_short_list = [1, 2]
+a_long_list [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (small, big) in itertools.zip_longest(a_short_list, a_long_list):
+    print(small, big)
+
+

That will print:

+
1 10
+2 20
+None 30
+None 40
+None 50
+None 60
+None 70
+None 80
+None 90
+
+

Careful with generators

+

One thing you must be careful when using zip() and zip_longest() are +generators. Why? Because some of them have no end.

+

Let's take one example: cycle(). cycle(), also part of the itertools +module, is a generator that, on request, returns the next element of an +iterable but, as soon as this iterable is over, it starts over. For example +(and I'm tacking zip() around this just for the sake of staying on topic, +and you don't need to use zip() with cycle()):

+
a_list = [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (bullet, value) in zip(cycle(['-', '*', '.']), a_list):
+    print(bullet, value)
+
+

That will produce:

+
- 10
+* 20
+. 30
+- 40
+* 50
+. 60
+- 70
+* 80
+. 90
+
+

What happened here is that zip() took the first value of the first iterable, +our cycle(['-', '*', '.']), which was the first value of its iterable, +'-', and the second value of the second iterable, 10; next iteration, the +second value of cycle() was '*' and the second value of a_list was 20; +third iteration, cycle() returned '.' and a_list returned 30; now, on +the fourth iteration, cycle() was asked for a value and, with its iterable +exhausted, it returned to the first value, returning '-' again.

+

Ok, cool?

+

So, what's the problem with generators?

+

Some generators -- like cycle() above -- do not have an end. If you replace +zip() with zip_longest() on the code above, you'll see that the code will +never stop. It's not every generator the can produce values continuously, +though, so you can mess with them with no issue.

+
+

It's not zip_longest() that may have an issue. You can put two cycle()s in +a zip() and it will keep producing tuples with no end.

+ +
+

All nice and dandy, but what if I need to show the index itself?

+

enumerate() to the rescue!

+

Ok, so we talked about mixing more than one iterable, but what if we need the +position? What if we have a list of ordered results and we need to show the +position itself?

+

Again, you may be temped to use range():

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for pos in range(len(winners)):
+    print(pos + 1, winners[pos].capitalize())
+
+

That will print:

+
1 First place
+2 Second place
+3 Third place
+4 Fourth place
+
+

One may also try to be clever and mix our newly found knowledge about zip() +and do:

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for (pos, name) in zip(range(len(winners)), winners):
+    print(pos + 1, name.capitalize())
+
+

... which ,personally, looks even more cumbersome than the first option. But +Python have another generator called enumerate() that takes one single +iterable, but produces tuples with the index of it and its value:

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for (pos, name) in enumerate(winners):
+    print(pos + 1, name.capitalize())
+
+

Even better, enumerate() have an option to define with will be the value of +the first element, so instead of that pos + 1 in the print() statement, we +can replace the enumerate to enumerate(winners, start=1) and remove the +addition in print().

+

Conclusion

+

Iterables is one of the powerhouses of Python, as you may have noticed in the +beginning with the number of things that can be iterated over. Understanding +those will help you write better and more concise Python code, without losing +meaning.

+ +
+ + + + +
+ + + + diff --git a/public/hyde.css b/public/hyde.css new file mode 100644 index 0000000..d976fa2 --- /dev/null +++ b/public/hyde.css @@ -0,0 +1 @@ +html{font-family:"PT Sans",Helvetica,Arial,sans-serif}@media (min-width: 48em){html{font-size:16px}}@media (min-width: 58em){html{font-size:20px}}.sidebar{text-align:center;padding:2rem 1rem;color:rgba(255,255,255,.5);background-color:#202020}@media (min-width: 48em){.sidebar{position:fixed;top:0;left:0;bottom:0;width:18rem;text-align:left}}.sidebar a{color:#fff}.sidebar-about h1{color:#fff;margin-top:0;font-family:"Abril Fatface",serif;font-size:3.25rem}.sidebar-nav{padding-left:0;list-style:none}.sidebar-nav-item{display:block}a.sidebar-nav-item:hover,a.sidebar-nav-item:focus{text-decoration:underline}.sidebar-nav-item.active{font-weight:bold}@media (min-width: 48em){.sidebar-sticky{position:absolute;right:1rem;bottom:1rem;left:1rem}@supports (padding: max(0px)){body:not(.layout-reverse) .sidebar-sticky{padding-left:max(1rem, env(safe-area-inset-left))}.layout-reverse .sidebar-sticky{padding-right:max(1rem, env(safe-area-inset-right))}}}.content{padding-top:4rem;padding-bottom:4rem}@supports (padding: max(0px)){body:not(.layout-reverse) .content{padding-right:max(1rem, env(safe-area-inset-right))}.layout-reverse .content{padding-left:max(1rem, env(safe-area-inset-left))}}@media (min-width: 48em){.content{max-width:38rem;margin-left:20rem;margin-right:2rem}}@media (min-width: 64em){.content{margin-left:22rem;margin-right:4rem}}@media (min-width: 48em){.layout-reverse .sidebar{left:auto;right:0}.layout-reverse .content{margin-left:2rem;margin-right:20rem}}@media (min-width: 64em){.layout-reverse .content{margin-left:4rem;margin-right:22rem}}.theme-base-08 .sidebar{background-color:#ac4142}.theme-base-08 .content a,.theme-base-08 .related-posts li a:hover{color:#ac4142}.theme-base-09 .sidebar{background-color:#d28445}.theme-base-09 .content a,.theme-base-09 .related-posts li a:hover{color:#d28445}.theme-base-0a .sidebar{background-color:#f4bf75}.theme-base-0a .content a,.theme-base-0a .related-posts li a:hover{color:#f4bf75}.theme-base-0b .sidebar{background-color:#90a959}.theme-base-0b .content a,.theme-base-0b .related-posts li a:hover{color:#90a959}.theme-base-0c .sidebar{background-color:#75b5aa}.theme-base-0c .content a,.theme-base-0c .related-posts li a:hover{color:#75b5aa}.theme-base-0d .sidebar{background-color:#6a9fb5}.theme-base-0d .content a,.theme-base-0d .related-posts li a:hover{color:#6a9fb5}.theme-base-0e .sidebar{background-color:#aa759f}.theme-base-0e .content a,.theme-base-0e .related-posts li a:hover{color:#aa759f}.theme-base-0f .sidebar{background-color:#8f5536}.theme-base-0f .content a,.theme-base-0f .related-posts li a:hover{color:#8f5536} \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..616f35c --- /dev/null +++ b/public/index.html @@ -0,0 +1,369 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Running a Command and Saving Its Output to File in Rust + +

+ + +
+

I had an issue: I needed to run a command inside Rust, but I needed that all +its output should go to a file, and I needed to check if there were certain +phrases in it.

+ +
+ + Read more... + +
+ +
+

+ + Timeout With Command in Tokio + +

+ + +
+

How to spawn an external command and give it a timeout in Rust, with Tokio

+ +
+ + Read more... + +
+ +
+

+ + Thinking About Rust Actors + +

+ + +
+

I recently wrote an application for work (so, sorry, can't show you the code) +that, 'cause it was heavily I/O based, I decided to write it using +Tokio and the idea of Actor Model with +it.

+

... which gave me some things to think about.

+ +
+ + Read more... + +
+ +
+

+ + Seek Test + +

+ + +
+

How to use .seek() in Tokio BufReaders.

+ +
+ + Read more... + +
+ +
+

+ + Overthinking Rust Iterators + +

+ + +
+

I had some issue recently with Rust iterators, and that led me to think a lot +about iterators in Rust.

+ +
+ + Read more... + +
+ +
+

+ + Degenerated Brief Tin + +

+ +
+ +
+

+ + Nice Troubled Astatine + +

+ + +
+

Note Taking Application

+ +
+ + Read more... + +
+ +
+

+ + Rust in Real Life + +

+ + +
+

For a while, I've been talking about Rust, making presentations, going to +meetups...

+

But a few months back I had the opportunity to finally work in a real +project in Rust.

+

So, how was it?

+ +
+ + Read more... + +
+ +
+

+ + Multiple Distros with Toolbx + +

+ + +
+

When I switched from Fedora to +Silverblue, I got used to use +toolbox to check for packages and whatnot. But when I needed to test a +project in multiple distributions, I decided it was time to explore Toolbx a +little deeper.

+ +
+ + Read more... + +
+ +
+

+ + Thrifty Rubidium + +

+ +
+ +
+ +
+ + + + diff --git a/public/links/1password-linux-beta/index.html b/public/links/1password-linux-beta/index.html new file mode 100644 index 0000000..eb6388e --- /dev/null +++ b/public/links/1password-linux-beta/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: 1Password for Linux beta is now open

+ +

1Password, the famous password management tool, published a blog about +releasing a beta version of their tool for +Linux.

+ +

Now, we always welcome a tool for Linux, specially the ones with names already +know in the market, 'cause that gives the public a perception that Linux +exists and that larger companies give a fuck about it, and so on.

+

But what caught my eye is this line: "Its backend is written completely in +Rust". Not just because I'm a fan of Rust, but because

+
    +
  1. the application doesn't look like a native application; it looks like an +Electron application;
  2. +
  3. this kind of action with Rust reminds of another technology that also wasn't +well known, but caught engineers attention, and then, suddenly, it took off +and now is widely used.
  4. +
+

That technology was Linux. And the same thing seems to be happening to Rust. +And this gives me a lot of hope in the future.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200303/index.html b/public/links/20200303/index.html new file mode 100644 index 0000000..24c68c4 --- /dev/null +++ b/public/links/20200303/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-03

+ +

Interesting links for 2020-03-03.

+ + +
+
1 +

I think I shared this on Mastodon before, but I realized there is one +small point that needs some clarification.

+
+ +
+ + + + +
+ + + + diff --git a/public/links/20200304/index.html b/public/links/20200304/index.html new file mode 100644 index 0000000..d0030f6 --- /dev/null +++ b/public/links/20200304/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-04

+ +

Interesting links for 2020-03-04.

+

Leaked Document Shows How Big Companies Buy Credit Card Data on Millions of Americans

+

Alright, this is stupid: "We removed the user information and put an unique ID +in place" is completely bullshit. I know it, you know it, but it seems it is +the general way of selling user information around.

+

Even if someone removes the unique ID but keep other information, things are +still traceable: For example, how many people do you think are white, male, +above 40, not married, living in a specific suburb (I won't even claim the +street itself) that bought some product? I bet you could pretty much find me +with just that, 'cause that description would fit 0.00001% of the city +population, anyway.

+

Maybe we need to rethink this "sell information" thing, since privacy is long +gone. We need laws that, if you want to sell collected information, you need +to put one single vector per information. That means that, if you want to sell +that information, you need to have one dataset for skin color, which says a +white person bought some product; another dataset for sex, which says a male +bought some product; and so on. No unique IDs.

+

It's not perfect, but I believe that would get more traction than simply say +"don't capture any data", 'cause, seriously, it is not working.

+

Aerogel from fruit biowaste produces ultracapacitors with high energy density and stability

+

Hey, that's cool that we are finding ways to recycle stuff like biowaste for +something like capacitors, but I have to wonder if that, in our current world, +that means people will produce durian and jackfruit just to let it rot to +create biowaste for the capacitors, instead of something simple, like feed +people.

+

IBM To Transition Their z/OS, POWER + AIX Compilers To Being LLVM/Clang-Based

+

I have to wonder if the move is something like this: IBM bought RedHat; RedHat +sells Linux solutions; IBM stronghold are the mainframes, which are dying; by +changing the base system from their compiler to Clang, they are also saying +"hey, people who build stuff for our platforms, you should use Clang now!", +which would make transition those codebases to Linux a bit simpler.

+

But yeah, just wondering if that makes sense.

+

(Also, Clang Fortran?)

+

Microservices – Combinatorial Explosion of Versions

+

I have a strong problem with this post: Basically, the problem it points +happens if you keep two different versions of the same microservice running.

+

That's not how you should build your fleet -- even if it is possible and not +that hard.

+

One point of upgrading a microservice is keeping backwards compatibility with +their inputs; if you deploy a new version what receives a complete different +input, you can either add both input interfaces in the new service or just add +a brand new microservice that just converts the old input to the new one -- +which increases the fleet, but it's not that a big point.

+

One thing to keep in mind with this upgrade policy is that you need to +monitor the inputs. Once the old input version is not being send anywhere +else, you can remove the input/disable the microservice -- with the second +option being less intrusive, as you won't need to redeploy the updated +microservice with the old input support.

+

Stop using Material Design text fields!

+

Or you could, for instance, to drop Material Design completely.

+

Yes, I'm not a fan of Material Design. I'm not UX expert, but I feel that it +fails in a lot of places -- not only text fields.

+

The Self-Attribution Fallacy

+

"Intelligence? Talent? No, the ultra-rich got to where they are through luck +and brutality."

+

"If wealth was the inevitable result of hard work and enterprise, every woman +in Africa would be a millionaire."

+

I keep saying this around, and one thing that resonates with what I say would +be: It's not that the ultra-rich are brutal, brutality is what made them rich.

+

Void: terminal-based personal organizer

+

Not sure if it falls into any of my workflows, but HOLY COW, graphs in the +console?

+

Building Rust for Multiple Platforms Using Github Actions

+

While focused on Rust, because the focus are the Github Actions, one could +"easily" port for other languages (for different levels of "easy").

+

Web crawler in Rust

+

"How to Draw an Owl", but for Rust crawler. :)

+

I got most of the stuff, but I guess anyone learning Rust would suddenly see +the later listing and think "This is nuts!"

+

The Cost of Indirection

+

"How a newbie, a seasoned and a veteran Rust coder solve this problem", but... +for Rust.

+

I'm not that interested in the times, but in the different implementations of +the same thing in the same language. May be interesting 'cause some +implementations may make more sense than other to some people.

+

Toss a Coin to Your Bitcher

+

A disabled person commenting on the way "The Witcher" series deal with +disabled people, in this case, Yennefer. Honestly, even when I watched, I +couldn't see Yennefer as disabled, 'cause... well, one 'cause although I think +about my own disability (glasses), I don't see that much different than any +other "normal" person (although I still think Gordon Freeman is the only +short-sighted "hero" I ever saw), and I know what happens with Yennefer in the +future (thanks for the games).

+

Still, it's eye-opening to see this kind of post to get a view of how disabled +people see disabled characters.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200305/index.html b/public/links/20200305/index.html new file mode 100644 index 0000000..bfff5d6 --- /dev/null +++ b/public/links/20200305/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-05

+ +

Interesting links for 2020-03-05.

+

“Let’s use Kubernetes!” Now you have 8 problems

+

Not only explaining the problems of running K8s1, but also K8s codebase +itself (summary: it looks like a mess) and if you really should use K8s +(summary: only if you scale a lot, and you can scape from the scaling problem +altogether).

+

Please stop recommending Git Flow!

+

I'm putting this here just because I wholeheartedly disagree with it. While +some points are real (the short-lived branch rule, for example), some are +(sorry, not sorry to say it) plain stupid.

+

Also, I do not believe in monorepos, 'cause monorepos bring the worst of +software development -- instead of focusing on separating things into +libraries and making proper releases, you just put everything globed together +and hope for the best. So yeah, it's not that Gitflow makes it impossible to +use monorepos, is that you shouldn't be using a monorepo in the first place!

+

Bye-Bye Mastodon, our account on Fosstodon.org was deleted yesterday

+

How a group of people working on open source projects but posted product +updates in one of the Mastodon servers and got kicked for advertising.

+

This is one thing that can happen on every project that you can't manage -- +and that includes every other social network mentioned in the post, not only +Mastodon. What would you do if Twitter saw your advertising and decided you +should buy "Enterprise Twitter Pro" to be able to post such content?

+

Mastodon -- and the Fediverse, for that matter -- is formed by lots of +servers. Fosstodon is only one of them (I do have an account on Functional +Cafe, for example. If the server policy +changed to something I was not in accord, I could just take my data (and yes, +you can take all your data) and upload to another server, with different +policies. And if I don't agree with any server policy, I can run my own +server and still connect with everyone.

+

So... Yeah, it's not that Mastodon is hard to use, or have a small community, +but you can still be part of the Fediverse, if you want. Bonus: You can make +your own policies for what is right or not.

+

genact - a nonsense activity generator

+

A very stupid CLI application with different modules to emulate some other +long-running CLI application, so you can let it run and seem you're waiting +for something.

+

caniuse.rs

+

I never thought we would get to this point: A "Can I Use" for Rust versions. +Can you use iter::once_with? Only on Rust 1.43 and up.

+

Sure, a language that is not standing still but keeps progressing, specially +since they are new, is a good thing, but it seems more and more features are +being pumped in every version. Also, as it is simple to update Rust (just run +rustup update) but it seems things are getting a bit out of hand.

+
+
1 +

"K8s" is the short-form of "Kubernetes", and hence the title of "8 +problems".

+
+ +
+ + + + +
+ + + + diff --git a/public/links/20200306/index.html b/public/links/20200306/index.html new file mode 100644 index 0000000..11e14ca --- /dev/null +++ b/public/links/20200306/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-06: Async Rust, Leadership, Firefox removing old cookies, X-Windows, Linux distributions, PC cases

+ +

Interesting things going on the internet, 2020-03-06.

+

async/await on embedded Rust

+

Not production ready yet, but the guys from Ferrous Systems are working on a +way to embbed async/await on embedded systems. While this may sound strange +("What? But Rust doesn't support async/await already?"), the fact is that most +async/await runtimes use Glibc functions and do not work without it. They even +have a repository with +some code.

+

This is huge.

+

Taking someone aside

+

Some tips on how to talk to someone when you want them to stop doing +something.

+

Purge site data when site identified via old tracking cookies

+

This is a direct link to a Firefox "bug" (actually, a feature) for removing +cookies older than 30 days if you don't interact with the site in 30 days.

+

"My logins!", you may be thinking. But this will also remove any tracking site +as long as you don't interact with the site anymore (goodbye Google tracking +sites, if you use DuckDuckGo, ProtonMail, Invidio.us, and so on).

+

The X-Windows Disaster

+

This is a piece of hate on XWindows -- you know, the thing that first was +XFree86, then turned to X.org, then was completely scratched and is slowly +being replaced by Wayland.

+

But the curious part is not the hate, but the fact that it tells the story +behind X-Windows, how it came to be and how it works -- and the steps people +made to make it actually work.

+

Try Linux

+

Not using Linux yet? Wondering which the myriad of distributions you should +use? Not really getting into that distribution that you Linux-fan friend +suggested?

+

This page has a list of distributions and their knowledge required.

+

Even if you already use Linux, you may pick something more "advanced", just to +explore new things.

+

The beautiful machine

+

I'm not running desktops anymore, but heck if that isn't a pretty case!

+ +
+ + + + +
+ + + + diff --git a/public/links/20200309/index.html b/public/links/20200309/index.html new file mode 100644 index 0000000..d7bdbb8 --- /dev/null +++ b/public/links/20200309/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-09

+ +

Generalists vs Specalists, Meds and Big Pharma Companies, Being Silly While +Washing Your Hands, Licensing and Copyrights, Torture in Movies, Badly +Anonymized Dataset Causes Melbourne Professor to Resign, Netlify Terms and +Telemetry, Packaging in Guix, Functional C#, UUIDs, Python Context Manager.

+

On being a generalist

+

A more general explanation on the differences between generalists and +specialists.

+

Personal take: Go for a generalist.

+

With no prospects for profits, big pharma neglects new infectious diseases

+

I guess this comes with no surprise.

+

Also, there is something really wrong with pharma companies or with the +current business model.

+

Wash Your Lyrics

+

You know those posters about how to wash your hands? You know that some people +are messing with them? Why not mess with your favourite song lyrics?

+

Please re-add original author to docs and license #1703

+

Short take: The author of Guake, a terminal emulator, found out his name was +removed from the project.

+

It's weird that I'm, right now, working on a presentation about licenses and +all of them say that Copyright can't be removed! On top of that, licenses +and based on copyright and, thus, unless the author concedes the license of +their copyright, no one can remove them from the copyright (well, maybe after +75 or so years, IIRC).

+

Torture Prevalent, Effective in Popular Movies, Study Finds

+

No, watching someone torture someone else won't make you a torturer, but will +desensitize you about torture and normalize it. And you shouldn't.

+

Melbourne professor quits after health department pressures her over data breach

+

Once again, person gets "anonymized" data-set, manages to re-identify people. +This part is so freaking common, companies (and government) that provide this +kind of data should be sued, till we have some laws preventing companies to +provide data in this way.

+

But, instead, what we are getting is people trying to criminalize people +re-identifying people form those datasets. And that's stupid.

+

netlify still connects to telemetry server when user does not consent to telemetry! #739

+

An issue on the Netlify CLI tool, which was (allegedly) sending telemetry +information even when the user requested to not send telemetry.

+

Now, while bugs are bugs and can happen, the discussion around it is quite +interesting, as Netlify people basically claim that going with telemetry on is +ok 'cause you accepted the terms of use of Netlify -- which, to me, sounds +like one hell of an excuse to let telemetry on by default.

+

How to package software for Guix (3)

+

Not that I get the Guix system yet, but I'm going to keep this around when I +jump into it.

+

Your C# is already functional, but only if you let it

+

Again, I'm not using C#, but I find it interesting that the language have all +the tools to make a functional architecture in it.

+

Why your software should use UUIDs in 2020s

+

I'm already planning all my data to use UUIDs, but I guess a long post about +why you should use can also convince you to start using them.

+

The Python "with" Statement by Example

+

Have I said how much I love the context manager in Python? 'Cause I love the +context manager in Python so much.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200311/index.html b/public/links/20200311/index.html new file mode 100644 index 0000000..0308394 --- /dev/null +++ b/public/links/20200311/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-11

+ +

Google Policy towards AGPL software, Swift vs Rust, Open Source Economics, +JUnit 5, cfg(doctest), Firefox on Flathub.

+

AGPL Policy

+

Google policy towards using AGPL software. Basically, because AGPL says +"source is always available", Google says "maintain an aggressively-broad +ban on all AGPL software"

+

Take away: Release everything under the AGPL.

+

Impressions of Rust as a Swift Developer: Memory Management

+

A take on the way Rust and Swift manages memory. While I agree with the +drawbacks of Rust, the author forgets to mention the price Swift pays for its +simplicity: A runtime.

+

Having a runtime is bad? Well, it depends: If you're not using anything the +runtime offers (your application does a full allocation upfront and never +deallocates, it completes its job before it has time to actually use the +garbage collector), you're basically wasting resources. Sure, you pay this in +development time, but this has to be measured.

+

Also, a runtime means another problem: Runtime errors. Unless your compiler +picks those and stop you from creating code that can generate those errors, +you'll get those.

+

(Also, fun fact: Graydon Hoare, the creator of Rust, worked on Swift.)

+

cfg(doctest) is stable and you should use it

+

Speaking of Rust, here's a feature I was not aware of: You can create testing +modules that test Markdown documentation. Why would anyone do that? Well, +markdown is usually the way people document their applications and you want +your examples to actually work, right?

+

Can We Make Open Source More Sustainable?

+

A big problem with open source is that actually nobody cares about how it is +developed: Sure, there is a person (or persons) behind it, but how are +those people paying for their living, eating and health? The post points some +things open source developers can do to get something out.

+

Improve your tests with JUnit 5

+

A few tips on using JUnit 5 -- some that I was not aware of.

+

Mozilla makes Firefox Beta available on Flathub

+

Mozilla is making Firefox available on Flathub, which means now it is even +easier to test Firefox without breaking your system -- 'cause Flatpak keeps +the whole package in its own container and it does not touch your system.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200312/index.html b/public/links/20200312/index.html new file mode 100644 index 0000000..e9111bd --- /dev/null +++ b/public/links/20200312/index.html @@ -0,0 +1,140 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-12

+ +

Netflix and the Hexagonal Architecture, logging, EOF, JS Frameworks, Emacs +Charts, Rust init Pattern, Software Engineers vs Technicians, Cancelling +Conferences How-To, A VIM Jump-to-Anything plugin.

+

Ready for changes with Hexagonal Architecture

+

A Netflix Tech post about the hexagonal architecture for microservices.

+

The interesting bit here is the fact that Netflix devs focused on "swappable +data sources", which is something I've been pushing where I work a lot1

+

Even if I hate this posture a lot2, now I can say "Netflix does this, we +can do it too!"

+

Do not log

+

I really don't agree with this. I do understand that, sometimes, logging is +stupid and just adds noise, but we have see this problem in the same way we +see comments: They need to explain the why. Why the request failed?

+

Sometimes it can even be the what: What user input caused this process to +fail?

+

As the author argues, one could use Sentry for capturing failures, but what if +this isn't an option (due to cost)? I once worked with the free version of +Sentry and while it was okay, it didn't provide enough information to +understand the why things failed -- you can add the message in the +exception, but only if that's your code; what can you do if it is a library +causing the exception? Cascade everything?

+

Log. But think on why you're logging.

+

EOF is not a character

+

My C life is build on top of lies!

+

Honestly, I thought EOF was really the same value as ^D (Ctrl-D, which ends +the input) and you could put an EOF in the middle of the file and still have +content. But it seems it was not that.

+

A RealWorld Comparison of Front-End Frameworks 2020

+

Not too sure about the benchmarks used -- specially when someone says "Svelte +was skipped due to cloc not being able to process .svelte files." when you can +surely use wc.

+

But still, interesting, in some aspects.

+

ActuallyUsingWasm

+

Implementations, runtimes, execution times, code samples... A bit of +everything about running Wasm.

+

Exploring emacs chart library

+

No, I didn't drop VIM and start using Emacs, but it is really impressive that +it has a built in charts library -- which, on the other hand, just adds to the +"Emacs is a good operating system, but lacks a good editor" joke.

+

My exploration of Rust and .NET

+

Converting LLVM bytecode from Rust to .NET assembly.

+

Init Struct Pattern

+

An initialization pattern for Rust structures. Honestly, I don't see that much +difference than using Default directly, but it may be interesting if you +should do some change in the input at construction.

+

(Also, I have the slight impression that the pattern, in the end, forces you +to build a complete object and then call init() to build a copy of said +already complete object.)

+

The Fall of The Software Engineer, The Rise of The Programmer Technician

+

A discussion on the (natural) evolution of the software development market.

+

My conference has a sneeze - Practical help in winding down a troubled conference

+

This is mostly interesting to me 'cause I'm part of the organization of two +conferences and we have this discussion about cancelling, postponing or going +forward for both.

+

any-jump.vim — IDE madness without overhead for 40+ languages

+

A VIM plugin to jump to everywhere (except files, that is). But hell if it +isn't cute.

+
+
1 +

Sadly, I'm not getting heard here.

+
+
2 +

That's cargo +cult, kids.

+
+ +
+ + + + +
+ + + + diff --git a/public/links/20200313/index.html b/public/links/20200313/index.html new file mode 100644 index 0000000..896d519 --- /dev/null +++ b/public/links/20200313/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-13

+ +

AWS+Azure+GCP on Optimizing Benchmarks, Public Service in Germany Can't Be +Free, Fake Twitter Accounts, Automated Emails, Documenting Your Rust Code, +Tips on Working From Home.

+

AWS, Azure, & GCP Respond to the 2020 Cloud Report

+

Here is the thing: CockroachLabs checks the performance of their database on +all major cloud providers using the default settings; cloud providers respond +the report by suggesting improvements; CockroachLabs publish the suggestions.

+

Court outlaws German Weather Service's free weather app

+

So you think a service provided by the government should be free (since, you +know, it's paid by the taxpayers). But then comes a private service and the +government (the law part) says the private service is correct in saying the +service paid by the taxpayers shouldn't be free.

+

And all that in Germany, in all the places... although I reckon Germany is not +a place known for urgent warnings like hurricanes and such.

+

Signs You’re Following A Fake Twitter Account…

+

A good report on how to spot fake accounts, although I have to wonder how many +people would actually take the time to do all the checking presented in the +article.

+

A Vacancy Has Been Detected

+

A tale of loss and how automated messages can be problematic 'cause they +assume too much about the target audience.

+

Guide on how to write documentation for a Rust crate

+

Not only explaining how the Rust documentation system works, but also giving +pointers on how to write a proper documentation.

+

Things I've learned from 12 years of WFH

+

Tips and tricks and some pointers on how to do a proper Work From Home.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200316/index.html b/public/links/20200316/index.html new file mode 100644 index 0000000..e6e0aaa --- /dev/null +++ b/public/links/20200316/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-03-16

+ +

Free DevOps Books, COVID-19 Vaccine Fight, License Writing Tool, Python +Cheatsheet, Erland LS, Unix Text Processing.

+

You can get my DevOps books free the rest of this month

+

Jeff Geerling, author of "Ansible for DevOps" and "Kubernetes for DevOps" made +those two books free on LeanPub, but only for this month.

+

Germany tries to halt U.S. interest in firm working on coronavirus vaccine

+

Welt am Sonntag, a German newspaper, got hold on the fact that the US +government is trying to buy the company working on a cure of COVID-19, "but +only for the US".

+

Hey, nice showing on how to be a super-power, US Government.

+

Licensor: write licenses to stdout

+

Tired of searching how to write the license for your project? Worry no more! +Licensor have a list of licenses and you can use it to generate your LICENSE +file!

+

Comprehensive Python Cheatsheet

+

Chearsheets are abound, but this one for Python is pretty damn nice -- and +really complete.

+

Welcome to Erlang LS

+

Erlang got its own Language Server, allow you to use any editor (that supports +LSP -- Language Server Protocol -- that is) to write Erland code and get +auto-completion and jump to definitions.

+

Text processing in the shell

+

A short explanation of lots of tools for text processing on Unix (actually, +POSIX) systems.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200419/index.html b/public/links/20200419/index.html new file mode 100644 index 0000000..55b3569 --- /dev/null +++ b/public/links/20200419/index.html @@ -0,0 +1,179 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-19

+ +

Managing Nested Data in MySQL, The Commons Clause License, Clojure, A Look +into Compilers, No <> to Generics, Configuration Files, Zoom Fiasco, Rust +CLI tools, SEO.

+

Managing Hierarchical Data in MySQL

+

A bunch of tips on how to manage nested/hierarchical information in MySQL. +While the storage format could be used in any database, it seems the insertion +part in the post is MySQL specific.

+

Curious, nonetheless.

+

The Commons Clause will destroy open source

+

While I don't agree with Drew in some points (mostly the things he rants +about), and while I don't think, on the surface, that the Commons Clause may +destroy open source, his words are a cautionary tale about picking the right +license1.

+

Guide to starting with Clojure

+

It's been too long since I saw a very detailed introduction of a language like +this. Explaining installs, IDE/Editor configuration, a short description of +the language, a toy problem and a way to build and deploy the result.

+

Really complete -- and, on the plus side, it's Clojure!

+

The Svelte Compiler Handbook

+

While related to Svelte -- the JavaScript templating language -- what it +describes is pretty close to what every compiler do, in a high level, even if +some do more stuff, like Rust having two more steps before the code +generation, for optimization.

+

Language Design: Stop Using <> for Generics

+

Let's get into some controversy, shall we?

+

One the major points of Clojure is exactly how it pick one single pair for +each different aspect, contrary to Lisp, which used parenthesis for +everything.

+

So, what is being described here is to use [] instead of <> for generics. +But wouldn't that clash with array access? Sure, that's why array access +should be (). But wouldn't that clash with function calling? Sure, that's +why function calling should be... should be what again? Nothing? So we let it +clash?

+

"<> is hard for compilers to parse". Oh, poor compiwer, it is weaving a bad +time? Newsflash, the job of a compiler is to take the hard work and leave +the simpler thing to users; the harder it does its work, the easier it is for +their users. If the users can clearly see generics with <> -- because it is +different from everything else -- then it is good.2

+

Your configs suck? Try a real programming language.

+

Another controversy, just for fun.

+

Ok, so config formats are bad 'cause you can't replicate some stuff -- I can +agree with that, imagine having to copy and paste the same value over and +over?

+

But the problem is: Using a "real programming language" for configuration may +also have a problem: you need to cut a lot of stuff. Django uses Python itself +as a configuration -- and, again, I can agree with that, 'cause it allows one +to have a default configuration and just import it and override things for +your local execution -- but it doesn't block running anything. Worse, because +you can import things into the configuration file, one project that gets +compromised will always run the code.

+

Again, I agree with a lot of points, including the fact that the current +formats for configuration files are bad, but using a programming language for +it is not the solution. Besides, it is possible to overcome those problems +with better configuration settings themselves than the format; as hard as it +is.

+

Security and Privacy Implications of Zoom

+

While articles about the raise of Zoom and its problems popping everywhere, +but Bruce Schneier, the father of internet security, made a post with all its +problems, from privacy to security.

+

My tools are going Rusty

+

A short summary of common Unix/Posix/GNU tools written in Rust.

+

How SEO Ruined the Internet

+

Yes, everybody knows how the current trend of creating content focused on +producing better search results -- instead of, say, better quality content +that should be indexed due its quality -- basically made the internet a +terrible place.

+

This post describes some of the effects of this focus on the general internet +content.

+
+
1 +

This was weirdly timed with a presentation I finished talking about +licenses -- it's in Portuguese, and I haven't present it yet, but at some +point there will be a companion post for it, even in English.

+
+
2 +

Personally, using Scala as an example of "doing right" feels really +wrong. Scala does a lot wrong, I don't freaking care how much you like +Scala. Also, saying Python uses [] for generics is wrong 'cause Python +does not have generics.

+
+ +
+ + + + +
+ + + + diff --git a/public/links/20200420/index.html b/public/links/20200420/index.html new file mode 100644 index 0000000..2087bc2 --- /dev/null +++ b/public/links/20200420/index.html @@ -0,0 +1,147 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-20

+ +

Async C, DDD + Django, From Org-Mode to Blog, Optimizable Code, Writing +Technical Specs, Apple and Amazon, Zoom and Meetings.

+

Libcsp

+

Yes, C is pretty bad and such, but holy cow, this is pretty: a library for +async function calling in C on the communicating sequential processes (CSP) +model, which is the same used by Go.

+

And, personally, the code looks prettier than Go.

+

Doing Domain Driven Design with Django

+

Slides to a presentation about doing DDD with Django. Although it's a +presentation and, thus, this means is has to be short and not specific, but +it does a good job in explaining DDD and how does it relate (or not) to the +Django architecture.

+

How to blog with Emacs Org mode

+

In pushing the "everything plus the kitchen sink" of Emacs features, this post +explains how to write things in Org-Mode and publish it into HTML, making it +easier for someone to write posts in Org-Mode and then publish.

+

(Hey, this blog is written in Markdown and them published in HTML, so that's +not that weird!)

+

Optimizable Code

+

The great question about optimization. Sure, not do it prematurely, but this +boils down to memory alignment. This post gives some tips about it.

+

A practical guide to writing technical specs

+

A roadmap on how to write a spec. While I don't agree with the front matter +part -- why the heck do you need to know who wrote it, when it was created and +when it was updated? -- it gives the general template for writing a spec.

+

How to Provide Test Fixtures for Django Models in Pytest

+

While I'm not a huge fan of Pytest -- unittest is there already, even if it is +that panacea of methods -- this explains pretty well how to integrate Pytest +into Django, specially since it takes the road from the original unittest, the +one you learn when reading the Django documentation, and turns into Pytest.

+

Apple, Amazon, and Common Enemies

+

This is a point about Apple doing what every monopoly does: If it can take +something from whoever needs you, you take. But don't think this is exclusive +to Apple: Google does that, Amazon does that, and so on.

+

Zoom Is Not the Problem – Our Meeting-Centric Workflow Is

+

This feels, initially, another of those "shut up and let me work" kind of +posts, but once again there is the call for "async communication" -- a.k.a. +"write a doc and send an email".

+

Personally, I saw both sides of this coin: Either we have a lot of emails +floating around, which made really hard to follow everything that was going +on, or we had too many personal talks and nothing was being saved for future +reference. I believe what you really need to have things written down, even if +they are preliminary and prone to change, but you also need a direct +discussion about some points from time to time, beyond the simple daily +"Yesterday, I did this, that and that, and that's it", which does not explain +the reason for doing this, that and that.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200421/index.html b/public/links/20200421/index.html new file mode 100644 index 0000000..351e755 --- /dev/null +++ b/public/links/20200421/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-21

+ +

Visualizing You Docker Compose, MongoDB vs PostgreSQL, Assignment Statement, +How to Understand Systems, Learning Haskell, Losing Your YouTube Account, IDEs +For Students

+

Nautilus: A Docker Compose Charting Tool

+

Not sure if you're designing your Docker Compose properly? This tool can draw +every container, their names, volumes and so on.

+

Comparison of JOINS: MongoDB vs. PostgreSQL

+

Ok, short summary: Yes, MongoDB doesn't have joins and you have to do them +yourself. You can write your own (very long) aggregations to make it work like +joins in relational databases, but the speed is atrociously slow.

+

Now, why am I sharing this? 'Cause one of the points of using MongoDB (or any +other NoSQL database) requires denormalizing your data first. It takes more +space due duplication, it can lead to some inconsistencies, but you need to +keep thins in mind when using those database -- and sometimes, it is exactly +what you need.

+

How to avoid the assignment statement

+

Surely using other languages than C can give you a lot of control over this +kind of stuff, but the suggestions here are valid for any languages.

+

And before you think it's because "assignment statement considered harmful", +no, that's not it. It's just some tricks into doing things that will give you +less headaches in the future.

+

Systems that defy detailed understanding

+

Instead of "How to avoid problems" or "How to fix common issues", the author +explains how to understand what you're dealing with. And I can get behind +this: Before you fix something, you need to understand how the system works.

+

(Maybe that's why I like Contracts so much: It describes what a system +consumes and what it produces and what every thing in the final product means. +This reduces the chance of being misunderstood.)

+

What I Wish I Knew When Learning Haskell

+

While most of "Thinks I Wish I Knew" posts actually mean "Stupid things I did +in So and So that I shouldn't", this is actually a very complete introduction +to Haskell.

+

YouTube Accidentally Permanently Terminated My Account

+

While this was solved and the account reinstated, this kind of report just +shows the perils of not controlling your platform: In a whim, everything you +have could vanish.

+

I don't mean "You need to buy your own hack, put your own blades, and lease +your own internet connection to have a site on the web", but when the policies +over your content are not managed by yourself, you're about to get a lot of +pain.

+

Stop Making Students Use Eclipse

+

I kinda make this same point some time ago: While it is nice and dandy that +you can press a button and make a code run -- or make a full deployment -- +when you're actually learning a language, those things are actually a problem +than a solution.

+

Sure, creating a build is hard and making a deployment even harder, but when +people who are learning to code are not taught how those things work, 'cause +they can "just press a button", they will never learn. Without exposing them +to the hardship of what is to make code -- and building and deployment are two +facets of this -- they can never learn how to make a CI/CD, for example.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200422/index.html b/public/links/20200422/index.html new file mode 100644 index 0000000..1819b96 --- /dev/null +++ b/public/links/20200422/index.html @@ -0,0 +1,176 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link for 2020-04-22

+ +

Valuable Dev Principles, Terms and Conditions for Stealing Ideas, Google +"Privacy", Google Biased AI, Pandoc for Books, YAML, Oaths, Amazon, DI in +Rust.

+

The Valuable Dev Principles

+

I know we are all tired of those manifestos and such, to the point that we are +signing those without even reading the whole thing. But this isn't this kind +of article: It discusses a lot of what the "value" we, developers, produce.

+

(Ok, it is not a manifesto, but you have to agree that the title sound like +one.)

+

Hundreds of companies assert usage rights over all ideas sent through their services

+

I mentioned the perils of picking a license a few days ago, and today we have +an article about the perils of... licenses to use.

+

Basically, one very prominent app have a clause that says they can use +everything that goes into their services, including "any ideas, inventions, +concepts, techniques or know-how disclosed wherein". Sounds awesome, doesn't +it? You're there, discussing some wild ideas with your friend, you guys come +with the next big app idea and suddenly... this company releases it before you +two. You think "I'll sue them", and they will just point to the terms and +services and show that you allowed them to do this.

+

Ok, hyperboles, I know. But the fact that terms and conditions are so large +and so hard to read shows that we have a problem1.

+

Google can still use Bluetooth to track your Android phone when Bluetooth is turned off

+

While Apple abuses its walled garden to get some things outside some +ecosystem, Google does what Google does: Capture your data even when you say +you don't want data to be captured.

+

This should come with no surprise to anyone watching Google in the last years.

+

Google Cloud's AI recog code 'biased' against black people – and more from ML land

+

There are a bunch of topics there, but the one that caught my eye was exactly +the "Google AI biased against black people". It's not the first time I read +something like that: When Google Photos got auto-labeling, it tagged black +people as "gorillas".

+

It seems Google still doesn't understand how those things work: If you hire a +bunch of white people -- and only white people -- what do you think will +happen with your learning profiles?

+

Also, remember these two stories next time Google do a promotion for MLK day.

+

Writing a Book with Pandoc, Make, and Vim

+

One thing I took from this: Pandoc can convert Markdown files directly into +PDF.

+

YAML: probably not so great after all

+

I mentioned this before: Sometimes, the problem with the configuration format +is not the format itself, but the way the configuration options were +created.

+

And I know that, when talking about configuration files, YAML is the favourite +format to get some bashing.

+

But you can agree that some options here make sense, but aren't being +processed in the right way.

+

... although I have to wonder if some issues would be solved by processing the +YAML in a language that has strong types, so the incoming "013" would be +processed as a string instead of an octal. Maybe we need a YAML-schema format +to feed into the YAML processing libraries so they know the type? And if +that's the case, can't we come up with a format that already has a type +definition in it?

+

Types Over Strings: Extensible Architectures in Rust

+

How to do a proper dependency injection in Rust.

+

Collections: Oaths! How do they Work?

+

Completely unrelated to technology -- which is what I usually post -- but this +article about the meaning and workings of an oath and a vow is really +interesting.

+

Amazon fires three critics of warehouse conditions in pandemic

+

You know, there is something really stupid when someone is criticizing their +own company and that company fires that person. What would you expect? People +claiming "Yeah, you can't bad mouth your company!"?

+
+
1 +

This is kinda getting the catchphrase for these posts, isn't it?

+
+
+

This list of links was build with the help of:

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200423/index.html b/public/links/20200423/index.html new file mode 100644 index 0000000..6ab146b --- /dev/null +++ b/public/links/20200423/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-23

+ +

Google, Commit Messages, Microservices, How Rust Sees Memory, More About +Tests, Asciiflow in VS Code, Does Rust Change Too Much?, Linux Laptop.

+

Google Says It Doesn’t 'Sell' Your Data. Here’s How the Company Shares, Monetizes, and Exploits It.

+

Alright, let's start by picking on who we like to pick the most: Google.

+

While the EFF article sounds a bit too scary and demonizes the company a bit +too much, it brings a good point: Google is trying to escape regulations by +using wording instead of actually fixing it.

+

Why my commit messages for configuration files describe my changes

+

While I don't fully agree with this idea of "describing the changes in the +commit message even when the change is there", even with the reason pointed in +the article, I think it still misses something:

+

Why you did the change.

+

Sure, you can describe the changes, duplicating the already-there description +by its changes, but you need to explain why you did so. Bob got into group +'fred'? Ok, but why?

+

This isn't just so people, in the future, when asking themselves "Why does Bob +is a member of fred?" but also forces you to go after the reason for doing it. +We are not machines that receive requests to, say, add Bob to the fred group, +and do so without any questions. There must be a reason for this kind of +stuff.

+

Untangling Microservices, or Balancing Complexity in Distributed Systems

+

There is a movement on killing microservices raising recently. The article +points one of the reasons: It's hard to find boundaries and where to split +services.

+

Did we jump into the "microservices" bandwagon too early? What are we missing +for people to get those boundaries in a simple and understandable way? Are +boundaries really that necessary for microservices? Can't we use some other +metric to split the services?

+

Honestly, I have no idea. There are some good points about microservices -- +like each having its own database and no shared state between services. But +maybe we should look into what the service should +produce +instead of focusing on "boundaries".

+

Visualizing memory management in Rust

+

While the article focuses on the Rust memory management, the same works for +every language that doesn't have a runtime, AFAIK. So, if you're trying to get +out of a language with runtime and switch to a language that has to deal with +memory directly, there is some good information here.

+

How We Test Vector

+

A lot of discussion about testing on Vector, a transformation pipeline.

+

One of the aspects that I liked on this is that they mention unit tests as "in +isolation" (which I agree) and that they used for one single component, the +transformations. And while they don't talk anything about using the classical +"on test per function", it seems they actually used this way but only for a +subset of everything.

+

Asciiflow in VS Code

+

While I'm not a user of either Asciiflow or VS Code, it looks really +interesting the fact that the whole design thing is in ASCII, WYSIWYG and +mouse-oriented.

+

The OAuth Bible

+

I'm not a fan of OAuth, basically 'cause I tried to implement it myself +(instead of using an already existing library) and it was too much work +without seeing any real protection.

+

On the other hand, since a lot of services use OAuth, it may be a good idea to +fully understand the protocol. And that's what is here.

+

How often does Rust change?

+

Rust has a release cadence of 6 weeks. There was another post about keeping up with idiomatic +Rust. +But does Rust change that much?

+

Although Klabnik points that yes, I personally don't think that much. The +language is still pretty usable since the 2018 edition.

+

On the other hand, some things must be taking in the big picture. There is a +huge run towards async in the ecosystem -- and not by Rust itself -- that +seems a bit... disorientating. One example I can point is +reqwest. I'm using it for a lot of +stuff and, suddenly, the API changed to use async, something I don't need +right now. While there is a blocking module for using the old, non-async +calls... it is still confusing that I can't use the main module 'cause I don't +want/need async yet.

+

System76 Launches Lemur Pro Linux Laptop with Open Source Firmware

+

While I'm quite happy with the XPS and an open source firmware may not be that +much of a fuss (actually, it kinda is, but still...), you can't deny that's +one hell of a pretty laptop.

+

The fact that it comes with Linux installed probably means all its hardware is +compatible and you won't find any troubles with drivers and such.

+

Did I mention it was one hell of a pretty laptop?

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200424/index.html b/public/links/20200424/index.html new file mode 100644 index 0000000..c943599 --- /dev/null +++ b/public/links/20200424/index.html @@ -0,0 +1,215 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-24

+ +

Understanding Databases, Studio Ghibli Wallpapers, Creative Commons, The Good +Side of COVID, Contact Tracing, Corotines in Python, Facebook, Privacy +Paradox, Writing.

+

Things I Wished More Developers Knew About Databases

+

A very long article about the different things different databases do. +Although it doesn't focus on specific databases, a lot can be inferred from +the points.

+

... although it focus on relational databases only.

+

Another point that I could add here is that you should pick a database for +making your data read ready. For example, if you built some sort of response +and it basically doesn't change, it is ok to put the whole thing in a database +(in JSON format or using a key-value database instead). Putting the work of +doing sums and averages and whatnot outside the database can really save +your butt.

+

"Studio Ghibli Wallpaper" for use in web conferences, etc.

+

Studio Ghibli, of "Princess Mononoke" and "My Neighbor Totoro" released a +bunch of wallpapers for people to use as background of their videoconferencing +or even computer wallpapers.

+

And it's free.

+

(This was a pain to finally find it in full: It was a toot on Mastodon, which +took me to BoingBoing, with pointed to OpenCulture, which finally went to +Studio Ghibli website with the images.)

+

Understanding Free Cultural Works

+

Creative Commons, known for their licenses-for-not-software (sorry, I can't +find a better description) released an article explaining the different types +of licenses they have.

+

And yes, I'm sharing this 'cause I am, again, worried about the amount of +stuff that doesn't get a proper license and may be abused.

+

Crashes and Traffic Are Down by Half, Saving State $40 Million Per Day During Shelter-In-Place

+

While we sit on our houses, wondering when we can get out again -- some of us +wondering if we could get out at some point -- some things seem to be +improving outside the COVID problem.

+

After India reported dramatic reduction in +pollution, +now California is reporting that, due people staying at their homes, the +number of traffic accidents reduced the costs taking injuries, damages and +deaths.

+

Not that we should raise a statue to COVID, but at least some good things are +coming out of this lockdown. Let's hope we can make these results permanent in +the end.

+

Google Apple Contact Tracing (GACT): a wolf in sheep’s clothes.

+

Contact Tracing is one of those things that look good in theory, but when +confronted with the challenges of privacy, doesn't seem so great.

+

The idea behind Contact Tracing is to make mobile devices talk to each other, +so in case someone finds out they got some transmittable disease, like COVID, +authorities can trace back who had contact with that person. It's good 'cause +you can alert those people earlier, preventing some huge explosion of +contamination cases around.

+

But the problem is that the owner of said mobile device can't opt out of this. +The data is not kept in a secure place -- like the person mobile device -- but +shared on the respective device company.

+

And how long till COVID is gone and this is used to trace, say, who some +journalist spoke when they got some information that puts pressure on a +government? True, I'm again jumping into the slippery slope of fallacies, but +we need to worry about those things when mobile devices are basically part of +us: We don't recall our appointments 'cause our devices do that for us; we +don't remember our friends phones 'cause it is in the device.

+

Building Finite State Machines with Python Coroutines

+

I found more curious that Python has corotines than the idea behind using them +for state machines.

+

The only point I see is how weird the floating yield appears in the code and +how non-Pythonic the corotine appears (send? Where that came from?)

+

How Does Facebook Know So Much About Me?

+

Dunno if it is because I cancelled my Facebook account, but I've noticed some +decline in the number of news about Facebook privacy "standards".

+

This is a short summary of what Facebook does to collect information about +you, even some without your consent -- a few weeks ago, there were some news +about a board member admitting they have "dark profiles", information about +people that do not have a Facebook account.

+

Decoding the Privacy Paradox

+

Knowing that our data is being captured everywhere and doing nothing to change +that is the so called "privacy paradox".

+

An interesting and sad read.

+

Doing more with less time: critical skills for productive programmers

+

While this is focused on developers, one thing really hit me hard:

+
+

Output = Productivity × Time Worked

+
+

Why? Because a lot of things around here in Brazil -- industry, specially -- +try to focus on increasing output by changing the "Time Worked" instead of +focusing on "Productivity", using better tools or investing in better +equipment.

+

And while it is not mentioned in the post (although it mentions the limit of +"time worked" though), we, developers, can also take a look on increasing +Productivity. The easiest way is to automate the heck of what we can: The less +time we waste on bureaucratic/repetitive actions, the more we can produce. +Some harder way is to change our current tools to something that can take less +of our time, and that's harder 'cause we believe we will "lose time" learning +something new or changing our workflows.

+

On Writing Well

+

For someone like me who is constantly writing something -- either blog posts, +either translating/writing a book, or just outputting small opinions about +diverse topics, like I'm doing right now -- having a proper idea on how to +write is important.

+

And I feel like I need to share this 'cause what I put on this kind of post is +only a short amount of what I read. Most of the links I save to read later +prove to be just short pieces of opinions but some are very complex and hard +to follow due their writing style. If I get tired reading, I won't get the +point and if I don't get the point, I don't think I should reshare -- no +matter how interesting the topic at hand is.

+
+

This list of links was built with the help of :

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200425/index.html b/public/links/20200425/index.html new file mode 100644 index 0000000..b78eb97 --- /dev/null +++ b/public/links/20200425/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-25

+ +

Extracting PDF Data, Rust Adoption, Rust Search, Debugging Bash Scripts, +Mocked HTTP Servers in Rust, CLI Kanban, COVID Lockdown, Rust Survey, TIL.

+

Indexing PDF For Searching Using Tika, Nokogiri, and Algolia

+

Although I don't use Ruby -- and hence Nokogiri and Algolia would be useless +-- the fact that it lists how Tika extracts the PDF information into a (good) +HTML format it interesting.

+

Debugging Bash scripts

+

Couple of notes and modules you can use in Bash scripts to debug your... +scripts.

+

On a side note: Am I the only one that think it is stupid to have a docker +image to run a linter?

+

Programming language Rust's adoption problem: Developers reveal why more aren't using it

+

Summary: the drop in adoption happens 'cause even if developers are using +Rust, their companies are not.

+

Sadly, I once read something that's true: "The adoption of any language is not +technical, it is cultural". While developers may enjoy taking some punches +from compilers, in the hopes that they won't get calls in the middle of +the night about the service going down, most companies see delays in delivery +as problem. And if some other language have some (apparent) huge support, they +will pick that language any day, no matter how problematic it is.

+

Even Apple Is Interested In Migrating Their C Code To Rust

+

A lot of assumptions going on here, but it seems that even when Rust adoption +is not that great, big companies are actually moving towards it. Apple is one +of them.

+

The fact that the creator of Rust is part of Apple and works of Swift may be +pure coincidence.

+

On the other hand... Why not replace that C code with Swift? Surely there is a +runtime problem here if the applications require performance, but with the +Swift compiler being built by Apple and Clang/LLVM also being built by Apple, +something could be worked out, wouldn't it?

+

Rust Search Extension

+

A browser extension that helps searching Rust Docs and Crates.

+

Honestly, I prefer DuckDuckGo +!bangs, so I can use !rust Iter or !crate elefren and it would translate the search for me, but if you don't use DDG +but code in Rust, it may be interesting.

+

Rust Survey 2019 Results

+

In the end of last year, the Rust Core Team launched a survey asking how the +Rust developers feel about the language. The result is up.

+

It seems the general consensus for the language is "Some improvement" in most +of the areas.

+

Wiremock: async HTTP mocking to test Rust applications

+

A library for creating async web servers, to be used as mocks in tests. Looks +pretty cute.

+

clikan

+

By the repo description: "clikan is a super simple personal kanban board that +runs in a CLI".

+

I'm a sucker for CLI tools, specially when they have a nice presentation +interface.

+

"It'll all be over by Christmas" (No it won't)

+

A good analysis of what's going on with the COVID lockdown, it's reflexes and +what is going on from here on.

+

Sure there is some speculation in the article, but even those are good food +for thought.

+

I've been writing TILs for 5 years

+

A list of small things Josh Branchaud collected in 5 years, in different +topics.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200426/index.html b/public/links/20200426/index.html new file mode 100644 index 0000000..6ec7a40 --- /dev/null +++ b/public/links/20200426/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-26

+ +

Memory Options for JVM, Rust Note-Taking WebApp, Contributing to Rust, COBOL, +Probably New Chips for MacBooks.

+

OutOfMemoryError Related JVM Arguments

+

JVM options are plenty. This article points some related to the out-of-memory +problems, like how to restart the process when that happens.

+

From Rust to WebAssembly: building an interactive note-taking webapp with Actix & Yew

+

I'm a sucker for note-taking apps. The fact that this one is built with Rust +and WebAssembly is just too much for me.

+

Contributing to Rust Open Source

+

People think contributing to any open source project is complicated and have +no idea where to start. Although focusing on helping the rust project, the +post describes the whole process in finding an issue and dealing with it.

+

Brush up your COBOL: Why is a 60 year old language suddenly in demand?

+

While I don't expect people to take their free time and code some application +in COBOL at this time and age, I think people will find curious the language +that was in vogue when I started coding.

+

(Also, I have a presentation about old languages and, to be honest, I couldn't +really remember how COBOL code looks like, and they have plenty examples in +the article.)

+

Apple Aims to Sell Macs With Its Own Chips Starting in 2021

+

It may come with no surprise for anyone following Apple news that there was +something going on with their Mac and their chips.

+

The greater point here is: Why? It's not that their chips are proving to be +some powerhouse, but neither are Intel chips. And, as far as we know, the +relationship between Intel and Apple is not in some bad weather, like it was +when Samsung produced Apple chips. And that's why the "Why?" remains.

+

Oxidize 1K - March 2020

+

Oxidize 1K, a conference about Embedded Rust, happened on March this year. The +conference was online and now the videos are available for everyone.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200427/index.html b/public/links/20200427/index.html new file mode 100644 index 0000000..85d5290 --- /dev/null +++ b/public/links/20200427/index.html @@ -0,0 +1,172 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-27

+ +

Facebook Screwing Contractors, Hire Juniors, Tips on Work-From-Home, Managing +Remote Teams, Generating Rust Tests, Tiling on GNOME Shell, WebKIT Energy +Consumption, Looking for Work, Don't Defend Bugs

+

Facebook Contractors Must Work in Offices During Coronavirus Pandemic — While Staff Stay Home

+

There is being not-so-nice, being an asshole, and being Facebook.

+

While taking a lot of information from everyone on the web, now they are +protecting their people instead of "people who work for Facebook". The idea +is obvious: While we may look nice to our people, paying for stay-at-home +and/or medical help, whoever is not in our payroll must keep the gears going.

+

Maybe that's not true. Maybe it is just hearsay. Maybe it's just bad +propaganda. The problem, though, is that Facebook reputation makes this sounds +true.

+

The future of work requires a return to apprenticeships

+

I've been doing this argument at the office (well, both offices, I'm +outsourced, anyway) for some time: Companies may want to have senior +developers 'cause they don't want to train anyone, but there are no senior +developers available around. Why? Because senior developers are either doing +remote work, getting paid in some foreign currency (and heck if the current +exchange rates for the major currencies doesn't make it worth it), or they +have some very comfortable position in their companies.

+

So it's time to train people, not look for people with lots of knowledge which +you won't find anyway.

+

Things I’ve learned from 12 years of WFH

+

At this point, everybody knows how to work-from-home, right? RIGHT?

+

No? So here are some tips.

+

Some of them is almost "well known" at this point -- some of them I've heard a +long time ago -- but I guess repeating is not that bad.

+

Free eBook “Managing Remote Teams”

+

Still on the topic of remote work and work-from-home, maybe you're actually +responsible for managing a team that's going to be remote. So not only you +you're working remote, you have to manage a team remotely. So maybe a free +book could help you with some tips on how to do it.

+

Generate Rust tests from data files

+

Using build.rs to generate tests -- at least, the easy ones, in which you +have an input and an output.

+

‘Pop Shell’ Wants to Bring Proper Tiling Window Features to GNOME Shell

+

A project to bring window tiling to GNOME Shell.

+

I've trying a few, including +gTile, but never felt +really comfortable.

+

Now there is another plugin claiming they can do tiling on the shell.

+

It even allows focusing windows using <Super> + <Direction>, which is one +of the really good things with i3.

+

How Web Content Can Affect Power Usage

+

In a world where everything has a battery and almost everything is in the web, +checking how much the pages are using of energy is really important.

+

And it seems WebKIT-based browsers have an inspector for checking this.

+

Career advice for people with bad luck

+

The times are not happy. Some companies doesn't seem to be able to survive the +slowing of the economy. So better to be prepared than sorry.

+

Stop apologizing for bugs

+

The point is: If there is a bug, or if you're responsible for a bug, don't +find excuses for it to exist.

+

I'd go a step further and say "Don't defend bad code".

+

Bugs happen, sure. Some of them are not intentional, but if we keep finding +excuses for them -- there wasn't enough time, people were in crunch time, we +were not aware of this requirement -- then we'll never worry about making +things better.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200429/index.html b/public/links/20200429/index.html new file mode 100644 index 0000000..82c0050 --- /dev/null +++ b/public/links/20200429/index.html @@ -0,0 +1,212 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-29

+ +

Python 3.9, A Nice Top in Pure Bash, Rewriting a Legacy System, Programming +Tribes, Feature Factory, Python Function Overload, Clean Git Branches, +Journaling for Devs, What Programming Is, Caches, GNOME Screen Recording, +Requirements, VIM Password Manager, Google AdSense Ransom.

+

New Features in Python 3.9 You Should Know About

+

The great feature coming in Python 3.9 is the dictionary shortcut (|, as in +new_dict = dict1 | dict2), but there are few more incoming changes.

+

I talked about the future of Python on PyCaxias this +year, and I pointed that Python grew a lot when it entered the web development +area and now that it is getting into the machine learning area, there will be +changes coming into the language to support this.

+

And if you ignore the dict operator, there is a lot of things related to ML.

+

BashTop: Linux resource monitor

+

When I first receive the link for this, I thought "I bet it looks like any +other bash script". But no, it has a well designed interface and loops +interesting as heck.

+

Avoid rewriting a legacy system from scratch, by strangling it

+

So you don't know how to replace your monolith with another monolith? Here is +one idea: Create the same API, put a gateway in front of the old system and +slowly reroute calls to the new service.

+

3 tribes of programming

+

It's kinda funny seeing articles that try to pinpoint developers in certain +categories and end up just splitting everyone.

+

But this one kinda makes sense, if you're willing to put a random label on +yourself.

+

12 Signs You’re Working in a Feature Factory

+

Ah, the good old ways of just pushing buttons and pumping features, with no +regard to process or anything else.

+

If you're starting your dev career, at some point you'll work in one of those, +and recognizing you're in such situation may help your future.

+

Function overloading in Python

+

Ah, the joys of using decorators to add features to the language. In this +case, using decorators, you can add function overloading to Python, and even +if it is based on the number of arguments, one could extend this to use the +type hints for figuring out the function (with some work, I reckon).

+

git-trim: Automatically trims your branches whose tracking remote refs are merged or gone

+

Keeping your GIT branches clean is good for your health. Removing those stupid +"fix-this" and "fix-that" after they were merged, but not removing "develop" +and "master" can be hard work.

+

This small app helps keeping everything nice and tidy.

+

Always Be Journaling

+

Today in "Things I Know I Should Be Doing But I Don't": Journaling.

+

I've seen this "pattern" a few times: Take notes of everything you're doing; +take notes of problems you solve; keep notes of discussions you had. Those are +all important and can save your butt in the future.

+

Programming is not a goal.

+

I was kinda expecting the "Programming is not a goal, providing value for your +customers is", but this is way more direct than you can think. It's the clear +suggestion for those who are starting to focus on solving their own problems +instead of just coding.

+

Figuring out how to scrap a website is ok, but what will you do with the data. +Building a neural network may be used in your CV when you're looking for that +high-paying job, but you're going to train to fix what?

+

What is cache penetration, cache breakdown and cache avalanche?

+

I suck at using the "proper" words for some contexts: I used a bunch of +patterns, but heck if I can remember (or even if I really know) their proper +names.

+

This is the same thing: Just some clarification on how to call some +problems/situations with caches.

+

GNOME has a ‘Secret’ Screen Recorder. Here’s How to Use it!

+

This is a cool thing: You can record your desktop if you're using GNOME. The +recording will appear as a webm in your "Videos" folder.

+

Requirements volatility is the core problem of software engineering

+

This should not come as a surprise to anyone who was part any moderately large +project: things change.

+

Yes, agile is a way to solve this, but we need to teach developers to "let go" +of their code. We write code expecting it to live forever, and then the +requirements change and we hung up on those little grouped words and instead +of removing and starting with a fresh view, we try to twists and push things +around till it works, but is barely recognizable.

+

This part agile doesn't teach us.

+

Using Vim as a password manager

+

A little stupid trick using VIM: VIM can encrypt files when saving them, so +you can pick a file, put your passwords, and save it in encrypted form.

+

Pay Up, Or We’ll Make Google Ban Your Ads

+

Not only we have the problem with Google acting the way it wants with its +products -- and as much as we don't like it, we can't deny its in their own +right to do so -- now people have to worry about people tricking Google into +killing your... revenue.

+

And I think that's one of the basis of the whole problem with privacy and the +general use of Google products: revenue. Imagine how scared someone could be +if they decide to pay U$ 5000 just to not kill their revenue.

+

There has to be a better way.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200430/index.html b/public/links/20200430/index.html new file mode 100644 index 0000000..57041ab --- /dev/null +++ b/public/links/20200430/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-04-30

+ +

Event Driven Architectures, Shell Scripts, Rust Dynamic Dispatch, Actix and +Diesel, CLI Slides, Making Presentations, Runbooks.

+

Event Driven Architecture

+

A long explanation on what Event Driven Architectures are.

+

Honestly, it is one of my favourite patterns, 'cause it allows high decoupling +of data. You have one thing creating events and you can have a lot of things +consuming those events: You can save them directly to the database; you can +make them go through a summing service, so you have the data read ready; and +so on.

+

Writing Safe Shell Scripts

+

I've seen a couple of tips like these floating around, so I picked one.

+

Shell scripts are a hell of lifesaver, giving the initial states for a way to +automate stuff. But doing it right is a bit hard, and starting it in the safe +way can save your bacon in the long run -- or, at least, till you find a more +suitable tool.

+

Rust Dynamic Dispatching deep-dive

+

Dynamic Dispatching is a way to make Rust applications behave like you had +polymorphism: You attach a trait (interface) to a structure and call methods +using the trait instead.

+

I had trouble making it work recently and this explanation -- which is pretty +complete -- got me back in track.

+

Rust Web Development Tutorial: REST API

+

Actix is all in rage for development web applications in Rust: It basically +took almost every position on web frameworks +benchmark a few months ago and has +only consolidated its position -- not that the things it does are important +for CRUDs.

+

But the tutorial does the full job, explaining not only Actix, but also how to +plug Diesel, Rust famous ORM, into it.

+

Shlide: a slide deck presentation tool written in pure bash

+

Say goodbye to the problems of resolution! Do the hipster thing and instead of +using graphics, do everything in the console.

+

An Open-Source Collection of +200 Algorithmic Flash Cards to Help you Preparing your Algorithm & Data Structure Interview

+

While some people work on those "Awesome X", some people actually builds cards +for you to learn about algorithms and related knowledge.

+

And it's all open source.

+

How to Give a Great Presentation: Timeless Advice from a Legendary Adman, 1981

+

Working one a presentation? Thinking on doing some online presentation in +these days of "stay at home"?

+

On a personal note, I've been doing presentations for over two years already, +and most of the stuff I learnt in the field instead of some technical list. +But I see that small tips like these really do help, specially when you see +people actually paying attention (well, at least, when you're not doing this +online).

+

Writing Runbook Documentation When You’re An SRE

+

I worked with Runbooks once and I think they are awesome: "If you find this +problem, do this".

+

The only "but" I could add to this is that it focused on SRE people, and I do +believe who should write those are the developers: they are the ones that +know why a save file operation failed.

+

Sadly, this is not quite true, 'cause developers tend to ignore errors, or use +some tool that doesn't provide a good view on where things can fail -- or, +worse, can fail without notifying the developer. In this case, the Runbook +should be built with the SRE and developers, so both can learn how the +application work and where it can fail.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200502/index.html b/public/links/20200502/index.html new file mode 100644 index 0000000..7402fdf --- /dev/null +++ b/public/links/20200502/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-02

+ +

Slack vs IRC, Forking Across Computers, AGCT, Stoicism, User Data Security.

+

Why Did Slack Win Out Over IRC, Anyway?

+

... in which we discuss the past of group communication compared to the +current state of group communication.

+

I'm a huge fan of IRC, maybe 'cause I used almost every day when I was young. +But IRC has a great feature that nobody talks about: It was distributed: You +could run your own IRC server and ask it to join a federation of IRC servers +-- as long as your users didn't mind the almost constant "netsplits".

+

Everybody today uses Slack and understanding where it "went wrong" can only be +understood by learning the history behind the change.

+

Teleforking a process onto a different computer!

+

... in which we learn about RPC at the kernel level.

+

The Challenge of Proximity Apps For COVID-19 Contact Tracing

+

... in which EFF analyses the contact tracing "solutions" and how they affect the +current world, specially since, as the article points, there is no information +about the type of contact happened between two phones -- heck, you can't even +point if the owner of the phone had the phone with themselves in the first +place.

+

So, with efficacy questioned, we have to ask ourselves: What can it be used, +then? And, if you wear a paranoid cap like me, things don't look good.

+

Vietnam's contact tracing app broadcasting a fixed ID

+

... in which not only we have a problem with the expected solution the +"contact tracing", the ones being used are not providing the minimum +protection to users privacy.

+

Psychological techniques and advice to practice Stoicism for attaining a good life.

+

In which I learn that I'm stoic1.

+

Guide to User Data Security

+

... in which... this joke is getting old already.

+

It's not just users that should care about privacy, companies have to have the +knowledge to protect users' data, preventing unintentional disclosure of that +data to third parties -- it would be better if companies didn't even capture +data in the first place, but still...

+
+
1 +

Before it was cool.

+
+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200503/index.html b/public/links/20200503/index.html new file mode 100644 index 0000000..8ac3c7a --- /dev/null +++ b/public/links/20200503/index.html @@ -0,0 +1,187 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-03

+ +

Data-Oriented Designs, Clean Air on Europe, A Playbook for Managers, Rules for +1x Developer, Rust/WinRT, Rust+Wasm for Kublets, Tmux, Cost of JavaScript, +Storage Systems, Awk.

+

Data-Oriented Design

+

I always looked at software as a flow of data: Data comes in, it is +transformed and it gets out -- sometimes, the transformation part is just a +collection of a sequence of transformations.

+

This is a whole book about looking at the data instead of the code. And it's +free.

+

Clean air in Europe during lockdown ‘leads to 11,000 fewer deaths’

+

Yet another silver lining in this quarantine: The reduction of polution it +causing people with asthma to have less attacks, reduced the deaths of +respiratory problems and so on.

+

I'm not saying "Hooray for COVID!", but governments need to take a look at +this kind of reduction and start working on ways to keep it more permanent.

+

Manager's Playbook

+

A few years ago, I got the opportunity to become a technical leader in two +different teams and I really enjoyed. Since then, I've been reading everything +I can about leadership, management and such. But I've never seen a such +succinct and direct list like this.

+

Rules of thumb for a 1x developer

+

While I don't agree with a lot of points here, I think it is worth sharing it.

+

In general, while the business rules you learn in one job do not automatically +transfer to another -- for example, the way a pharmaceutical company works, +and its business rules, do no translate directly to an auto shop -- some +aspects do transfer: Both of those have to manage their resources, specially +money; both of these have to deal with customers and give them a good +experience. Again, those do not translate directly, but knowing what they +tried and didn't work, no matter what it was, is always good knowledge.

+

But some are really gold: "Estimates serve more for creating pressure than for +project planning" is actually a hell of a truth.

+

Rust/WinRT Public Preview

+

After pointing most of the problems with Windows are memory safety +issues +(one thing Rust aims for) and after working on its own version of the borrow +checker with Project Verona, now +Microsoft released a version of the Windows Runtime Libraries aimed for Rust +developers.

+

It seems Microsoft is getting really in love with Rust.

+

Microsoft: Why we used programming language Rust over Go for WebAssembly on Kubernetes app

+

... and that's not only it.

+

Microsoft is checking the use of Rust and WebAssembly to make Kubernets +"kublets" -- the worker parts of a Kubernets cluster.

+

The interesting part is "For the first week or so, we lost much of our time to +learning how borrows worked. After about two weeks, we were back up to 50% +efficiency compared to us writing in Go. After a month, we all were +comfortable enough that we were back up to full efficiency (in terms of how +much code we could write)," writes Thomas.

+

This is not related to the speed of the resulting app, but the speed of +development. And the learning curve of Rust is well known, but the curve is +not permanent, with the final results pointing that you have better security +in the end.

+

And I'm left wondering how long till Microsoft starts sponsoring Rust +development, as AWS did in the end of last +year.

+

Tmux for mere mortals

+

The configuration I was always looking for Tmux: Using alt to switch between +contexts, no leading key.

+

Maybe I still need to mess a bit with my terminal emulator, but that's +basically it.

+

The Cost of Javascript Frameworks

+

A long study on the price we pay for adding JavaScript on our sites.

+

This is not a rant against JavaScript -- it is here and it won't go away. +But having this information can give you some pointers on deciding what is +and what is not worth adding to your site.in the beginning of this year.

+

Storage Systems for Cheap but Capable Bastards

+

Where do you want to keep your files? Do you have lots of money? What kind of +data you want to keep?

+

Awk in 20 Minutes

+

Awk. The first time I saw Awk, I though it was simple a text processing of +sorts, a sed on steroids. But there is a lot more about than just that. And +here is a short intro about the language itself.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200507/index.html b/public/links/20200507/index.html new file mode 100644 index 0000000..64c41c3 --- /dev/null +++ b/public/links/20200507/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-07

+ +

The difference between Epoll and IO-URing and how it related to async apps and +things announced on Github Satellite.

+

Notes on io-uring

+

Although focused on the problems of using (said) io-uring on Rust, Boats does +one hell of a job explaining what io-uring is, how it works and how async +systems must deal with the way it works.

+

For those not aware, io-uring is another async IO layer, which appeared in the +last few versions of the Linux kernel. It allows one program to ask to the OS +to do something and just receive a notification when it's done, so it can do +other things -- you know, async stuff. The difference here is that the +previous system, epoll, would notify the program when it was ready to +perform an operation, while io-uring notifies when the operation is +complete.

+

But enough spoilers, it is a well written description of the current state of +asynchronous IO.

+

Github Codespaces

+

In case you missed Github Satellite presentation this year, Github announced a +new service that will allow you to run a whole dev environment in the cloud, +using your Github repo as a starting point.

+

The interesting points, though, is that this environment will, initially, +support VS Code, which is quite weird, considering that Github itself is +the one that started the Atom editor. Why would they pick another editor +instead of working with what they already have? Another point is that you can +define what your environment have, which is basically a container, but it +doesn't use the Dockerfile format; it is a completely different format, +using JSON instead of YAML. Again, since everything runs on Docker, why use +another format?

+

The feature is still in beta, and should be rolled to all users, with +undefined pricing at this point, later.

+

GitHub Insights

+

Another feature presented on Github Satellite was "Insights", Jira-like +reports based on the work done on Github repos. While most of us, personal +users of Github, will find it only curious, managers will find it quite +interesting, specially since if their team is already using Github, they don't +need to pay for Jira anymore.

+

Couple this with the fact that Github already has a virtual kanban and you can +see exactly where Github is aiming.

+

Github Codescanning

+

The third feature announced was Codescanning, a tool that can scan your code +(if it is hosted on Github) for vulnerabilities. What it does is that it +follows the data coming from outside the system to the inside, figuring out +how it is used and if it can lead to some security failure.

+

While cool, one has to wonder how the tool knows the entry point for your +application; what happens if you have multiple entry points (for example, you +provide a web interface and console interface); how it detects unsanitized +inputs when the underlying framework does this already (like Django). Sure it +has "decades of research behind it" (as pointed in the presentation) and +everything else, but I end up with more questions than answers.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200511/index.html b/public/links/20200511/index.html new file mode 100644 index 0000000..258a406 --- /dev/null +++ b/public/links/20200511/index.html @@ -0,0 +1,178 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-11

+ +

iPad Mouse, Organizing Events, Website Privacy Concerns, Careful With Whom You +Work For (Like Tim Bray), Deleting Online Accounts Howto, Reducing Rust +Binaries, History of systemd, Reopening The Economy.

+

How Apple reinvented the cursor for iPad

+

Ignore the pretentious title for a second and check the animations. +"Reinvented" may be a bit too much, but you have to give it to Apple for +coming with something actually different for cursor.

+

I wouldn't be surprised if the same thing comes to Linux in a few years.

+

RustFest - organization was the best. Also rhymes.

+

I'm sort-of part of the organization of the next PythonBrasil (the Brazilian +version of PyCon) and this is one hell of a report about the organization of +it. Lots of tips on how to properly organize an event.

+

How to fix the broken web as a site owner and web developer

+

I won't lie that the cynical in me reads this and thinks "This is cute".

+

Sure, explaining how to make a good, GDPR and privacy compliant site is +possible, but we can't ignore the problem of "Why?" You put some tracking code +and boom, information about the source of searches, where people visiting your +website are coming from, how long they stay in the site; and then you put +another tracking code and boom, those clicks become money (very little, but +hey, it's money, nonetheless); and then you put 30 of those tracking codes and +boom, lots of little money coming in.

+

The only way to remove make people with websites to remove those is to kill +the incentives; telling them "that's not nice" won't prevent anything.

+

We are complicit in our employer's deeds

+

I disagree with Drew in a lot of points -- specially on things that I like he +doesn't, and probably 'cause I talk the same things about the things I don't +like -- but I have to agree with this: We are. If we work for a company that +does something "morally wrong", even if that's not illegal, then we are +complicity with it. It doesn't matter if you take care of some "customer +support" group and the company does collect information from a lot of people +and, thus, you're not working on this bad thing, so you're good. As Drew puts, +you're using the "Nuremberg Defense" (basically, "I'm just following orders).

+

Bonus points: The post is actually Drew's thoughts on Tim Brays post about him +leaving Amazon due the firing of people complaining about the COVID-19 actions +of the company. Tim was working on the Tech side of Amazon and was not related +to the warehouse control and still he left the company.

+

Of course, Tim has enough political power to quit the company and write a +letter saying "The company I just left was doing something morally wrong" and +not suffer any huge consequences -- I bet if I pointed some morally debatable +things some of the companies I previously work for I'd be sued out of the +pants I'm wearing but I have to ask this: Do we want to live in a world were +pointing wrong stuff is punishable?

+

JustDeleteMe

+

A directory of tips on how to delete your account on several different +websites. If you're unsure about the privacy measures one site takes with your +data and you're worried about what they can use to it (and remember, some +still collect information about you even if you don't access them directly +anymore), and you can't actually figure out how to delete your account +(Facebook is notorious about this), here's your chance to remove that account.

+

Reducing the size of a Rust GStreamer plugin

+

Languages generating static binaries are all in rage these days and Rust is +one of those. But actually, there is a lot that can be done to reduce the +binary size without losing all the safety measures the compiler takes when +generating said binary.

+

And while you may not be creating GStreamer plugins, a lot discussed here can +be used for any binaries.

+

systemd, 10 years later: a historical and technical retrospective

+

Wow, a very long, very explicative discussion about the raise of systemd.

+

To Safely Reopen, Make the Workweek Shorter. Then Keep It Shorter.

+

One of those things that seem so obvious that you have to wonder "Why I didn't +think about this before?"

+

We heard about the tales of Microsoft Japan reducing the working +days and keeping productivity +and now we have this virus floating around that's moving people to work from +home and then someone actually made the connection and suggested that we could +put both together and just reopen things using this 4 day thingy.

+

Honestly, it sounds good 'cause I can work from home. How that would affect +people that can't is something that needs to be checked.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200516/index.html b/public/links/20200516/index.html new file mode 100644 index 0000000..b05e08e --- /dev/null +++ b/public/links/20200516/index.html @@ -0,0 +1,253 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-16

+ +

Gleam, Java From a Python View, Code Images, UNIX TypeSetting Tools, History +of VIM, Writing Documentation, Fighting COVID with Porn, Thinking Beyond +Problems, A Metronome, Diagrams in Python, React Native for Windows (and Mac), +Secrets in Python Bytecodes, Word Generator NeuralNet, Firebase Blunders, +Standups, Sharing as a Dev, Material Design.

+

Gleam v0.8 released!

+

Gleam is another language focused on the BEAM (Erlang) VM. And the new version +brings a lot of stuff that makes me really curious about using it in the +future.

+

Why Java? Tales from a Python Convert

+

Not that I'm converted from Python to Java -- I can see I'm productive with +Java, but the fact is, I'm not having fun being productive with it. Sure, it +gets the job done, but it lacks something.

+

Even with that, I think this post brings a lot of things that are actually... +interesting... in recent Java releases, and does a good job in breaking that +feeling that Java sucks.

+

Create and share beautiful images of your source code

+

I used Carbon before but I keep forgetting when I need it the most.

+

Where Vim Came From

+

People believe Vim to be unfriendly, but what happens is that the lineage of +it comes from a long way, always improving and changing. Understanding why Vim +is designed the way it is is one way to understand it -- and, as anything in +history, to avoid repeating the same mistakes again.

+

UNIX Text Formatting Using the -ms Macros

+

Yes, another post about "the tools of the ole age" -- troff is used to build +man pages -- but there is something about the simplistic approach on due the +typesetting that is really interesting.

+

Encouraging a Culture of Written Communication

+

This articles pushes towards better written communication due the fact that +most of us are working remotely, but I have to push that this should be the +norm, not the exception.

+

Documentation can be used for a long time after a developer leaves the project +or the company, and keeping it up-to-date can ease the onboarding of new +developers. So no, it's not just because we jumped into the remote working era +that documentation must be a priority: It should be way before that.

+

Why the porn industry has a lot to teach us about safety in the Covid-19 era

+

Ah, the kind of news headlines that you won't expect to see.

+

But the thing boils down to the fact that the porn industry had to deal with +HIV and now makes HIV testing a common, periodic thing. And with COVID-19, a +virus that has no cure (yet), and something that we'll have to learn to live +with, doing something similar is almost required.

+

Obviously, porn stars are just a small set of people compared to the general +population, and thus way more expensive, but we really need to start thinking +about this.

+

Second-Order Thinking: What Smart People Use to Outperform

+

A psychological article, for a change, and something most developers can learn +from: Instead of focusing on the problem of "this", also thing on what the +issues the solution will create.

+

Metronome

+

I think I saw this application running in the last year PythonBrasil, and here +is the link for the Flatpak of it.

+

It's a great tool to time stuff, and it is also nice that it is a desktop +application with responsive layout.

+

Diagrams

+

I'm a sucker for this kind of stuff -- so much that dot is part of my usual +development tools. But writing diagrams in Python... that's a freaking awesome +way to do it.

+

React Native for Windows + macOS

+

A long time ago, Microsoft promised people could write Windows applications +using only XML and JavaScript. That thing never happened.

+

Then it promised you could write UWPs (Universal Window Programs), again in +Javascript, that would run in any Windows platform (tablet, phone and +desktop). That too, never happened.

+

And now we have React Native for Windows and Mac. While the suspicion that +this may again be a bust, at least React Native has some market presence to +maybe make this work.

+

Finding secrets by decompiling Python bytecode in public repositories

+

The same problem people have with compiled applications -- which can be easily +be extracted using strings -- exists with Python bytecode files.

+

This Word Does Not Exist

+

After This Person Does Not Exist and +This Fursona Does Not Exist, someone +decided to train a neural net to make words and descriptions.

+

Report: Estimated 24,000 Android apps expose user data through Firebase blunders

+

Security is hard. Keeping users information from leaking is a full time job +and can happen no matter what database/storage you use -- the standards for +90% of the installs is "make it easier for developers to start working, and +later they can secure it" instead of the other way around it. So this is not a +Firebase issue at all.

+

The troubling bit, though is this "A December 2019 report shows that Google +scrubs these vulnerable database URLs from its search results. However, they +are still indexed by other search engines like Bing."

+

How the fuck assholy you have to be that you hide the wronging of people +using your product, just because you have, basically, the monopoly on search +engines? Sure, using that information may help bad actors accessing random +people -- people that have no direct contact with the tool besides using +something someone else built -- but heck, cancel the damn account till they +learn how to protect people data instead of just hiding the problems under the +hug. "But that would cause people to stop using our product!" Then your +product have a design problem and you should fix it.

+

But, again, hiding it under the hug is no solution. At all.

+

Your daily standups should be async. Here's why

+

I freaking hate these kind of posts: "Here, thing does work. We should get rid +of it." This goes one step further and points what people are going with the +thing and still points that thing is broken. Heck, why can't we point +why something exists and try to teach people on how to do it properly?

+

Nope, complaining that it is broken is way easier.

+

The most successful developers share more than they take

+

"You do not really understand something unless you can explain it to your +grandmother. If you can't explain something to a six-year-old, you really +don't understand it yourself." is one of Richard Feyman's famous quotes.

+

I do like to post opinions on my blog. I do like to do presentations. Mostly +'cause, when I'm explaining, I'm learning. I may think something is worth +explaining and do some research on how to better explain it.

+

Also, sometimes I write things I learnt down so I can remember it better +later.

+

That's why some of those "Month of blogging" exist.

+

Material Design is a political choice

+

Ok, maybe the title is a bit too bait, but there is one point that really +caught my eye:

+

"We are representing Google, whatever that might mean."

+

I do have my problems with Material design -- in my opinion, its natural +evolution would eventually get to the interfaces we have right now, so it's +basically a step back -- but that really is something.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200524/index.html b/public/links/20200524/index.html new file mode 100644 index 0000000..7f4304c --- /dev/null +++ b/public/links/20200524/index.html @@ -0,0 +1,270 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-24

+ +

Rust Unix Commands, Learning Rust (yes, again), Zuckerberg, Facebook and +Working Remotely, Open Source in European University, Open Source Your Shitty +Library, Writing Documentation, Open Source Culture War, Building Applications +With No Invalid State, Show How You Solve Problems, Pull Requests, Dokuwiki, +Things Wrong With Rust, Unofficial APIs, Selling Yourself, Dark Patterns, +Picking Licenses, ZShell Tricks, Global Git Ignore, Internal Monologues, +DevOps Lessons, Mocking in Rust.

+

Common *nix commands written in Rust

+

I know I posted something like this recently, but I feel this list is a bit +more complete.

+

Getting Started with Rust by Building a Tiny Markdown Compiler

+

A good introduction to Rust. I really like how things that are interesting but +could get in the way of learning the language are collapsed and just if you +really want to know what they are talking about, you can expand it.

+

Mark Zuckerberg and Priscilla Chan's $800,000 donation to their 8 favorite restaurants is like the median US family giving 13 cents to each

+

Let's rant a bit, shall we?

+

There are a lot of news about billionaires helping small business or people, +sharing some expressive amount of money.

+

But then, when you check how much they are "helping", it is just some really +small drop of everything they had.

+

On the other hand, it's not like Zuckerberg had $76.3 billion on his bank +account (or pocket). It's based on the value of Facebook (the company) and the +Zuckerberg stock.

+

So, saying "Rich person shared a huge load of money" is wrong, as is "it's +just peanuts" is also wrong -- although I must reckon the first is more wrong +than the second.

+

Facebook employees may face pay cut if they move to cheaper areas to work from home

+

And just to put some more perspective into what Zuckerberg does, here is +another facet: Due COVID, Facebook allowed workers to work from home, but now +comes the warning: Just because you're working from home, you can't just take +your salary to a cheaper place. You must suffer, SUFFER!

+

Ok, I may have gotten over my head on that.

+

But there are a bunch of things you can take from this: You're not allowed to +improve your life while not taking more from the company; cheaper places +should mean cheaper payment; and on, and on.

+

Dunno what Zuckerberg idea is behind this (except maybe make more money).

+

Why European universities are choosing open source software

+

This is actually good news. When I was on Uni, one of the problems I faced was +the incongruent idea that you need some specific software to do your +homework, but those were paid, closed source options and, thus, the only +option was to either stay at uni (something really hard when you have to work +to pay for it) or pirate it.

+

Now, honestly, that's the "free as in beer" part of the "free software" (which +is not actually true, but it happens), but in the long run, I guess people +learning to code can also gather more accustomed to having the source around, +and maybe even used to see how things works.

+

It’s OK for your open source library to be a bit shitty

+

That's one of the things most developers still are afraid of: You're working +on an open source license, but you fear into making it available everywhere +'cause "it's not perfect".

+

There are reasons to keep an open source content not available yet: You're +working through licenses and copyrights. Apart from that, you can really +released a version that is not up to scratch, 'cause showing what it is -- and +update as necessary -- is way more impressive than releasing a perfect version +in the first shot.

+

RFCs and asynchronous-first culture

+

One of the things that really caught my eye here is the idea that, when doing +some graphical design, people go to sketches and mockups instead of jumping +directly into the final design. And doing documentation (and emails, for that +matter) we need some sort of "sketches" for it.

+

The Culture War in Open Source is On

+

Oh boy, here we go again...

+

Yes yes, there is something going inside the open source culture: Stallman was +forced out of the FSF and Eric Raymond was kicked out of OSI maillist.

+

But here is the thing: Even if Stallman started the GNU project and kick +started the whole free software movement, he also saw no problem in underage +girls with older men, only changing position days before being kicked out of +the FSF board; Eric Raymond may have written "The Cathedral and the Bazaar", +but also became a gun nut, claimed gay men are, basically, paedophiles and +that a cop shooting a suspicious black man is not racism, but self defense -- +and nobody found it weird when he mentioned "black man" and not simply "man"?

+

Open source and free software won. There is a lot more people coming in the +movement than before, and showing that people are welcomed here is the point. +When people are actually damaging the image of the movement, they are not +helping.

+

On another note, I remember that in early 2000s, we were already discussing +how Raymond's attitudes and opinions were actually harmful to the ecosystem. +That was more than 20 years ago, and it seems he didn't change a bit. Good +riddance.

+

Honestly, the "war" we have is simply "You may be a cool, technical person, +but your shitty attitude won't be allowed here anymore."

+

Constructive vs Predicative Data

+

I really like this kind of posts, which explores how information could be +accidentally wrong, while a different approach can prevent a wrong state.

+

To get a better programming job, explain your problem-solving skills

+

You know, there is something deeper here than it seems.

+

The interviews I did on bigger companies, I didn't feel they were trying to +find the way I solved problems; they were looking if I knew the answer right +away.

+

So, one can see the title in two ways: Either you can get a better programming +job by showing your problem solving skills OR better jobs want to see your +problem solving skills (poor jobs do not).

+

On Writing a Great Pull Request

+

More people should read posts like this. I had to deal a lot with pull +requests with no information whatsoever about what was being done. Worse, +sometimes, the title of the pull requests was actually the branch name.

+

Argon Dokuwiki Template

+

I used Dokuwiki a long time ago, and even then the interface felt a bit +outdated. Now there is some pretty theme for it -- although I'm not sure I'm +in need to Dokuwiki at this point.

+

Things I hate about Rust

+

Sure, no language is perfect and ranting about the wrong things is a way to +improve it, but some points are actually without merit.

+

For example, complaining about Rust multiple string types: I understand the +problem with &str and String, but OsString has a reason to exist -- +operating systems that are UTF-8 while their filesystem is not. So how do you +deal with it? You make everything UTF-8 and let the filesystem create stupidly +named files?

+

Unofficial APIs

+

A list of services APIs that are not official. Just in case you want to play +with something that doesn't offer a real API.

+

Sell yourself, Sell Your Work...

+

That's one thing I do really bad: I don't know how to sell myself. I just hope +this blog -- and opinions, and technical posts and even stupid ideas -- can +serve as a way to do it so.

+

Dark Patterns: Past, Present, and Future

+

I've been seeing a lot of those patterns recently. There is one missing bit, +though: How do we get rid of them?

+

Choose A License

+

Want to check what each license allow you to do? Here is a neat table with +several licenses and what you need to do and what you can do with them.

+

Some zshrc tricks

+

I may have switched to ZShell recently, so this kind of post is actually +pretty damn useful.

+

... but the thing that caught my eye was the way to put aliases for +directories, which helps a lot in getting to the right place, but I'm using +Scotty and that makes something like +that somewhat useless.

+

Global Gitignore Files Are Cool and So Are You

+

Ah, that's one thing I have been missing: Global ignores. That would allow me +to ignore VIM swap files on every project at once.

+

Today I Learned That Not Everyone Has An Internal Monologue And It Has Ruined My Day.

+

Far from ruining my day, but I also found this really... curious, to put +mildly.

+

But lacking a internal monologue may also explain why some people don't +like books -- the dialogues may be a bit missing, and it may be hard to follow +the story.

+

(A few) Ops Lessons We All Learn The Hard Way

+

Ah, some awesome things we think it always true with devops but aren't.

+

Introducing faux

+

A nice looking Mocking library for Rust.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200525/index.html b/public/links/20200525/index.html new file mode 100644 index 0000000..0355de0 --- /dev/null +++ b/public/links/20200525/index.html @@ -0,0 +1,194 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-25

+ +

Owning Your Data, Latency in Async Python, eBay Port Scanning, Rust Macros, +Rust Tests, Rust Project Organization, Going Remote, Shapes of Code, Public +Domain vs Copyright, Libre vs Open.

+

I want to own the database that my apps use

+

While the idea is commendable, I think the proposed solutions have a number of +problems:

+ +

I don't mean to diss the post, but there are a few things that need to be +fixed before we can dream of something like this -- for example, closing the +damn data-oil well.

+

Latency in Asynchronous Python

+

I'm not sure I follow the author description on how to solve the problem +presented.

+

Thing is, async (in any form) cannot be compared with threads, which seems the +initial idea on the description of the problem. Async is cooperative +multitasking, which means someone has to say "I'm done" so another task can +continue; by using a heartbeat task but doing I/O (print) and creating 200 +async tasks, you're actually measuring how long the event loop wasn't allowed +to continue.

+

eBay port scans visitors' computers for remote access programs

+

In today's "Let's Abuse The Web To Find a New Way To Track People", some +people found out that the eBay website (yes, the website, not an app or +something like that) is using WebSockets (yes, websockets, not some fancy +technology, not some raw socket thingy) to do a port scan on the user's +computer.

+

There are two things that will happen now: People will start looking for those +things and stupid people will add that to their websites.

+

Maybe browsers could block websockets to one single address and, once it is +used, the site can't open a new one on a different address/port.

+

Rust macro rules in practice

+

Macros is a part of Rust I still have to explore. This post describes one of +the simples macro types Rust have (there are three).

+

How to organize your Rust tests

+

On my last live (it was in Portuguese, sorry English speakers), we discussed +the fact that my toy project had no tests -- in my defence, that was kinda +intentional, as all I'm doing is exploring more of the language.

+

An just out of the blue this post appears, which describes a bunch -- maybe I +bit too much -- of testing strategies for Rust code.

+

Just: How I Organize Large Rust Programs

+

And just related to the previous event (you know, the live discussing Rust +code), I was also reorganizing my code, and now have a few more ideas on what +to do in the future.

+

Beyond Remote

+

A good collection of points now that large tech companies switched to remote +working (some as "remote first" now) about what may and what may not work +straight away when a company switches to remote working.

+

The Shapes of Code

+

This is one hell of an interesting post: Describing code by its shape -- +basically, what you see in one of those "minimaps" -- instead of their +content. The curious parts is that it describes "what" the shape means and how +it can be improved in some refactoring.

+ +

I understand what the EFF is trying to say here but, at the same point, we +have to understand that copyleft -- the thing that powers every open source +project today -- is based on copyright. The thing that prevents open source +being abused is the fact that is copyrighted by someone, and that someone will +tell exactly what others can do with the code. It's the copyright that +protects it from being snatched by someone else and being used to lock-in +users.

+

Maybe the idea of copyright is being abused in a lot of places, but it doesn't +mean it is (totally) broken.

+

One thing to keep in mind here: Public Domain means anyone can do anything +with it. It could mean anyone could pick an free software and turn it into a +locked-in version of it.

+

What Does Free/Libre/Open Mean?

+

This is a quick and good explanation of the old discussion of the difference +between "free software" and "open source".

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200526/index.html b/public/links/20200526/index.html new file mode 100644 index 0000000..e62d6a4 --- /dev/null +++ b/public/links/20200526/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-26

+ +

GNU Recutils, Tips on Git, Simple COBOL Code, Paying for Open Source, +Contributing to Open Source, Dealing With Boring Stuff, Accessibility, 12 Not +So Great Steps For Great Code, Culture Tests, Microsoft Marketing.

+

GNU Recutils

+

So you want to keep a simple database, but don't want to go through the loops +and hoops of creating a script to manage it? Worry no more, the solution is +here!

+

Recutils is a set of tools that I wasn't aware it existed, but it keeps +information in plain files, allow searching and has a schema.

+

5 Useful Tricks You Didn't Know for Git

+

While I'm not a huge fan of the short logs/changes (just "not a fan", not +saying it may be useful), the whatchanged and the other commands are pretty +damn useful.

+

A basic "game" in COBOL for learning

+

Ah, the good old days of COBOL. Haha, who am I kidding, they were never good, +that's all we had!

+

But if you never saw a COBOL code, here is a taste of it.

+

Paying for Software

+

We have seen this discussion going around for some time, but it's worth +repeating it: In an age of large usage of free software, we must remember that +companies making money with it are not helping fund said software.

+

But it's also worth mentioning that not every free software needs support. +Going "Open Source" is, sometimes, a marketing plot just to get visibility; +I've seen companies making open source in which they never heard the points +raised by the community itself and even just focused on new features, leaving +the bugfix part to the community (and no, I'll not cite with company/software +does this).

+

How to Contribute to Open Source Software

+

I have a presentation on the "Why and How to Contribute To Open Source +Software" (it's in Portuguese, so I won't link it here), but here is a +complete explanation on how to contribute with software -- and yes, there are +more ways to contribute than just writing code.

+

I like how very "step by step" this post describes how to do it, even if it is +focused on a major service and may not reflect all open source projects (I may +even "steal" some of those for my presentation).

+

Help, I can't learn/do something because it is boring!

+

I've done my fair share of boring stuff -- I sadly remember when I have to go +through 30+ AWS Glacier folders to restore one single file on each, with the +interface not allowing me to open each folder in a new tab, so it was really +boring: click, click, click, click, wait, click, click, click, rinse, repeat.

+

But, if I could, I'd automate the heck of it, and I probably should have taken +some breaks -- which was hard, considering my boss sat in front of me.

+

Standards for Writing Accessibly

+

Some tips on how to write interfaces in an accessible friendly mode. And while +you may think "Why should I worry about accessibility when only low-percent of +users have a disability?", you may also wonder how many of those have a +temporary disability, like they just came back from their LASIK surgery, +they broke their arms in a ski accident and so on. Providing accessible +content for people with disabilities may also improve your interface for those +people -- and they would probably be grateful that they don't need to check +your competitor.

+

The Joel Test: 12 Steps to Better Code

+

An old post by Joel Spolsky, but it is probably worth repeating. This is a +checklist of things you should do for better code. But we need here to discuss +if the whole list is actually good.

+

I've seen a lot of projects fail 'cause it misses something incredibly simple +like specs, so devs keep running in circles, trying to figure out what +actually needs to be built.

+

On the other hand, some things feel out of place, in my opinion:

+ +

Honestly, when I picked the link in my feed, I though "Hey, that's a good list +of things to have". But then I started writing this and noticed how broken it +seems.

+

The Pragmatic Engineer’s Developer Culture Test

+

Instead of the checklist above, I think this makes more sense, even if its +results can only be verified in the long run -- and the Joel list seems more +focused on the short.

+

It's way more focused on the culture part of the company, what culture the +company is trying to build and such -- and as someone who suffered a lot under +micro-aggressions without realizing, and without my boss realizing, it +surely stroke a never there.

+

While Microsoft Was Making Its Climate Pledge, It Was Sponsoring an Oil Conference

+

This is from January this year, but I decided to share it 'cause it shows +something a lot of companies do: "We Are The Good Guys" in marketing, "we +don't actually care" in business.

+

I've read some other stories like this: Promote the Pride March, but ignore +harassment on LGBT+ people inside the company; say you are here to help, but +close repositories and make a contract with ICE. On and on and on.

+

Just to make the point clearer: This is not something "Microsoft" does, it +what every big company does.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200529/index.html b/public/links/20200529/index.html new file mode 100644 index 0000000..f6a03bc --- /dev/null +++ b/public/links/20200529/index.html @@ -0,0 +1,180 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-29

+ +

Spotify Around the Globe, Git Commit Messages, Airflow, Emacs Bindings, +Contributing to Open Source Rust Style, Self-Hosted Git Repos, Vim Wiki, Don't +Use Medium, StackOverflow Survey Results, Problems With StackOverflow Survey.

+

Spotify Most streamed track of the day by Country

+

Curious about which song is the most played on Spotify on each country?

+

My favourite Git commit

+

A huge text for a simple one character change? Sure, why not?

+

I have to agree with the point being made here, although the result is a bit +too large for my taste: Write commit messages that explain why some change +had to be done, what other options where presented, and why the actual +solution was taken.

+

And that's how a proper commit message should be done.

+

An Introduction to Apache Airflow

+

I have been hearign about Airflow for awhile, but what the heck it is, what it +does and things like that was something I didn't know about.

+

But Airflow is a data processing (ETL) framework in Python, where each task is +defined in isolation and combined afterwards in an acyclic graph.

+

And it is in Python.

+

Binding Emacs

+

A practical guide on using Emacs keybinds.

+

Contributing to Rust

+

Although focused on the Rust project, this is a very good personal experience +report in contributing to open source project -- in this case, a compiler. But +instead of jumping directly into code, it all started with a simple +documentation change.

+

The key points here are, basically: Start simple, get your feet wet and things +just will start rolling.

+

Choosing a Self-Hosted Git Service

+

Git != Github or Gitlab. Github and Gitlab are frontends to Git and, if you +wish, you could run a different interface on your domain.

+

Other optiosn presented here are: Cogs, Gitea, SourceHut, Phabricator, +Gitolite, Gitweb and cgit. Each has its own strengths and weaknesses and they +are explored here.

+

I use cgit on my repository, although I'd +prefer to run something that generate static pages instead of something +dynamic -- I don't do that many commits that would require rendering +everything every time.

+

Personal Wiki for Vim

+

Did you know that you can have a personal wiki using just Vim? With this +plugin, you can keep your data locally, without the need to install anything +else (besides the plugin, that is) -- and people who like Emacs forgive me, +but the format is simpler than Org-Mode (even if Org-Mode does a lot more +stuff).

+

Stop Blogging on Medium if You Care about SEO

+

I don't freaking care about SEO -- honestly, SEO is the cherry on the top of +the shit cake the internet has become -- but there are two points here that +you must pay attention: "Login wall for free articles" and "Hidden costs of +publishing on Medium" 'cause they tell you two things:

+ +

So you're, basically, the one generating income for Medium. Heck, even +WordPress.com has a free tier with no paywall.

+

Stack Overflow Developer Survey 2020

+

StackOverflow did a survey last year to find out which languages developers +are using, if they like it, how much they get paid, that kind of stuff.

+

And now, finally, the results are out.

+

PS: Rust is the most loved language for the 5th year in a row.

+

Stack overflow developer survey removes Clojure

+

... but not everything are flowers. The Clojure subreddit found that Clojure +was not listed and even if they could fill the form with their own value, +Clojure still didn't even appear in the results.

+

Not only that, but on our Rust group someone asked why there were no Rust +libraries and frameworks on the list (Serde is wildly used) and after that I +noticed that Glib also wasn't in the options -- and who the heck is crazy enough to +work in C (which appears in the language list) without Glib these days?

+

So yeah, the list is nice, but feels a lot incomplete in these days.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200531/index.html b/public/links/20200531/index.html new file mode 100644 index 0000000..6ad8c31 --- /dev/null +++ b/public/links/20200531/index.html @@ -0,0 +1,209 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-05-31

+ +

Running Things in Python, Emacs, Everything That Can Go Wrong, Why We Believe +that Rewrites Go Right, Copyleft, Analogies for Technical Debt, Leading +Projects, Microservices in Rust, Cities as Roads, Complaining about Stallman.

+

The many ways to pass code to Python from the terminal

+

This is a curious post. Although I've been using Python for a long time, +some of those were completely unknowns to me -- for example, making a zip file +and running it directly with the interpreter.

+

Emacs - Productivity Tricks/Hacks

+

Although I don't usually use Emacs -- I'm a Vim user myself -- I can't stop +myself from sharing a post about Emacs that suggests using Evil, the Vim +keybinds emulation mode.

+

And the suggestion of using Helm is something that I really need to add on my +Emacs configuration.

+

Postmortems

+

A Discord place for posting things going wrong.

+

I've been mentioning this for a year already: Most presentations we do, when +we go in public, is to talk about the things the go perfecting fine -- you +just do a build, it will never fail; just write the code, you won't find a +corner case; just create something, everything will be fine -- and that's not +the real life.

+

Postmortens is a forum exactly for describing things going wrong. And there is +a lot more to learn from things going wrong than from perfect steps that does +not reflect reality.

+

Why do we fall into the rewrite trap?

+

Yes, everybody, at this point, heard about the "Refactor, Don't Rewrite". And +this is just more of that.

+

But there are some things that really caught my eye1: First, "Contempt +Culture", the idea that something is bad because it's old and bad and the new +thing is good because it's new. I mentioned this on my "Things I Learnt The +Hard Way in 30 Years of Software Development", but "right tool for the job" is +mostly a way to push an agenda and the right tool is mostly the tool your team +knows the best.

+

Also, instead of just going through "Rewrite BAD!", it actually list some +situations when doing a rewrite is the right option -- and I won't spoil, but +it does seems really the right situation.

+

Toward Copyleft Equality for All

+

A lot of the things in this post would be just for me to repeat things I +pointed in other posts: Companies are using the Free Software label just as +marketing, working on new features and charging for it, while leaving the +bugfixing part to the community, for example.

+

Here, the thing is a bit more complex, and I'm not sure if I can have an +concrete opinion about what is being said. Basically, the idea of +"copyleft" -- using copyright to make sure the code will still be available +and accessible to everything -- has been been subverted with the "dual +licensing".

+

In one hand, companies should be able to let the code be available and still +charge for it, but the way they have been using free software seems to be only +as a marketing plot. "Look, it's free software!" but listen to the community, +let them point the destiny of the project, making sure contributing is easy, +nothing of that makes part of those projects.

+

Technical Debt Is like a Tetris Game

+

This may be the best Technical Debt analogy I ever seen: It is a game of +Tetris.

+

In the start, everything is clear and it is simple to fit the pieces. But, if +you don't take the time to clear things from time to time, it will get more +and more chaotic till you lose.

+

If this isn't an explanation that everyone understands why you need to stop +from just piling up pieces and try to clear the field from time to time, I +really don't know what will.

+

How to Lead a Project - as a Software Engineer

+

A list of things software engineers should take care when they become project +leaders.

+

I can attest that the general concept here works, 'cause that's what I did +when I was technical leader in projects.

+

Building a Microservice with Rust

+

Ok, the fact that I love Rust may be related to me wanting to share this, but +you have to agree that the post is really complete, showing all the hops and +jumps you need to do to make a microservice in Rust.

+

city roads

+

This is a cool project: Instead of drawing a city using its geographical +limits, draw it using their roads.

+

Burning the House That Richard Stallman (RMS) Built: An Open Letter to GNU Maintainers Who Opposed RMS

+

Let's complain about those complaining?

+

Another one of those "Leave rms alone!" kind of posts. This time, whoever +works for Microsoft -- which is extremely weird for this kind of post for not +calling it Micro$oft -- are the real pirates and who works for Red Hat have as +bad character as them.

+

Honestly, there is no denying in the work Richard Stallman did to promote free +software. But, at the same time, we can't ignore that, for years, GCC got +stuck on its architecture 'cause any changes were denied and we can't deny +that this "tantrum" in improving GCC is what gave Clang the space it got -- +just remember that Apple used GCC to build macOS and iOS binaries. And we +can't ignore that just one day before the pressure for rms to leave the FSF +reached critical levels he was still saying that there was no problem in an +underage girl to have a sexual relationship to an old man.

+

This kind of though -- "But he did lots, and can say and do whatever he +wants" -- it's the most pure teenage thought of no worrying about the +consequences. "Oh, look at the consequences in the history of Microsoft +against free software! But don't look on what rms is saying and how his +posture hurts important projects and the community, 'cause he's my friend".

+

The community has grown up -- not only in numbers, but also in its mental +age -- and now we are asking when important figures will be hold responsible +for whatever they say and whatever they do.

+

... and it is really weird for a post like this that attacks Microsoft and +Red Hat, but says absolutely NOTHING about what Google has been doing with the +term "open source".

+
+
1 +

... specially since I saw some things related to this yesterday +morning...

+
+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200601/index.html b/public/links/20200601/index.html new file mode 100644 index 0000000..7339931 --- /dev/null +++ b/public/links/20200601/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2020-06-01

+ +

Distributed Systems, C in Rust, Protecting Projects, No Code, Android, +Research Blog, Contact Tracing and Privacy (again).

+

Notes on Distributed Systems for Young Bloods

+

A bunch of "things you need to remember when working on distributed systems", +not only for "young bloods", but also for those who are doing this for +sometime, just as a reminder.

+

writing c library in rust

+

One of the cool things about Rust is that you can combine Rust applications +with any other C library. But not only that, it is also possible to write code +in Rust and export it as a C interface -- and, with that, combine with any +other language that can bind with C, which are basically every language around.

+

Self-Protecting Projects

+

Projects without a CI/CD pipeline are doomed to fail.

+

That's basically the gist of the post and I'm all for it too. There are a few +missing bits, like you can have a CI/CD pipeline and not having a policy for +writing tests; but, at the same time, I reckon there is no easy way to measure +if the proper things are being tested (and no, "every single function" is not +a measure).

+

Also, the idea of making the application open tickets every time the +application crashes is cool and all, but that only works for applications that +run on your own environment -- an embedded application would have a hard time +making this.

+

Why I Keep a Research Blog

+

I've been thinking about this for some time: I have a list of "Things I Don't +Know", which I keep on Joplin. The idea is that, +when I have some time, or when I see some information related to the topic, I +can add to the note, till I finally feel confident enough to say "Ok, now I +understand this".

+

But for some time I've been writing this kind of post (the +"Links" ones) as a way to keep a +list of things that I feel I may need in the future. So, if I keep a list of +"maybe in the future" links, why don't I put the research topics also in this +blog? Surely, right now, it will have only the topics and no content (sorry!) +but making it available may also help someone else.

+

There is one point that one could make: If I share links, why not share links +related to those topics, and let the blog engine worry about grouping them? +The point is actually to write whatever I learnt in my own words, 'cause those +are easier to recall in the future.

+

I'm still wrangling with the idea, though. No promises.

+

Minnesota is now using contact tracing to track protestors, as demonstrations escalate

+

You may recall that I've been, for a while, mentioning that contact tracing +applications may sound good to find someone that had contact with another +someone with COVID-19 (so we could alert and/or take that person to a +hospital, before it was too late for treatment), but there were serious +privacy problems with it? Well, there we go.

+

A black person was brutally killed by the police in the USA, and the community +rioted to the point that a police department was set afire -- I'm not saying +it was right or wrong, but you have to think the type of indignation that make +people set a police department on fire.

+

And those people who worried that they may get in contact with someone that +got infected with COVID-19 and installed any contact tracing application are +now being tracked by their association with other demonstrators.

+

And that's what I was talking about. There is no policy that says "this +tracing information may be only used for diseases and nothing else".

+

The 'No Code' Delusion

+

Ignoring the fact that the post talks about a movement for "creating +business rules without the need of a developer", what I found interesting is +the visual comparison of the business rule (in a diagram) and the code (a +piece of Python code). Why? Because that's exactly the way applications should +be written: There is logic and it is described in a combination of functions, +which content doesn't make part of the rule itself and there are no rules +"hidden" inside the function of a rule. There is nothing of "let me put a +regexp here to validate the email". That's not what the business rule says, so +that's not in the code. If the business rule said "You should test this, +convert to that and send this to there", that's exactly what the function +should have.

+

On the other hand, I didn't realized that diagrams require some previous +knowledge: Which symbol represents a test? Which symbol represents "white in +the screen"? And so on.

+

What I need to mention, though, is that COBOL was created for non-programmers +so they could describe business rules and run them; SQL was desgiedn so +non-programmers could describe how to retrieve and process data; BDD has +always been described as a way for non-programmers to describe how a system +should be validated.

+

Google pushed to take action against Android bloatware by 50+ organizations

+

A post from earlier this year, but there is one point that I need to bring:

+

Android is "open source", right? If it is, why doesn't those 50+ organizations +just fork it and make their own Android? Surely, in a 50+ organization group, +there should be a few developers and making them all work on that could solve +the problem, right?

+

Well, thing is, Google controls Android. You can't simply fork and hope that +you can run on your device. You can't simply make a pull request and hope it +will, one day, be part of the system.

+

"Android is opensource" is a farce. It is "source available", not "open +source" by any stretch of imagination.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200604/index.html b/public/links/20200604/index.html new file mode 100644 index 0000000..9f96811 --- /dev/null +++ b/public/links/20200604/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-06-03

+ +

Scotty, Pyramid and Cornice, Problems with datetime.now(), Mercurial and +Python 3, Fast Python, Async Python Request Library, Online Advertising, +Google and Web.

+

scotty: Transports you to any directory you have visited before

+

I have been using Scotty for some time and I really like it.

+

What Scotty does is keep a list of directories you accessed recently and, +after a while, you can simply use s <directory> to get straight into it. Not +only that, but Scotty uses fuzzy searching to find the directory that closely +matches whatever you typed.

+

How to write a Python web API with Pyramid and Cornice

+

Pyramid is the "less known" Python web framework around. But this post shows +how simple is to build a (simple) API with it.

+

Stop Using datetime.now!

+

Slightly clickbait title, but great content. Not only pointing out the +problems when using datetime.now() (no, it's not the function itself that +has a problem, it is the way we use that may cause problems), but going into +lenghts explaining dependency injection in Python.

+

Mercurial's Journey to and Reflections on Python 3

+

Ding dong, the witch is dead, and so is Python 2.

+

But there is still a large base of Python 2 projects that need to be converted +to Python 3, and Mercurial did this, and here's the experience of a +maintained on doing it so.

+

I do understand that converting Python 2 to 3 is not a simple task, but there +are a few misconceptions in the post. For example, "the approach of assuming +the world is Unicode is flat out wrong and has significant implications for +systems level applications". The word is unicode. Go read the Portuguese +version of this blog to have some idea. Go read any Chinese/Japonese blog to +see how it looks. Do you really think those people do not use system level +applications anywhere? Also, what do you think are mostly used: User level +applications or system level?

+

Not saying the conversion is perfect -- in a way, unicode is simply a way of +dealing with the underlying bytes -- but ranting that this change made your +specific way to think harder is not an excuse to not understand where the +whole ecosystem was moving -- and it also doesn't mean your specific thing is +not welcome, but you have to understand you're in the minority case here.

+

(Also, it's no surprise to me that claiming "world is unicode is wrong" is +coming from someone living in an ASCII country.)

+

Making Python Programs Blazingly Fast

+

A set of tips on how to make Python applications faster. Some of those may +seem weird in the first glance (make a variable in the function point to the +a variable in the same class?) but the post also explains why this may +improve the general performance.

+

Httpx: A next-generation HTTP client for Python

+

Requests shown to everyone how +APIs should work, but it kinda got stuck in time, without async support (and a few +other glitches in the project management). Now there is Httpx, which is, +again, another HTTP request library, but this time with async support and, +basically, the same interface.

+

No-judgment digital definitions: Online advertising strategies

+

Have you ever wondered why after you search something -- say, "gamer chair" -- +suddenly you start getting a lot of promotions and ads for chairs in your +social networks?

+

Nothing happens by simple chance, and that's the effect of all the trackers +that someone puts on a page. But how they identify who is who is the real +question.

+

This post by Mozilla may seem a little bit basic, but shows pretty damn well +how those things are done.

+

Google Is Not God of The Web

+

Another clickbait title but, again, good content.

+

A point that caught my attention was "Google has the right to dictate 'Best +Practices', although I think the topic is quite the opposite, based on its +content.

+

Imagine that Google start giving points of "user experience" to pages that use +the Material design. Pages and pages that look like Android apps. But if you +use your own layout, your own colors, you lose points. What now?

+

This is the greatest problem on people depending on Google, and all the +relationship of one of their groups working on web standards, a group working +on a browser and a group to take advantage of whatever the previous two did. +The less dependent on Google you become, the more you use alternative search +engines (DuckDuckGo, Searx and even Bing), the more you use other email +providers (ProtonMail), the more you use browsers that are not Chrome +(Firefox, Safari or anything based on WebKit), the lesser the chance of the +internet becoming the thing of a single company.

+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200611/index.html b/public/links/20200611/index.html new file mode 100644 index 0000000..df0b8b0 --- /dev/null +++ b/public/links/20200611/index.html @@ -0,0 +1,198 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-06-11

+ +

Infrastructure as (Python) Code, Pong in Elm, Alan Kay and Objects, Paywalls, +Brave, Note Taking, Rust From Scratch, Writing, 51 Concepts You Should Know, +MAD in CSS, Magic Algorithms.

+

Why you should try pyinfra

+

I've been, for some time, postponing creating an +Ansible playbook to set up my DigitalOcean droplet +-- for no real reason besides I'm lazy -- and now there is this pure-Python +way to set up an environment, and now I'll probably not start two set ups -- +again, because I'm lazy.

+

Recreating Pong for the Web with Elm

+

There is something deeply satisfying in reading a tutorial that takes from the +very start and explain every little step needed.

+

I just miss the "If you do this, it won't work/will crash" parts.

+

Alan Kay Did Not Invent Objects

+

Ah, I just love this kind of discussion, that goes over and over and over -- I +basically had to hear that every time I went to the local Elixir Meetup.

+

The gist is: When Alan Kay was talking about "object-oriented design", he was +talking about the communication between objects, not about encapsulation, +inheritance and so on.

+

Problems With Paywalls

+

Some of the words in the post are quite strong -- "I would be happier in a +world where major newspapers ceased to exist, compared to the world where they +exist but their articles are paywalled" -- but the actual point being made is +quite true: Paywalled content usually take a route of "let me twist your +imagination/curiosity so you pay to actually see the content". And maybe the +content was produced only for taking your curiosity and produce absolutely +nothing of actual research or content.

+

At the same point, if content was actually good, based on research, and had +actual content that would live on (and not something that was interesting for +this week only and would be completely forgotten in the next), then paywalling +content would be worth paying.

+ +

That was not the first time Brave was caught doing something morally +questionable with users content. At some point, one would wonder if they +share a referral link to some service to a friend -- say, taking advantage of +some rewards on DigitalOcean, for example -- and instead of giving some reward +to them, it give it to the Brave company so they can run their servers.

+

In a way, it just shows how hard it is to produce a browser these days, even +if you take some previously existing codebase and improve it. But doing +morally questionable actions also seem the way of most companies take about +the internet these days...

+

Zettelkasten note-taking in 10 minutes

+

I've been thinking about a way to improve my note-taking workflow, so the +knowledge is not completely lost. And a lot about this "Zettelkasten" way of +taking notes is appearing on my timeline from time to time.

+

So it is nice that a simple introduction exists, although I still have to +start doing it so.

+

Zero To Production #1: Setup - Toolchain, IDEs, CI

+

If you're interested in Rust but have no idea how to start or where to go, +Luca Palmieri is writing a "book" about the whole process.

+

How We Write

+

Tips on how to write gooder1. The tips are pretty precise and direct.

+

50 Ideas That Changed My Life

+

Not much as "ideas", but more like "concepts".

+

Also, as any good list, there are 51 concepts, not just 50.

+

The Mad Magazine Fold-In Effect in CSS

+

Ah, the last page of MAD. I do remember trying over and over to make the +folding correct, so the proper picture would appear. It's kind obvious that, +once we automated stuff, there should be a way to do this.

+

On the other hand, I have the same opinion about the same very complex CSS +example: Ok, now center the text in this box.

+

Algorithm is the Problem, Not Mark Zuckerberg

+

Ok, let's discuss this for a bit: The one showing people that COVID is a +Chinese government weapon gone rogue, racism is not a problem and white people +also suffer racism, and decapitating statues is wrong is not Zuckerberg doing, +but "the algorithm".

+

Here is the problem, though: Although Zuckerberg was not the one who created +"the algorithm", people who work for him did. Also, "the algorithm" didn't +simply appear and decided what do you like, someone put it there. This is what +most people get wrong about artificial intelligence and "algorithms": They +don't simply appear, someone put things there and they act towards what that +person put there.

+

Take, for example, the fact that Google was tagging black people as "gorillas" +in their Photos. It was not a "problem with the algorithm"; someone working +at Google decided black people weren't import enough to add them in the +training set -- worse, that person (or group of people) didn't even though +that adding black people in the training set was something worth or even +missing.

+

This is not the algorithm, is people. People are behind every single "magic" +algorithm out there.

+

And although Zuckerberg was probably not related to the construction of the +algorithm, the people were the problem. Not the algorithm.

+
+
1 +

Yes, I wrote that wrong on purpose.

+
+
+

This post was built with the help of

+ + +
+ + + + +
+ + + + diff --git a/public/links/20200618/index.html b/public/links/20200618/index.html new file mode 100644 index 0000000..61c4eb7 --- /dev/null +++ b/public/links/20200618/index.html @@ -0,0 +1,136 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-06-18

+ +

Commit Messages (again), Ansible, CLI Names, Feature Flags, Rust Binary Sizes, +Mongo with Rust, Command Line Task Manager.

+

How to write good Git commit messages

+

About a month ago, I shared a link describing how to make proper commit +messages, and this post talks a bit further about -- and it also cites some of +stuff I usually miss when I need to do some code review.

+

Ansible: Tasks vs Roles vs Handlers

+

Another "I shared something like that before" link, this one focuses on +Ansible itself instead of some other configuration tool. Although not deep, it +explain most of Ansible "surface" content.

+

The Poetics of CLI Command Names

+

So you decided to create your own command line application to learn a new +language. Congratulations. But the success of your tool depends (partially) on +the name of it and how you consider the "mystic" behind it.

+

I don't fully agree with some points, though. For example, claiming cfdisk +was a bad choice for a curses fdisk; fdisk is well known, and using the +same name as a part of the new name shows that shows that it is a different +version and also gives information to whoever knows fdisk what this +application does. Same case: top and htop.

+

What Are Feature Flags?

+

Before I changed projects, we had a discussion about the way the projects were +using feature flags.

+

Although not discussed here, I do believe that feature flags should, at some +point, be removed, either by the team when a feature goes into full +availability or moved to a user configuration. But it needs to get out of +hands of the developers at some point and not live forever as a flag.

+

How to minimize Rust binary size

+

Not that Rust binaries are big -- at least, in release -- but there is always +someone complaining, specially when compared to binaries created in other +languages whose binaries are not static.

+

But it is always good to have a set of tips on how to reduce them, just in +case.

+

Announcing our Rust Driver: Version 1.0

+

Still on Rust news, MongoDB, the company, released their official driver for +MonogDB, the database, in Rust.

+

One thing that I must say, reading the announcement, is how nice it plays with +the existing ecosystem, supporting the top async frameworks and the +serialization framework. A truly "play nice with everything" by the +description.

+

unfog-cli: A simple task & time manager, written in Haskell.

+

I have a personal project for a long time to create a command line version of +Toggl, but it seems someone had the same idea and did +the project already.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200620/index.html b/public/links/20200620/index.html new file mode 100644 index 0000000..0345985 --- /dev/null +++ b/public/links/20200620/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-06-20

+ +

SIGSEGV, ActivityPub Conf, Git Branch Names, Rust Ecosystem, Learning Rust +with CLI, Design Problems, SCP.

+

Why is there a "V" in SIGSEGV Segmentation Fault?

+

A little bit of UNIX/POSIX based-operating systemas -- and something that +never actually made me wonder what it meant, specially considering the names +of the other interruptions and some internal commands (creat, for example).

+

ActivityPub Conference 2020

+

Ok, it is a bit early for this -- the CFP just opened -- but as a fan of what +ActivityPub proposes to solve, I must share this: A conference related to the +discussion of the protocol and its tools (well, I guess that the topic, +anyway).

+

Stay tuned for the selected talks in the future.

+

On Git branch naming

+

The change of Git main branch name to something that is not "master" generated +some discussion online, even with the major Git services (Github, for example) +already announced that new repositories will get new names.

+

There is a problem with the meaning of the name and what it represents to a +significant part of the world population, but what the post shows is that even +if you ignore that, the name "master" makes no sense in the Git architecture; +it is based on the name used by BitKeeper, which had the master/slave +architecture, which Git does not have.

+

And yes, I do agree with all the answers there. And: If it is a simple change, +won't break anything, and oppressed groups (in the past or present) don't get +offended, why not?

+

There is another point thought: Git is distributed, right? This means it has +not a central server; every installation is the central of itself. The same +goes for its branches, though: Every branch is a copy in itself and you don't +have to put them all in the same basket at some point, e.g., merging back to +the main branch, because there is no main branch. It is just a name and +doesn't hold any special functionality compared to other branches.

+

Understanding the Rust Ecosystem

+

I tend to mention that "languages do not exist in a vacuum", and by that I +mean that you must not look only at some programming language or just a small +piece of it, but the whole; how is the ecosystem for this thing?

+

And, for Rust, it felt always a vibrant system, with all its weirdness and +coolness. And this post goes one step further showing most of the things going +around, from platforms, to forums, to meetups, to companies using the +language, to famous tools.

+

Diving into Rust with a CLI

+

Speaking of Rust, Kevin K wrote this post about a command line tool to +download the XKCD comics. But instead of building the most simple solution for +it, he used the most known libraries for specific points (explaining why he +picked some) and showing a complete final solution.

+

I'm writing some other command line tool in Rust to explore more the language, and the current result is not even near the niceness of what is shown here.

+

Stop Blaming People: It’s a Design Problem

+

Developers are famous for not being able to design a button in the right way +or making it too damn hard to use the damn button -- or, in worse cases, +building an interface so cluttered with options that it is basically +impossible to use the application.

+

But it is not just the software world that suffers from that: the fire in the +Notre Dame Cathedral could be prevented if the interface didn't use some +indirect information; the ballistic missile warning in Hawaii wouldn't have +happened if the interface for the alarm wasn't so simplistic. And so on.

+

Sometimes it is necessary to think a bit more about how the service will be +used instead of making things complex (or too simplistic).

+

SCP - Familiar, Simple, Insecure, and Slow

+

I already knew SCp was slow, but I wasn't sure how slow. What impressed me +most in the post is this line here:

+
tar cf - /tmp/big_folder | ssh server 'tar xC /tmp/ -f -'
+
+

Basically, using tar to get the content of several files and turn it in a +single sequence of bytes, send it through stdout to ssh and, there, run tar +to undo the sequence (making them back into files). Curious, and potentially +4x faster than copying files directly through scp.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200621/index.html b/public/links/20200621/index.html new file mode 100644 index 0000000..c8def21 --- /dev/null +++ b/public/links/20200621/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-06-21

+ +

Google Lawsuit for Ignoring Incognito Mode, Chrome Exploit in the Wild, +Benchmarking HTTP/1.1 and HTTP/2.0, Creating Tables in C++, Understanding +Emacs, Open Source Licenses, Builder Pattern in Rust, Why Leave Medium.

+

Google faces $5 billion lawsuit for tracking people in incognito mode

+

Company that makes money tracking people keeps tracking people even when they +ask for not doing it, news at eleven.

+

I keep repeating this over and over, but let's put this again: If you rely on +anything Google, you can assume your privacy is gone. Your salary? They know. +Your secret emails? Known. The trash you talk about your boss with your +coworkers? All noted.

+

Worse: When you suggest people to start using Google products, you're +basically telling them you don't freaking care about that person privacy. What +kind of friend does that to a friend?

+

Exclusive: Massive spying on users of Google's Chrome shows new security weakness

+

Still in news about who doesn't care about you, a security alert for Chrome +being explore by others -- besides Google -- to spy on you.

+

The interesting part part here is that the security flaw was found by a +company called "Awake Security". Why is this interesting? 'Cause Google has a +specialized group in finding security flaws that, it seems, can only find +security in other products, never on theirs.

+

Performance testing HTTP/1.1 vs HTTP/2 vs HTTP/2 + Server Push for REST APIs

+

A curious comparison: The way to do several requests using different versions +of HTTP with different properties.

+

Obviously, the new stuff is more performant, but one has to ask if doing that +many requests is actually a real thing -- as in "You know loading the real +site, not the site and 300 trackers and bullshit libraries for stupid +animations".

+

tabulate: Table Maker for Modern C++

+

My desire to work with C++ got a lot lower after I learnt Rust, but I have to +reckon that this library, to create ASCII tables on the console, looks a lot +interesting.

+

A Life Configuring Emacs

+

Do you want to learn Emacs? Like, really learn it?

+

Here is a very complete, very long explanation of how to do things in Emacs.

+

Choosing a license for GoatCounter

+

Discussions about open source licenses are always nice and cool, 'cause there +is always something else you can learn about the licenses that exist.

+

In this case, a post analysing several licenses about trying to, besides +keeping the source open, also being able to make money on top of it.

+

The builder pattern, and a macro that keeps FFI code DRY

+

I kept this post for a while for one single reason: How freaking easy it is +to create the builder pattern in Rust without any external libraries. There +are crates that allow doing it so with simple #[derive] directives but this +just shows how you don't even need that, if you're willing to type a bit more.

+

Why we left Medium, and how!

+

You may have noticed that, from some time, none of the links I commented here +are from Medium. And there is a reason for me to not share content posted +there and it is exactly due the aggressive measures they are taking to gather +resources -- not that there is something wrong doing it so, but there are +other ways besides blocking people out of content, or taking our features for +people that publish content -- and remember that Medium itself doesn't publish +anything, they need other people to create content for them.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200703/index.html b/public/links/20200703/index.html new file mode 100644 index 0000000..7634a6e --- /dev/null +++ b/public/links/20200703/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-07-03

+ +

Rust Async and Tide, Github Redesign, Apple Declining Web APIs, Fira Font, +Runbooks, Zig Async.

+

Image decay as a service

+

Although it mentions "Image", this post is actually a very good (as Amos' +posts usually are) explaining async Rust and Tide from the very beginning.

+

Redesigning Github repository page

+

Github presented a new layout recently, but some things are not... quite in +place.

+

Here, Nikita explores the interface step by step, checking every element and +how to make them work.

+

Apple declined to implement 16 Web APIs in Safari due to privacy concerns

+

You have one chance to figure out who proposed most of those 16 APIs.

+

Also, not to just pick on anyone or defend Apple, but some of those are +completely absurd for a web thing -- unless you want the web to become a whole +operating system, something that would make a lot more sense in, I don't know, +a native application running on a real operating system, maybe?

+

Fira

+

Mozilla took the task of keeping Fira -- and Fira Code -- fonts.

+

The only issue I found: No ligatures on the mono version. There is an issue +open since 2016 but the ligatures are not there (at least, the common ones, +like "==", "->" and "=>", that make those appear as a single character).

+

Sadly, for now, I'm sticking with +Cascadia.

+

The Runbooks Project

+

I'm a huge fan of Runbooks. Why? Because, some day, you'll be on call and +things will go wrong and you'll have no idea what to do, but there it is, a +list of things that can go wrong and how to fix them.

+

And here are some generic runbooks to take care of common things when they go +wrong.

+

What is Zig's “Colorblind” Async/Await?

+

Async/await is in all rage these days, and Zig is a small language that takes +a lot of C, but tries to fix some of its issues.

+

And here is an introduction directly of async/await in Zig, so you can get a +good "feel" of the language.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200706/index.html b/public/links/20200706/index.html new file mode 100644 index 0000000..35522bd --- /dev/null +++ b/public/links/20200706/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-07-06

+ +

Reddit and LinkedIn Apps Capturing iOS Clipboard, Python Library for Pretty +Terminal Apps, Zola Workflow, Modern Pascal, Bash Test Framework, Dependency +Manager for Python, C Quirks.

+

Reddit and Linkedin apps also caught copying and pasting clipboard contents

+

Recently, there was some news about TikTok capturing clipboard +content in a +recent iOS update, which notifies the user on the desktop when something is +copied on the device or vice-versa -- the gist of it is that in the next iOS +version, when you do a copy in one device, it will notify you that something +was added to the clipboard, so you can paste the content in any other Apple +device.

+

And now the Reddit and LinkedIn apps running on the new iOS also seem to push +the notification.

+

Since it is the first version of iOS 14, it could be that something is wrong +with the API and it is notifying something that is actually normal, and it +wouldn't be the first time Apple broke something like this in new OS versions. +But, at the same time, we live in an era where every freaking app wants to +capture as much data as it can from the user and you can't deny that it +wouldn't be weird if Reddit (which is aggressively pushing towards using their +app in the mobile website) and LinkedIn wouldn't do something like this.

+

Honestly, I think the API isn't broken. Apple did that on purpose, to show bad +actors without claiming they are bad actors.

+

Rich is a Python library for rich text and beautiful formatting in the terminal.

+

I'm finding curious how it seems there is a "renaissance" of terminal apps +these days; and, tied with that, the amount of libraries that help developers +build pretty terminal applications.

+

And here is another one, this time in Python.

+

My Zola Workflow

+

I do use Zola on this blog too (and I'm currently abusing the tagging feature, +but that's a discussion for another time) and here is Jason set up to generate +the pages when pushing content to his github.

+

There is only one issue I have is that he's using Docker to keep Zola. But +Zola is a Rust application and will produce a single binary and I don't see +why Docker is necessary here (not counting access to Glib, that is). One could +just add the Zola binary to their source content and be happy with it -- I'm +inclined to go with this route, once I stop procrastinating and make an +automated deployment of this blog, which currently is a single shell script.

+

Modern Object Pascal Introduction for Programmers

+

Ah, Pascal. The language must of us, old farts, learnt in the UNI.

+

I have to admit that I forgot most of the stuff I used (due the lack of use) +and I'm always happy to find these gems talking about some of the languages I +lost contact over the years -- not to mention that I have this idea of writing +an application in Pascal, just for the giggles.

+

Bach Testing Framework

+

Bach is a testing framework for Bash scripts.

+

DepHell

+

A tool for managing dependencies with Python. Converts from one format to +another and even allow creating a dockerfile for strong isolation.

+

C, what the fuck??!

+

I like C and I won't lie. Even with its quirks, it is a fun little language.

+

But the amount of quirks -- some quite obscure, as shown here -- is really a +pain.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200712/index.html b/public/links/20200712/index.html new file mode 100644 index 0000000..0a1518f --- /dev/null +++ b/public/links/20200712/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-07-12

+ +

Erlang by Example, Accessibility, Good StackOverflow Answers, Testing, +Flexbox, HTTP Server in C, Icecream Affecting Cars.

+

Erlang/OTP by Example

+

Erlang is one of the languages in my "to learn" list and having a "by example" +site really helps -- at least, it helps me a lot with Rust.

+

The 6 Most Common Accessibility Problems (and How to Fix Them)

+

Accessibility is always import. And knowing that there is something akin to +OWASP (common web application insecurities) that puts a list of common +problems is always good. And, on top of that, having a list of easy to fix +problems is even better.

+

Parsing city of origin / destination city from a string

+

Although the answer is quite long and not "Just use X", this is the kind of +answer StackOverflow should aim for: Even if the question seems absurd, there +is a long explanation on how to do it, every step and problems on every step, +till the point of "it's not that simple".

+

against testing

+

Someone took my words about testing and took it waaaay too far.

+

Sure, testing everything feels wrong, but you can see things are wrong when +someone says "Tests are very brittle, breaking due to entirely innocuous +changes in the code". Here is the problem: You're a fucking moron if that +happens; you're testing the implementation not the behavior. So sure, it +will be brittle 'cause you wrote the whole thing wrong.

+

That is one of the points I really don't like the so called "unit test" -- as +in "testing every function". Behaviour is not contained in a function, but it +appears when functions interact. That's why integration tests feel more +"right" to me: We ignore how things were implemented and focus on how the +system should behave.

+

So yeah, testing is wrong and you may dislike it, specially when you writing +it wrong in the first place.

+

Coping with flexbox

+

Flexbox is in all rage these days in web development, mostly 'cause it fix the +damn "Center this vertically and horizontally". And this kind of explanation, +going through the basics, is always welcome.

+

httpserver.h: Single header library for writing non-blocking HTTP servers in C

+

One of the weird things about C is that there is a lot you can do with it, +including a single file for building a whole HTTP server.

+

"My Car does not start when I buy Vanilla Ice Cream", said a Man to General Motors.

+

I'm a sucked for this kind of story: Things don't work because some weird +random, seemingly unrelated event.

+

It reminds me of the story "My password doesn't work when I'm standing up".

+ +
+ + + + +
+ + + + diff --git a/public/links/20200719/index.html b/public/links/20200719/index.html new file mode 100644 index 0000000..9c74a5b --- /dev/null +++ b/public/links/20200719/index.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-07-19

+ +

Building Executables Unix Way, Really Used Data Structures and Algorithms, Zig +Foundation, Rust on Linux, Bad AI, Git Ignore, What is CI and CD.

+

Traditional Unix Toolchains

+

While the title may give some impression that it will talk about common unix +tools (and pipes, and && and ||), it actually talks about the process the +unix compilers take on converting your C code into an executable.

+

It is a bit succinct, but succinct in the right places. It gives a good +explanation on the whole process, the involved tools and their jobs in the +process.

+

Data Structures & Algorithms I Actually Used Working at Tech Companies

+

When doing job interviews, we get asked about a lot of stuff. But what do we +actually use? Kinda reminds of that joke about the job interview asking to +invert a binary tree and the job is just to move a button 2 pixels to the +left.

+

But it is good to know what is actually useful, in real life applications. And +not just some CRUD or whatever, but what goes into Skype and Uber.

+

Announcing the Zig Software Foundation

+

Zig is a small language aimed to fix the problems with C.

+

What impressed me here is that the Rust community had talks about making a +foundation, so the language would be open to everyone, but still didn't manage +to make it.

+

So, kuds to Zig developers for creating their foundation!

+

Linux kernel in-tree Rust support

+

Alright, so it seems the Linux developers finally opened to doors to new +languages in their tree.

+

What feels "wrong" here is that Linus is saying that "Rust support" should +always be up, so if something breaks, they can point that it was broken +anyway. The "wrong" part is that this, obviously, puts visibility on things +that don't work instead of focusing on the things that do work. What if +there are a couple of modules working fine, but only one fails? Obviously +everybody will point out that the support doesn't work and people should +stick with what still works.

+

But Linus, you know...

+

Awful AI

+

Not every AI is good. Not every AI will help you find an open spot for that +meeting with everyone. Not every AI will tag your photos with locations and +loved one -- but they would tag any black people as "gorillas". Or maybe say +who may be gay or not (and think how those people would be affected on +countries that see homosexuality as a crime). The list goes on and on.

+

gitignore.io

+

Create a comprehensive .gitignore for your project, based on your language +and tools.

+

The real difference between CI and CD

+

What does CI and CD do? What they are there for?

+

I've been thinking about doing a presentation for people starting with in +development about each of those -- 'cause, you know, there are a bunch of +people still thinking git push on your computer and git pull on the +production server is a good decision...

+ +
+ + + + +
+ + + + diff --git a/public/links/20200726/index.html b/public/links/20200726/index.html new file mode 100644 index 0000000..a5ef73a --- /dev/null +++ b/public/links/20200726/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-07-26

+ +

Datomic Internals, Developer Advice, Racism@Google, Logging, Code To Delete, +Being a Product Manager, Syntax Highlight, Rust Module System.

+

Unofficial guide to Datomic internals

+

Database internals are always curious, to say the least. And Datomic is also a +curious database, as everything is immutable.

+

But understating internals is always good to understand where the database +fits and how to take most of it.

+

Advice to Myself When Starting Out as a Software Developer

+

When you're working in the field for too long, it is easy to forget how it was +when you started.

+

I can't find anything wrong with the tips, but they feel a bit... bland. I +mean, honestly, the tips here are something that should be in every developers +list anyway, beginner or pro.

+ +

Oh, are you saying Google is racist? That's impossible! That's "the algorithm" +fault! Google is good, it gives me free email!

+

You see how "giving things for free" and "open source" (and then not listening +to users) is purely a marketing plot?

+

Good Logging

+

Logging is always important -- personally, I think logging (and good logs) are +more important than debugging -- but knowing how and what to log is the +key for properly dealing with it.

+

Some of the points are quite common, like screaming logs, although the +solution is not using WARNING or INFO, but actually figuring out how to +properly set the log level for each modules -- and using modules -- feels more +correctly.

+

Personally, I leave a lot of debug messages in some places, as "scars" of a +battle. Maybe some future developer will see that sequence and think twice +before jumping in.

+

Write code that is easy to delete, not easy to extend.

+

That's one thing I totally agree: it is better to write code that's easy to +delete than to reuse. But simply going into copying things over and over so +you can delete one thing without breaking the other is not actually the +solution.

+

I'd just adding abstractions, to the point functions are so simple they exist +without any business logic; these logic pieces are then put together in other +functions, describing exactly what the business rule is: +get_info_from_server, change_info_in_some_way, and so on. If the rule change, +you just delete the abstraction in the middle of the larger function.

+

"But that still doesn't solve it!" Well, if the business rule changed, then +you can either delete the larger function and write a new one to follows the +new rule or simply drop -- or add -- any of the abstractions.

+

22 Principles for Great Product Managers

+

I didn't even get to half of the list and I was "yup, I had a hard time with a +manager that didn't do that" and "I remember when they did that and it was +awesome".

+

Syntax highlighting is a waste of an information channel

+

Once again, "I can get behind the sentiment, but not the implementation". +Surely, having information about types, or some parameter, in the syntax helps +a ton, but the fact is that it depends on situation. At some point, the type +may be more important than the parameter, or vice-versa, or worse, it may give +focus to something that is not important at that time. Putting all that +together, at the same time, would be a nightmare -- or a fruit salad +of colours that would make reading the code and finding what matters completely +impossible.

+

Clear explanation of Rust’s module system

+

Rust module system is a bit different from everything else, and the +exploration I did gave me some insights about it -- mostly, exactly what the +post says.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200802/index.html b/public/links/20200802/index.html new file mode 100644 index 0000000..7bdee44 --- /dev/null +++ b/public/links/20200802/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-08-02

+ +

Async/Await Fails, Facebook Complains About iOS 14, Telegram on Emacs, Go is +Google Language, Copyleft is Copyright, Google Blaiming "The Algorithm" Again, +Many Teams Fragmentations.

+

Beware of Async/Await

+

Not much as "careful with async/await", but "don't use async/await in the +wrong way". And since async/await is in all the rage these days, in every +language, the same problem can happen in any of them.

+

Facebook says Apple’s iOS 14 changes could hurt its ad targeting

+

You know Apple may be doing something right for a change when Facebook says a +change will hurt them.

+

telega.el: GNU Emacs telegram client (unofficial)

+

Emacs kitchen sink just gets bigger.

+

pkg.go.dev is more concerned with Google's interests than good engineering

+

Again, I disagree with Drew in a lot of points, but I have to give it to him +when he gets the point right.

+

One of the points of Git is its decentalization. Surely the de facto use of +Git these days is not decentalized, but sadly centralized. And Google should +know better, as they had their own Git repository (GoogleCode, anyone) and +they just... fucked it up. And now, because they fucked it up, it seems they +want to just screw it further, so people don't realized how they fucked it up.

+

And, again, Go is Google language. It's not yours and they are not interested +in helping you there.

+

Open Usage Commons: a warning

+

Let's ignore the "world is ending" tone of the post here, and let's focus +on what's here:

+
    +
  1. To help you trademark your open source project, you give up all your +patents and such to the Open Usage Commons.
  2. +
  3. Let me repeat that: You give up all your patents to someone else.
  4. +
+

Copyleft works 'cause, in the very deep, it is a copyright law; you can sue +anyone that tries to steal your patents and trademarked content if, say, they +tried to take your trademark away, or used their position to overtake as the +"the one who knows it" from you.

+

One thing that remind me in the very start of the post is that GNU Foundation +does the same thing: If you want to make your application a GNU application, +you have to give your patents and trademarks to the GNU Foundation. While it +may appear the same, they are completely different:

+

If you want to release anything under any GPL (GPL, LGPL or AGPL), your +don't give anything to the GNU Foundation; it is still yours. If you want to +make your application a GNU application, the GNU Foundation still have to +accept it.

+

Trademark and copyright is very important to open source projects. Don't +give them up.

+

Google blames algorithm for adding porn titles to train station search results

+

Once again, the mythical "the algorithm did it!" excuse. It's not "sorry, we +did mess up with the training data", it's "the algorithm".

+

Google idea of "organizing the worlds data" seems far and far away when they +don't even try to understand the data themselves.

+

Independence, autonomy, and too many small teams

+

I've seen this: Because people buy the "communication grows exponentially" and +should make smaller teams -- which is correct. But they make "smaller teams" +and not "smaller problems that can be dealt by smaller teams". And that's when +things fall apart.

+

Honestly, to me, this feels a lot like failing to have a proper architect, +someone who can see the big picture and think on ways to make all the pieces +come together.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200809/index.html b/public/links/20200809/index.html new file mode 100644 index 0000000..125500f --- /dev/null +++ b/public/links/20200809/index.html @@ -0,0 +1,149 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-08-09

+ +

VimConf, Better SQL, Git Branches, Excel Fucking Science, OpenJDK on ARM, Rust +CLI Tools, DataFrames in Rust, World Windows.

+

VimConf 2020 Live

+

One small good point on everything that is going around is the amount of +conferences going live.

+

And now there is VimConf going live.

+

For the incredible amount of $0.

+

We Can Do Better Than SQL

+

"Hear, hear! Our product has a better thing than the rest of world! We +promise!"

+

Although I can understand that SQL is not perfect -- I mean, do anyone know +and know how to use all the join types? -- but it is one thing saying "our +system is better" when you can clearly see that the request needs information +beyond what you're showing.

+

Surely, your queries may be simple, but how much work there is when creating +the database for making that query possible? What proper cases does it match +and where does it make things harder? I can cite Rust as an example: It makes +possible to write parallel code correctly, but due this it is really hard to +write something like a linked list without running into some issues.

+

So yeah, your query is magical, but not showing where it falls flat gives zero +information about if I want to use it or not. SQL has its drawbacks, but there +are known and documented.

+

git branch --delete master

+

No Master Branches, No God Branches.

+

This is kinda related to the other link shared 2 months ago, but gives an +explanation on how to kill your master branch and use something else.

+

Scientists rename human genes to stop Microsoft Excel from misreading them as dates

+

What point we reached when science has to bow to the whims of technology...

+

OpenJDK Comes to Windows 10 on ARM

+

If you had any doubts that ARM is the platform for the future, there are two +points here that may make you rethink:

+ +

Rewritten in Rust: Modern Alternatives of Command-Line Tools

+

I shared a list like this before, but I keep forgetting to install hyperfine +and I had to use grex once and forgot their names.

+

So, once again, in the hopes I'll remember to check my blog first.

+

Polars: Rust DataFrames

+

Data science in Rust. I didn't believe it was possible, but I can see the +first steps here.

+

WindowSwap

+

This is one hell of a cool project, even if not directly linked to programming +itself.

+

People put cameras on their windows and you can check them, randomly.

+ +
+ + + + +
+ + + + diff --git a/public/links/20200815/index.html b/public/links/20200815/index.html new file mode 100644 index 0000000..8fe0db0 --- /dev/null +++ b/public/links/20200815/index.html @@ -0,0 +1,182 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-08-15

+ +

Rust Docs On the Comand Line, Emacs Doom, Apple ARM Cascade Effect, Software +Architecture, Uploads in Flask, Flask and Prometheus, Rust in Apple, +Configuration Files In Rust, Rust Builder Pattern, Ruining Phipher Sites With +Bash, Run Code Online, Free Action Cult, What Is Mozilla, Rust SPAs, GNOME +Extensions, Git in Rust.

+

roc: Rust command line documentation searching

+

I may getting too much into CLI tools and such, but searching Rust +documentation directly from the command line seems helpful as heck.

+

Emacs Doom for Newbies

+

I promised myself I wouldn't share links from Medium anymore, but this +specific article helped me a lot getting into Emacs Doom keybinds. And Emacs +Doom is my new favourite Emacs distribution now, so...

+

Apple Silicon: The Passing of Wintel

+

I like how this article describes how the simple change from Apple to their +ARM version will push Microsoft towards it, thought their Surface thing. And +if Microsoft changes, all big manufacturers will change too.

+

It is a fairy-tale of sorts, but damn, it does make sense!

+

Five things every developer should know about software architecture

+

I don't watch technical videos -- mostly 'cause my world revolves around text +and I prefer things in textual form -- but I can see that the bullet points +make sense.

+

(Also, if someone watch the video and I'm wrong here, let me know.)

+

Handling File Uploads With Flask

+

Although uploads are a simple matter (usually, and specially with Flask), I +like when a tutorial starts on the very basic, no frills option and then +starts adding features, showing the progress done to reach something that is +way better than the first version.

+

Monitoring Flask microservices with Prometheus

+

A nice library to add support for Prometheus scraping on Flask applications.

+

Even Apple Is Interested In Migrating Their C Code To Rust

+

Ok, it's their services and not something related to macOS or iOS or any other +OSes.

+

confy: Zero-boilerplate configuration management in Rust

+

Look how cute this little library that have the directories where +configuration should be and how to load it.

+

typed-builder

+

Cool crate that allows #deriving the builder pattern on a struct.

+

Stopping phishing campaigns with bash

+

Nothing funnier than destroying a phishing site with automated scripts.

+

Try It Online

+

One of the cool things about the Rust ecosystem is the +Playground, a site that allows you to code Rust +without having to install the Rust compiler. But someone took a step forward +and make a Playground for almost every language.

+

I Love MDN, or the cult of the free in action]

+

It all starts with a "But I did first and nobody said they loved me" but then +it hit me in the gut with "It reminds me of breaking into spontaneous applause +for our courageous health workers instead of funding them properly so they can +do their jobs."

+

MDN is one hell of source of web knowledge. And, for some absurd reason, +Mozilla decided to not fund it anymore. And nobody is talking about how to +keep MDN going outside Mozilla: no talks about crowdfunding, no talks about +moving to somewhere that will keep it alive and such.

+

By the way, if you're sad about MDN but are still using Chrome: +Congratulations, you're part of the problem.

+

Mozilla’s uncertain future

+

It is really interesting how this paints a good picture of what "Mozilla" +actually is, explaining the works of the Foundation and the works of the +Corporation.

+

Single Page Applications using Rust

+

At this point, it must be clear how much I like posts that start with +something very simple and go building something more complex with in some +simple steps.

+

And this one have even diffs for the changes!

+

How To Make Ubuntu Work Like Windows 10

+

Not that I'm into Windows layout in the first place, but a good collection of +GNOME extensions, if you're into changing the look of your system.

+

gitoxide: An idiomatic, modern, lean, fast, safe & pure rust implementation of git

+

One more to the bag of "common tools rewritten in Rust".

+ +
+ + + + +
+ + + + diff --git a/public/links/20200829/index.html b/public/links/20200829/index.html new file mode 100644 index 0000000..ddd6209 --- /dev/null +++ b/public/links/20200829/index.html @@ -0,0 +1,165 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Links for 2020-08-29

+ +

YouTube Unhideable Political Ads, Fediverse Out of Play Store, Haskell From +Zero, Haskell Mini-Patterns, Rust Thread Pools, Embedded Rust Logging Crate, +Predicable Oracle, Falsehoods About Addresses, Track This.

+

YouTube Mobile (iOS): I keep getting Donald Trump campaign ads with no "stop showing me" option

+

What a great way to start a list of commented links by showing Google being... +well, Google.

+

You can hide ads that don't interest you. But it seems certain ads can't be +hidden, can't be skipped and don't react like normal ads.

+

In a way, it's fine that Google decides that, if someone pays enough, they +have higher privileges in their system. After all, Google (Alphabet actually) +is a company, and it can decide how things work on their system and how they +are going to make money out of their system. On the other hand... that's what +we keep pointing over and over: Google doesn't care what goes in their +systems; Google doesn't care what happens in their system.

+

And that's why a company that have that much effect in everyone's life +shouldn't exist in the first place.

+

Google is apparently taking down all/most fediverse apps from Google play

+

Again, Google is free to do whatever they want when their system.

+

But here is the thing: ActivityPub is a protocol that allows any server to +share activities to other servers that implement that protocol. It is not tied +to any kind of activity, but the most common one at this point is +microblogging (think Twitter). So far, so good.

+

Whatever people do in their systems is up to them.

+

Because the protocol is open, anyone can implement anything with it, including +clients for, say, Android.

+

In the early days of the protocol, some bad servers appeared, but people +managing moderated servers took care and decided to not federate with those +bad servers, basically leaving the bad apples out of the basket.

+

So yeah, there are bad services in the ActivityPub universe, and they are +being ignored by the vast majority of other services. Should Google ban Chrome +or Firefox from the Play Store 'cause there is content like Breitbart on the +internet?

+

Haskell from 0 to IO (Maybe Hero)

+

Haskell is one of those fancy languages I'm trying to get a grasp of.

+

I can say that I could understand half of this, before the complexities of the +syntax throw me off. But I intent to read it again (and probably again) till +I get it.

+

Haskell mini-patterns handbook

+

Speaking of Haskell, here are some patterns (really small ones) in that +language.

+

Maybe to be consumed after understanding the language.

+

Multiple Thread Pools in Rust

+

Serendipity: I was thinking in ways to improve my dhash calculator, using +threads pools and queues to check for files and dhash calculation for each +image.

+

And then this shows up.

+

defmt, a highly efficient Rust logging framework for embedded devices

+

A new logging system for Rust, targeting high efficiency. But it seems small +and simple enough for any system.

+

aaronson-oracle

+

A little experiment on how to predict things. After a while, I couldn't make +it drop below 75%.

+

This proves how easy it is to predict behaviors the more data you have about +someone. Also could explain how you suddenly start seeing ads for something +you just spoke with someone: They have so much data about you that they can +predict, with some pretty good accuracy, what will interest you in the future.

+

Falsehoods programmers believe about addresses

+

I love these "Falsehoods" posts.

+

Hey advertisers, track THIS

+

Mozilla may seem in bad shape these days, but we can't forget how they did +something like "Track THIS", which will flood tracking sites with bad content +about someone, so they can't predict anything right.

+ +
+ + + + +
+ + + + diff --git a/public/links/20210318/index.html b/public/links/20210318/index.html new file mode 100644 index 0000000..06ebc34 --- /dev/null +++ b/public/links/20210318/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links for 2021-03-18

+ +

CI, Who Owns Your Data, Mac keybinds on Linux (and Windows), A Word About +Testing, Spring with GraalVM.

+

The Tao of Continuous Integration

+

Some good things here (CI needs a purpose), some not great (developers creating +workarounds the CI? How?) and no solution for those problems but, in the end, +some real things you need to keep an eye for.

+

For Whom Does Data Work?

+

Hey, it's "let's get scared about who is getting my data" o'clock!

+

Ok, not that much but, once again, someone is asking who is getting some money +using information we don't know is being captured and processed about us. There +is even a discussion about different models -- but sadly leaves things like GDPR +and LGPD (the Brazilian version of GDPR) out of it.

+

Kinto.sh

+

A script to update your shortcuts to use the same as the Mac. This would be my +dream of using Super-C and Super-V instead of Ctrl-C and Ctrl-V -- which doesn't +work as expected in the terminal, and you have to add Shift to the equation -- +but alas, it doesn't work properly on Fedora due SELinux (and heck if I'm going +to lower or disable SELinux -- my paranoid self would never allow that).

+

A short piece on writing tests

+

A really short piece about testing, but I surely can agree with the content of +the first line: "If you're unsure of how to proceed, white a test".

+

Announcing Spring Native Beta!

+

I had my time with Spring and that's one piece of software that made my life +with Java less miserable. The title was a bit misleading to me, 'cause I kinda +associated the word "Native" with "Mobile, but in one single language".

+

The "Native" part here is actually targeting the result into a GraalVM image +instead of the war tested bytecode.

+

It's weird how GraalVM appeared and then disappeared from my radar. It was +touted as a solution for most integration systems and then... nothing. Maybe +with Spring embracing it, it would get some traction again.

+ +
+ + + + +
+ + + + diff --git a/public/links/expanding-fuchsia-open-source-model/index.html b/public/links/expanding-fuchsia-open-source-model/index.html new file mode 100644 index 0000000..da43fe6 --- /dev/null +++ b/public/links/expanding-fuchsia-open-source-model/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented link: Expanding Fuchsia's open source model

+ +

Google recently announced they they are changing the open source +model +of their new open source OS called Fuchsia. But there are so many red flags one +has to wonder what the announcement actually is.

+ +

For example: "We have been developing Fuchsia in the open, in our git +repository for the last four years." Thing is, nobody had access to the +repository for writing, only Google. And, although it was "open" you couldn't +suggest changes or anything, even if you were following the development since +its inception. The model is as "open" as Android is, where only way to +contribute to the mainline code is being at Google; you can clone the Android +code as much as you can clone Fuchsia code, but good luck trying to make it run +without voiding your device warranty.

+

"Starting today, we are expanding Fuchsia's open source model to make it easier +for the public to engage with the project." This point is important for the +next points, but you have to ask yourself: What is actually changing in the +model? Are they changing the license, to allow people to continuous contribute +as an open source project? Are they opening the lines for accepting external +pull requests? No, they are just creating a maillist and writing down how one +can get permission to submit patches or become a committer. How open is a +project that you need to have badge to be able to be part of the project?

+

Let me try to explain this by using an analogy: Imagine a house with a +huge, sound-proof window. Sure you can look inside the house, but +there is no way you can tell people that the sofa looks better if +facing the other wall, that a vase is about to fall down and break or +even get in and help them move the sofa to the other side of the +room. You wouldn't call that an "open" house, would you? Well, that's +the current model for Google projects: Look, but we won't listen to +you and we won't let you get in to move the sofa the way we actually +want.

+

"In addition, we are also publishing a technical roadmap for Fuchsia to provide +better insights for project direction and priorities." Remember the first point +about making easier to the public to contribute? Well, how can it be a +contribution from the public if the direction is already set? What if the +public decides that the direction should be another one? Either is a waste of +time of the current developers or the "easier to contribute" is simply for free +labor and not for building an open source project, in the end.

+

"Fuchsia is an open source project that is inclusive by design, from the +architecture of the platform itself, to the open source community that we’re +building." This point was raised from another user on Mastodon (hello +Berkes): One does not "build" an open +source community; you make an inclusive, open to everyone project, where people +can contribute to code, documentation, ideas, improvements and even direction +and the community will build itself -- Rust is a great example of that (and I'm +bringing this for later).

+

But even with all that, let's take a step back: Why would Google change the +"model" of such OS? Couldn't they develop it themselves, in the close? Sure +they could. The fact that they are "open sourcing" it probably means the +project lost importance inside Google and nobody actually cares to continue +development of it. The roadmap probably is just the original authors +"wishlist" for the OS and nothing more.

+

Also, there is the question of "Why Fuchsia?"; why would Google invest in +producing another OS when Linux seems to fit most of their needs (after all, it +fits their ChromeOS and Android systems)? While being developed with Rust, a +language the provides memory protection and should, in theory, provide a better +experience for users, it doesn't mean that other languages can't provide the +same protections -- Rust just means the compiler will do a better job at +pointing out problems than other languages. But when you have an operating +system like Linux, which is reviewed by thousands of developers around the +world, highly modular and with groups focused on different subsystems, the +protection comes from the community. Google could, pretty much, rewrite some +critical subsystems in Rust and get over it, but they decided to go with a +completely different OS. And the rumors say that it was simply 'cause Linux is +licensed under GPL, a license the allows anyone to contribute -- with later +versions of the license even requesting companies to provide the encryption +keys for devices that require it -- and that Google simply abhors.

+

So, an OS created (probably) out of petty spite for rules that actually build +open source communities now is trying to create an open source community. If +this isn't poetic justice, I don't know what it is.

+ +
+ + + + +
+ + + + diff --git a/public/links/fsf-statement-about-rms/index.html b/public/links/fsf-statement-about-rms/index.html new file mode 100644 index 0000000..b35c041 --- /dev/null +++ b/public/links/fsf-statement-about-rms/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Statement of FSF board on election of Richard Stallman

+ +

After the weird return of rms to the Free Software Foundation +board, now both the FSF and rms provided +statements about the event.

+

But I still think things are amiss.

+ +

First, a small look at rms short +statement. +While recognizing his troubled comments, it seems he focused on one single +event -- the Minksy comment -- , ignoring a lot of others that appeared, like +the accounts of women feeling uncomfortable and people pointing the way he +directed the FSF. He did mention that he may sound "tone deaf" and the feeling +that this statement is "just to say something" may be related to that, but +still... Can't be board help him in discussing this kind of stuff?

+

Second, and which gave me a lot more "bad vibes" was the statement by the FSF +board +about rms reinstatement into the board. On that, the second paragraph strikes me +like the most out of perspective of them all.

+

For example, "We decided to bring RMS back because we missed his wisdom." The +problem here is that it pushes an emotional tone: they don't "lack" the wisdom, +they just "missed" it. It's not like they recognize a failure in the current +board focus, it is more like they felt they needed the "hug that really tied the +room together".

+

Another point: "His historical, legal and technical acumen on free software is +unrivalled." I understand where they are trying to get here, and I'd give that +rms really does have a lot of historical knowledge, but that strikes me as, +again, a problem with rms. If you have a senior dev/technical leader in your +project, it is expected that this person would help other developers and +management people by passing away their knowledge, to the point that they may +be, in the future, totally irrelevant (that doesn't happen, 'cause either they +move up the hierarchy or new people are brought to the team). A technical +leader/senior dev that doesn't share knowledge is a failure, in my opinion. On +those 20 years in the FSF before renouncing his position, rms should've shared +enough that even if his knowledge is vast, a lot was present around no matter +what. While I can't point the problem directly at rms, as it could be that the +board itself didn't care about acquiring more knowledge (as some developers do), +this shows that there is a huge problem here.

+

Still in this same paragraph, "He remains the most articulate philosopher and an +unquestionably dedicated advocate of freedom in computing." rms admitted himself +that he's tone deaf. How can someone be articulate if he's tone deaf and can't +properly explain his points? Connect this that, in the next point the board +itself recognizes that "his personal style remains troubling for some" and you +have someone that isn't articulate.

+

And finally, there is "We recognize the need to attract a new generation of +activists for software freedom and to grow the movement." This is true and I'm +fully behind the FSF on this point. Except for the fact that instead of bringing +someone from a new generation to fill the seat in the board, they are bringing +someone from the previous generation. If I had to shown my geek credentials, I'd +say that it is basically Kirk taking command of Enterprise A from Decker and, if +Decker wasn't there, he'd blow the ship completely in the first warp test. A new +generation is necessary to understand the new environment, we can't keep using +the same old knowledge now that the ship is a brand new one.

+

The feeling I got from all this is that both texts were posted only to say +"Yeah, ok", not "We recognize our faults". If rms recognized the problems, he +would've cited the other issues, citing his side and pointing understanding +about where he failed. If the board recognized the problem with appointing rms +again, they wouldn't have use an emotional tone about him and wouldn't pin this +all in a "new generation" while staying with the old.

+

Being wrong happens. Understanding what was wrong (communication, attitude, +understanding at the time) and pointing that out is a great way to grow up. If +you keep deflecting this, you end up standing still doing the same wrongs +again. And I feel both rms and FSF, in those statements, are still standing +still.

+ +
+ + + + +
+ + + + diff --git a/public/links/go-xml-vulnerability/index.html b/public/links/go-xml-vulnerability/index.html new file mode 100644 index 0000000..709fd35 --- /dev/null +++ b/public/links/go-xml-vulnerability/index.html @@ -0,0 +1,148 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Coordinated disclosure of XML round-trip vulnerabilities in Go’s standard library

+ +

Mattermost, along with Google, announced a vulnerability in the Go XML +stdlib. +There is a bunch of things to unwrap in this announcement.

+ +

Before anything, I need to point out that I never liked Go. I don't +like the way they deal with the community, I don't like their error +reporting way and I don't like their code style. I take every chance +to bash the language. But this time, I think the brokenness went too +long.

+

First of all, sure, there is a vulnerability in the XML library. The +vulnerability by itself and not huge -- it basically means, by what I +got, that the library itself doesn't keep the order of elements inside +-- but its the use in some huge elements, like SAML, affects the way +the protocol works. So, basically, something that would look like a +well-formed XML/SAML content would be interpreted in the wrong way +'cause the system is changing the semantics of it by changing the +order.

+

Second, apparently, since the vulnerability was found, the go security +team have been working on fixing the issue, with no success. The +resolution after all this was "the root causes of the vulnerabilities +cannot be reliably addressed." That means that the stdlib now have a +vulnerability that can't be fixed.

+

Third, this vulnerability was found in August this year and only now, +four months later, the vulnerability was disclosed and announced that +it can't be fixed. This is extremely infuriating 'cause Google have a +project called "Project Zero", created to find and report +vulnerabilities in several products. The problem is this is the third +not-so-small vulnerability in go code, and none of them were found by +Porject Zero. On the other hand, they are pretty quick in pointing and +disclosing -- with a 30 day allowance -- issues in Windows or iOS, for +example.

+

Oh, and in case you're wondering what were the other issues, the first +was related to the cryptographic +libraries +and basically affected a bunch of Etherium applications. The second, +an issue with the "http" library, which could lead to a +denial-of-service in +Kubernetes.

+

Also... Four months and no solution? That means there is something +seriously broken in go internal architecture that doesn't allow +something like ordering to be applied.

+

But back to the main issue: Fourth, the company that worked with +Google to find and helped in trying to fix the issues, pointed that +they don't believe the changes proposed by the go team will actually +fix the problem. By their words, it seems Google just want to throw +the issue under a rug and, when it blows up, they will say "it's your +own fault, we told you so".

+

Google solution is, basically, "we'll put in the documentation and +hope for the best". So, no fix at all. Honestly, the proper solution +would be remove the whole thing and let someone else, hopefully +smarter, write a proper XML library. We say no documentation is better +than wrong documentation, so no XML library is better than a broken, +vulnerable library.

+

Another solution is to create binds to libxml2, which is a C library +that powers a lot of other languages XML needs. This would mean that +the standard library would require external tools to properly build, +though.

+

Personally, with all that is going on with the language, using it for +any half-serious (or higher) project is completely stupid.

+

PS: Just after I posted this, someone send me an announcement from the +go team about a new release fixing a vulnerability in the stdlib "ssh" +library. Again, anything that is at least half-serious shouldn't use +go.

+ +
+ + + + +
+ + + + diff --git a/public/links/google-illegaly-spying-workers/index.html b/public/links/google-illegaly-spying-workers/index.html new file mode 100644 index 0000000..3e509e0 --- /dev/null +++ b/public/links/google-illegaly-spying-workers/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Google illegally spied on workers before firing them, US labor board alleges

+ +

TheVerge posted some news about Google Firing +Workers +based on information from a company they hired to spy their own workers.

+ +

I mean, that's nothing new: the "Do no evil" motto is long gone, and we see, +every day, Google threating their users like cattle for profit. But now we see +more and more news about Google trying to stop their own workers on getting a +proper working environment.

+

Sadly, this is not the only one: We knew something was wrong way long, when in +2018 a group of workers had to make a public walkout in protest to the way +Google were dealing with sexual misconduct and forced arbitration -- something +that made Andy Rubin, author of Android, being "fired" from the company. From +there, everything needs to find its way to the news, otherwise it just hid +under the hug.

+

The fact that Google is pushing to spying their own workers show how bad the +environment is there.

+

Before I go into a long rant about the continuous noticing of those events, I +need to make a request: STOP USING GOOGLE PRODUCTS. When you use, you are +basically telling them it's ok to continue doing it so.

+ +
+ + + + +
+ + + + diff --git a/public/links/google-slams-microsoft/index.html b/public/links/google-slams-microsoft/index.html new file mode 100644 index 0000000..40301bb --- /dev/null +++ b/public/links/google-slams-microsoft/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Google slams Microsoft for trying 'to break the way the open web works'

+ +

Weird are the times when Google, trying to break the web, accuses Microsoft of +doing it so.

+ +

Ok, let's put this in perspective:

+ +

And that's, ladies and gentlemen, is when Microsoft jumped in. By siding with +the news corporations and saying "Hey, if Google Search won't work more in +Australia, you can be sure Bing will work". And that's when Google, being +Google, said "You're trying to break the open web!"

+

Give me a fucking break, Google. You broke the open web years ago and now is +calling everyone else what you did. And I don't mean this as a supporter of +Microsoft -- which I'm not --, a supporter of the Australian government -- which +I'm not -- or a supporter of big news corporations -- which, guess what, I'm +not.

+

The sooner Google disappears from the internet, the better for everyone else.

+ +
+ + + + +
+ + + + diff --git a/public/links/index.html b/public/links/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/links/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/links/mitigating-memory-safety-issues-in-oss/index.html b/public/links/mitigating-memory-safety-issues-in-oss/index.html new file mode 100644 index 0000000..89d14b3 --- /dev/null +++ b/public/links/mitigating-memory-safety-issues-in-oss/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Mitigating Memory Safety Issues in Open Source Software

+ +

Initially announced on HackerNews as "Google to Pay Developers to Port Their Code +to Rust" on this +post, +what is actually going on is not quite what it seems.

+

And it seems this time HackerNews comments actually got what it actually +means.

+ +

But let me surmise this.

+

First of all, the funding is not going to open source developers so they can +secure their applications, or look for alternatives that seem more +secure. Google will fund another company -- ISRG -- for them to write new +versions of some code. So, even if the idea is pretty good, it won't translate +into offering help to the authors so they could still work on their project; the +money will all go to someone else, to provide patches.

+

This "someone will provide patches" always remind me of a talk by Brett Cannon +on a DjangoCon. "You see this little puppy, so cute, but what I see is 10 years +of walks, giving food and picking its crap."1 So, while ISRG will provide +patches for improving open source projects using memory safe languages, there is +no word about "and continue to make things work". Sure it is nice to have a +safety patch in some other language landing in your project, but who will take +care of it in the next version? And the next one? ISRG or the original author -- +whose, again, got absolutely nothing in the first place?

+

Second, there is this line:

+
+

The ISRG's approach of working directly with maintainers to support rewriting +tools and libraries incrementally falls directly in line with our perspective +here at Google.

+
+

What feels strange about it is that we know, for a long time, that Google does +not work for the common good; it works for itself (and that's ok for the +company). But what if the secure way of some project does not fall in the exact +"perspective" of Google? Will they fork it? Accept that their perspective isn't +the right way?

+

For example, recently Cryptography replaced a core element to use Rust -- which +totally makes sense in a secure project. The problem is that some people, using +some non-mainstream architectures, saw their builds +failing. Now, again, it makes +sense for something that enforces security to use a memory safe language, but +what that was the proposed solution by ISRG -- which, again, aligns with the +perspective of Google -- and the author decided that portability is more +important?

+

In the end, it feels like Goog is trying another way to take hold on open source +projects for their own purposes and not actually caring about helping end users +to have a better internet experience.

+
+
1 +

Paraphrased, I can't really recall the actual quote.

+
+ +
+ + + + +
+ + + + diff --git a/public/links/plausible-agpl/index.html b/public/links/plausible-agpl/index.html new file mode 100644 index 0000000..03a811a --- /dev/null +++ b/public/links/plausible-agpl/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented link: Open source licensing and why we're changing Plausible to the AGPL license

+ +

Plausible is a competitor for Google Analytics, without the need of exposing +your visitors data to some company. And recently they changed their license to +AGPL, where they explain why.

+ +

But while I admit that I'm not a fan of the tone of "COMPANIES WILL STEAL YOUR +CODE!", there is another point one must think: What if someone acts as a +gateway of your project to some users? Will they ever know there is someone +else working on it? What about improvements? Don't you want people using your +product to get the best experience?

+

Sure, you can ignore these problems and just don't care about what people do. +What if a company takes your work and get some money from it? You don't care. +Ok. But this gives me the impression that you don't care about what you did. +You don't care about your product. If you don't care, why should I? Why should +I care about you, in the first place?

+

(Ok, I know: I'm being mean. Whatever.)

+

But that's the thing, isn't it? I mean, I wrote some software. I like it. It +solves my problem. I expect people to like it too. I just don't want a faceless +entity to come around, pick my software, do some changes and lock their users +into their system -- something that I, inadvertently, helped build. I locked +people into some product that they have no idea they could just move their data +out of it.

+

"Not everybody can program, so who cares?" Yes, not everybody can pick whatever +script in Python or Rust or C or Java I wrote and change to make it fit their +needs -- heck, think about someone wanting to making a change in Firefox. But +everybody knows someone that can program. They can ask that person to change +that. They can pay that person to change the program to fit their needs. But, +for that, they need to have access to the code. If the faceless entity picks +the code, makes changes, lock people and my license doesn't prevent them from +doing it so, I'm part of the problem.

+

No size fits all in software. We can fit a large number of people, but not all. +But we can give the tools to let people make it fit their size.

+ +
+ + + + +
+ + + + diff --git a/public/links/programming-sucks/index.html b/public/links/programming-sucks/index.html new file mode 100644 index 0000000..1e0ed5a --- /dev/null +++ b/public/links/programming-sucks/index.html @@ -0,0 +1,90 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Programming Sucks

+ +

This is not my usual sharing, 'cause I usually share serious stuff ('cause, you +know, I do serious business), but this is seriously funny take on the problems +of programming

+ +

And I don't mean "problems" as "some application crashes" or "big company says +they are cool, but they are a terrible thing and just wants to destroy the +world for profit", but serious in "why the damn application is crashing", in a +non-programmer explanation way.

+

Oh, and if you think the metaphors are a bit too much... they are not.

+ +
+ + + + +
+ + + + diff --git a/public/links/whatsapp-giving-more-time-for-our-recent-update/index.html b/public/links/whatsapp-giving-more-time-for-our-recent-update/index.html new file mode 100644 index 0000000..a6b76b5 --- /dev/null +++ b/public/links/whatsapp-giving-more-time-for-our-recent-update/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Commented Link: Giving More Time For Our Recent Update

+ +

WhatsApp recently decided to change the way they allow people using their +platform, allowing Facebook to collect information. But the backlash was a bit +too much and now they are... erm... giving more time for you to accept +it. But some +things really don't pan out.

+ +

First of all, the next paragraphs may be the result of bad PR, but the fact is: +Some things don't look good.

+

For example, they mention that people are "confused" and that there is "a lot +of misinformation" floating around. But what points are people confused about? +What misinformation is being spread and what is real? Those two point are not +pointed out, so you don't know what is real and what is not.

+

And there isn't a single word about "change". They are not changing the wording +on their update to clear the confusing, they are not changing the update +itself. Get used to it. Accept or get out.

+

But, then again, that could be simply bad PR. No idea on what to do, no +experience in this kind of communication problem, so not a single word that +could give security that those changes are not what they seem.

+

But let me take this a bit deeper: WhatsApp is constantly reassuring that +end-to-end encryption will not change, even when you communicate with business. +The post points to their FAQ, with a link that says they are providing "more +options", but the FAQ itself shows that those are not options: It shows things +that will happen. If there is no selection to get out/disable these things, +it is no option at all.

+

And even if the conversation is end-to-end encrypted, there is no word about +metadata. Metadata is important 'cause it tells a lot without saying exactly +what. For example, in a end-to-end encrypted conversation, nobody can see what +I discussed with my (non-existent) wife, but the metadata says that our +location is not the same for a while (they don't capture your location, but a +lot can be said with your IP), there was a long discussion between us ('cause, +again, characters and number of messages is pure metadata, not the data itself) +and, for some reason, after this talk, I opened another talk with someone whose +Facebook profile says it is a Divorce Lawyer. But no, your data is safe.

+

Why this is a problem? One of the changes in this update is that "some +information may be shared with third-parties" and you can be sure that one of +those "third-parties" is Facebook -- although this is not troubling yet. But +imagine that I use WhatsApp to talk with my favorite vegan pizza place. Again, +metadata is shared between WhatsApp and Facebook, and now Facebook, collecting +my profile, knows that I like vegan pizza. And now there is another data point +on it. While this is not bad for me, it is bad for the vegan pizza place, +'cause I'll start getting pizza ads on my Facebook feed. This basically means +that business using WhatsApp business are shooting themselves in the foot.

+

Also, the wording in their "Shared With Facebook FAQ" (which is another link +away) says that business may use Facebook infrastructure to provide receipts +and chatting. But this could still be end-to-end encrypted, so there was no +change at all: Facebook would be simply a service provider for storing that +information. If instead of Facebook, WhatsApp decided to use AWS infrastruture, +there would be a change in their privacy terms?

+

I'm not saying that this change looks like a huge breach in our already eroded +privacy, but from 10.000 feet view, it looks like something is bad.

+ +
+ + + + +
+ + + + diff --git a/public/page/1/index.html b/public/page/1/index.html new file mode 100644 index 0000000..3140153 --- /dev/null +++ b/public/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/public/page/10/index.html b/public/page/10/index.html new file mode 100644 index 0000000..03d29a8 --- /dev/null +++ b/public/page/10/index.html @@ -0,0 +1,529 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Commented Links for 2020-07-26 + +

+ + +
+

Datomic Internals, Developer Advice, Racism@Google, Logging, Code To Delete, +Being a Product Manager, Syntax Highlight, Rust Module System.

+ +
+ + Read more... + +
+ +
+

+ + Introducing Elixir: Getting Started in Functional Programming - Simon St.Laurent, J. David Eisenberg + +

+ + +
+

GoodReads Summary: +Authors Simon St. Laurent and J. David Eisenberg show you how to write simple +Elixir programs by teaching you one skill at a time. You'll learn about +pattern matching, recursion, message passing, process-oriented programming, +and establishing pathways for data rather than telling it where to go. By the +end of your journey, you'll understand why Elixir is ideal for concurrency and +resilience.

+ +
+ + Read more... + +
+ +
+

+ + How to Kill Developer Productivity + +

+ + +
+

There are several ways to not kill developer productivity in a project. +Unfortunately, the real causes are never discussed.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-07-19 + +

+ + +
+

Building Executables Unix Way, Really Used Data Structures and Algorithms, Zig +Foundation, Rust on Linux, Bad AI, Git Ignore, What is CI and CD.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-07-12 + +

+ + +
+

Erlang by Example, Accessibility, Good StackOverflow Answers, Testing, +Flexbox, HTTP Server in C, Icecream Affecting Cars.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-07-06 + +

+ + +
+

Reddit and LinkedIn Apps Capturing iOS Clipboard, Python Library for Pretty +Terminal Apps, Zola Workflow, Modern Pascal, Bash Test Framework, Dependency +Manager for Python, C Quirks.

+ +
+ + Read more... + +
+ +
+

+ + 21st Century Robot: The Dr. Simon Egerton Stories - Brian David Johnson + +

+ + +
+

GoodReads Summary: +When companies develop a new technology, do they ask how it might affect the +people who will actually use it? That, more or less, sums up Brian David +Johnson's duties as Intel's futurist-in-residence. In this fascinating book, +Johnson provides a collection of science fiction prototyping stories that +attempt to answer the question.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-07-03 + +

+ + +
+

Rust Async and Tide, Github Redesign, Apple Declining Web APIs, Fira Font, +Runbooks, Zig Async.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-06-21 + +

+ + +
+

Google Lawsuit for Ignoring Incognito Mode, Chrome Exploit in the Wild, +Benchmarking HTTP/1.1 and HTTP/2.0, Creating Tables in C++, Understanding +Emacs, Open Source Licenses, Builder Pattern in Rust, Why Leave Medium.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-06-20 + +

+ + +
+

SIGSEGV, ActivityPub Conf, Git Branch Names, Rust Ecosystem, Learning Rust +with CLI, Design Problems, SCP.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/11/index.html b/public/page/11/index.html new file mode 100644 index 0000000..fd472e5 --- /dev/null +++ b/public/page/11/index.html @@ -0,0 +1,558 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + In Fury Born - David Weber + +

+ + +
+

GoodReads Summary: +Imperial Intelligence couldn't find them, the Imperial Fleet couldn't catch +them, and local defenses couldn't stop them. It seemed the planet-wrecking +pirates were invincible. But they made a big mistake when they raided +ex-commando leader Alicia DeVries' quiet home work, tortured and murdered her +family, and then left her for dead. Alicia decided to turn "pirate" herself, +and stole a cutting-edge AI ship from the Empire to start her vendetta. Her +fellow veterans think she's gone crazy, the Imperial Fleet has shoot-on-sight +orders. And of course the pirates want her dead, too. But Alicia DeVries has +two allies nobody knows about, allies as implacable as she is: a self-aware +computer, and a creature from the mists of Old Earth's most ancient legends. +And this trio of furies won't rest until vengeance is served.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-06-18 + +

+ + +
+

Commit Messages (again), Ansible, CLI Names, Feature Flags, Rust Binary Sizes, +Mongo with Rust, Command Line Task Manager.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-06-11 + +

+ + +
+

Infrastructure as (Python) Code, Pong in Elm, Alan Kay and Objects, Paywalls, +Brave, Note Taking, Rust From Scratch, Writing, 51 Concepts You Should Know, +MAD in CSS, Magic Algorithms.

+ +
+ + Read more... + +
+ +
+

+ + Python Losing the 2nd Place on Loved Languages: A Thought + +

+ + +
+

On this year StackOverflow Survey, Python lost its 2nd place in the "Most +Loved Languages" ranking to TypeScript. On our Python group, people started +wondering why. And I just thought it would be nice to post my thoughts on +the situation.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-06-03 + +

+ + +
+

Scotty, Pyramid and Cornice, Problems with datetime.now(), Mercurial and +Python 3, Fast Python, Async Python Request Library, Online Advertising, +Google and Web.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-06-01 + +

+ + +
+

Distributed Systems, C in Rust, Protecting Projects, No Code, Android, +Research Blog, Contact Tracing and Privacy (again).

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-31 + +

+ + +
+

Running Things in Python, Emacs, Everything That Can Go Wrong, Why We Believe +that Rewrites Go Right, Copyleft, Analogies for Technical Debt, Leading +Projects, Microservices in Rust, Cities as Roads, Complaining about Stallman.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-29 + +

+ + +
+

Spotify Around the Globe, Git Commit Messages, Airflow, Emacs Bindings, +Contributing to Open Source Rust Style, Self-Hosted Git Repos, Vim Wiki, Don't +Use Medium, StackOverflow Survey Results, Problems With StackOverflow Survey.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-26 + +

+ + +
+

GNU Recutils, Tips on Git, Simple COBOL Code, Paying for Open Source, +Contributing to Open Source, Dealing With Boring Stuff, Accessibility, 12 Not +So Great Steps For Great Code, Culture Tests, Microsoft Marketing.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-25 + +

+ + +
+

Owning Your Data, Latency in Async Python, eBay Port Scanning, Rust Macros, +Rust Tests, Rust Project Organization, Going Remote, Shapes of Code, Public +Domain vs Copyright, Libre vs Open.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/12/index.html b/public/page/12/index.html new file mode 100644 index 0000000..85679d5 --- /dev/null +++ b/public/page/12/index.html @@ -0,0 +1,620 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Links for 2020-05-24 + +

+ + +
+

Rust Unix Commands, Learning Rust (yes, again), Zuckerberg, Facebook and +Working Remotely, Open Source in European University, Open Source Your Shitty +Library, Writing Documentation, Open Source Culture War, Building Applications +With No Invalid State, Show How You Solve Problems, Pull Requests, Dokuwiki, +Things Wrong With Rust, Unofficial APIs, Selling Yourself, Dark Patterns, +Picking Licenses, ZShell Tricks, Global Git Ignore, Internal Monologues, +DevOps Lessons, Mocking in Rust.

+ +
+ + Read more... + +
+ +
+

+ + The 7 Secrets of Exceptional Leadership - Brian Tracy + +

+ + +
+

GoodReads Summary: +In The Seven Secrets of Exceptional Leadership Brian describes the most +important leadership qualities practiced by top leaders worldwide. By +committing yourself to these seven "secrets" of exceptional leadership, you +can achieve all your goals as a leader in every area of your life.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-16 + +

+ + +
+

Gleam, Java From a Python View, Code Images, UNIX TypeSetting Tools, History +of VIM, Writing Documentation, Fighting COVID with Porn, Thinking Beyond +Problems, A Metronome, Diagrams in Python, React Native for Windows (and Mac), +Secrets in Python Bytecodes, Word Generator NeuralNet, Firebase Blunders, +Standups, Sharing as a Dev, Material Design.

+ +
+ + Read more... + +
+ +
+

+ + Fledgling - Sharon Lee, Steve Miller + +

+ + +
+

GoodReads Summary: +Theo Waitley has lived all her young life on Delgado, a Safe World that is +home to one of the galaxy's premier institutions of higher learning. Both +Theo's mother, Kamele, and Kamele's onagrata Jen Sar Kiladi, are professors at +the university, and they all live comfortably together, just like they have +for all of Theo's life, in Jen Sar's house at the outskirts of town.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-11 + +

+ + +
+

iPad Mouse, Organizing Events, Website Privacy Concerns, Careful With Whom You +Work For (Like Tim Bray), Deleting Online Accounts Howto, Reducing Rust +Binaries, History of systemd, Reopening The Economy.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-07 + +

+ + +
+

The difference between Epoll and IO-URing and how it related to async apps and +things announced on Github Satellite.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-03 + +

+ + +
+

Data-Oriented Designs, Clean Air on Europe, A Playbook for Managers, Rules for +1x Developer, Rust/WinRT, Rust+Wasm for Kublets, Tmux, Cost of JavaScript, +Storage Systems, Awk.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-05-02 + +

+ + +
+

Slack vs IRC, Forking Across Computers, AGCT, Stoicism, User Data Security.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-30 + +

+ + +
+

Event Driven Architectures, Shell Scripts, Rust Dynamic Dispatch, Actix and +Diesel, CLI Slides, Making Presentations, Runbooks.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-29 + +

+ + +
+

Python 3.9, A Nice Top in Pure Bash, Rewriting a Legacy System, Programming +Tribes, Feature Factory, Python Function Overload, Clean Git Branches, +Journaling for Devs, What Programming Is, Caches, GNOME Screen Recording, +Requirements, VIM Password Manager, Google AdSense Ransom.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/13/index.html b/public/page/13/index.html new file mode 100644 index 0000000..09d4959 --- /dev/null +++ b/public/page/13/index.html @@ -0,0 +1,557 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Rust In Action - T.S. McNamara + +

+ + +
+

GoodReads Summary: +Rust in Action introduces the Rust programming language by exploring numerous +systems programming concepts and techniques. You'll be learning Rust by delving +into how computers work under the hood. You'll find yourself playing with +persistent storage, memory, networking and even tinkering with CPU +instructions. The book takes you through using Rust to extend other +applications and teaches you tricks to write blindingly fast code. You'll also +discover parallel and concurrent programming. Filled to the brim with +real-life use-cases and scenarios, you'll go beyond the Rust syntax and see +what Rust has to offer in real-world use cases.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-27 + +

+ + +
+

Facebook Screwing Contractors, Hire Juniors, Tips on Work-From-Home, Managing +Remote Teams, Generating Rust Tests, Tiling on GNOME Shell, WebKIT Energy +Consumption, Looking for Work, Don't Defend Bugs

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-26 + +

+ + +
+

Memory Options for JVM, Rust Note-Taking WebApp, Contributing to Rust, COBOL, +Probably New Chips for MacBooks.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-25 + +

+ + +
+

Extracting PDF Data, Rust Adoption, Rust Search, Debugging Bash Scripts, +Mocked HTTP Servers in Rust, CLI Kanban, COVID Lockdown, Rust Survey, TIL.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-24 + +

+ + +
+

Understanding Databases, Studio Ghibli Wallpapers, Creative Commons, The Good +Side of COVID, Contact Tracing, Corotines in Python, Facebook, Privacy +Paradox, Writing.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-23 + +

+ + +
+

Google, Commit Messages, Microservices, How Rust Sees Memory, More About +Tests, Asciiflow in VS Code, Does Rust Change Too Much?, Linux Laptop.

+ +
+ + Read more... + +
+ +
+

+ + Link for 2020-04-22 + +

+ + +
+

Valuable Dev Principles, Terms and Conditions for Stealing Ideas, Google +"Privacy", Google Biased AI, Pandoc for Books, YAML, Oaths, Amazon, DI in +Rust.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-21 + +

+ + +
+

Visualizing You Docker Compose, MongoDB vs PostgreSQL, Assignment Statement, +How to Understand Systems, Learning Haskell, Losing Your YouTube Account, IDEs +For Students

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-20 + +

+ + +
+

Async C, DDD + Django, From Org-Mode to Blog, Optimizable Code, Writing +Technical Specs, Apple and Amazon, Zoom and Meetings.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-04-19 + +

+ + +
+

Managing Nested Data in MySQL, The Commons Clause License, Clojure, A Look +into Compilers, No <> to Generics, Configuration Files, Zoom Fiasco, Rust +CLI tools, SEO.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/14/index.html b/public/page/14/index.html new file mode 100644 index 0000000..3253182 --- /dev/null +++ b/public/page/14/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Microservices: Chassis + +

+ + +
+

The chassis for a microservices fleet is defined as the libraries and +frameworks that one should use when creating a new microservice.

+ +
+ + Read more... + +
+ +
+

+ + You Don't Need range() + +

+ + +
+

Beginners in Python tend to use range() for iterating over lists. This is +not really necessary.

+ +
+ + Read more... + +
+ +
+

+ + Fulgrim - Graham McNeill + +

+ + +
+

GoodReads Summary +It is the 31st millennium, and humanity is at the peak of its powers. As the +Great Crusade, led by Warmaster Horus, continues to conquer the galaxy, +Fulgrim, Primarch of the Emperor’s Children, leads his warriors into battle +against a vile alien foe. From the blood of this campaign are sown the seeds +that will lead this proud Legion to treachery, taking them down the darkest of +paths of corruption. Leading up to the carnage of the Dropsite Massacre on +Isstvan V, this is the tale of Fulgrim's tragic fall from grace.

+ +
+ + Read more... + +
+ +
+

+ + Ansible: From Beginner to Pro - Michael Heap + +

+ + +
+

GoodReads Summary: +This book is your concise guide to Ansible, the simple way to automate apps +and IT infrastructure. In less than 250 pages, this book takes you from +knowing nothing about configuration management to understanding how to use +Ansible in a professional setting.

+ +
+ + Read more... + +
+ +
+

+ + Mothers & Other Monsters: Stories - Maureen F. McHugh + +

+ + +
+

GoodReads Summary: +In her debut collection, Maureen F. McHugh examines the impacts of social and +technological shifts on families. Using deceptively simple prose, she +illuminates the relationship between parents and children and the expected and +unexpected chasms that open between generations.

+ +
+ + Read more... + +
+ +
+

+ + 97 Things Every Programmer Should Know: Collective Wisdom from the Experts - Kevlin Henney + +

+ + +
+

GoodReads Summary: +Tap into the wisdom of experts to learn what every programmer should know, no +matter what language you use. With the 97 short and extremely useful tips for +programmers in this book, you'll expand your skills by adopting new approaches +to old problems, learning appropriate best practices, and honing your craft +through sound advice.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-16 + +

+ + +
+

Free DevOps Books, COVID-19 Vaccine Fight, License Writing Tool, Python +Cheatsheet, Erland LS, Unix Text Processing.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-13 + +

+ + +
+

AWS+Azure+GCP on Optimizing Benchmarks, Public Service in Germany Can't Be +Free, Fake Twitter Accounts, Automated Emails, Documenting Your Rust Code, +Tips on Working From Home.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-12 + +

+ + +
+

Netflix and the Hexagonal Architecture, logging, EOF, JS Frameworks, Emacs +Charts, Rust init Pattern, Software Engineers vs Technicians, Cancelling +Conferences How-To, A VIM Jump-to-Anything plugin.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-11 + +

+ + +
+

Google Policy towards AGPL software, Swift vs Rust, Open Source Economics, +JUnit 5, cfg(doctest), Firefox on Flathub.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/15/index.html b/public/page/15/index.html new file mode 100644 index 0000000..714d7ec --- /dev/null +++ b/public/page/15/index.html @@ -0,0 +1,498 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Geek Wisdom: The Sacred Teachings of Nerd Culture - Stephen H. Segal, N.K. Jemisin, Eric San Juan, Genevieve Valentine, Zaki Hasan + +

+ + +
+

GoodReads Summary: +Computer nerds are our titans of industry; comic-book superheroes are our +Hollywood idols; the Internet is our night on the town. Clearly, geeks know +something about life in the 21st century that other folks don’t—something we +all can learn from. Geek Wisdom takes as gospel some 200 of the most powerful +and oft-cited quotes from movies (“Where we’re going, we don’t need roads”), +television (“Now we know—and knowing is half the battle”), literature (“All +that is gold does not glitter”), games, science, the Internet, and more. Now +these beloved pearls of modern-day culture have been painstakingly interpreted +by a diverse team of hardcore nerds with their imaginations turned up to 11. +Yes, this collection of mini-essays is by, for, and about geeks—but it’s just +so surprisingly profound, the rest of us would have to be dorks not to read +it. So say we all.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-09 + +

+ + +
+

Generalists vs Specalists, Meds and Big Pharma Companies, Being Silly While +Washing Your Hands, Licensing and Copyrights, Torture in Movies, Badly +Anonymized Dataset Causes Melbourne Professor to Resign, Netlify Terms and +Telemetry, Packaging in Guix, Functional C#, UUIDs, Python Context Manager.

+ +
+ + Read more... + +
+ +
+

+ + Microservices AntiPatterns and Pitfalls - Mark Richards + +

+ + +
+

GoodReads Summary: +Remember when service-oriented architecture (SOA) was all the rage? Companies +jumped in before fully understanding SOA’s advantages and disadvantages, and +struggled to make this complex architecture work. Today, we’re poised to +repeat this same experience with microservices—only this time we’re prepared. +With this concise ebook, author Mark Richards walks you through the ten most +common microservice anti-patterns and pitfalls, and provides solutions for +avoiding them.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-06: Async Rust, Leadership, Firefox removing old cookies, X-Windows, Linux distributions, PC cases + +

+ + +
+

Interesting things going on the internet, 2020-03-06.

+ +
+ + Read more... + +
+ +
+

+ + How To Survive A Horror Movie - Seth Grahame-Smith + +

+ + +
+

GoodReads Summary: +From ghosts, vampires, and zombies to serial killers, cannibalistic +hillbillies, and haunted Japanese videocassettes, How to Survive a Horror +Movie shows how to defeat every obstacle found in scary films.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-05 + +

+ + +
+

Interesting links for 2020-03-05.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-04 + +

+ + +
+

Interesting links for 2020-03-04.

+ +
+ + Read more... + +
+ +
+

+ + Functional Reactive Programming - Stephen Blackheath, Anthony Jones + +

+ + +
+

GoodReads Summary +Functional Reactive Programming teaches the concepts and applications of FRP. +It begins with a careful walk-through of the FRP core operations and +introduces the concepts and techniques you'll need to use FRP in any language. +Following easy-to-understand examples, you'll learn both how to use FRP in +greenfield applications and how to refactor existing applications. Along the +way, the book introduces the basics of functional programming in a +just-in-time style, so you never learn anything before you need to use it. +When you're finished, you'll be able to use FRP to spend more time adding +features and less time fixing problems.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2020-03-03 + +

+ + +
+

Interesting links for 2020-03-03.

+ +
+ + Read more... + +
+ +
+

+ + Sharing Daily Links + +

+ + +
+

I'm changing the way I share links around the web.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/16/index.html b/public/page/16/index.html new file mode 100644 index 0000000..67584d9 --- /dev/null +++ b/public/page/16/index.html @@ -0,0 +1,481 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + 88 Days to Any Goal - Rolland Roberts + +

+ + +
+

GoodReads Summary: +No summary.

+ +
+ + Read more... + +
+ +
+

+ + Reactive Microservices Architecture - Jonas Bonér + +

+ + +
+

GoodReads Summary: +Still chugging along with a monolithic enterprise system that’s difficult to +scale and maintain, and even harder to understand? In this concise report, +Lightbend CTO Jonas Bonér explains why microservice-based architecture that +consists of small, independent services is far more flexible than the +traditional all-in-one systems that continue to dominate today’s enterprise +landscape.

+ +
+ + Read more... + +
+ +
+

+ + Christopher Walken A to Z: The Man, the Movies, the Legend - Robert Schnakenberg + +

+ + +
+

GoodReads Summary: +The Complete Guide To All Things Walken.

+ +
+ + Read more... + +
+ +
+

+ + Microservices: Where Is the Source of Truth? + +

+ + +
+

When we are talking about a system, there is one point that we need to discuss +where the "Source of Truth" of it is. In Monoliths, the source of truth is the +storage itself. But where does it sit in a system that is composed by multiple +parts?

+ +
+ + Read more... + +
+ +
+

+ + Code is a Book, Unit Tests are Spellcheckers + +

+ + +
+

If we use an analogy for code as being the words in a book and the system +being built as the whole book, then what are unit tests?

+ +
+ + Read more... + +
+ +
+

+ + Adult Stuff: Things You Need to Know to Win at Real Life - Robert Boesel, Matt Moore + +

+ + +
+

GoodReads Summary: +Sometimes your first steps into the "real world" send you falling flat on your +face. It's natural to be optimistic about new experiences, but most of us set +ourselves up only to be let down every time. And disappointment hurts like a +$%&*#.

+

News flash: You don't have to be an Einstein to survive adult life. You don't +even have to abandon your standards to get what you want. All you have to do +is keep your expectations realistic.

+ +
+ + Read more... + +
+ +
+

+ + The League of Regrettable Superheroes: Half-Baked Heroes from Comic Book History - Jon Morris + +

+ + +
+

GoodReads Summary: +You know about Batman, Superman, and Spiderman, but have you heard of Doll +Man, Doctor Hormone, or Spider Queen? In The League of Regrettable +Superheroes, you’ll meet one hundred of the strangest superheroes ever to see +print, complete with backstories, vintage art, and colorful commentary. So +prepare yourself for such not-ready-for-prime-time heroes as Bee Man (Batman, +but with bees), the Clown (circus-themed crimebuster), the Eye (a giant, +floating eyeball; just accept it), and many other oddballs and oddities. +Drawing on the entire history of the medium, The League of Regrettable +Superheroes will appeal to die-hard comics fans, casual comics readers, and +anyone who enjoys peering into the stranger corners of pop culture.

+ +
+ + Read more... + +
+ +
+

+ + Broetry Poetry for Dudes - Brian McGackin + +

+ + +
+

GoodReads Summary: +As contemporary poets sing the glories of birds, birch trees, and +menstruation, regular guys are left scratching their heads. Who can speak for +Everyman? Who will articulate his love for Xbox 360, for Mama Celeste's frozen +pizza, for the cinematic oeuvre of Bruce Willis?

+ +
+ + Read more... + +
+ +
+

+ + Employees Gone Wild: Crazy (and True!) Stories of Office Misbehavior, and What You Can Learn From the Mistakes of Others - Richard Burton + +

+ + +
+

GoodReads Summary: +Richard Burton has tales you won’t believe actually happened over his decades +spent as the attorney hired by companies to protect them when their employees +act out. Employees Gone Wild collects some of the most outrageous and +absolutely-true stories (names changed to protect the guilty of course) from +Burton’s years on the job, along with his indispensable practical advice on +how companies and the people that work for them can avoid the same pitfalls.

+ +
+ + Read more... + +
+ +
+

+ + K is for Knifeball: An Alphabet of Terrible Advice - Avery Monsen, Jory John + +

+ + +
+

GoodReads Summary: +From the authors of the breakout bestseller All my friends are dead. (more +than 175,000 copies sold) and in the humorous vein of Go the F**k to Sleep +comes a laugh-out-loud collection of bad advice that turns the children's +alphabet book on its head. Adorable illustrated characters lead readers down a +path of poor decision-making, and alphabetical, rhyming couplets offer +terrible life lessons in which O is for opening things with your teeth, F is +for setting Daddy's wallet on fire, and R is for Raccoon (but definitely not +for rabies). With plenty of playfully disastrous choices lurking around every +corner, this compendium of black humor may be terrible for actual children, +but it's perfect for the common-senseless child in all adults.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/17/index.html b/public/page/17/index.html new file mode 100644 index 0000000..2079f85 --- /dev/null +++ b/public/page/17/index.html @@ -0,0 +1,430 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Creating Interfaces with Bulma - Jeremy Thomas, Oleksii Potiekhin, Mikko Lauhakari, Aslam Shah, Dave Berning + +

+ + +
+

GoodReads Summary: +This book is a step-by-step guide that will teach how to build a web interface +from scratch using Bulma.

+ +
+ + Read more... + +
+ +
+

+ + The Flight of the Eisenstein - James Swallow + +

+ + +
+

GoodReads Summary: +Having witnessed the events on Istvaan III, Deathguard Captain Garro seizes a +ship and heads to Terra to warn the Emperor of Horus's treachery. But the +fleeing Eisenstein is damaged by enemy fire, and becomes stranded in the warp. +Can Garro and his men survive the depredations of Chaos and get his warning to +Terra in time?

+ +
+ + Read more... + +
+ +
+

+ + Reveries About Testing + +

+ + +
+

Today, a large number of developers use some testing methodology. But what are +tests? What are they for? What is the purpose of writing testes, anyway? Are +we testing the right things?

+ +
+ + Read more... + +
+ +
+

+ + The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win - Gene Kim, Kevin Behr, George Spafford + +

+ + +
+

GoodReads Summary: +In a fast-paced and entertaining style, three luminaries of the DevOps +movement deliver a story that anyone who works in IT will recognize. Readers +will not only learn how to improve their own IT organizations, they'll never +view IT the same way again.

+ +
+ + Read more... + +
+ +
+

+ + Self-Healing Microservices + +

+ + +
+

All the previous +discussions I bought about +microservices was just a prelude to something I still don't have a fixed +solution: how do microservices "heal" themselves in case of missing data?

+ +
+ + Read more... + +
+ +
+

+ + My 2019 Review + +

+ + +
+

This year, I decided to make some review of what happened last year, to me.

+ +
+ + Read more... + +
+ +
+

+ + Microservices: Artifact Ejection + +

+ + +
+

As I was discussing about artifacts in +microservices, I guess I forgot to +discuss some important point: How those artifacts are "ejected" from the +microservice?

+ +
+ + Read more... + +
+ +
+

+ + Ad Astra - Jack Campbell + +

+ + +
+

GoodReads Summary: +In Jack Campbell’s New York Times bestselling Lost Fleet series, Campbell’s +hero Captain Black Jack Geary explores the furthest reaches of space. Here, +Campbell explores what kinds of problems mankind might face as our horizons +expand. The third in a series of collections of Campbell’s short stories +includes some of Campbell’s favorite stories, and some of his earliest. A +brand new author’s note accompanies each story.

+ +
+ + Read more... + +
+ +
+

+ + Microservices: Artifact = Input + State + +

+ + +
+

Designing microservices is a bit complicated because you have to think about +different things when deciding which "domain" it will occupy. A recent +discussion with coworkers about our current microservices design led me to +rethink how to think about microservices.

+ +
+ + Read more... + +
+ +
+

+ + Mastering Docker - Russ McKendrick + +

+ + +
+

GoodReads Summary: +Experience first- and third-party tools such as Docker Compose, Docker +Machine, Portainer, and Rancher Learn how to leverage Kubernetes, Amazon ECS, +and Docker Swarm and know when each solution is appropriate Discover how +Docker can be integrated into your daily workflows.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/18/index.html b/public/page/18/index.html new file mode 100644 index 0000000..1e3eb61 --- /dev/null +++ b/public/page/18/index.html @@ -0,0 +1,461 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + One Day On Mars - Travis S. Taylor + +

+ + +
+

GoodReads Summary: +A nonstop futuristic thrill-ride, through the critical events which were the +breaking point for the underclass of Martian citizens and precipitated a +revolution to break the Martian colonists free from the formidable Sol System +government. The formerly red planet—now in danger of again becoming red, blood +red—would never be the same, nor would the human race.

+ +
+ + Read more... + +
+ +
+

+ + 301 Smart Answers To Though Interview Questions - Vicky Oliver + +

+ + +
+

GoodReads Summary: +In today's job market, how you perform in an interview can make or break your +hiring possibilities. If you want to stand a head above the rest of the pack, +301 Smart Answers to Tough Interview Questions is the definitive guide you need +to the real, and sometimes quirky, questions employers are using to weed out +candidates.

+ +
+ + Read more... + +
+ +
+

+ + Galaxy in Flames, Ben Counter + +

+ + +
+

GoodReads Summary: +Having recovered from his grievous injuries, Warmaster Horus leads the +triumphant Imperial forces against the rebel world of Isstvan III. Though the +rebels are swiftly crushed, Horus's treachery is finally revealed when the +planet is razed by virus bombs and Space Marines turn on their battle-brothers +in the most bitter struggle imaginable.

+ +
+ + Read more... + +
+ +
+

+ + Mastering Emacs, Mickey Petersen + +

+ + +
+

GoodReads summary: +Learn Emacs from the ground up. In the Mastering Emacs ebook you will learn +the answers to all the concepts that take weeks, months or even years to truly +learn, all in one place.

+ +
+ + Read more... + +
+ +
+

+ + Horus Rising - Dan Abnett + +

+ + +
+

Goodreads Summary: +After thousands of years of expansion and conquest, the imperium of man is at +its height. His dream for humanity nearly accomplished, the emperor hands over +the reins of power to his warmaster, Horus, and heads back to Terra. But is +Horus strong enough to control his fellow commanders and continue the +emperor's grand design?

+ +
+ + Read more... + +
+ +
+

+ + Microservice Patterns - Chris Richardson + +

+ + +
+

GoodReads summary: +Microservice Patterns teaches enterprise developers and architects how to +build applications with the microservice architecture. Rather than simply +advocating for the use the microservice architecture, this clearly-written +guide takes a balanced, pragmatic approach. You'll discover that the +microservice architecture is not a silver bullet and has both benefits and +drawbacks. Along the way, you'll learn a pattern language that will enable you +to solve the issues that arise when using the microservice architecture. This +book also teaches you how to refactor a monolithic application to a +microservice architecture.

+ +
+ + Read more... + +
+ +
+

+ + Why Rust and not Go + +

+ +
+ +
+

+ + Chthon - Piers Anthony + +

+ + +
+

Goodreads Summary: +Chthon was Piers Anthony’s first published novel in 1967, written over the +course of seven years. He started it when he was in the US Army, so it has a +long prison sequence that is reminiscent of that experience, being dark and +grim. It features Aton Five, a space man who commits the crime of falling in +love with the dangerous, alluring Minionette and is therefore condemned to +death in the subterranean prison of Chthon. It uses flashbacks to show how he +came to know the Minionette, and flash-forwards to show how he dealt with her +after his escape from prison. The author regards this as perhaps the most +intricately structured novel the science fantasy genre has seen. It was a +contender for awards, but not a winner.

+ +
+ + Read more... + +
+ +
+

+ + Pro Vim - Mark McDonnell + +

+ + +
+

GoodReads link: (No +summary exists).

+ +
+ + Read more... + +
+ +
+

+ + Dragon's Winter - Elizabeth A. Lynn + +

+ + +
+

Goodreads Summary: +Karadur and Tenjiro are twin sons of Kojiro Antani, the dragon lord of Ippa. +But only Karadur, whose name means "fire-bringer," bears the blood of the +dragon in his veins. His younger brother, Tenjiro or "Heaven's hope," was +second out of the womb and is the weakest and smallest of the two. As the +twins grow to maturity, Karadur is anxious to attain the promise of his blood +and transform into the dragon he is capable of becoming. But Tenjiro, who +bears the scars of Karadur's claws, resents his older brother and, on the eve +of Karadur's transformation, steals the talisman that makes the change +possible. That same night he disappears, fleeing to a distant, icy realm where +he will reemerge as a powerful wizard bent on destroying his older brother. +But Karadur, lord of Dragon Keep, is prepared to go to war against Tenjiro, +and it's likely only one will survive. --Craig Engler (less)

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/19/index.html b/public/page/19/index.html new file mode 100644 index 0000000..3869e87 --- /dev/null +++ b/public/page/19/index.html @@ -0,0 +1,405 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Microservices In Action - Morgan Bruce + +

+ + +
+

GoodReads summary: +Microservices in Action is a practical book about building and deploying +microservice-based applications. Written for developers and architects with a +solid grasp of service-oriented development, it tackles the challenge of +putting microservices into production. You'll begin with an in-depth overview +of microservice design principles, building on your knowledge of traditional +systems. Then, you'll start creating a reliable road to production. You'll +explore examples using Kubernetes, Docker, and Google Container Engine as you +learn to build clusters and maintain them after deployment. Throughout this +rich, experience-driven book, you'll move through real-world use cases +including a continuous delivery pipeline, production monitoring, and practical +techniques for scaling and maintaining a healthy system.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Don't Defend Bad Code + +

+ + +
+

Bad code exists everywhere. You shouldn't defend it, even if it is your own +code.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Global Changes Must Be Discussed With The Whole Team First + +

+ + +
+

So you got tired of bad tests and decided it is a good idea to add some fuzz +testing tool. Before you do add it in +the main branch, you have to discuss it with your team.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Be Transparent With The User + +

+ + +
+

Since we are talking about logging, +another thing you must do is to be transparent with the user in your user +interface.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - One Version To Add, One Version To Remove + +

+ + +
+

A lot of things change during development. One day you need a field, another +day that field may be completely different. For those cases, use one version +to add the new field and another to remove.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Git-Flow Is The Way To Go + +

+ + +
+

If Gerrit is such a mistake, what can you use +instead? Git Flow!

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Own Your Shit + +

+ + +
+

When I said "Scala is garbage" or "Gerrit is a mistake", it wasn't "l33th4x0r" +who said that; it was Julio Biason. 'Cause I do believe that putting your face +to be slapped is the way we grow.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Gerrit Is A Mistake + +

+ + +
+

I hate calling software "a mistake", but I can't find any other way to +describe Gerrit. You may see people using Gerrit 'cause Google uses it. The +thing is: Google misunderstood what Git actually is.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Nothing More Permanent Than A Temporary Solution + +

+ + +
+

Depending on where you look, "Nothing more permanent than a temporary +solution" is either an old Russian proverb or a quote by Milton Friedman. +Thing is, temporary solutions, unless you think about the future to fix them, +will become permanent.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - You Always Have The Time + +

+ + +
+

You may think "Alright, I have a list of things I don't know, but I have no +time to learn those things!" You do have time.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/2/index.html b/public/page/2/index.html new file mode 100644 index 0000000..e526012 --- /dev/null +++ b/public/page/2/index.html @@ -0,0 +1,420 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + I Redid My NeoVim Configuration + +

+ + +
+

For some obscure reason, my NeoVim install decided it didn't want to +display LSP warnings anymore. So I redid the whole configuration.

+ +
+ + Read more... + +
+ +
+

+ + Decoding the FAST Protocol: Examples + +

+ + +
+

After the whole explanation about the definition of the FAST protocol, I +noticed there was something missing: Examples, to make things easier to +understand.

+ +
+ + Read more... + +
+ +
+

+ + Decoding the FAST Protocol + +

+ + +
+

Recently I have to work with a FAST (FIX Adapted for Streaming) and because the +documentation is scattered around, I decided to put the things I discovered in a +single place for (my own) future reference.

+ +
+ + Read more... + +
+ +
+

+ + Learning Concurrency in Python - Elliot Forbes + +

+ + +
+

GoodReads Summary: +Practically and deeply understand concurrency in Python to write efficient +programs.

+ +
+ + Read more... + +
+ +
+

+ + Live Free or Die - John Ringo + +

+ + +
+

GoodReads +Summary: When +aliens trundled a gate to other worlds into the solar system, the world reacted +with awe, hope and fear. But the first aliens to come through, the Glatun, were +peaceful traders and the world breathed a sigh of relief. When the Horvath came +through, they announced their ownership by dropping rocks on three cities and +gutting them. Since then, they've held Terra as their own personal fiefdom. With +their control of the orbitals, there's no way to win and earth's governments +have accepted the status quo.

+ +
+ + Read more... + +
+ +
+

+ + In Calabria - Peter S. Beagle + +

+ + +
+

OpenLibrary Summary: +"Claudio Bianchi has lived alone for many years on a hillside in Southern +Italy's scenic Calabria. Set in his ways and suspicious of outsiders, Claudio +has always resisted change, preferring farming and writing poetry. But one +chilly morning, as though from a dream, an impossible visitor appears at the +farm. When Claudio comes to her aid, an act of kindness throws his world into +chaos. Suddenly he must stave off inquisitive onlookers, invasive media, and +even more sinister influences" -- provided by publisher.

+ +
+ + Read more... + +
+ +
+

+ + Loki (2021) + +

+ + +
+

Wikipdia Summary: The series +takes place after the events of the film Avengers: Endgame (2019), in which an +alternate version of Loki created a new timeline.

+ +
+ + Read more... + +
+ +
+

+ + The Manager's Answer Book - Barbara Mitchell, Cornelia Gamlem + +

+ + +
+

OpenLibrary +Summary: +Powerful Tools to Maximize Your Impact and Influence, Build Trust and Teams, and +Respond to Challenges

+ +
+ + Read more... + +
+ +
+

+ + Wandavision + +

+ + +
+

Wikipedia Summary: WandaVision is +an American television miniseries created by Jac Schaeffer for the streaming +service Disney+, based on Marvel Comics featuring the characters Wanda Maximoff +/ Scarlet Witch and Vision.

+ +
+ + Read more... + +
+ +
+

+ + The Falcon and the Winter Soldier (2021) + +

+ + +
+

Wikipedia +Summary: The +Falcon and the Winter Soldier[a] is an American television miniseries created by +Malcolm Spellman for the streaming service Disney+, based on Marvel Comics +featuring the characters Sam Wilson / Falcon and Bucky Barnes / Winter +Soldier. It is the second television series in the Marvel Cinematic Universe +(MCU) produced by Marvel Studios, sharing continuity with the films of the +franchise and taking place after the events of the film Avengers: Endgame +(2019). Spellman served as head writer with Kari Skogland directing.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/20/index.html b/public/page/20/index.html new file mode 100644 index 0000000..ca4e5fc --- /dev/null +++ b/public/page/20/index.html @@ -0,0 +1,388 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet + +

+ + +
+

You may feel "I'm not start enough to talk about this" or "This must be so +stupid I shouldn't talk about it". Don't.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style + +

+ + +
+

An "hero project" is a project/spec change that you personally think will +solve a group of problems in your project. It could be a different +architecture, a new framework or even a new language.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Don't Confuse Hero Project With Hero Syndrome + +

+ + +
+

Someone that suffers from Hero Syndrome will claim that things won't work +unless they are carefully watching over everything.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Create Libraries + +

+ + +
+

I've tried to go paperless many, many times. But keeping a notepad and a bunch +of post its in my desk has been one of the most helpful tools I ever got.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet + +

+ + +
+

You may think "This project is so small and so focused on whatever I needed, I +should never post it on Github. What would people think?" Github is not for +that.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable + +

+ + +
+

Instead of taking the blows and keep moving, maybe it would be better to your +own health to simply quit.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - I.T. World Is Really Small + +

+ + +
+

We have two expressions here: "The world turns around"; it means whatever you +do, sometime in the future, you'll face the consequences of it. Another +expression is "The world of something is an egg"; because the world turns +around, if the world is an egg, you'll face the consequences sooner than you +think.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Keep A List of Things I Don't Know + +

+ + +
+

Richard Feymann, famous physicist, kept a notebook with the title "Things I +Don't Know".

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable + +

+ + +
+

You may think "But I could go to those people and say 'Why are you being +toxic?' or 'Why are you attacking me?' or even just tell them it's not nice to +say such things. It would help."

+

I don't believe that's the case.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Beware of Microaggressions + +

+ + +
+

Microaggressions are defined as "brief, everyday exchanges that send +denigrating messages to certain individuals because of their group +membership". The hardest part is that they don't sound aggressive.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/21/index.html b/public/page/21/index.html new file mode 100644 index 0000000..b53d2b5 --- /dev/null +++ b/public/page/21/index.html @@ -0,0 +1,381 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Beware of Toxic People + +

+ + +
+

You'll find people that, even if they don't small talk you, they will bad +mouth everything else -- even some other people -- openly.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - You'll Learn About Yourself The Hard Way + +

+ + +
+

We get frustrated with code that doesn't compile. We get angry with customers +asking things back and forth. We get upset when upper management can't make up +its mind. And we lash out on others when that happens.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - People Get Upset About Code And Architecture Quality 'Cause They Care + +

+ + +
+

At some point, you'll describe some solution/decision about some piece of +code or some architectural design and people will seem annoyed/pissed about +it. When people care about a product/code, they do that.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Pay Attention On How People React To You + +

+ + +
+

One way you can learn about yourself is to pay attention on how people react +to your actions.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Code of Conduct Protect YOU, Not THEM + +

+ + +
+

When you're beginning with any language/library/framework, check their CoC; +they will protect you from being harassed for not immediately getting what +is going on instead of blocking you from telling them what you think.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Don't Tell It's Done When It's Not + +

+ + +
+

You are tired of running the same thing over and over again. You kinda +remember that something weird may happen, but because you're tired, you tell +everyone that "It's finished". Don't.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Take Responsibility For The Use Of Your Code + +

+ + +
+

This is hard. Very very hard. It's the difference between "freedom" and +"responsibility".

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - If It Doesn't Run On Your Computer, You Have A Problem + +

+ + +
+

I've seen a lot of systems that would never run on a isolated computer, like +the developer tool, 'cause the system requires running on a specialized +environment. Those things are wrong.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Learn To Say No + +

+ + +
+

Sometimes, you'll have to say no: No, I can't do it; no, it can't be made in +this time; no, I don't feel capable of doing this; no, I don't feel +comfortable writing this.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - When It's Time to Stop, It's Time To Stop + +

+ + +
+

Learn when you can't code anymore.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/22/index.html b/public/page/22/index.html new file mode 100644 index 0000000..5e8dd11 --- /dev/null +++ b/public/page/22/index.html @@ -0,0 +1,419 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Companies Look For Specialists But Keep Generalists Longer + +

+ + +
+

If you know a lot about one single language, it may make it easier to get a +job, but in the long run, language usage dies or loses its charms and you'll +need to find something else. Knowing a bit about a lot of other languages +helps in the long run, not to mention that may help you think of better +solutions.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve + +

+ + +
+

If it took you more than one hour for you to figure out what went wrong, it is +a good idea to put it on list, 'cause these things have the tendency to appear +again.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Units Makes Things Clear + +

+ + +
+

You know what's one of the worst function names ever? sleep().

+

Sleep for how long? It is seconds or milliseconds?

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Think About The Users + +

+ + +
+

Think how the data you're collecting from your users will be used -- this is +more prevalent on these days, where "privacy" is a premium.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Code Formatting Tools Are Ok, But No Silver Bullet + +

+ + +
+

One thing a team may decide to fix the continuous flux of code style comments +in a code review is to use a code formatting tool to auto-format the code. +That's ok, but they should never rely on it.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Code Reviews Are Not For Style + +

+ + +
+

When doing code reviews, do not focus on style; focus on design things that +look a bit weird.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Code Style: Follow It + +

+ + +
+

If your project have a defined code style, you must follow it. Sometimes it +may not be clear ("this struct/class should be singular or plural"?), but do +your best to follow it.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style + +

+ + +
+

Every freaking time Google comes with their own coding style, it's a garbage +fire. The community came with a better style way before and Google seem to +come with a style with high contrasting parts just to call it theirs.

+ +
+ + Read more... + +
+ +
+

+ + A Devil's Chaplain: Reflections on Hope, Lies, Science, and Love + +

+ + +
+

Goodreads summary: +Richard Dawkins's essays are an enthusiastic testament to the power of +rigorous, scientific examination, and they span many different corners of his +personal and professional life. He revisits the meme, the unit of cultural +information that he named and wrote about in his groundbreaking work The +Selfish Gene. He makes moving tributes to friends and colleagues, including a +eulogy for novelist Douglas Adams; he shares correspondence with the +evolutionary biologist Stephen Jay Gould; and he visits with the famed +paleoanthropologists Richard and Maeve Leakey at their African wildlife +preserve. He concludes the essays with a vivid note to his ten-year-old +daughter, reminding her to remain curious, to ask questions, and to live the +examined life.

+ +
+ + Read more... + +
+ +
+

+ + Seven Languages in Seven Weeks + +

+ + +
+

GoodReads summary: +You should learn a programming language every year, as recommended by The +Pragmatic Programmer. But if one per year is good, how about Seven Languages +in Seven Weeks? In this book you'll get a hands-on tour of Clojure, Haskell, +Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is +on that list, you'll broaden your perspective of programming by examining +these languages side-by-side. You'll learn something new from each, and best +of all, you'll learn how to learn a language quickly.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/23/index.html b/public/page/23/index.html new file mode 100644 index 0000000..512bd24 --- /dev/null +++ b/public/page/23/index.html @@ -0,0 +1,382 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Even for Application Composition, Start Stupid + +

+ + +
+

Application composition may lead to microservices -- which is good -- but +microservices require some ideas about how applications "talk" between them +over the wire (protocols and such) which you don't need to start with.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Not Just Function Composition, But Application Composition + +

+ + +
+

When we were discussing the magical number +seven, I mentioned that it made +more sense to actually call the functions in sequence instead of each calling +the next. That's basically a "function composition", one thing you can also do +with your applications.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Command Line Options Are Weird, But Helpful + +

+ + +
+

In this day and age, when everything has a graphical interface, does it still +makes sense to add command line options to your application? In fact, it does.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - The Config File Is Friend + +

+ + +
+

Do not ignore the power of configuration files.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Create Libraries + +

+ + +
+

One thing you must learn is how to break your project into smaller libraries, +to avoid doing rounds to deal with "the same, but a bit different".

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Logs Are For Events, Not User Interface + +

+ + +
+

On a previous life, to understand how a system behaved, I added a ton of +metrics: how fast things were going in, how fast things were going out, how +many things were in the middle, how many the job processed... Not doing it so +makes me feel... naked.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Optimization Is For Compilers + +

+ + +
+

Let say you need more performance on your application. You may be tempted to +look at your code and think "How can I keep this same logic and still remove a +few cycles, so things seem to go faster?" Well, if you want performance, you +need to change your logic.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Organize Your Code by Data/Type, Not Functionality + +

+ + +
+

A lot of projects assume that you'll put things with the same functionality in +the same place, no matter what data they deal with. This makes things harder +to break apart later.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - One Commit Per Change + +

+ + +
+

When working with source control tools, keep one change per commit. Avoid +bundling more than one change in a single commit just to "save time".

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Always Use A Version Control System + +

+ + +
+

"This is my stupid application that I just want to learn something" is not +even a good excuse to not use a version control system.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/24/index.html b/public/page/24/index.html new file mode 100644 index 0000000..b443085 --- /dev/null +++ b/public/page/24/index.html @@ -0,0 +1,375 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Debuggers Are Overrated + +

+ + +
+

I heard a lot of people complaining that code editors are bad 'cause it's hard +to attach a debugger. I'd claim that this vision is wrong.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Shortcuts Are nice, But Only In The Short Run + +

+ + +
+

A lot of languages/libraries/frameworks add a way to make things shorter, +reducing the number of things you need to type.

+

But, later, that will bite you and you'll have to remove the shortcut and do +the long things.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Logs Are For Events, Not User Interface + +

+ + +
+

Two things in one: First of all, when using logging, use it to log events, not +for user interfaces; second, log events in a machine readable way, not +necessarily an human readable format.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Resist The Temptation Of Easy + +

+ + +
+

Sure that IDE will help you with a ton of autocomplete stuff and let you +easily build your project, but do you understand what's going on?

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Start Stupid + +

+ + +
+

One way to get away from the IDE is to "start stupid": Just get the compiler +and get an editor (ANY editor) with code highlight and do your thing: Code, +build it, run it.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Always Use Timezones With Your Dates + +

+ + +
+

No matter if the date you're receiving is in your local timezone and you'll +display it in your timezone, sooner or later, the fact that you ignored there +was a timezone behind that date will hurt you.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Always Use UTF-8 For Your Strings + +

+ + +
+

Long gone are the days where ASCII was +enough for everyone. Long gone are the days where you can deal with strings +with no "weird" or "funny" characters.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Cognitive Cost Is The Readability Killer + +

+ + +
+

"Cognitive dissonance" +is a fancy way of saying "I need to remember two (or more) different and +contradicting things at the same time to understand this." Keeping those +different things in your head creates a cost and it keeps accumulating the +more indirect the things are ('cause you'll have to keep all those in your +head).

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Thinking Data Flow Beats Patterns + +

+ + +
+

When you're trying to find a solution to your problem, think on the way the +data will flow through your code.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Learn The Basics of Functional Programming + +

+ + +
+

At this point, you should at least have heard about how cool functional +programming is. There are a lot of concepts here, but at least the very basic +ones you should keep in mind.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/25/index.html b/public/page/25/index.html new file mode 100644 index 0000000..3ce497b --- /dev/null +++ b/public/page/25/index.html @@ -0,0 +1,369 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - The Magical Number Seven, Plus Or Minus Two + +

+ + +
+

"The magical number" +is a psychology article about the number of things one can keep in their mind +at the same time.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Understand And Stay Away From Cargo Cult + +

+ + +
+

"Cargo cult" is a type of cult +which appeared in the Melanesia, in which the natives would build their copy +of an airplane (no motor, 'cause they didn't have the knowledge to build one +-- or even knew what went inside the airplane) in the hopes they would get the +same results as a real airplane.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Don't Mess With Things Outside Your Project + +

+ + +
+

Simple rule: Is the code yours or from your team? Good, you can make any +changes you want. Does it come from outside? DON'T. TOUCH. IT.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Design Patters Are Used to Name Solution, Not Find Them + +

+ + +
+

Most of the times I saw design patterns being applied, they were applied as a +way to find a solution, so you end up twisting a solution -- and, sometimes, +the problem it self -- to fit the pattern.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - "Right Tool For The Job" Is Just To Push An Agenda + +

+ + +
+

A lot of times I heard "We should use the right tool for the job!" Most of +those times it was just a way to push an agenda.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - The Right Tool Is More Obvious Than You Think + +

+ + +
+

Maybe you're in a project that needs to process some text. Maybe you're +tempted to say "Let's use Perl" 'cause you know that Perl is very strong in +processing text.

+

But that may still be not the right tool.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - If Your Data Has a Schema, Use a Structure + +

+ + +
+

You may be tempted to use a list (or tuple, if your language allows) to keep +your data if it has, say, only 2 fields. Don't.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - It's Better To Let The Application Crash Than Do Nothing + +

+ + +
+

Although that sounds weird, it's better to not add any error handling than +silently capturing errors and doing nothing.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Types Say What You Data Is + +

+ + +
+

Memory is just a sequence of bytes; bytes are just numbers from 0 to 255; what +those numbers mean is described on the language type system.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - If You Know How To Handle It, Handle It + +

+ + +
+

If you know an error can occur, then you should handle it properly, instead of +ignoring it.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/26/index.html b/public/page/26/index.html new file mode 100644 index 0000000..3675e29 --- /dev/null +++ b/public/page/26/index.html @@ -0,0 +1,385 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - A Language Is Much More Than A Language + +

+ + +
+

Picking a programming language is much more than just picking the words that +will generate a code. They come with a community, a leadership, an ecosystem +and a thread the binds them all together.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Don't Use Booleans As Parameters + +

+ + +
+

When you're designing a function, you may be tempted to add a flag (a +parameter in a function that it is a boolean). Don't do this.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - If A Function Description Includes An "And", It's Wrong + +

+ + +
+

Functions should do one thing and one thing only. I clear indication that +you're breaking this principle is the need to add an "and" in its +documentation.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Beware of Interface Changes + +

+ + +
+

Interfaces and APIs is what you give away to others. If you keep changing them, +you'll make everyone's life sad.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Good Languages Come With Integrated Documentation + +

+ + +
+

If you're worried about learning some new programming language, you can bet +the one with a better documentation is the one that is born with a document +processor.

+

Same goes for the frameworks/libraries of that language.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - The Function Documentation Is Its Contract + +

+ + +
+

When you start the code by writing the general flow as +steps and making each step a +function, you're actually making a contract (probably with your future self): +I'm saying this function does this and this is what it does.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Documentation Is a Love Letter To Your Future Self + +

+ + +
+

We all know writing the damn docs for functions and classes and modules is a +pain in the backside. But realizing what you were thinking when you wrote the +function will save your butt in the future.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Future Thinking is Future Trashing + +

+ + +
+

When developers try to solve a problem, they sometimes try to find a way that +will solve all the problems, including the ones that may appear in the future.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Testing Every Function Creates Dead Code + +

+ + +
+

If you write a test for every single function on your system, and your system +keeps changing, how will you know when a function is not necessary anymore?

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Good Languages Come With Tests + +

+ + +
+

You can be sure that if a language brings a testing framework -- even minimal +-- in its standard library, the ecosystem around it will have better tests +than a language that doesn't carry a testing framework, no matter how good the +external testing frameworks for the language are.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/27/index.html b/public/page/27/index.html new file mode 100644 index 0000000..ad1d014 --- /dev/null +++ b/public/page/27/index.html @@ -0,0 +1,369 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way - Disclaimer + +

+ + +
+

There is one magical thing you need to know when reading this book: It's all +personal opinion

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Gherkin Is Your Friend to Understand Expectations + +

+ + +
+

Gherkin is file format for writing behaviour tests (BDD). But it can also give +you some insights on what you should do.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Unit Tests Are Good, Integration Tests Are Gooder + +

+ + +
+

The view of the whole is greater than the sum of its parts. And that includes +tests for the whole compared to tests of single things.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Tests Make Better APIs + +

+ + +
+

Testing things in isolation may give a better view of your APIs.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Make Tests That You Know How To Run on the Command line + +

+ + +
+

You know that "Play" with a little something on your IDE that runs only the +tests? Do you know what it does?

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Be Ready To Throw Your Code Away + +

+ + +
+

A lot of people, when they start with TDD, get annoyed when you say that you +may have to rewrite a lot of stuff, including whatever your already wrote.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Intro + +

+ + +
+

"Things I Learnt The Hard Way (In 30 Years of Software Development)" started +as a simple sequence of toots (the same as "tweets", on +Mastodon when I was thinking about a +new presentation I could do.

+

But why "a new presentation"?

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Spec First, Then Code + +

+ + +
+

"Without requirements or design, programming is the art of adding bugs to an +empty text file." -- Louis Srygley

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - Write Steps as Comments + +

+ + +
+

Don't know how to solve your problem? Write the steps as comments in your +code.

+ +
+ + Read more... + +
+ +
+

+ + Things I Learnt The Hard Way - The... Book? + +

+ + +
+

Random thought about the previous post about "Things I Learnt The Hard Way".

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/28/index.html b/public/page/28/index.html new file mode 100644 index 0000000..b1c34bc --- /dev/null +++ b/public/page/28/index.html @@ -0,0 +1,454 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Things I Learnt The Hard Way (in 30 Years of Software Development) + +

+ + +
+

This is a cynical, clinical collection of things I learnt in 30 years working +with software development.

+

Again, some things are really cynical, others are long observations on +different jobs.

+ +
+ + Read more... + +
+ +
+

+ + Don't Diminish Types + +

+ + +
+

In a previous life, I had a long discussion on why adding booleans was a bad +idea. And just recently one of the core Python developers suggested the same +thing -- adding booleans, that is. This is a long rant on why such things are +bad.

+ +
+ + Read more... + +
+ +
+

+ + Hands-On Microservices with Rust - Denis Kolodin + +

+ + +
+

GoodReads Summary: +A comprehensive guide in developing and deploying high performance +microservices with Rust.

+ +
+ + Read more... + +
+ +
+

+ + The Where, the Why, and the How: 75 Artists Illustrate Wondrous Mysteries of Science - Matt LaMothe, Julia Rothman, Jenny Volvovski, David Macaulay + +

+ + +
+

GoodReads Summary: +A science book like no other, The Where, the Why, and the How turns loose 75 of +today's hottest artists onto life's vast questions, from how we got here to +where we are going. Inside these pages some of the biggest (and smallest) +mysteries of the natural world are explained in essays by real working +scientists, which are then illustrated by artists given free rein to be as +literal or as imaginative as they like. The result is a celebration of the +wonder that inspires every new discovery. Featuring work by such contemporary +luminaries as Lisa Congdon, Jen Corace, Neil Farber, Susie Ghahremani, +Jeremyville, and many more, this is a work of scientific and artistic +exploration to pique the interest of both the intellectually and imaginatively +curious.

+ +
+ + Read more... + +
+ +
+

+ + The Wolf's Hour - Robert R. McCammon + +

+ + +
+

GoodReads Summary: +Michael Gallatin is a British spy with a peculiar talent: the ability to +transform himself into a wolf. Although his work in North Africa helped the +Allies win the continent in the early days of World War II, he quit the service +when a German spy shot his lover in her bed. Now, three years later, the army +asks him to end his retirement and parachute into occupied Paris. A mysterious +German plan called the Iron Fist threatens the D-Day invasion, and the Nazi in +charge is the spy who betrayed Michael’s lover. The werewolf goes to France for +king and country, hoping for a chance at bloody vengeance.

+ +
+ + Read more... + +
+ +
+

+ + Modern Java in Action - Raoul-Gabriel Urma + +

+ + +
+

GoodReads Summary: +Java 8 Lambdas in Action is a clearly-written guide to Java 8 lambdas and +functional programming in Java. It begins with a practical introduction to the +structure and benefits of lambda expressions in real-world Java code. The book +then introduces the Stream API and shows how it can make collections-related +code radically easier to understand and maintain. Along the way, you'll +discover new FP-oriented design patterns with Java 8 for code reuse, code +readability, exception handling, data manipulation, and concurrency. For +developers also exploring other functional languages on the JVM, the book +concludes with a quick survey of useful functional features in Scala and +Clojure.

+ +
+ + Read more... + +
+ +
+

+ + Publishing Books on Zola + +

+ + +
+

A long time ago I wrote a couple of posts on a WordPress, then moved them to +GitBook. Unfortunately, GitBook changed its layout to something a bit more +confusing and now I'm bringing them back to this blog, which runs Zola.

+ +
+ + Read more... + +
+ +
+

+ + One Week with Tiler + +

+ + +
+

Tiler is a tiling split manager for VIM. Here is my experience with it +installed for one week.

+ +
+ + Read more... + +
+ +
+

+ + Greek Mythology Explained: A Deeper Look at Classical Greek Lore and Myth - Marios Christou, David Ramenah + +

+ + +
+

GoodReads Summary: +Greek mythology explored like never before.

+

Fans of George R.R Martin’s A Song of Ice & Fire series and the Game of Thrones +TV series will love Greek Mythology Explained, a unique retelling of Greek +mythological tales featuring love, betrayal, murder and ruthless ambitions.

+ +
+ + Read more... + +
+ +
+

+ + Modern Vim: Craft Your Development Environment with Vim 8 and Neovim - Drew Neil + +

+ + +
+

GoodReads Summary: +Turn Vim into a full-blown development environment using Vim 8’s new features +and this sequel to the beloved bestseller Practical Vim. Integrate your editor +with tools for building, testing, linting, indexing, and searching your +codebase. Discover the future of Vim with Neovim: a fork of Vim that includes +a built-in terminal emulator that will transform your workflow. Whether you +choose to switch to Neovim or stick with Vim 8, you’ll be a better developer.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/29/index.html b/public/page/29/index.html new file mode 100644 index 0000000..fef3808 --- /dev/null +++ b/public/page/29/index.html @@ -0,0 +1,453 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Moon Shot: The Inside Story of America's Race to the Moon - Alan Shepard + +

+ + +
+

GoodReads summary: +The never-before-told story of the courage, dedication, and teamwork that made +the journey to the moon possible--an intense human drama of the sacrifices and +risks asked of a remarkable group of astronauts. Shepard and Slayton, part of +the pioneering space program from the beginning, tell this fascinating inside +story. 32 pages of photos.

+ +
+ + Read more... + +
+ +
+

+ + Soulminder - Timothy Zahn + +

+ + +
+

GoodReads summary: +For Dr. Adrian Sommers, a split second of driving while distracted leads to +tragedy-and obsession. His family destroyed, he devotes his entire being to +developing Soulminder, a technology that might have saved his son as he wavered +on the edge of death. Sommers's vision is to capture a dying person's life +essence and hold it safely in stasis while physicians heal the body from injury +or disease. Years of experimentation finally end in success—but those who +recognize Soulminder's possibilities almost immediately corrupt its original +concept to pursue dangerous new frontiers: body-swapping, obstruction of +justice, extortion, and perhaps even immortality.

+ +
+ + Read more... + +
+ +
+

+ + Answers to Questions You’ve Never Asked: Explaining the What If in Science, Geography and the Absurd - Joseph Pisenti + +

+ + +
+

GoodReads summary: +Fun facts for kids of all ages: When you take the most absurd parts of history, +science, economics and geography, you end up with a pretty confusing picture of +humanity. Why do we have borders, what’s the furthest you can get from the +ocean, how do you qualify as a country and why did Vikings wear those silly +helmets? These are just a few of the strange questions that bounce around the +head of YouTube sensation Joseph Pisenti, aka RealLifeLore.

+ +
+ + Read more... + +
+ +
+

+ + The Origin of Names, Words and Everything in Between - Patrick Foote + +

+ + +
+

GoodReads summary: +Explore the world of names: What is something that literally everything in +existence has in common? It all has a name! With The Origin of Names, Words and +Everything in Between, you can learn the origins of these names. From countries +and cities to toys and animals to even planets, learn the etymology of +interesting words in a fun and entertaining way.

+ +
+ + Read more... + +
+ +
+

+ + Films from the Future: The Technology and Morality of Sci-Fi Movies - Andrew Maynard + +

+ + +
+

GoodReads summary: +Science, technology, and society: In Films from the Future, former physicist +Andrew Maynard threads together his love of science fiction movies with his +expertise on emerging technologies to engage, entertain and make you think +about the relationship between technology, and society as they discover +astounding, transformative advances in science. Through the imagination and +creativity of science fiction movies, Maynard introduces readers to the +profound capabilities presented by new and emerging technologies, and the +complex personal and societal challenges they present.

+ +
+ + Read more... + +
+ +
+

+ + About Me + +

+ +
+ +
+

+ + Announcing JulioBiason.Net 4.0 + +

+ + +
+

Short version: New new blog engine and layout.

+ +
+ + Read more... + +
+ +
+

+ + The Planets: Photographs from the Archives of NASA - Nirmala Nataraj, Bill Nye, U.S. Goverment + +

+ + +
+

GoodReads Summary: +This magnificent volume offers a rich visual tour of the planets in our solar +system. More than 200 breathtaking photographs from the archives of NASA are +paired with extended captions detailing the science behind some of our cosmic +neighborhood's most extraordinary phenomena. Images of newly discovered areas +of Jupiter, fiery volcanoes on Venus, and many more reveal the astronomical +marvels of space in engrossing detail. Anyone with an interest in science, +astronomy, and the mysteries of the universe will delight in this +awe-inspiring guide to the wonders of the solar system.

+ +
+ + Read more... + +
+ +
+

+ + The Story Behind: The Extraordinary History Behind Ordinary Objects - Emily Prokop + +

+ + +
+

GoodReads Summary: +Learn the fascinating history and trivia you never knew about things we use +daily from the host of The Story Behind podcast.

+ +
+ + Read more... + +
+ +
+

+ + Learn You a Haskell for Great Good! - Miran Lipovača + +

+ + +
+

GoodReads Summary: +Learn You a Haskell for Great Good! is a fun, illustrated guide to learning +Haskell, a functional programming language that's growing in popularity. Learn +You a Haskell for Great Good! introduces programmers familiar with imperative +languages (such as C++, Java, or Python) to the unique aspects of functional +programming. Packed with jokes, pop culture references, and the author's own +hilarious artwork, Learn You a Haskell for Great Good! eases the learning +curve of this complex language, and is a perfect starting point for any +programmer looking to expand his or her horizons. The well-known web tutorial +on which this book is based is widely regarded as the best way for beginners +to learn Haskell, and receives over 30,000 unique visitors monthly.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/3/index.html b/public/page/3/index.html new file mode 100644 index 0000000..0fbcd46 --- /dev/null +++ b/public/page/3/index.html @@ -0,0 +1,414 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Three Weeks With Silverblue + +

+ + +
+

A few weeks ago (four weeks ago, to be exact, based on this post date), my +Fedora Workstation crashed hard, in some freak accident that, I believe, killed +my /boot partition. At first I reinstalled Workstation, but then decided to +give a change to Silverblue.

+ +
+ + Read more... + +
+ +
+

+ + Command Pattern Experiments in Rust + +

+ + +
+

I've been doing some experiments in using the command pattern in Rust and found +at least two ways to write it.

+ +
+ + Read more... + +
+ +
+

+ + Using `alternatives` + +

+ + +
+

alternatives allows one to select a different executable for a normal command +line program, but how does it work?

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Statement of FSF board on election of Richard Stallman + +

+ + +
+

After the weird return of rms to the Free Software Foundation +board, now both the FSF and rms provided +statements about the event.

+

But I still think things are amiss.

+ +
+ + Read more... + +
+ +
+

+ + The Dragons of Dorcastle - Jack Campbell + +

+ + +
+

GoodReads Summary: +For centuries, the two Great Guilds have controlled the world of Dematr. The +Mechanics and the Mages have been bitter rivals, agreeing only on the need to +keep the world they rule from changing. But now a Storm approaches, one that +could sweep away everything that humans have built. Only one person has any +chance of uniting enough of the world behind her to stop the Storm, but the +Great Guilds and many others will stop at nothing to defeat her.

+ +
+ + Read more... + +
+ +
+

+ + Safe Enough to Soar - Fred Miller, Judith Kat + +

+ + +
+

GoodReads Summary: +Some organizations pay a great deal of attention to ensuring the physical +safety of their team members, but do the team members feel safe enough to speak +up and raise tough concerns or share bold and still-in-formation ideas? In this +book, bestselling authors and inclusion experts Frederick A. Miller and Judith +H. Katz introduce the concept of "interaction safety" and demonstrate how it +can help create a work environment of trust, inclusion, and collaboration.

+ +
+ + Read more... + +
+ +
+

+ + FSF and rms (Again) + +

+ + +
+

About six months ago, in 2020-09-16, Richard Stallman, a.k.a. "rms", resigned from +FSF +(the Free Software Foundation, maintainer of the GPL family of licenses) with +not-so-great headlines. A week ago, in 2021-03-22, rms told the world that he +is back.

+

And now we have a huge mess. Again.

+ +
+ + Read more... + +
+ +
+

+ + Kill Switch (2008) + +

+ + +
+

IMDB Summary: +A troubled detective travels to Memphis in order to track down a pair of serial +killers.

+ +
+ + Read more... + +
+ +
+

+ + Unhinged (2020) + +

+ + +
+

IMDB Summary: +After a confrontation with an unstable man at an intersection, a woman becomes +the target of his rage.

+ +
+ + Read more... + +
+ +
+

+ + Good Omens (2019) + +

+ + +
+

Wikipedia Summary: +Set in 2018, the series follows the demon Crowley (David Tennant) and the angel +Aziraphale (Michael Sheen), longtime acquaintances who, having grown accustomed +to life on Earth as representatives of Heaven and Hell, seek to prevent the +coming of the Antichrist and with it Armageddon, the final battle between +Heaven and Hell.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/30/index.html b/public/page/30/index.html new file mode 100644 index 0000000..fc2ad97 --- /dev/null +++ b/public/page/30/index.html @@ -0,0 +1,490 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Genius: The Life and Science of Richard Feynman - James Gleick + +

+ + +
+

GoodReads Summary: +An illuminating portrayal of Richard Feynman—a giant of twentieth century +physics—from his childhood tinkering with radios, to his vital work on the +Manhattan Project and beyond.

+ +
+ + Read more... + +
+ +
+

+ + The Cyberiad - Stanisław Lem + +

+ + +
+

GoodReads Summary: +A brilliantly funny collection of stories for the next age, from the +celebrated author of Solaris. Ranging from the prophetic to the surreal, these +stories demonstrate Stanislaw Lem's vast talent and remarkable ability to +blend meaning and magic into a wholly entertaining and captivating work.

+ +
+ + Read more... + +
+ +
+

+ + The Book of Skulls - Robert Silverberg + +

+ + +
+

GoodReads Summary: +Seeking the immortality promised in an ancient manuscript, The Book of Skulls, +four friends, college roommates, go on a spring break trip to Arizona: Eli, +the scholar, who found and translated the book; Timothy, scion of an American +dynasty, born and bred to lead; Ned, poet and cynic; and Oliver, the brilliant +farm boy obsessed with death.

+ +
+ + Read more... + +
+ +
+

+ + Night of the Living Trekkies - Kevin David Anderson + +

+ + +
+

GoodReads Summary: +Jim Pike, the disillusioned manager of a hotel that is hosting a Star Trek +convention, finds himself leading a ragtag crew of survivors as a strange +virus turns the convention-goers into zombies...

+ +
+ + Read more... + +
+ +
+

+ + I Have No Mouth and I Must Scream - Harlan Ellison + +

+ + +
+

GoodReads Summary: +First published in 1967 and re-issued in 1983, I Have No Mouth and I Must +Scream contains seven stories with copyrights ranging from 1958 through 1967. +This edition contains the original introduction by Theodore Sturgeon and the +original foreword by Harlan Ellison, along with a brief update comment by +Ellison that was added in the 1983 edition. Among Ellison's more famous +stories, two consistently noted as among his very best ever are the title +story and the volume's concluding one, Pretty Maggie Moneyeyes.

+ +
+ + Read more... + +
+ +
+

+ + The Book of Kells - R.A. MacAvoy + +

+ + +
+

GoodReads Summary: +An unusual and original work of fantasy from the acclaimed author of Tea with +the Black Dragon. A contemporary man, John Thornburn (a meek, non-violent and +unpredictable artist) and woman, Derval (his tough, confrontational, strong +and warrior-like lover) time travel to ancient Ireland to avenge a Viking +attack. Packed with fascinating details of historical time and place in Irish +history and delicately balanced on the border between realism and fantasy, the +story centers around one of the most famous and beautiful illuminated +manuscripts in history, the legendary but entirely real Book of Kells. Celtic +history blends with magical fantasy for a strange and immersive tale of +adventure.

+ +
+ + Read more... + +
+ +
+

+ + Learning Java - Patrick Niemeyer + +

+ + +
+

GoodReads Summary: +Version 5.0 of the Java 2 Standard Edition SDK is the most important upgrade +since Java first appeared a decade ago. With Java 5.0, you'll not only find +substantial changes in the platform, but to the language itself-something that +developers of Java took five years to complete. The main goal of Java 5.0 is +to make it easier for you to develop safe, powerful code, but none of these +improvements makes Java any easier to learn, even if you've programmed with +Java for years. And that means our bestselling hands-on tutorial takes on even +greater significance."Learning Java" is the most widely sought introduction to +the programming language that's changed the way we think about computing. Our +updated third edition takes an objective, no-nonsense approach to the new +features in Java 5.0, some of which are drastically different from the way +things were done in any previous versions. The most essential change is the +addition of "generics," a feature that allows developers to write, test, and +deploy code once, and then reuse the code again and again for different data +types. The beauty of generics is that more problems will be caught during +development, and "Learning Java" will show you exactly how it's done.Java 5.0 +also adds more than 1,000 new classes to the Java library. That means 1,000 +new things you can do without having to program it in yourself. That's a huge +change. With our book's practical examples, you'll come up to speed quickly on +this and other new features such as loops and threads. The new edition also +includes an introduction to Eclipse, the open source IDE that is growing in +popularity. "Learning Java," 3rd Edition addresses all of the important uses +of Java, such as web applications, servlets, and XML that are increasingly +driving enterprise applications.

+ +
+ + Read more... + +
+ +
+

+ + In the Beginning...: Science Faces God in the Book of Genesis - Isaac Asimov + +

+ + +
+

GoodReads Summary: +In the Beginning: Science Faces God in the Book of Genesis. The beginning of +time. The origin of life. In our Western civilization, there are two +influential accounts of beginnings. One is the biblical account, compiled more +than two thousand years ago by Judean writers who based much of their thinking +on the Babylonian astronomical lore of the day. The other is the account of +modern science, which, in the last century, has slowly built up a coherent +picture of how it all began. Both represent the best thinking of their times, +and in this line-by-line annotation of the first eleven chapters of Genesis, +Isaac Asimov carefully and evenhandedly compares the two accounts, pointing +out where they are similar and where they are different.

+ +
+ + Read more... + +
+ +
+

+ + Princesses Behaving Badly: Real Stories from History Without the Fairy-Tale Endings - Linda Rodríguez McRobbie + +

+ + +
+

GoodReads Summary: +(No summary.)

+ +
+ + Read more... + +
+ +
+

+ + Future Shock (Future Shock, #1) - Elizabeth Briggs + +

+ + +
+

GoodReads Summary: +Elena Martinez has street smarts, the ability for perfect recall, and a +deadline: if she doesn’t find a job before she turns eighteen, she’ll be +homeless. But then she gets an unexpected offer from Aether Corporation, the +powerful Los Angeles tech giant. Along with four other recruits—Adam, Chris, +Trent, and Zoe—Elena is being sent on a secret mission to bring back data from +the future. All they have to do is get Aether the information they need, and +the five of them will be set for life. It’s an offer Elena can’t refuse.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/31/index.html b/public/page/31/index.html new file mode 100644 index 0000000..fac78b9 --- /dev/null +++ b/public/page/31/index.html @@ -0,0 +1,463 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + The Big Bad Book of Bill Murray: A Critical Appreciation of the World's Finest Actor - Robert Schnakenberg + +

+ + +
+

GoodReads Summary: +The man. The movies. The life. The legend. He’s played a deranged +groundskeeper, a bellowing lounge singer, a paranormal exterminator, and a +grouchy weatherman. He is William James “Bill” Murray, America’s greatest +national treasure. From his childhood lugging golf bags at a country club to +his first taste of success on Saturday Night Live, from his starring roles in +Hollywood blockbusters to his reinvention as a hipster icon for the +twenty-first century, The Big Bad Book of Bill Murray chronicles every aspect +of his extraordinary life and career.

+ +
+ + Read more... + +
+ +
+

+ + Being There - Jerzy Kosiński + +

+ + +
+

GoodReads Summary: +A modern classic now available from Grove Press, Being There is one of the +most popular and significant works from a writer of international stature. It +is the story of Chauncey Gardiner - Chance, an enigmatic but distinguished man +who emerges from nowhere to become an heir to the throne of a Wall Street +tycoon, a presidential policy adviser, and a media icon. Truly "a man without +qualities," Chance's straightforward responses to popular concerns are +heralded as visionary. But though everyone is quoting him, no one is sure what +he's really saying. And filling in the blanks in his background proves +impossible. Being There is a brilliantly satiric look at the unreality of +American media culture that is, if anything, more trenchant now than ever.

+ +
+ + Read more... + +
+ +
+

+ + Powers (Annals of the Western Shore, #3) - Ursula K. Le Guin + +

+ + +
+

GoodReads Summary: +Young Gav can remember the page of a book after seeing it once, and, +inexplicably, he sometimes "remembers" things that are going to happen in the +future. As a loyal slave, he must keep these powers secret, but when a +terrible tragedy occurs, Gav, blinded by grief, flees the only world he has +ever known.

+ +
+ + Read more... + +
+ +
+

+ + Programming Rust: Fast, Safe Systems Development - Jim Blandy + +

+ + +
+

GoodReads Summary: +Rust is a new systems programming language that combines the performance and +low-level control of C and C++ with memory safety and thread safety. Rust's +modern, flexible types ensure your program is free of null pointer +dereferences, double frees, dangling pointers, and similar bugs, all at +compile time, without runtime overhead. In multi-threaded code, Rust catches +data races at compile time, making concurrency much easier to use.

+ +
+ + Read more... + +
+ +
+

+ + Let's Not Call It "Unit Tests" Anymore + +

+ + +
+

I keep seeing people call tests "integration tests", while they are perfect +unit tests. So maybe what we call "unit tests" shouldn't be called unit +tests.

+ +
+ + Read more... + +
+ +
+

+ + Eon (The Way, #1) - Greg Bear + +

+ + +
+

GoodReads Summary: +The 21st century was on the brink of nuclear confrontation when the 300 +kilometer-long stone flashed out of nothingness and into Earth's orbit. NASA, +NATO, and the UN sent explorers to the asteroid's surface...and discovered +marvels and mysteries to drive researchers mad.

+ +
+ + Read more... + +
+ +
+

+ + Changing Planes: Stories - Ursula K. Le Guin + +

+ + +
+

GoodReads Summary: +Sita Dulip has missed her flight. But instead of listening to garbled +announcements in the airport, she has found a method of bypassing the crowds +at the desks, the long lines at the toilets, the nasty lunch, the whimpering +children and punitive parents, the bookless bookstores, and the blue plastic +chairs bolted to the floor.

+ +
+ + Read more... + +
+ +
+

+ + Hadoop in Practice - Alex Holmes + +

+ + +
+

GoodReads Summary: +Hadoop in Practice collects nearly 100 Hadoop examples and presents them in a +problem/solution format. Each technique addresses a specific task you'll face, +like querying big data using Pig or writing a log file loader. You'll explore +each problem step by step, learning both how to build and deploy that specific +solution along with the thinking that went into its design. As you work +through the tasks, you'll find yourself growing more comfortable with Hadoop +and at home in the world of big data.

+ +
+ + Read more... + +
+ +
+

+ + Hap and Leonard: Blood and Lemonade - Joe R. Lansdale + +

+ + +
+

GoodReads Summary: +Hap Collins is a complicated man. He looks like a good ‘ol boy, but his +politics don’t match. After way too many jobs, Hap has discovered what he’s +best at: kicking ass. Vietnam veteran Leonard Pine is even more complicated: +black, Republican, gay—and an occasional arsonist. As childhood friends and +business associates, Hap and Leonard have a gift for the worst kind of +trouble: East Texan trouble.

+ +
+ + Read more... + +
+ +
+

+ + The Emperor's Soul - Brandon Sanderson + +

+ + +
+

GoodReads Summary: +A heretic thief is the empire’s only hope in this fascinating tale that +inhabits the same world as the popular novel, Elantris.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/32/index.html b/public/page/32/index.html new file mode 100644 index 0000000..6e3b2d2 --- /dev/null +++ b/public/page/32/index.html @@ -0,0 +1,470 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems - Martin Kleppmann + +

+ + +
+

GoodReads Summary: +Data is at the center of many challenges in system design today. Difficult +issues need to be figured out, such as scalability, consistency, reliability, +efficiency, and maintainability. In addition, we have an overwhelming variety +of tools, including relational databases, NoSQL datastores, stream or batch +processors, and message brokers. What are the right choices for your +application? How do you make sense of all these buzzwords?

+

In this practical and comprehensive guide, author Martin Kleppmann helps you +navigate this diverse landscape by examining the pros and cons of various +technologies for processing and storing data. Software keeps changing, but the +fundamental principles remain the same. With this book, software engineers and +architects will learn how to apply those ideas in practice, and how to make +full use of data in modern applications.

+ +
+ + Read more... + +
+ +
+

+ + On Unit Tests and Layers, Part II + +

+ + +
+

After coming with a discussion about unit tests and layers, I got a +bunch of other insights, specially from a video of Gary Bernhardt +about "Fast Test, Slow Test".

+ +
+ + Read more... + +
+ +
+

+ + On Unit Tests and Layers + +

+ + +
+

On a recent discussion about testing, I think I came up with a +reason why some people really think we need to test everything: they +are thinking in layers, without even realizing it.

+ +
+ + Read more... + +
+ +
+

+ + The Waste Lands (The Dark Tower #3) - Stephen King + +

+ + +
+

GoodReads Summary: +Several months have passed, and Roland’s two new tet-mates have become +proficient gunslingers. Eddie Dean has given up heroin, and Odetta’s two +selves have joined, becoming the stronger and more balanced personality of +Susannah Dean. But while battling The Pusher in 1977 New York, Roland altered +ka by saving the life of Jake Chambers, a boy who—in Roland’s where and +when—has already died. Now Roland and Jake exist in different worlds, but they +are joined by the same madness: the paradox of double memories. Roland, +Susannah, and Eddie must draw Jake into Mid-World then follow the Path of the +Beam all the way to the Dark Tower. But nothing is easy in Mid-World. Along +the way our tet stumbles into the ruined city of Lud, and are caught between +the warring gangs of the Pubes and the Grays. The only way out of Lud is to +wake Blaine the Mono, an insane train that has a passion for riddling, and for +suicidal journeys.

+ +
+ + Read more... + +
+ +
+

+ + Will Eisner's the Spirit: Who Killed the Spirit? - Matt Wagner + +

+ + +
+

GoodReads Summary: +To celebrate the 75th anniversary of Will Eisner's most iconic character, +Dynamite Entertainment proudly assembled the creative dream team of Eisner +Award-winning author Matt Wagner, artist Dan Schkade, and colorist Brennan +Wagner to honor the legend with an all-new adventure!

+ +
+ + Read more... + +
+ +
+

+ + The Drawing of the Three (The Dark Tower, #2) - Stephen King + +

+ + +
+

GoodReads Summary: +While pursuing his quest for the Dark Tower through a world that is a +nightmarishly distorted mirror image of our own, Roland, the last gunslinger, +encounters three mysterious doorways on the beach. Each one enters into the +life of a different person living in contemporary New York.

+ +
+ + Read more... + +
+ +
+

+ + Storm Real-Time Processing Cookbook - Quinton Anderson + +

+ + +
+

GoodReads Summary: +A Cookbook with plenty of practical recipes for different uses of Storm.If you +are a Java developer with basic knowledge of real-time processing and would +like to learn Storm to process unbounded streams of data in real time, then +this book is for you.

+ +
+ + Read more... + +
+ +
+

+ + Apache Kafka - Nishant Garg + +

+ + +
+

GoodReads Summary: +The book will follow a step-by-step tutorial approach which will show the +readers how to use Apache Kafka for messaging from scratch.Apache Kafka is for +readers with software development experience, but no prior exposure to Apache +Kafka or similar technologies is assumed. This book is also for enterprise +application developers and big data enthusiasts who have worked with other +publisher-subscriber based systems and now want to explore Apache Kafka as a +futuristic scalable solution. (less)

+ +
+ + Read more... + +
+ +
+

+ + Nginx: From Beginner to Pro - Rahul Soni + +

+ + +
+

GoodReads Summary: +Teaches you to start up Nginx and quickly take your expertise to a level where +you can comfortably work with various aspects of the web server and make +informed design decisions for your web farm. Nginx powers more than 40% of the +top 1000 websites and is among the handful of web servers that can handle more +than 10K simultaneous connections. It has some features which are simply +unparalleled.

+ +
+ + Read more... + +
+ +
+

+ + Web Development with Clojure: Build Bulletproof Web Apps with Less Code - Dmitri Sotnikov + +

+ + +
+

GoodReads Summary: +Modern web development needs modern tools. Web Development With Clojure shows +you how to apply Clojure programming fundamentals to build real-world +solutions. You'll develop all the pieces of a full web application in this +powerful language. If you already have some familiarity with Clojure, you'll +learn how to put it to serious practical use. If you're new to the language, +the book provides just enough Clojure to get down to business.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/33/index.html b/public/page/33/index.html new file mode 100644 index 0000000..2126e6d --- /dev/null +++ b/public/page/33/index.html @@ -0,0 +1,479 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + The Gunslinger (The Dark Tower, #1) - Stephen King + +

+ + +
+

GoodReads Summary: +In the first book of this brilliant series, Stephen King introduces readers to +one of his most enigmatic heroes, Roland of Gilead, The Last Gunslinger. He is +a haunting figure, a loner on a spellbinding journey into good and evil. In +his desolate world, which frighteningly mirrors our own, Roland pursues The +Man in Black, encounters an alluring woman named Alice, and begins a +friendship with the Kid from Earth called Jake. Both grippingly realistic and +eerily dreamlike, The Gunslinger leaves readers eagerly awaiting the next +chapter.

+ +
+ + Read more... + +
+ +
+

+ + Clojure for Machine Learning - Akhil Wali + +

+ + +
+

GoodReads Summary: +Clojure for Machine Learning is an introduction to machine learning techniques +and algorithms. This book demonstrates how you can apply these techniques to +real-world problems using the Clojure programming language.

+

It explores many machine learning techniques and also describes how to use +Clojure to build machine learning systems. This book starts off by introducing +the simple machine learning problems of regression and classification. It also +describes how you can implement these machine learning techniques in Clojure. +The book also demonstrates several Clojure libraries, which can be useful in +solving machine learning problems.

+ +
+ + Read more... + +
+ +
+

+ + Antifragile Systems and Teams - Dave Zwieback + +

+ + +
+

GoodReads Summary: +All complex computer systems eventually break, despite all of the +heavy-handed, bureaucratic change-management processes we throw at them. But +some systems are clearly more fragile than others, depending on how well they +cope with stress. In this O’Reilly report, Dave Zwieback explains how the +DevOps methodology can help make your system antifragile.

+ +
+ + Read more... + +
+ +
+

+ + Clojure for the Brave and True - Daniel Higginbotham + +

+ + +
+

GoodReads Summary: +As a Lisp-style functional programming language, Clojure lets you write robust +and elegant code, and because it runs on the Java Virtual Machine, you can +take advantage of the vast Java ecosystem. Clojure for the Brave and True +offers a "dessert-first" approach: you'll start playing with real programs +immediately, as you steadily acclimate to the abstract but powerful features +of Lisp and functional programming. Inside you'll find an offbeat, practical +guide to Clojure, filled with quirky sample programs that catch cheese thieves +and track glittery vampires.

+ +
+ + Read more... + +
+ +
+

+ + Land of Lisp: Learn to Program in Lisp, One Game at a Time! - Conrad Barski + +

+ + +
+

GoodReads Summary: +Lisp is a uniquely powerful programming language that, despite its academic reputation, is actually very practical. Land of Lisp brings the language into the real world, teaching Lisp by showing readers how to write several complete Lisp-based games, including a text adventure, an evolution simulation, and a robot battle. While building these games, readers learn the core concepts of Lisp programming, such as data types, recursion, input/output, object-oriented programming, and macros. And thanks to the power of Lisp, the code is short. Rather than bogging things down with reference information that is easily found online, Land of Lisp focuses on using Lisp for real programming. The book is filled with the author Conrad Barski's famous Lisp cartoons, featuring the Lisp alien and other zany characters.

+ +
+ + Read more... + +
+ +
+

+ + Arrival - Ted Chiang + +

+ + +
+

GoodReads Summary: +From a soaring Babylonian tower that connects a flat Earth with the heavens +above, to a world where angelic visitations are a wondrous and terrifying part +of everyday life; from a neural modification that eliminates the appeal of +physical beauty, to an alien language that challenges our very perception of +time and reality... Chiang's rigorously imagined stories invite us to question +our understanding of the universe and our place in it.

+ +
+ + Read more... + +
+ +
+

+ + The Swift Programming Language - Apple Inc. + +

+ + +
+

GoodReads Summary: +Swift is a new programming language for creating iOS and OS X apps. Swift +builds on the best of C and Objective-C, without the constraints of C +compatibility. Swift adopts safe programming patterns and adds modern features +to make programming easier, more flexible, and more fun. Swift’s clean slate, +backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an +opportunity to reimagine how software development works.

+ +
+ + Read more... + +
+ +
+

+ + The End of All Things (Old Man's War, #6) - John Scalzi + +

+ + +
+

GoodReads Summary: +Humans expanded into space... only to find a universe populated with multiple +alien species bent on their destruction. Thus was the Colonial Union formed, +to help protect us from a hostile universe. The Colonial Union used the Earth +and its excess population for colonists and soldiers. It was a good +arrangement... for the Colonial Union. Then the Earth said: no more.

+ +
+ + Read more... + +
+ +
+

+ + The Human Division (Old Man's War, #5) - John Scalzi + +

+ + +
+

GoodReads Summary: +Following the events of The Last Colony, John Scalzi tells the story of the +fight to maintain the unity of the human race.

+ +
+ + Read more... + +
+ +
+

+ + Zoe's Tale (Old Man's War, #4) - John Scalzi + +

+ + +
+

GoodReads Summary: +Everyone on Earth knows the tale I am part of. But you don't know my tale: How +I did what I did — how I did what I had to do — not just to stay alive but to +keep you alive, too. All of you. I'm going to tell it to you now, the only way +I know how: not straight but true, the whole thing, to try make you feel what +I felt: the joy and terror and uncertainty, panic and wonder, despair and +hope. Everything that happened, bringing us to Earth, and Earth out of its +captivity. All through my eyes.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/34/index.html b/public/page/34/index.html new file mode 100644 index 0000000..48ac0b0 --- /dev/null +++ b/public/page/34/index.html @@ -0,0 +1,461 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + How to Make Mistakes in Python - Mike Pirnat + +

+ + +
+

GoodReads Summary: +Even the best programmers make mistakes, and experienced programmer Mike +Pirnat has made his share during 15+ years with Python. Some have been simple +and silly; others were embarrassing and downright costly. In this O’Reilly +report, he dissects some of his most memorable blunders, peeling them back +layer-by-layer to reveal just what went wrong.

+ +
+ + Read more... + +
+ +
+

+ + Imperative to Functional Programming Succinctly - Marc Clifton + +

+ + +
+

GoodReads Summary: +Functional programming is fundamentally different from imperative programming. +As such, it provides a unique approach to solving problems—one that requires +developers to transform how they think about software design and +implementation. With Imperative to Functional Programming Succinctly by Marc +Clifton, you will learn many of the basic concepts involved with functional +programming, such as currying, partial application, function pipelines, +recursion, and continuations. By book's end, you will learn how to combine +functional and imperative programming to get the most out of your solutions.

+ +
+ + Read more... + +
+ +
+

+ + Black Hat Python: Python Programming for Hackers and Pentesters - Justin Seitz + +

+ + +
+

GoodReads Summary: +When it comes to creating powerful and effective hacking tools, Python is the +language of choice for most security analysts. But just how does the magic +happen?

+ +
+ + Read more... + +
+ +
+

+ + Python Data Science Essentials - Learn the fundamentals of Data Science with Python - Alberto Boschetti + +

+ + +
+

GoodReads Summary: +Key Features Quickly get familiar with data science using Python Save time - +and effort - with all the essential tools explained Create effective data +science projects and avoid common pitfalls with the help of examples and hints +dictated by experience Book Description

+ +
+ + Read more... + +
+ +
+

+ + Why Mixing Spaces and Tabs IS a Big Deal + +

+ + +
+

Why something so small is actually a big deal.

+ +
+ + Read more... + +
+ +
+

+ + The Little Book of HTML/CSS Coding Guidelines - Jens Oliver Meiert + +

+ + +
+

GoodReads Summary: +A proper plan can improve your code, including your HTML documents and CSS +style sheets. Jens Oliver Meiert explores the theory and practice of coding +guidelines and shows, using Google’s HTML and CSS standards as a particular +example, how consistency and care can make the code base you create today much +easier to deal with when you—or someone else—work on it later.

+ +
+ + Read more... + +
+ +
+

+ + A Bug Hunter's Diary: A Guided Tour Through the Wilds of Software Security - Tobias Klein + +

+ + +
+

GoodReads Summary: +Seemingly simple bugs can have drastic consequences, allowing attackers to +compromise systems, escalate local privileges, and otherwise wreak havoc on a +system.

+ +
+ + Read more... + +
+ +
+

+ + Python Playground: Geeky Projects for the Curious Programmer - Mahesh Venkitachalam + +

+ + +
+

GoodReads Summary: +Python is a powerful programming language that's easy to learn and fun to play +with. But once you've gotten a handle on the basics, what do you do next?

+ +
+ + Read more... + +
+ +
+

+ + Write Great Code: Volume I: Understanding the Machine - Randall Hyde + +

+ + +
+

GoodReads Summary: +Write Great Code, Volume 1 teaches machine organization, including numeric +representation; binary arithmetic and bit operations; floating point +representation; system and memory organization; character representation; +constants and types; digital design; CPU, instruction set, and memory +architecture; input and output; and how compilers work.

+ +
+ + Read more... + +
+ +
+

+ + Pre-Orders: The Case of No Man's Sky + +

+ + +
+

No Man's Sky is getting a lot of heat recently +because, well, the game is not all what the developers promised. And a lot of +people are putting the blame on pre-orders and whatnot.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/35/index.html b/public/page/35/index.html new file mode 100644 index 0000000..d15f58b --- /dev/null +++ b/public/page/35/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Less Web Development Essentials - Bass Jobsen + +

+ + +
+

GoodReads Summary: +Written in a practical and concise manner, this book is a crash-course in +teaching you the fundamental concepts of Less with real-life examples and +problems. If you use CSS(3) in your web development tasks and would love to +learn how to create maintainable and reusable code with Less, this book is +ideal for you. Although you need to have some experience in web development, +even beginners will find that this book is useful.

+ +
+ + Read more... + +
+ +
+

+ + Mocking A Mock + +

+ + +
+

Mocks are an important part of testing, but learn how to properly mock stuff.

+ +
+ + Read more... + +
+ +
+

+ + When I Used PEP8 To Fuck Up Code + +

+ + +
+

We "inherited" some Python code recently. Although another team was working on +it, we now should support it and keep it going. The previous team at least +tried to use Pylint and follow PEP8. And I say "tried" because their +pylintrc has a couple of exceptions and their PEP8 extended the +maximum column to 100.

+ +
+ + Read more... + +
+ +
+

+ + Web Development with Django Cookbook - Aidas Bendoraitis + +

+ + +
+

GoodReads Summary: +Over 70 practical recipes to create multilingual, responsive, and scalable +websites with Django About This Book Improve your skills by developing models, +forms, views, and templates Create a rich user experience using Ajax and other +JavaScript techniques A practical guide to writing and using APIs to import or +export data Who This Book Is For.

+ +
+ + Read more... + +
+ +
+

+ + Django Design Patterns and Best Practices - Arun Ravindran + +

+ + +
+

GoodReads Summary: +Learning how to write better Django code to build more maintainable websites +either takes a lot of experience or familiarity with various design patterns. +Filled with several idiomatic Django patterns, Django Design Patterns and +Best Practices accelerates your journey into the world of web development.

+ +
+ + Read more... + +
+ +
+

+ + Silence on the Wire: A Field Guide to Passive Reconnaissance and Indirect Attacks - Michal Zalewski + +

+ + +
+

GoodReads Summary: +There are many ways that a potential attacker can intercept information, or +learn more about the sender, as the information travels over a network. +Silence on the Wire uncovers these silent attacks so that system +administrators can defend against them, as well as better understand and +monitor their systems.

+ +
+ + Read more... + +
+ +
+

+ + Reactive Programming with JavaScript - Jonathan Hayward + +

+ + +
+

GoodReads Summary: +Learn the hot new front-end web framework from Facebook: ReactJS, an easy way +of developing the V in MVC and a better approach to software engineering in +JavaScript.

+ +
+ + Read more... + +
+ +
+

+ + CoffeeScript Application Development - Ian Young + +

+ + +
+

GoodReads Summary: +What JavaScript user wouldnt want to be able to dramatically reduce +application development time This book will teach you the clean, elegant +CoffeeScript language and show you how to build stunning applications. +Overview Learn the ins and outs of the CoffeeScript language, and understand +how the transformation happens behind the scenes Use practical examples to put +your new skills to work towards building a functional web application, written +entirely in CoffeeScript Understand the language concepts from short, +easy-to-understand examples which can be practised by applying them to your +ongoing project In Detail JavaScript is becoming one of the key languages in +web development. It is now more important than ever across a growing list of +platforms. CoffeeScript puts the fun back into JavaScript programming with +elegant syntax and powerful features. CoffeeScript Application Development +will give you an in-depth look at the CoffeeScript language, all while +building a working web application. Along the way, youll see all the great +features CoffeeScript has to offer, and learn how to use them to deal with +real problems like sprawling codebases, incomplete data, and asynchronous web +requests. Through the course of this book you will learn the CoffeeScript +syntax and see it demonstrated with simple examples. As you go, youll put your +new skills into practice by building a web application, piece by piece. Youll +start with standard language features such as loops, functions, and string +manipulation. Then, well delve into advanced features like classes and +inheritance. Learn advanced idioms to deal with common occurrences like +external web requests, and hone your technique for development tasks like +debugging and refactoring. CoffeeScript Application Development will teach you +not only how to write CoffeeScript, but also how to build solid applications +that run smoothly and are a pleasure to maintain.

+ +
+ + Read more... + +
+ +
+

+ + Backbone.Js Testing - Ryan Roemer + +

+ + +
+

GoodReads Summary: +This book is packed with the step by step tutorial and instructions in recipe +format helping you setup test infrastructure and gradually advance your skills +to plan, develop, and test your backbone applications.If you are a JavaScript +developer looking for recipes to create and implement test support for your +backbone application, then this book is ideal for you.

+ +
+ + Read more... + +
+ +
+

+ + Backbone.js Essentials - Jeremy Walker + +

+ + +
+

GoodReads Summary: +Construct top-notch web applications by mastering the powerful tools provided +by Backbone.js Gain insights into how to simplify data management and create +single-page web applications with powerful user interfaces This is a +fast-paced guide on how to test, document, and leverage third-party libraries, +and helps you get the most out of Backbone.js.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/36/index.html b/public/page/36/index.html new file mode 100644 index 0000000..ec33aa9 --- /dev/null +++ b/public/page/36/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + The Last Colony (Old Man's War #3) - John Scalzi + +

+ + +
+

GoodReads Summary: +Retired from his fighting days, John Perry is now village ombudsman for a +human colony on distant Huckleberry. With his wife, former Special Forces +warrior Jane Sagan, he farms several acres, adjudicates local disputes, and +enjoys watching his adopted daughter grow up.

+ +
+ + Read more... + +
+ +
+

+ + The Ghost Brigades (Old Man's War, #2) - John Scalzi + +

+ + +
+

GoodReads Summary: +The Ghost Brigades are the Special Forces of the Colonial Defense Forces, +elite troops created from the DNA of the dead and turned into the perfect +soldiers for the CDF's toughest operations. They’re young, they’re fast and +strong, and they’re totally without normal human qualms.

+

The universe is a dangerous place for humanity—and it's about to become far +more dangerous. Three races that humans have clashed with before have allied +to halt our expansion into space. Their linchpin: the turncoat military +scientist Charles Boutin, who knows the CDF’s biggest military secrets. To +prevail, the CDF must find out why Boutin did what he did.

+ +
+ + Read more... + +
+ +
+

+ + C# Succinctly - Joe Mayo + +

+ + +
+

GoodReads Summary: +(No summary.)

+ +
+ + Read more... + +
+ +
+

+ + Instant Backbone.js Application Development - Thomas Hunter II + +

+ + +
+

GoodReads Summary: +Learn something new in an Instant! A short, fast, focused guide delivering +immediate results.

+ +
+ + Read more... + +
+ +
+

+ + Python 3 Object Oriented Programming - Dusty Phillips + +

+ + +
+

GoodReads Summary: +The book begins with the very foundations of OOP and then uses practical +examples to show how to correctly implement Object Oriented Programming in +Python. Many examples are taken from real-world projects. The book focuses on +high-level design as well as the gritty details of the Python syntax. The +provided exercises inspire the reader to think about his or her own code, +rather than providing solved problems. If you're new to Object Oriented +Programming techniques, or if you have basic Python skills and wish to learn +in depth how and when to correctly apply Object Oriented Programming in +Python, this is the book for you. If you are an object-oriented programmer for +other languages, you too will find this book a useful introduction to Python, +as it uses terminology you are already familiar with. Python 2 programmers +seeking a leg up in the new world of Python 3 will also find the book +beneficial, and you need not necessarily know Python 2.

+ +
+ + Read more... + +
+ +
+

+ + Getting Started with Meteor.js JavaScript Framework - Second Edition - Isaac Strack + +

+ + +
+

GoodReads Summary: +Learn one of the most up-to-date JavaScript platforms, with easy to follow, +step-by-step instructions Familiarize yourself with Meteor’s new and improved +features Create dynamic, multi-user applications in JavaScript.

+ +
+ + Read more... + +
+ +
+

+ + Mastering JavaScript Design Patterns - Essential Solutions for Effective JavaScript Web Design - Simon Timms + +

+ + +
+

GoodReads Summary: +Enhance your JavaScript code with this essential collection of design +patterns. Discover an extensive range of techniques and strategies to +successfully tackle complex JavaScript development problems and put them into +practice by following detailed examples that demonstrate each design pattern +at its most effective. Dive deeper into JavaScript and master these powerful +design patterns for an innovative and cutting-edge approach to JavaScript that +meets the demands of modern web development.

+ +
+ + Read more... + +
+ +
+

+ + TypeScript Succinctly - Steve Fenton + +

+ + +
+

GoodReads Summary: +The extensive adoption of JavaScript for application development, and the +ability to use HTML and JavaScript to create Windows Store apps, has made +JavaScript a vital part of the Windows development ecosystem. Microsoft has +done extensive work to make JavaScript easier to use. Microsoft's TypeScript +extends many familiar features of .NET programming to JavaScript. With +TypeScript Succinctly by Steve Fenton, you will learn how TypeScript provides +optional static typing and classes to JavaScript development, how to create +and load modules, and how to work with existing JavaScript libraries through +ambient declarations. TypeScript is even significantly integrated with Visual +Studio to provide the autocompletion and type checking you are most +comfortable with.

+ +
+ + Read more... + +
+ +
+

+ + Learning ECMAScript 6 - Narayan Prusty + +

+ + +
+

GoodReads Summary: +About This Book Learn a powerful approach to writing object-oriented +JavaScript code using ES6 Create and use ES6 modules to learn to write smart, +modularized JavaScript code The book will take you step-by-step through a wide +array of examples, giving you tips on how to make the best use of the latest +ES6 features Who This Book Is For

+ +
+ + Read more... + +
+ +
+

+ + Learning Ionic - Build real-time and hybrid mobile applications with Ionic - Arvind Ravulavaru + +

+ + +
+

GoodReads Summary: +Key Features Create hybrid mobile applications by combining the capabilities +of Ionic, Cordova, and AngularJS Reduce the time to market your application +using Ionic, that helps in rapid application development Detailed code +examples and explanations, helping you get up and running with Ionic quickly +and easily Book Description

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/37/index.html b/public/page/37/index.html new file mode 100644 index 0000000..98aa50d --- /dev/null +++ b/public/page/37/index.html @@ -0,0 +1,439 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Dear Github Maintainers + +

+ + +
+

A rebuttal to "Dear Github".

+ +
+ + Read more... + +
+ +
+

+ + Linux Shell Scripting Cookbook - Shantanu Tushar + +

+ + +
+

GoodReads Summary: +This cookbook is for beginners or intermediate Linux users who want to master +writing Bash shell scripts. Intermediate/advanced users, system +administrators, developers, and programmers can use it as a reference when +they face problems while coding. Each recipe contains step-by-step +instructions about everything necessary to execute a particular task. The book +is designed so that beginners can read it from start to end while advanced +users can just open it at any chapter and start following the recipes as a +reference. It covers most of the commands on Linux with a variety of use cases +accompanied by plenty of examples and guides you on implementing some of the +commonest Linux commands with recipes that handle operations or properties +related to files like searching and mining inside a file with grep. It also +shows how utilities like sed, awk, grep, and cut can be combined to solve text +processing problems. The focus is on saving time by automating activities with +a few lines of script.

+ +
+ + Read more... + +
+ +
+

+ + Couchbase Example and REST + +

+ + +
+

Using the example Couchbase to show how REST works.

+ +
+ + Read more... + +
+ +
+

+ + Agile vs Culture: The Story of Outliners + +

+ + +
+

When the culture goes against agile.

+ +
+ + Read more... + +
+ +
+

+ + The Day I Found My Old Code + +

+ + +
+

Found a piece of code I wrote 2 years ago, following a lot of linters. I'm +amazed how readable the code still is.

+ +
+ + Read more... + +
+ +
+

+ + Object-oriented JavaScript - Second Edition - Stoyan Stefanov + +

+ + +
+

GoodReads Summary: +Create scalable and reusable high-quality JavaScript applications and +libraries using the concepts of object-oriented programming. This book is for +the beginning to intermediate web developer who wants to solve web development +problems with smart JavaScript. It does not assume any prior knowledge of +JavaScript programming; however even if you already know some JavaScript, +there will be plenty for you to learn here.

+ +
+ + Read more... + +
+ +
+

+ + Oh Myyy! (There Goes the Internet): Life, the Internet and Everything - George Takei + +

+ + +
+

GoodReads Summary: +How did a 75-year old actor from Star Trek become a social media juggernaut? +Why does everything he posts spread like wildfire across the ether, with tens +or even hundreds of thousands of likes and shares? And what can other sites, +celebrities and companies do to attain his stratospheric engagement levels, +which hover or top 100 percent while theirs languish in the single digits?

+ +
+ + Read more... + +
+ +
+

+ + JavaScript Testing Beginner's Guide - Liang Yuxian Eugene + +

+ + +
+

GoodReads Summary: +This book is organized such that only the most essential information is +provided to you in each chapter so as to maximize your learning. Examples and +tutorials are given in an easy to follow, step-by-step manner so that you can +see how the testing process is being carried out and how the code is being +written. The source code also contains detailed explanation so that you know +what the code is doing. Multiple screenshots are used in places that matter so +that you have a visual sense of what is happening. Beginner JavaScript +developers looking for essential ways to write, test, and debug JavaScript for +different purposes and situations.

+ +
+ + Read more... + +
+ +
+

+ + Old Man's War (Old Man's War, #1) - John Scalzi + +

+ + +
+

GoodReads Summary: +Earth itself is a backwater. The bulk of humanity's resources are in the hands +of the Colonial Defense Force. Everybody knows that when you reach retirement +age, you can join the CDF. They don't want young people; they want people who +carry the knowledge and skills of decades of living. You'll be taken off Earth +and never allowed to return. You'll serve two years at the front. And if you +survive, you'll be given a generous homestead stake of your own, on one of our +hard-won colony planets.

+ +
+ + Read more... + +
+ +
+

+ + The Martian - Andy Weir + +

+ + +
+

GoodReads Summary: +Six days ago, astronaut Mark Watney became one of the first people to walk on +Mars.

+

Now, he’s sure he’ll be the first person to die there.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/38/index.html b/public/page/38/index.html new file mode 100644 index 0000000..7012495 --- /dev/null +++ b/public/page/38/index.html @@ -0,0 +1,473 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Rust Essentials - Ivo Balbaert + +

+ + +
+

GoodReads Summary: +Discover how to use Rust to write fast, secure, and concurrent systems and +applications About This Book Learn how to create secure and blazingly fast +programs in Rust Start working with Rust in a multicore and distributed +environment Explore the core characteristics of Rust - safety, performance, +and concurrency - to build error free and robust code Who This Book Is For

+ +
+ + Read more... + +
+ +
+

+ + 12 Years a Slave - Solomon Northup + +

+ + +
+

GoodReads Summary: +Twelve Years a Slave, sub-title: Narrative of Solomon Northup, citizen of +New-York, kidnapped in Washington city in 1841, and rescued in 1853, from a +cotton plantation near the Red River in Louisiana, is a memoir by Solomon +Northup as told to and edited by David Wilson. It is a slave narrative of a +black man who was born free in New York state but kidnapped in Washington, +D.C., sold into slavery, and kept in bondage for 12 years in Louisiana. He +provided details of slave markets in Washington, D.C. and New Orleans, as well +as describing at length cotton and sugar cultivation on major plantations in +Louisiana.

+ +
+ + Read more... + +
+ +
+

+ + American Gods - Neil Gaiman + +

+ + +
+

GoodReads Summary: +Days before his release from prison, Shadow's wife, Laura, dies in a +mysterious car crash. Numbly, he makes his way back home. On the plane, he +encounters the enigmatic Mr Wednesday, who claims to be a refugee from a +distant war, a former god and the king of America.

+

Together they embark on a profoundly strange journey across the heart of the +USA, whilst all around them a storm of preternatural and epic proportions +threatens to break.

+ +
+ + Read more... + +
+ +
+

+ + WikiLeaks: Inside Julian Assange's War on Secrecy - David Leigh + +

+ + +
+

GoodReads Summary: +A team of journalists with unparalleled inside access provides the first full, +in-depth account of WikiLeaks, its founder Julian Assange, and the ethical, +legal, and political controversies it has both uncovered and provoked.

+ +
+ + Read more... + +
+ +
+

+ + The Sad Life of Walter Mitty + +

+ + +
+

I once wrote about The Secret Life of Walter +Mitty +and how nice story about a guy outgrowing his daydreams.

+ +
+ + Read more... + +
+ +
+

+ + Ready Player One - Ernest Cline + +

+ + +
+

GoodReads Summary: +IN THE YEAR 2044, reality is an ugly place. The only time teenage Wade Watts +really feels alive is when he's jacked into the virtual utopia known as the +OASIS. Wade's devoted his life to studying the puzzles hidden within this +world's digital confines, puzzles that are based on their creator's obsession +with the pop culture of decades past and that promise massive power and +fortune to whoever can unlock them.

+ +
+ + Read more... + +
+ +
+

+ + iPad Productivity Essentials: The Definitive Guide to Getting More Productive with your iPad - Christopher J. Lee + +

+ + +
+

GoodReads Summary: +You have your iPad, now what? You could continue to use your tablet as an +excellent web surfing tool. You could also use it to play one of the many, +many games out on the App Store. Or, you could simply turn it over to your +spouse or your kid(s) for their enjoyment. I suggest a different path, a path +that will keep your iPad in your hands, at work…a path that will put you on +the road towards increased productivity!

+ +
+ + Read more... + +
+ +
+

+ + Subterranean Scalzi Super Bundle - John Scalzi + +

+ + +
+

GoodReads Summary:

+

Subterranean Press bundles together all of their John Scalzi titles into one easy-to-buy special this November:

+

How I Proposed To My Wife: An Alien Sex Story

+

An Election

+

Judge Sn Goes Golfing

+

Questions for a Soldier

+

The Sagan Diary

+

The Tale of the Wicked

+

The God Engines

+

You're Not fooling Anyone When You Take Your Laptop to the Coffee Shop

+ +
+ + Read more... + +
+ +
+

+ + An Illustrated Book of Bad Arguments - Ali Almossawi + +

+ + +
+

GoodReads Summary: +This book is aimed at newcomers to the field of logical reasoning, +particularly those who, to borrow a phrase from Pascal, are so made that they +understand best through visuals. I have selected a small set of common errors +in reasoning and visualized them using memorable illustrations that are +supplemented with lots of examples. The hope is that the reader will learn +from these pages some of the most common pitfalls in arguments and be able to +identify and avoid them in practice.

+ +
+ + Read more... + +
+ +
+

+ + Getting Things Done: The Art of Stress-Free Productivity - David Allen + +

+ + +
+

GoodReads Summary: +In today's world, yesterday's methods just don't work. In Getting Things Done, +veteran coach and management consultant David Allen shares the breakthrough +methods for stress-free performance that he has introduced to tens of +thousands of people across the country. Allen's premise is simple: our +productivity is directly proportional to our ability to relax. Only when our +minds are clear and our thoughts are organized can we achieve effective +productivity and unleash our creative potential.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/39/index.html b/public/page/39/index.html new file mode 100644 index 0000000..c3565e0 --- /dev/null +++ b/public/page/39/index.html @@ -0,0 +1,487 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + The Drift Wars - Brett James + +

+ + +
+

GoodReads Summary: +Peter Garvey was just a kid when the warships emerged from the Drift and +devastated his homeworld. He enlisted immediately, leaving behind his +small-town life to fight in distant space.

+

Barely surviving basic training, he is thrust to the front line to battle the +Riel, an army of creatures beyond his darkest nightmares.

+ +
+ + Read more... + +
+ +
+

+ + Just a Geek: Unflinchingly honest tales of the search for life, love, and fulfillment beyond the Starship Enterprise - Wil Wheaton + +

+ + +
+

GoodReads Summary: +Wil Wheaton has never been one to take the conventional path to success. +Despite early stardom through his childhood role in the motion picture "Stand +By Me," and growing up on television as Wesley Crusher on "Star Trek: The +Next Generation," Wil left Hollywood in pursuit of happiness, purpose, and a +viable means of paying the bills. In the oddest of places, Topeka, Kansas, +Wil discovered that despite his claims to fame, he was at heart "Just a +Geek." In this bestselling book, Wil shares his deeply personal and difficult +journey to find himself. You'll understand the rigors, and joys, of Wil's +rediscovering of himself, as he comes to terms with what it means to be +famous, or, ironically, famous for once having been famous. Writing with +honesty and disarming humanity, Wil touches on the frustrations associated +with his acting career, his inability to distance himself from Ensign Crusher +in the public's eyes, the launch of his incredibly successful web site, +wilwheaton.net, and the joy he's found in writing. Through all of this, Wil +shares the ups and downs he encountered along the journey, along with the +support and love he discovered from his friends and family. The stories in +"Just a Geek" include: Wil's plunge from teen star to struggling actor, +discovering the joys of HTML, blogging, Linux, and web design, the struggle +between Wesley Crusher, Starfleet ensign, and Wil Wheaton, author and +blogger, gut-wrenching reactions to the 9-11 disaster, moving tales of Wil's +relationships with his wife, step-children, and extended family, and the +transition from a B-list actor to an A-list author.

+ +
+ + Read more... + +
+ +
+

+ + Redshirts - John Scalzi + +

+ + +
+

GoodReads Summary: +Ensign Andrew Dahl has just been assigned to the Universal Union Capital Ship +Intrepid, flagship of the Universal Union since the year 2456. It’s a prestige +posting, and Andrew is thrilled all the more to be assigned to the ship’s +Xenobiology laboratory.

+ +
+ + Read more... + +
+ +
+

+ + Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin + +

+ + +
+

GoodReads Summary: +Even bad code can function. But if code isn't clean, it can bring a +development organization to its knees. Every year, countless hours and +significant resources are lost because of poorly written code. But it doesn't +have to be that way.

+ +
+ + Read more... + +
+ +
+

+ + 1001 Video Games You Must Play Before You Die - Tony Mott + +

+ + +
+

GoodReads Summary: +For devoted gamers as well as those interested in groundbreaking graphic +design, this is the first, most comprehensive, and only critical guide ever +published to video games. The video game has arrived as entertainment and as +an art form. This is the first serious critical evaluation ever published of +the best video games and is a testament to the medium’s innovativeness and +increasing emphasis on aesthetics. Organized chronologically and for all +platforms (PC, Xbox, PlayStation, etc.) and covering all genres from the bold +(Grand Theft Auto and Halo) and dark (Resident Evil and Silent Hill) to the +spiritual (Final Fantasy) and whimsical (Legend of Zelda), the book traces the +video game from the rough early days of Pong to the latest visual fantasia.

+ +
+ + Read more... + +
+ +
+

+ + Brave New World - Aldous Huxley + +

+ + +
+

GoodReads Summary: +Brave New World is a dystopian novel by English author Aldous Huxley, written in 1931 and published in 1932. Largely set in a futuristic World State, inhabited by genetically modified citizens and an intelligence-based social hierarchy, the novel anticipates huge scientific advancements in reproductive technology, sleep-learning, psychological manipulation and classical conditioning that are combined to make a dystopian society which is challenged by only a single individual: the story's protagonist.

+ +
+ + Read more... + +
+ +
+

+ + All Quiet on the Western Front - Erich Maria Remarque + +

+ + +
+

GoodReads Summary: +In 1914 a room full of German schoolboys, fresh-faced and idealistic, are +goaded by their schoolmaster to troop off to the ‘glorious war’. With the fire +and patriotism of youth they sign up. What follows is the moving story of a +young ‘unknown soldier’ experiencing the horror and disillusionment of life in +the trenches.

+ +
+ + Read more... + +
+ +
+

+ + Emotions Revealed: Understanding Faces and Feelings - Paul Ekman + +

+ + +
+

GoodReads Summary: +A renowned expert in nonverbal communication, Paul Ekman led a revolution in +our scientific understanding of emotions. In Emotions Revealed, he assembles +his research and theories to provide a comprehensive look at the evolutionary +roots of human emotions, including anger, sadness, fear, disgust, and +happiness.

+ +
+ + Read more... + +
+ +
+

+ + The Island of Doctor Moreau (Unabridged) - H.G. Wells + +

+ + +
+

GoodReads Summary: +While this riveting tale was intended to be a commentary on evolution, divine +creation, and the tension between human nature and culture, modern readers +familiar with genetic engineering will marvel at Wells’s prediction of the +ethical issues raised by producing “smarter” human beings or bringing back +extinct species. These levels of interpretation add a richness to Prendick’s +adventures on Dr. Moreau’s island of lost souls without distracting from what +is still a rip-roaring good read.

+ +
+ + Read more... + +
+ +
+

+ + The Forever War - Joe Haldeman + +

+ + +
+

GoodReads Summary: +The Earth's leaders have drawn a line in the interstellar sand—despite the +fact that the fierce alien enemy that they would oppose is inscrutable, +unconquerable, and very far away. A reluctant conscript drafted into an elite +Military unit, Private William Mandella has been propelled through space and +time to fight in the distant thousand-year conflict; to perform his duties +without rancor and even rise up through military ranks. Pvt. Mandella is +willing to do whatever it takes to survive the ordeal and return home. But +"home" may be even more terrifying than battle, because, thanks to the time +dilation caused by space travel, Mandella is aging months while the Earth he +left behind is aging centuries.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/4/index.html b/public/page/4/index.html new file mode 100644 index 0000000..3d0f8df --- /dev/null +++ b/public/page/4/index.html @@ -0,0 +1,392 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + 13 Hours (2016) + +

+ + +
+

Wikipedia Summary: +The film follows six members of Annex Security Team who fought to defend the +American diplomatic compound in Benghazi, Libya after waves of attacks by +militants on September 11, 2012.

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Google slams Microsoft for trying 'to break the way the open web works' + +

+ + +
+

Weird are the times when Google, trying to break the web, accuses Microsoft of +doing it so.

+ +
+ + Read more... + +
+ +
+

+ + The Geek's Guide to Dating - Eric Smith + +

+ + +
+

GoodReads Summary: +You keep your action figures in their original packaging. Your bedsheets are +officially licensed Star Wars merchandise. You're hooked on Elder Scrolls and +Metal Gear but now you've discovered an even bigger obsession: the new girl who +just moved in down the hall. What's a geek to do? Take some tips from Eric Smith +in The Geek's Guide to Dating. This hilarious primer leads geeks of all ages +through the perils and pitfalls of meeting women, going on dates, getting +serious, breaking up, and establishing a successful lifelong relationship (hint: +it's time to invest in new bedsheets). Full of whimsical 8-bit illustrations, +The Geek's Guide to Dating will teach fanboys everywhere to love long and +prosper.

+ +
+ + Read more... + +
+ +
+

+ + Greenland (2020) + +

+ + +
+

Wikipedia Summary: +The film follows a family who must fight for survival as a planet-destroying +comet races to Earth.

+ +
+ + Read more... + +
+ +
+

+ + Crap Dates - Rhodri Marsden + +

+ + +
+

GoodReads Summary:

+

A good date can be exhilarating: a shared joke, an improbable spark, long +moments of gazing fondly into each other's eyes. Not so for the dating disasters +featured in this collection of laugh-out-loud actual tweets about the most +terrible evenings imaginable. From seriously unwelcome confessions, to dousing +dates in wine, to bringing them back to creepy apartments to meet favorite +stuffed animals, here are the funniest and most alarming reports from dating's +front lines. Along the way, author Rhodri Marsden offers tips on how to identify +and avoid the worst of the bad daters, including married men, blatant liars, +deluded optimists, and more. This harrowing collection of real nightmare dates +will amuse anyone who's suffered through one of cupid's off nights.

+ +
+ + Read more... + +
+ +
+

+ + Undercity - Catherine Asaro + +

+ + +
+

GoodReads Summary: +Major Bhaajan, a former military officer with Imperial Space Command, is now a +hard-bitten P.I. with a load of baggage to deal with, and clients with woes +sometimes personal, sometimes galaxy-shattering, and sometimes both. Bhaajan +must sift through the shadows of dark and dangerous Undercity—the enormous +capital of a vast star empire—to find answers.

+ +
+ + Read more... + +
+ +
+

+ + Links for 2021-03-18 + +

+ + +
+

CI, Who Owns Your Data, Mac keybinds on Linux (and Windows), A Word About +Testing, Spring with GraalVM.

+ +
+ + Read more... + +
+ +
+

+ + Python + +

+ +
+ +
+

+ + Emacs + +

+ +
+ +
+

+ + Org-Mode + +

+ +
+ +
+ +
+ + + + diff --git a/public/page/40/index.html b/public/page/40/index.html new file mode 100644 index 0000000..2b20670 --- /dev/null +++ b/public/page/40/index.html @@ -0,0 +1,270 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + All You Need Is Kill - Hiroshi Sakurazaka + +

+ + +
+

GoodReads Summary: +When the alien Gitai invade, Keiji Kiriya is just one of many raw recruits +shoved into a suit of battle armor and sent out to kill. Keiji dies on the +battlefield, only to find himself reborn each morning to fight and die again +and again. On the 158th iteration though, he sees something different, +something out of place: the female soldier known as the Bitch of War. Is the +Bitch the key to Keiji’s escape, or to his final death?

+ +
+ + Read more... + +
+ +
+

+ + The Complete Collection - H.P. Lovecraft + +

+ + +
+

GoodReads Summary: +The weird fiction short stories of H.P. Lovecraft from 1917-1935. Excludes +collaborations.

+

The eBook’s table of contents is listed below. It includes the year each story +was written.

+ +
+ + Read more... + +
+ +
+

+ + AngularJS - Brad Green + +

+ + +
+

GoodReads Summary: +Develop smaller, lighter web apps that are simple to create and easy to test, +extend, and maintain as they grow. This hands-on guide introduces you to +AngularJS, the open source JavaScript framework that uses +Model–view–controller (MVC) architecture, data binding, client-side templates, +and dependency injection to create a much-needed structure for building web +apps.

+ +
+ + Read more... + +
+ +
+

+ + I Am Legend - Richard Matheson + +

+ + +
+

GoodReads Summary: +Robert Neville is the last living man on Earth... but he is not alone. Every +other man, woman and child on the planet has become a vampire, and they are +hungry for Neville's blood.

+

By day he is the hunter, stalking the undead through the ruins of +civilisation. By night, he barricades himself in his home and prays for the +dawn.

+ +
+ + Read more... + +
+ +
+

+ + Dogfight: How Apple and Google Went to War and Started a Revolution - Fred Vogelstein + +

+ + +
+

GoodReads Summary: +The rise of smartphones and tablets has altered the business of making +computers. At the center of this change are Apple and Google, two companies +whose philosophies, leaders, and commercial acumen have steamrolled the +competition. In the age of the Android and the iPad, these corporations are +locked in a feud that will play out not just in the marketplace but in the +courts and on screens around the world.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/5/index.html b/public/page/5/index.html new file mode 100644 index 0000000..0e476d8 --- /dev/null +++ b/public/page/5/index.html @@ -0,0 +1,401 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Wild Lawrencium + +

+ +
+ +
+

+ + Timeless Reactive Thrifty Mercury + +

+ +
+ +
+

+ + Commented Link: Mitigating Memory Safety Issues in Open Source Software + +

+ + +
+

Initially announced on HackerNews as "Google to Pay Developers to Port Their Code +to Rust" on this +post, +what is actually going on is not quite what it seems.

+

And it seems this time HackerNews comments actually got what it actually +means.

+ +
+ + Read more... + +
+ +
+

+ + Concise Guide To Databases - Peter Lake, Paul Crowther + +

+ + +
+

GoodReads +Summary: +This easy-to-read textbook/reference presents a comprehensive introduction to +databases, opening with a concise history of databases and of data as an +organisational asset. As relational database management systems are no longer +the only database solution, the book takes a wider view of database technology, +encompassing big data, NoSQL, object and object-relational, and in-memory +databases. The text also examines the issues of scalability, availability, +performance and security encountered when building and running a database in the +real world.

+ +
+ + Read more... + +
+ +
+

+ + The Escort (2015) + +

+ + +
+

Wikipedia Summary:

+

Journalist Mitch is a sex addict. When he is fired, he applies for a job with a +magazine. The editor promises to hire him if he writes a more interesting +article than his competitors. He decides to write about Natalie, a +Stanford-educated escort he met by chance.

+ +
+ + Read more... + +
+ +
+

+ + Pretty Lyrical Francium + +

+ +
+ +
+

+ + Central Station - Lavie Tidhar + +

+ + +
+

GoodReads Summary: +When Boris Chong returns to Tel Aviv from Mars, much has changed. Boris’s +ex-lover is raising a strangely familiar child who can tap into the datastream +of a mind with the touch of a finger. His cousin is infatuated with a +robotnik—a damaged cyborg soldier who might as well be begging for parts. His +father is terminally-ill with a multigenerational mind-plague. And a hunted +data-vampire has followed Boris to where she is forbidden to return.

+ +
+ + Read more... + +
+ +
+

+ + "Repent, Harlequin!" Said the Ticktockman - Harlan Ellison + +

+ + +
+

Wikipedia Summary: +The story is a satirical look at a dystopian future in which time is strictly +regulated and everyone must do everything according to an extremely precise +time schedule.

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Giving More Time For Our Recent Update + +

+ + +
+

WhatsApp recently decided to change the way they allow people using their +platform, allowing Facebook to collect information. But the backlash was a bit +too much and now they are... erm... giving more time for you to accept +it. But some +things really don't pan out.

+ +
+ + Read more... + +
+ +
+

+ + Learn Amazon Web Services In A Month Of Lunches + +

+ + +
+

GoodReads Summary:

+

AWS gives users the networking, compute, and security services they need without +making them pay for anything they're not actually using. With almost a hundred +individual AWS services, putting all the pieces together is not a simple +thing. That's where this book can help.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/6/index.html b/public/page/6/index.html new file mode 100644 index 0000000..43b3a37 --- /dev/null +++ b/public/page/6/index.html @@ -0,0 +1,398 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Realm of Racket: Lean to Program, One Game at a Time! + +

+ + +
+

GoodReads Summary: +Racket is a descendant of Lisp, a programming +language renowned for its elegance, power, and challenging learning +curve. But while Racket retains the functional goodness of Lisp, it +was designed with beginning programmers in mind. Realm of Racket is +your introduction to the Racket language.

+ +
+ + Read more... + +
+ +
+

+ + Go problem is not the XML vulnerability + +

+ + +
+

Yesterday I posted some comments about the vulnerability in go XML +stdlib and some people said it was not a big +deal.

+

The problem is not the vulnerability in itself, though.

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Coordinated disclosure of XML round-trip vulnerabilities in Go’s standard library + +

+ + +
+

Mattermost, along with Google, announced a vulnerability in the Go XML +stdlib. +There is a bunch of things to unwrap in this announcement.

+ +
+ + Read more... + +
+ +
+

+ + Commented link: Expanding Fuchsia's open source model + +

+ + +
+

Google recently announced they they are changing the open source +model +of their new open source OS called Fuchsia. But there are so many red flags one +has to wonder what the announcement actually is.

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Google illegally spied on workers before firing them, US labor board alleges + +

+ + +
+

TheVerge posted some news about Google Firing +Workers +based on information from a company they hired to spy their own workers.

+ +
+ + Read more... + +
+ +
+

+ + King Kong (2005) + +

+ + +
+

IMDB Summary: A greedy film +producer assembles a team of moviemakers and sets out for the infamous +Skull Island, where they find more than just cannibalistic natives.

+ +
+ + Read more... + +
+ +
+

+ + The Colony (2013) + +

+ + +
+

IMDB Summary: +Forced underground by the next ice age, a struggling outpost of survivors must +fight to preserve humanity against a threat even more savage than nature.

+ +
+ + Read more... + +
+ +
+

+ + Condensed Sodium + +

+ +
+ +
+

+ + Meet the Censors (2020) + +

+ + +
+

IMDB Summary: +From a Kafkaesque office for social media in Germany into South Sudan military +headquarters, to conversations with an Iranian Ayatollah, Indian film censors +and Chinese news editors. Norwegian filmmaker Håvard Fossum has traveled the +world to understand what censorship is, allowing the censors themselves to +state their case.

+ +
+ + Read more... + +
+ +
+

+ + Nekrotronic (2018) + +

+ + +
+

IMDB Summary: +A man who discovers that he is part of a secret sect of magical beings who hunt +down and destroy demons in the internet.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/page/7/index.html b/public/page/7/index.html new file mode 100644 index 0000000..2ba62b6 --- /dev/null +++ b/public/page/7/index.html @@ -0,0 +1,383 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Spy Game (2001) + +

+ + +
+

IMDB Summary: +Retiring CIA agent Nathan Muir recalls his training of Tom Bishop while working +against agency politics to free him from his Chinese captors.

+ +
+ + Read more... + +
+ +
+

+ + Survive the Night (2020) + +

+ + +
+

IMDB Summary: +A disgraced doctor and his family are held hostage at their home by criminals +on the run, when a robbery-gone-awry requires them to seek immediate medical +attention.

+ +
+ + Read more... + +
+ +
+

+ + You've Been Trumped Too (2016) + +

+ + +
+

IMDB Summary: +A chronicle of the confrontation between billionaire Donald Trump and feisty +92-year-old Scottish widow, Molly Forbes.

+ +
+ + Read more... + +
+ +
+

+ + Lazy Kovar + +

+ +
+ +
+

+ + Swan Song - Robert R. McCammon + +

+ + +
+

GoodReads Summary: +Swan is a nine-year-old Idaho girl following her struggling mother from one +trailer park to the next when she receives visions of doom—something far wider +than the narrow scope of her own beleaguered life. In a blinding flash, nuclear +bombs annihilate civilization, leaving only a few buried survivors to crawl +onto a scorched landscape that was once America.

+ +
+ + Read more... + +
+ +
+

+ + Gaga Silly Germanium + +

+ +
+ +
+

+ + Treadstone (2019) + +

+ + +
+

IMDB Summary: +The Treadstone project, having created super spy Jason Bourne, turns its +attention on a new protocol to develop unstoppable superhuman assassins.

+ +
+ + Read more... + +
+ +
+

+ + Grand Prix Driver + +

+ + +
+

IMDB Summary: +Grand Prix Driver goes inside the secretive world of Formula 1 by offering +never-before-granted access to the inner workings of McLaren. Narrated by +Michael Douglas.

+ +
+ + Read more... + +
+ +
+

+ + American Playboy: The Hugh Hefner Story + +

+ + +
+

IMDB Summary: +The Amazon Original Series draws from unprecedented access to more than 17,000 +hours of footage and over 2,600 scrapbooks from Hefner's personal archives, +chronicling the life of an American icon and the history of the brand he +created.

+ +
+ + Read more... + +
+ +
+

+ + Radioactive Jagged Copper + +

+ +
+ +
+ +
+ + + + diff --git a/public/page/8/index.html b/public/page/8/index.html new file mode 100644 index 0000000..e0d7a36 --- /dev/null +++ b/public/page/8/index.html @@ -0,0 +1,359 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Ad Astra (2019) + +

+ + +
+

IMDB Summary: +Astronaut Roy McBride undertakes a mission across an unforgiving solar system +to uncover the truth about his missing father and his doomed expedition that +now, 30 years later, threatens the universe.

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: Programming Sucks + +

+ + +
+

This is not my usual sharing, 'cause I usually share serious stuff ('cause, you +know, I do serious business), but this is seriously funny take on the problems +of programming

+ +
+ + Read more... + +
+ +
+

+ + What The Hell Is Apple Doing? + +

+ + +
+

Apple announced that the new iPhone won't come with a charger or earphones, "to +help the environment". And a lot of people said they are just trying to get +more money.

+

But maybe there is something more in this.

+ +
+ + Read more... + +
+ +
+

+ + Learn you some Erlang for great good! - Fred Hebert + +

+ + +
+

GoodReads Summary: +(No Summary)

+ +
+ + Read more... + +
+ +
+

+ + Commented Link: 1Password for Linux beta is now open + +

+ + +
+

1Password, the famous password management tool, published a blog about +releasing a beta version of their tool for +Linux.

+ +
+ + Read more... + +
+ +
+

+ + Commented link: Open source licensing and why we're changing Plausible to the AGPL license + +

+ + +
+

Plausible is a competitor for Google Analytics, without the need of exposing +your visitors data to some company. And recently they changed their license to +AGPL, where they explain why.

+ +
+ + Read more... + +
+ +
+

+ + Tacit Beryllium + +

+ +
+ +
+

+ + Wiggly Duralim + +

+ +
+ +
+

+ + Condensed Fernico + +

+ +
+ +
+

+ + Potent Thrifty Iridium + +

+ +
+ +
+ +
+ + + + diff --git a/public/page/9/index.html b/public/page/9/index.html new file mode 100644 index 0000000..78e101e --- /dev/null +++ b/public/page/9/index.html @@ -0,0 +1,468 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Abounding Palladium + +

+ +
+ +
+

+ + Normative Robust Platinum + +

+ +
+ +
+

+ + Timeless Uranium + +

+ +
+ +
+

+ + The Hidden Value of TikTok + +

+ + +
+

As if 2020 wasn't weird enough, Oracle bought the US operations of TikTok, +which makes no sense.

+

Except when it does.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-08-29 + +

+ + +
+

YouTube Unhideable Political Ads, Fediverse Out of Play Store, Haskell From +Zero, Haskell Mini-Patterns, Rust Thread Pools, Embedded Rust Logging Crate, +Predicable Oracle, Falsehoods About Addresses, Track This.

+ +
+ + Read more... + +
+ +
+

+ + Functional Python Programming - Create Succinct and Expressive Implementations with Python - Steven F. Lott + +

+ + +
+

GoodReads Summary: +With Functional Python Programming by your side you’ll understand the core +concepts of function Python, its impact on the programming workflow, and how +to implement it in Python, giving you the ability to take your applications to +an even higher level.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-08-15 + +

+ + +
+

Rust Docs On the Comand Line, Emacs Doom, Apple ARM Cascade Effect, Software +Architecture, Uploads in Flask, Flask and Prometheus, Rust in Apple, +Configuration Files In Rust, Rust Builder Pattern, Ruining Phipher Sites With +Bash, Run Code Online, Free Action Cult, What Is Mozilla, Rust SPAs, GNOME +Extensions, Git in Rust.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-08-09 + +

+ + +
+

VimConf, Better SQL, Git Branches, Excel Fucking Science, OpenJDK on ARM, Rust +CLI Tools, DataFrames in Rust, World Windows.

+ +
+ + Read more... + +
+ +
+

+ + Introducing Erlang: Getting Started in Functional Programming - Simon St. Laurent + +

+ + +
+

GoodReads Summary: +If you’re new to Erlang, its functional style can seem difficult, but with +help from this hands-on introduction, you’ll scale the learning curve and +discover how enjoyable, powerful, and fun this language can be.

+ +
+ + Read more... + +
+ +
+

+ + Commented Links for 2020-08-02 + +

+ + +
+

Async/Await Fails, Facebook Complains About iOS 14, Telegram on Emacs, Go is +Google Language, Copyleft is Copyright, Google Blaiming "The Algorithm" Again, +Many Teams Fragmentations.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/poole.css b/public/poole.css new file mode 100644 index 0000000..1d44241 --- /dev/null +++ b/public/poole.css @@ -0,0 +1 @@ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{margin:0;padding:0}html{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;line-height:1.5}@media (min-width: 38em){html{font-size:20px}}body{color:#515151;background-color:#fff;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a{color:#268bd2;text-decoration:none}a:hover,a:focus{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:bold;line-height:1.25;color:#313131;text-rendering:optimizeLegibility}h1{font-size:2rem}h2{margin-top:1rem;font-size:1.5rem}h3{margin-top:1.5rem;font-size:1.25rem}h4,h5,h6{margin-top:1rem;font-size:1rem}p{margin-top:0;margin-bottom:1rem}strong{color:#303030}ul,ol,dl{margin-top:0;margin-bottom:1rem}dt{font-weight:bold}dd{margin-bottom:.5rem}hr{position:relative;margin:1.5rem 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr{font-size:85%;font-weight:bold;color:#555;text-transform:uppercase}abbr[title]{cursor:help;border-bottom:1px dotted #e5e5e5}code,pre{font-family:Menlo,Monaco,"Courier New",monospace}code{padding:.25em .5em;font-size:85%;color:#bf616a;background-color:#f9f9f9;border-radius:3px}pre{display:block;margin-top:0;margin-bottom:1rem;padding:1rem;font-size:.8rem;line-height:1.4;overflow-x:scroll;background-color:#f9f9f9}pre code{padding:0;font-size:100%;color:inherit;background-color:rgba(0,0,0,0)}.highlight{margin-bottom:1rem;border-radius:4px}.highlight pre{margin-bottom:0}blockquote{padding:.5rem 1rem;margin:.8rem 0;color:#7a7a7a;border-left:.25rem solid #e5e5e5}blockquote p:last-child{margin-bottom:0}@media (min-width: 30em){blockquote{padding-right:5rem;padding-left:1.25rem}}img{display:block;margin:0 0 1rem;border-radius:5px;max-width:100%}table{margin-bottom:1rem;width:100%;border:1px solid #e5e5e5;border-collapse:collapse}td,th{padding:.25rem .5rem;border:1px solid #e5e5e5}tbody tr:nth-child(odd) td,tbody tr:nth-child(odd) th{background-color:#f9f9f9}.lead{font-size:1.25rem;font-weight:300}.message{margin-bottom:1rem;padding:1rem;color:#717171;background-color:#f9f9f9}.container{max-width:38rem;padding-left:1rem;padding-right:1rem;margin-left:auto;margin-right:auto}.masthead{padding-top:1rem;padding-bottom:1rem;margin-bottom:3rem}.masthead-title{margin-top:0;margin-bottom:0;color:#505050}.masthead-title a{color:#505050}.masthead-title small{font-size:75%;font-weight:400;color:silver;letter-spacing:0}.page,.post{margin-bottom:4em}.page-title,.post-title,.post-title a{color:#303030}.page-title,.post-title{margin-top:0}.post-date{display:block;margin-top:-.5rem;margin-bottom:1rem;color:#9a9a9a}.related{padding-top:2rem;padding-bottom:2rem;border-top:1px solid #eee}.related-posts{padding-left:0;list-style:none}.related-posts h3{margin-top:0}.related-posts li small{font-size:75%;color:#999}.related-posts li a:hover{color:#268bd2;text-decoration:none}.related-posts li a:hover small{color:inherit}.footnote-definition:first-of-type{border-top:1px solid;padding-top:1rem}.footnote-definition{margin-top:1rem}.footnote-definition sup{margin-left:-1rem;float:left}.pagination{overflow:hidden;margin-left:-1rem;margin-right:-1rem;font-family:"PT Sans",Helvetica,Arial,sans-serif;color:#ccc;text-align:center}.pagination-item{display:block;padding:1rem;border:1px solid #eee}.pagination-item:first-child{margin-bottom:-1px}a.pagination-item:hover{background-color:#f5f5f5}@media (min-width: 30em){.pagination{margin:3rem 0}.pagination-item{float:left;width:50%}.pagination-item:first-child{margin-bottom:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination-item:last-child{margin-left:-1px;border-top-right-radius:4px;border-bottom-right-radius:4px}} \ No newline at end of file diff --git a/public/presentations/index.html b/public/presentations/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/presentations/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/print.css b/public/print.css new file mode 100644 index 0000000..2113a74 --- /dev/null +++ b/public/print.css @@ -0,0 +1 @@ +.sidebar{display:none !important}.content{margin:0 auto;width:100%;float:none;display:initial}.container{width:100%;float:none;display:initial;padding-left:1rem;padding-right:1rem;margin:0 auto} \ No newline at end of file diff --git a/public/projects/astatine/index.html b/public/projects/astatine/index.html new file mode 100644 index 0000000..b871153 --- /dev/null +++ b/public/projects/astatine/index.html @@ -0,0 +1,195 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Nice Troubled Astatine

+ +

Note Taking Application

+ +

A (I hope) novel idea about note taking apps: Instead of keeping the notes and +having either links or tags to link different content, each note is short and +you can create a thread of notes, somewhat similar to the way microblogging +tools like Twitter and Mastodon work.

+

Still thinking on storage. Initially, it feels like using SQLite would suffice, +but I'd prefer some text format for not "locking" the content into a single +thing.

+

Text Storage could be a couple of Markdown with special links, but that means +that building a whole graph of connected notes (all the threads in your notes) +would take a massive time, since every note would have to be scanned and marked +as a parent or child of another (also, a child note could appear before a +parent, and we would need to take that in care). Another solution would use a +hidden file for the index: all notes are markdown (with or without the special +links) but a single file contains the whole note structure. This could create +an issue when the user manually changes a note.

+

Ideas for a GUI

+

Insert note

+
+-------------------------------------------------+
+| +---------------------------------------------+ |
+| | New note:                                   | |
+| | [                                         ] | |
+| | [                                         ] | |
+| |                               [ + Add new ] | |
+| +---------------------------------------------+ |
+|                                                 |
+| +---------------------------------------------+ |
+| | This is a note                              | |
+| | 2022-08-03 15:53  [ Delete ] [ + Followup ] | |
+| +---------------------------------------------+ |
+|                                                 |
+| +---------------------------------------------| |
+| | Another note, not necessarily a follow up   | |
+| | of the one above.                           | |
+| | 2022-08-03 15:50  [ Delete ] [ + Followup ] | |
+| +---------------------------------------------+ |
++-------------------------------------------------+
+
+

Map view

+
              +-------------------------+
+             -| A follow up of "A note" |
++---------+ / +-------------------------+
+| A note  |-
++---------+ \ +-------------------+   +------------------------+
+             -| Another follow up |---| Follow up of "Another" |
+              +-------------------+   +------------------------+
+
+

Storage

+

Since we are keeping things in Markdown, it seems it would be good to have a +proper format that could also be read as a normal markdown.

+
# Note title
+
+This is a note
+---
+2022-08-23 15:53
+[parent-note-id](parent note)
+Children:
+  - [child1](Child 1)
+  - [child2](Child 2)
+
+
# A note
+
+This note has no parent and no children.
+
+---
+2023-07-27 14:46
+
+
# A parent note
+
+This note has no parent, only children.
+
+---
+2022-08-23 15:53
+Children:
+  - [child1](Child 1)
+  - [child2](Child 2)
+
+

The "note title" would also be the filename, sluggered (if that's even a +word). Also note that the GUI design does not have title, but those are +interesting 'cause that would produce the proper filename1.

+

Another option for the title: Top level notes can have just one line, which is +the title for the thread. All child notes could have a versioning-like scheme +for them, like

+
Single line note  (becomes single-line-note.md)
+|-- note content (becomes single-line-note-1.md)
+| |-- another note content (becomes single-line-note-1-1.md)
+| \-- more content (becomes single-line-content-1-2.md)
+\-- more content (becomes single-line-note-2.md)
+
+

This can be done 'cause the note we would add a follow up already have a list +of children, so it's just a matter of adding "-1" if the note has no children +yet, or "last id + 1" otherwise.

+

There should be an index of sorts, with all the notes in order of insertion +(most recent to the oldest), just to speed up loading. This "index" would be +read as paging, so if we want Page 10, we would probably need

+

Web

+

One nice thing to have, which could replace the GUI, is to have a Web +interface. This would allow using outside our device (as long as it have +internet access) and to make notes public or private.

+

If we do this, there should be two indexes files: One for everything and one +for only public notes. When the user is logged in (and since notes are +personal, only one user would be accepted), the system loads notes from the all +notes index; if it is not, only the public notes index is read.

+
+
1 +

Note that there aren't titles in the GUI mock up 'cause the Mockup is +older than the idea of using Markdown files, and I want to keep some +"history" of the project there.

+
+ +
+ + + + +
+ + + + diff --git a/public/projects/beryllium/index.html b/public/projects/beryllium/index.html new file mode 100644 index 0000000..dc6d597 --- /dev/null +++ b/public/projects/beryllium/index.html @@ -0,0 +1,92 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Tacit Beryllium

+ +

Telegram bot in Rust.

+
    +
  1. If the user sends a message with a link but didn't interact with the group +before, the message is deleted.
  2. +
  3. URL blocklist; if message contains an URL from the blocklist, the message is +deleted.
  4. +
  5. Welcome message (so, not so tacit, huh?). The main idea is to tell people +how to share content in the group (use Gist, not paste images or code +directly, etc).
  6. +
  7. Validate that the account is a real person? ("Click here to confirm you're a +person") This doesn't invalidate point 1, as the person may connect, click +the link and then simply some automate process post content.
  8. +
+ +
+ + + + +
+ + + + diff --git a/public/projects/copper/index.html b/public/projects/copper/index.html new file mode 100644 index 0000000..b99778e --- /dev/null +++ b/public/projects/copper/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Radioactive Jagged Copper

+ +

Rust Joplin Clone.

+

Probably write something in Gtk-Rs (or similar) using the same format as +Joplin, so their clients can be used for the same data.

+

Options for frontend:

+ + +
+ + + + +
+ + + + diff --git a/public/projects/duralim/index.html b/public/projects/duralim/index.html new file mode 100644 index 0000000..f197d5c --- /dev/null +++ b/public/projects/duralim/index.html @@ -0,0 +1,92 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Wiggly Duralim

+ +

Rust WebDAV server.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/fernico/index.html b/public/projects/fernico/index.html new file mode 100644 index 0000000..a0dd34a --- /dev/null +++ b/public/projects/fernico/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Condensed Fernico

+ +

CLI Finance

+ + +
+ + + + +
+ + + + diff --git a/public/projects/francium/index.html b/public/projects/francium/index.html new file mode 100644 index 0000000..aae2e98 --- /dev/null +++ b/public/projects/francium/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pretty Lyrical Francium

+ +

Personal Last.Fm.

+

Service that runs on the user machine to collect information about music +played, using the Libre.Fm/Last.Fm API.

+

I'm more interested in all the graphs than anything else.

+ +
+ + + + +
+ + + + diff --git a/public/projects/germanium/index.html b/public/projects/germanium/index.html new file mode 100644 index 0000000..d5f0730 --- /dev/null +++ b/public/projects/germanium/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Gaga Silly Germanium

+ +

Git Static Generator.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/index.html b/public/projects/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/projects/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/projects/iridium/index.html b/public/projects/iridium/index.html new file mode 100644 index 0000000..0672123 --- /dev/null +++ b/public/projects/iridium/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Potent Thrifty Iridium

+ +

ARCHIVED pgcli does everything I wish.

+

Postgres Text Interface.

+ +
+----------------------------------------+
+| *Connected to XXX*                     |
++----------------------------------------+
+| Query                                  |
+|                                        |
+|                                        |
+|                                        |
++----------------------------------------+
+| Results                                |
+| +----+---------+----------+------+---> |
+| | Fi | Field   | Field    | Fiel | F   |
+| +----+---------+----------+------+---> |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| +----+---------+----------+------+---> |
++----------------------------------------+
+
+ + +
+ + + + +
+ + + + diff --git a/public/projects/kovar/index.html b/public/projects/kovar/index.html new file mode 100644 index 0000000..22337c6 --- /dev/null +++ b/public/projects/kovar/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Lazy Kovar

+ +

Likes Keeper.

+

Just a bunch of microservices in Rust, to explore how it could be done.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/lawrencium/index.html b/public/projects/lawrencium/index.html new file mode 100644 index 0000000..ac56218 --- /dev/null +++ b/public/projects/lawrencium/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Wild Lawrencium

+ +

Work Log.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/mercury/index.html b/public/projects/mercury/index.html new file mode 100644 index 0000000..ef2d7e2 --- /dev/null +++ b/public/projects/mercury/index.html @@ -0,0 +1,92 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Timeless Reactive Thrifty Mercury

+ +

Top Reddit to Mastodon.

+

Crawls Reddit subreddits and create a post on Mastodon when it reaches a +threshold.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/palladium/index.html b/public/projects/palladium/index.html new file mode 100644 index 0000000..d094445 --- /dev/null +++ b/public/projects/palladium/index.html @@ -0,0 +1,92 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Abounding Palladium

+ +

Activity Pub

+ + +
+ + + + +
+ + + + diff --git a/public/projects/platinum/index.html b/public/projects/platinum/index.html new file mode 100644 index 0000000..0560239 --- /dev/null +++ b/public/projects/platinum/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Normative Robust Platinum

+ +

Name Rust Project

+ +

Repository: nrp.git

+ +
+ + + + +
+ + + + diff --git a/public/projects/rubidium/index.html b/public/projects/rubidium/index.html new file mode 100644 index 0000000..e461480 --- /dev/null +++ b/public/projects/rubidium/index.html @@ -0,0 +1,182 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Thrifty Rubidium

+ +

Task Runner.

+

The basic idea is to have a bunch of tasks, and each task have a step. Based on +the parallelism available (number of cores, for example), the system would +launch each step on each task as long as there is available processing power.

+

Let's start with the definition of task: A task could be, very simply, a +directory with a runner configuration file, where the steps are defined. For +example:

+
{
+	"name": "ExampleTask",
+	"steps": [
+		{
+			"name": "Get List",
+			"command": "ls > file.ls"
+		},
+		{
+			"name": "Find file",
+			"command": "grep somename file.ls"
+		},
+		{
+			"name": "Remove file",
+			"command": "rm file.ls"
+		}
+	]
+}
+
+

If one of the steps fails, the whole task stops. For example, if grep returns +an error code, "Rmeove file" would not be run.

+
+

Thought: Maybe we could add a flag on each step to point that the steps +should keep going even in case of error.

+ +
+

The first step is to walk all directories, trying to find out which ones +contain the task configuration file. Once found, it will be added to the list +of running tasks, and the steps will start running.

+

One multiple tasks we could have something like this +(TUI idea, also):

+
Task         Step 1        Step 2         Step 3           Step 4
+ExampleTask  Get list (R)  Find file (W)  Remove file (W)
+Task2        Step21 (D)    Step 22 (R)    Step 23 (W)      Step 24 (W)
+Task3        Step31 (R)    Step 32 (W)    Step 33 (W)
+Task4        Step41 (D)    Step 42 (R)
+Task5        Step51 (E)    Step 52 (S)    Step 53 (S)
+
+

In this example, there are 4 available cores, so only 4 steps can run at the +same time; those are marked as (R) for Running. Once the step is Done, marked +as (D), task can move to the next step. Steps marked with (W) are Waiting +for their time to be run, which requires the previous step to be marked as Done +and having enough cores available. If a step errors, (E), the task stops +running and the next steps are marked as Skipped, (S).

+

The structures to load the tasks is pretty simple:

+
pub struct Case {
+	name: String,
+	steps: Vec<Step>
+}
+
+pub struct Step {
+	name: String,
+	command: Command,
+}
+
+pub struct Command {
+	command: String,
+	name: String,
+}
+
+

After reading the data from the disk, the code could check if the step is "valid", +like checking if the command exists and can be called. The Command doesn't +exist in the configuration file, but it is generated while being loaded; the +command itself it is the command specificed in the runner configuration file, +but its main component is extracted and put in the name, to make it easier to +display to the user; for example /usr/bin/ls -lha in the configuration file +would have the same value in the command field, but the name would be +simply "ls".

+

For every structure, they is a "sister" structure "Run", with the results of +the execution:

+
pub struct CaseRun {
+	case: &Case,
+	status: CaseRunStatus,
+}
+
+pub enum CaseRunStatus {
+	PendingSteps,		// there are still steps to be run in this case
+	Completed,		// no more steps available
+	Error,			// one step failed and it shouldn't run anymore
+}
+
+pub struct StepRun {
+	step: &Step,
+	status: StepRunStatus,
+	output: String,
+}
+
+pub enum StepRunStatus {
+	Waiting,
+	Running,
+	Done,
+	Error,
+	Skipped,
+}
+
+ +
+ + + + +
+ + + + diff --git a/public/projects/sodium/index.html b/public/projects/sodium/index.html new file mode 100644 index 0000000..c48f6a8 --- /dev/null +++ b/public/projects/sodium/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Condensed Sodium

+ +

A Client Status web app.

+ +
+----------------------------------+
+| +-----------+ +----------------+ |
+| | Client 1  | | Client 2       | |
+| | No issues | | Await response | |
+| +-----------+ +----------------+ |
++----------------------------------+
+
+

"Await response" is the text of the interaction.

+
+----------------------------------+
+| Client 2        [ See Contacts ] |
+|                                  |
+| New interaction:                 |
+| [                              ] |
+| [                              ] |
+| [                              ] |
+|            [ Await ] [ Success ] |
+|                                  |
+| Previous interactions:           |
+| * DATE - Asked if this works   ! |
+| * DATE - Await response        ? |
++----------------------------------+
+
+

"Previous interactions" goes from the oldest to the newest results.

+ +
+ + + + +
+ + + + diff --git a/public/projects/tin/index.html b/public/projects/tin/index.html new file mode 100644 index 0000000..f15d066 --- /dev/null +++ b/public/projects/tin/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Degenerated Brief Tin

+ +

Download Bookmarked Toots.

+ + +
+ + + + +
+ + + + diff --git a/public/projects/uranium/index.html b/public/projects/uranium/index.html new file mode 100644 index 0000000..0dda527 --- /dev/null +++ b/public/projects/uranium/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Timeless Uranium

+ +

Time Up!

+ +

Repository: tu.git

+ +
+ + + + +
+ + + + diff --git a/public/pt/announcements/going-live/index.html b/public/pt/announcements/going-live/index.html new file mode 100644 index 0000000..2fe8a17 --- /dev/null +++ b/public/pt/announcements/going-live/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

AO VIVO!

+ +

Por causa da pandemia, pensei em fazer o que muitos estão fazendo hoje: Fazer +lives.

+

Onde vão acontecer?

+

As lives vão acontecer, inicialmente no +Twitch. Vídeos das lives vão depois pro +YouTube.

+

A princípio, eu queria colocar os vídeos diretamente no meu domínio, +provavelmente com o PeerTube, mas eu ainda não +tive tempo de tentar instalar.

+

O que vai ser apresentado?

+

Qualquer coisa, basicamente. Inicialmente, eu tenho a seguinte ideia:

+ +

Quando vão acontecer?

+

No momento, não tenho um horário definido. Minha vida está um pouco "fluída" +no momento e não queria me comprometer a fazer apresentações sempre no mesmo +dia e horário enquanto a situação encontra-se nesse ponto.

+

Mas vão ser sempre a noite.

+

Se não tem horário, quando eu sei que vai acontecer?

+

Eu provavelmente vou avisar no Twitter e no +Mastodon, um bom tempo antes (algo +como meia-hora e/ou uma hora antes).

+ + +
+ + + + +
+ + + + diff --git a/public/pt/announcements/index.html b/public/pt/announcements/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/announcements/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/books/shell-por-dia/comandos-obscuros/index.html b/public/pt/books/shell-por-dia/comandos-obscuros/index.html new file mode 100644 index 0000000..3d57c1c --- /dev/null +++ b/public/pt/books/shell-por-dia/comandos-obscuros/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell por Dia: Comandos Obscuros

+ +

Existem alguns comandos que quase não são usados e por isso são pouco +comentados, mas se algum dia precisar, eles estão lá.

+
+

Todos os comandos listados aqui são parte do "GNU CoreUtils" e +estão presentes na maior parte das distribuições Linux. Se você estiver usando +uma distribuição de BSD, possivelmente vai precisar instalar o pacote do +CoreUtils antes de poder usar.

+ +
+

Em nenhuma ordem em particular:

+ + +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/entradas-e-saidas/index.html b/public/pt/books/shell-por-dia/entradas-e-saidas/index.html new file mode 100644 index 0000000..7b906f3 --- /dev/null +++ b/public/pt/books/shell-por-dia/entradas-e-saidas/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell Por Dia: Entradas e Saídas

+ +

Antes de sairmos vendo comandos e coisas do tipo, vamos começar com um conceito +básico: entradas e saídas.

+

Para entradas e saídas em sistemas POSIX (incluindo os Unixes e Linux), existem +três "descritores" que estão presentes para todas as aplicações:

+ +

Por exemplo, quando uma aplicação começa a jogar informações para o usuário, +ela está escrevendo no stdout; quando a aplicação fica esperando que o +usuário digite alguma coisa, ela fica tentando ler de stdin.

+

A importância desta informação ficará mais clara mais pra frente, quando +começarmos a ver redicionamentos e pipes.

+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/error-chain/index.html b/public/pt/books/shell-por-dia/error-chain/index.html new file mode 100644 index 0000000..1f6976d --- /dev/null +++ b/public/pt/books/shell-por-dia/error-chain/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell por Dia: Error Chain

+ +

Quando um comando é executado, ele "emite" um código para o shell indicando o +resultado de sua execução. Por exemplo, se você rodar ls e estiver no Bash, +você pode ver o resultado do comando com echo $? -- que será 0, já que o ls +conseguiu executar (a não ser que você esteja num diretório que não tem +permissão de listar o conteúdo, mas enfim).

+
+

Para quem programa/programou em C, deve lembrar das constantes EXIT_SUCCESS e +EXIT_FAILURE, que ficavam no final do main(). Bom, SUCCESS tem definido o +valor 0 e FAILURE 1, e se você quiser, pode brincar de criar uma aplicação que +retorne os dois valores e verificar o resultado com o echo $?.

+ +
+

Algumas aplicações utilizam vários códigos diferentes para indicar que a +execução foi terminada por um erro específico.

+

Mas para encadeamento de erros, só precisamos saber que 0 é "tudo terminou +certo" e qualquer coisa diferente disso é "deu erro".

+

Para encadear comandos, podemos usar && e ||.

+

&& indica "se o comando anterior terminar em sucesso, execute o próximo +comando". Por exemplo ls && cp arq1 arq2 indica que, se o ls terminar com +sucesso, então o comando cp (que copia arquivos) será executado; se, por algum +motivo, o ls falhasse, o comando cp não seria executado.

+

|| indica "se o comando anterior falhar, execute o próximo comando". Assim, +ls || cp arq1 arq2 faria com que o cp somente fosse executado se o ls +falhasse.

+

E vários comandos podem ser encadeados dessa forma:

+
ls && cp arq1 dir/arq2 || mkdir dir
+
+

Irá fazer o ls; se ele não falhar, executa o cp; se o cp falhar, cria o +diretório.

+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/index.html b/public/pt/books/shell-por-dia/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/books/shell-por-dia/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/books/shell-por-dia/introducao/index.html b/public/pt/books/shell-por-dia/introducao/index.html new file mode 100644 index 0000000..b7dbf9e --- /dev/null +++ b/public/pt/books/shell-por-dia/introducao/index.html @@ -0,0 +1,84 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell Por Dia: Introdução

+ +

Assim como eu já tinha feito com "Um Python Por Dia" e "Um Vim Por Dia", eu +comecei uma nova série com os colegas de trabalho, chamado "Um Shell Por Dia".

+

A ideia é passar pequenas pérolas sobre shell, uma por dia. Isso envolve tanto +coisas comuns entre shells -- como, por exemplo, redirecionamento de entradas e +saídas -- quanto comandos mais comuns -- como, por exemplo, wc ou time.

+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/jobs/index.html b/public/pt/books/shell-por-dia/jobs/index.html new file mode 100644 index 0000000..3243850 --- /dev/null +++ b/public/pt/books/shell-por-dia/jobs/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell por Dia: Jobs

+ +

Algumas vezes estamos rodando um comando que é demorado, mas precisamos ter +acesso novamente ao shell por algum motivo. Para isso, podemos suspender a +execução do processo com as teclas Ctrl+z. Um processo suspendo não executa +nada e não consome CPU, mas ainda está presente no sistema -- sendo chamado de +"job" nesse ponto.

+

Para ver a lista de jobs, basta chamar jobs. Note que o resultado desse +comando é a lista do nome do processo com um identificador.

+

Uma vez que eu tenha feito que precisava ser feito e quiser voltar para +aplicação, usa-se o comando fg (de "foreground"). Entretanto, eu posso querer +que a aplicação continue executando, mas não em primeiro plano; para isso, +existe o comando bg (de "background"). Chamados diretamente, fg e bg irão +trabalhar com o último comando executado mas é possível indicar um processo +específico para estes, usando o identificador apresentado em jobs.

+
+

Uma forma de fazer uma aplicação iniciar diretamente em background é usar um & +no final da chamada; por exemplo curl url & irá iniciar o curl mas deixar o +terminal liberado, pois o comando estará rodando em background.

+

Seria o mesmo que chamar curl url, usar Ctrl+z para suspender a execução e +depois usar bg para fazer o processo rodar em background.

+ +
+

Quando um processo está em background, o terminal fica "bloqueado" para logouts +-- pois, afinal de contas, o shell ainda é pai dos processos, mesmo que eles +estejam em background. Para passar a guarda de um processo filho para o init -- +e, assim, poder ser encerrado sem problemas -- pode-se usar o comando +disown. Assim, o processo em background ou suspendo passa a ser filho do init +e o terminal pode ser encerrado sem que o processo anterior seja encerrado junto.

+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/pipes/index.html b/public/pt/books/shell-por-dia/pipes/index.html new file mode 100644 index 0000000..9944849 --- /dev/null +++ b/public/pt/books/shell-por-dia/pipes/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell Por Dia: Pipes

+ +

Ainda sobre entradas e saídas, imagine que você queira usar a saída de um +arquivo como entrada de outro. Usando apenas direcionamentos, poderíamos fazer:

+
comando1 > um_arquivo
+comando2 < um_arquivo
+
+

(ou seja, salvar a saída de comando1 em um arquivo qualquer -- que chamamos +de "um_arquivo" aqui -- e usar o conteúdo desse arquivo como entrada para +comando2.)

+

Com pipes, podemos fazer isso diretamente:

+
comando1 | comando2
+
+

O que o pipe (aquele "|") faz é pegar o stdout do comando da esquerda e fazer +com que esse seja o stdin do comando da direita.

+

A ligação pode ser usadas quantas vezes você quiser:

+
comando1 | comando2 | comando3 | comando4
+
+

O stdout de comando1 vai ficar como stdin do comando2; o stdout do comando2 vai +ser o stdin do comando3; e stdout do comando3 vai ser o stdin do comando4.

+

E como o pipe trabalha apenas com stdout, não dá pra fazer algo com stderr. Mas +você pode usar redicionamentos para mandar stderr para stdout e aí usar o pipe.

+
comando1 2>&1 | comando2
+
+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/redirecionamento/index.html b/public/pt/books/shell-por-dia/redirecionamento/index.html new file mode 100644 index 0000000..08f7ced --- /dev/null +++ b/public/pt/books/shell-por-dia/redirecionamento/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell Por Dia: Redirecionamento

+ +

Agora que conhecemos os descritores de entrada, saída e erro, vamos ver como +redirecionar a saída dos descritores para arquivos.

+

Vamos pegar um exemplo simples: python manage.py migrate, um comando que faz +parte do Django que altera o banco de dados. Se quisermos mandar a saída do +comando para um arquivo, podemos usar >:

+
python manage.py migrate > saida_migrate.txt
+
+

Quando seguido por >, o shell faz com que o stdout de uma aplicação seja +enviada para um arquivo e, assim, qualquer saída da aplicação (com exceção do +que for escrito no stderr) será mandando para o arquivo.

+

Ainda, o arquivo é zerado toda vez que houver o redicionamento, e assim, +executar o comando acima duas vezes seguida fará com que o arquivo +"saida_migrate.txt" fique apenas com o resultado da segunda execução. Para +adicionar o conteúdo no final do arquivo ao invés de sobreescrever o conteúdo +inteiro, deve-se usar >> ao invés de >.

+

Mas, mais uma vez, até agora vimos como mandar stdout para um arquivo. Em +alguns casos, erros são enviados para stderr ao invés de stdout. Para +redirecionar stderr, usa-se 2>.

+

E, finalmente, aplicações que esperam entrada de dados -- digamos que o nosso +comando acima esperasse uma configuração, algo como "Type 'y' to continue" -- +poderíamos criar um arquivo com y dentro e mandar isso para o migrate com +<:

+
python manage.py migrate < confirmacao
+
+

Até aqui, simples e direto. Existe ainda uma questão: Imagine que você queira +que toda a saída de uma aplicação, stdout e stderr, seja enviada para um +arquivo. A princípio, você tentaria

+
python manage.py migrate > arquivo 2> arquivo
+
+

O problema desta chamada é que a saída do stdout iria criar o arquivo, e a +saída do stderr iria sobreescrever esta saída e mandar o stderr apenas (existe +uma complicação entre "descritores" e "arquivo em disco", onde o descritor pode +estar escrevendo num arquivo em disco que não existe mais, e para a aplicação +tudo continua andando normalmente, embora não pareça porque o arquivo não +exista, mas vamos ignorar essa parte aqui) o que podemos fazer é enviar o +stderr para stdout e redirecionar o stdout para o arquivo. Para redirecionar +stderr para stdout usamos 2>&1 -- 2> é realmente a saída do stdout, e &1 +indica que queremos que a saída indicada seja enviada para o descritor "1" -- +que é o stdout.

+

E ainda dá pra usar todo mundo junto:

+
python manage.py migrate 2>&1 > saida_migrate.txt < confirmaca
+
+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/shells/index.html b/public/pt/books/shell-por-dia/shells/index.html new file mode 100644 index 0000000..8a9613a --- /dev/null +++ b/public/pt/books/shell-por-dia/shells/index.html @@ -0,0 +1,102 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell por Dia: Shells

+ +

Mais uma interrupção entes de continuarmos vendo coisas de shell. Por que? +Porque dependendo do shell que você está usando, as coisas podem mudar daqui pra +frente. Até o presente momento, o que vimos de redecionamento e pipes funciona +igual em todos.

+ +

E, por últmo, se você estiver pensando em trocar o shell de forma permanente, é +possível usar o comando chsh (change shell). A sintaxe é chsh -s <caminho para o shell que você quer> <username>.

+ +
+ + + + +
+ + + + diff --git a/public/pt/books/shell-por-dia/subcomandos/index.html b/public/pt/books/shell-por-dia/subcomandos/index.html new file mode 100644 index 0000000..8871f4a --- /dev/null +++ b/public/pt/books/shell-por-dia/subcomandos/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Um Shell por Dia: Sub comandos

+ +

Algumas vezes queremos que parte do comando que será executado seja calculado +automaticamente e, para isso, temos sub comandos.

+

Por exemplo, digamos que você queria executar um comando e mandar para um +arquivo com a data atual. Existe um comando pronto para mostrar a data atual, +date, que permite que o formato de saída seja definido como, por exemplo, +date +"%Y%m%d", que gera algo como "20210921".

+

Apenas para lembrar, você pode querer fazer

+
comando > 20210921.txt
+
+

E amanhã fazer

+
comando > 20210922.txt
+
+

Só que isso significa que não é possível automatizar isso. Quer dizer, não +daria, se não fossem os subcomandos. E para usar subcomandos, são usadas +crases (ou, no original, "back-ticks"). No nosso exemplo

+
comando > `date +"%Y%m%d"`
+
+

E, assim, podemos automatizar a geração e não se preocupar em ver o dia correto +todo dia.

+

Mas um aviso: não são todos os shells que suportam esse formato. Fish, por +exemplo, requer que os subcomandos sejam executando entre parênteses (comando > (date +"%Y%m%d")) e Bash suporta o formato de $(subcomando). Portanto, cuide +qual o shell está sendo executado antes de sair usando os ticks.

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/cargo-cult.jpg b/public/pt/code/cargo-cult.jpg new file mode 100644 index 0000000..6d52f90 Binary files /dev/null and b/public/pt/code/cargo-cult.jpg differ diff --git a/public/pt/code/cargo-cult/index.html b/public/pt/code/cargo-cult/index.html new file mode 100644 index 0000000..c30541f --- /dev/null +++ b/public/pt/code/cargo-cult/index.html @@ -0,0 +1,139 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Cargo Cult

+ +

Um dos problemas não falados na área de T.I. é o cargo cult, mas poucos +realmente sabem o que essa expressão quer dizer e de onde vem.

+
+

Esse post acompanha a minha apresentação sobre +Cargo Cult.

+ +
+

Você provavelmente já ouviu falar da "Polinésia", onde ficam o Havaí, a Nova +Zelândia e a Ilha da Páscoa, entre outros. Mas logo do lado existe outro grupo +de ilhas, chamadas de "Melanésia", onde Fiji faz parte.

+

Pois bem, nesse conjunto de ilhas, nos séculos 19 e 20, houve um "intercâmbio" +entre os exploradores europeus e norte-americanos com as tribos indígenas +locais. Produtos trazidos por aviões eram trocados com os indígenas; produtos +como chicletes e espelhos eram trocados por comida ou utilizados como moeda +para pagamento de serviços -- como aconteceu em vários outros lugares do mundo +em outros tempos.

+

Entretanto, nem tudo dura pra sempre e os explodores se foram, levando seus +aviões, chicletes e espelhos.

+

Para as tribos da Melanésia, isso se tornou um problema. Como eles fariam para +continuar conseguindo seus chicletes e espelhos?

+

A solução foi "simples": Eles fizeram seu próprio avião, com sua própria pista +de vôo.

+

Indígenas Melonsénios com seu avião

+

Não apenas isso, mas em algumas ilhas, é venerado o deus "John Frum", que +voltará trazendo grandes maravilhas. E chicletes.

+

E agora você está rindo, achando "nossa, que bando de simplórios".

+

Bom, mas alguma vez você já ouviu alguém dizer...

+ +

ou

+ +

ou ainda

+ +

Estes são exemplos básicos de cargo cult no meio da T.I. Quando as +capacidades técnicas de alguma ferramenta (biblioteca, framework, linguagem, o +que seja) é ignorado, baseando-se apenas na sua origem e/ou uso por causa de um +nome, então temos um cargo cult -- a ideia de que, se fizermos como os outros +fizeram ou da forma que outros falaram, teremos sucesso.

+

Obviamente, o fato do Netflix usar alguma coisa, ou ser feita pelo Google, ou +ser indicado pelo Uncle Bob são fatores importante, mas não devem ser, nem de +longe, o fator decisivo na escolha de uma tecnologia.

+

E só porque o Uncle Bob disse pra fazer assim, não quer dizer que fazendo +assim você vai ter o retorno esperado -- porque seu problema pode não ser +exatamente o problema que o Uncle Bob está resolvendo.

+

E só porque o Netflix usa, não quer dizer que usar a mesma tecnologia vá trazer +o mesmo resultado -- a não ser que você esteja trabalhando na Netflix e fazendo +o que a Netflix faz.

+

Por isso, tome cuidado quando alguém diz que vai ser utilizada alguma +tecnologia pelos motivos acima. Eles podem ser critérios de desempate quando há +mais de uma opção, mas eles não devem ser, nem de longe, o primeiro critério de +aceitação.

+
+

A parte dos chicletes e John Frum pode ser vista no documentário +Into the Inferno, +de Werner Herzog.

+ +
+ +
+ + + + +
+ + + + diff --git a/public/pt/code/command-pattern-rust/index.html b/public/pt/code/command-pattern-rust/index.html new file mode 100644 index 0000000..f75570d --- /dev/null +++ b/public/pt/code/command-pattern-rust/index.html @@ -0,0 +1,183 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Experimentos com Command Pattern em Rust

+ +

Eu tenho feito alguns experimentos implementando o command pattern em Rust e +encontrei pelo menos duas formas de implementar.

+

Mas Primeiro... Por que?

+

Existe uma coisa que eu estou tentando fazer em que o command pattern se +encaixa perfeitamente: Eu quero ter uma biblioteca com todas as ações do +sistema e implementar uma interface em cima disso, sendo que pode ser uma CLI +ou uma interface web ou uma interface qualquer. Para isso, a lógica por trás da +ação deve estar de alguma forma isolada da origem da chamada.

+

O Que É

+

O command pattern é descrito como ter um objeto para cada ação (porque, +basicamente, os patterns são mais focados em projetos orientados a objetos) e +cada um destes tem um método chamado execute que... bem... executa o comando.

+

A Solução Enum

+

Como o que você têm é uma lista de ações, uma das ideias foi usar Enum, mesmo +que isso não seja exatamente o que pattern descreve.

+

Digamos que nós temos duas ações que podem ser chamadas: Depositar dinheiro e +sacar dinheiro. Simples.

+

Assim, podemos ter o seguinte Enum1:

+
enum Command {
+    Depositar(Decimal),
+    Sacar(Decimal),
+}
+
+

Como Rust permite que as variantes de um Enum carreguem um valor com elas, o +valor a ser depositado ou sacado fica anexado junto com a variante.

+

E então você tem a função execute(). E, de novo, porque Rust permite que +sejam adicionadas funções em basicamente tudo, o que eu fiz foi adicionar um +método diretamente no Enum:

+
impl Command {
+    fn execute(&self) -> Result<...> {
+        match self {
+            Depositar(valor) => faz_o_deposito(valor),
+            Sacar(valor) => sacar_dinheiro(valor),
+        }
+    }
+}
+
+

E assim por diante.

+

Para usar, eu coloquei algo parecido com isso na minha camada de interface:

+
let valor = requisicao_externa.valor();
+let comando = match requisicao_externa.comando() {
+    "depositar" => Command::Depositar(valor),
+    "sacar" => Command::Sacar(valor),
+}
+comando.execute();
+
+

Tudo fica simples e tal, mas existe uma tendência a deixar uma bagunça com a +quantidade de conteúdo que fica dentro ou ao redor do impl, na minha opinião. +Mas, ao mesmo tempo, a camada de dispatch (que fica entre a camada de +serviço/enum e a camada de interface) é bem básica.

+

Uma solução para para a quantidade de "conteúdo dentro ou ao redor do impl" +seria o uso de múltiplos impl: Ter um módulo deposito.rs que faz o impl +de faz_o_deposito e outro módulo saque.rs que também faz o impl dentro do +enum com o conteúdo de sacar_dinheiro. Mas eu ainda precisaria centrar todas +as operações no execute para ter um dispatch correto.

+

A Solução com Traits

+

A solução com trait é bem parecida com o que o pattern diz: Você cria uma trait +(interface) e "impl" em todos os comandos, que são structs. Por exemplo:

+
trait Command {
+    fn execute(&self) -> Result<...>;
+}
+
+
struct Depositar(Decimal);
+impl Command for Depositar {
+    fn execute(&self) -> Result <...> {
+        // o que era o `faz_o_deposito` vai aqui.
+    }
+}
+
+struct Sacar(Decimal);
+impl Command for Sacar {
+    fn execute(&self) -> Result <...> {
+        // o que era o `sacar_dinheiro` vai aqui.
+    }
+}
+
+

... o que parece um pouco mais limpo, já que todas as coisas relacionadas com +Deposito ou Saque estão juntas agora.

+

Entretanto, isso causa um pequeno problema com a camada de interface: Agora ela +não pode mais retorna algo com tamanho fixo: É necessário usar um conteúdo com +dispatch dinâmico, como Box<dyn Command>, o que não é tão direto quando um +Enum/Struct/conteúdo com tamanho.

+

Por outro lado, como Box implementa Deref, uma vez que a interface retorne +algo-que-implementa-Command, basta chamada execute() diretamente nele.

+
let comando = interface_que_retorna_um_comando_num_box_dyn();
+comando.execute();
+
+

Onde Eu Vejo Esses Dois

+

Eu consigo ver o uso do Enum em arquiteturas simples, com apenas um domínio. +Como toas as coisas são relacionadas, elas podem viver tranquilamente dentro do +Enum.

+

Mas quando estamos lidando com múltiplos domínios, a solução de trait/dispatch +dinâmico parece fazer mais sentido: Coisas relacionadas nos seus próprios +módulos, nos seus próprios espaços e a ideia de misturar os mesmos (por +exemplo, se você tiver um domínio de tags e um domínio de dinheiro, e quer +colocar tags nas operações de dinheiro) ficaria na camada acima deles.

+
+
1 +

Decimal não faz parte da biblioteca padrão do Rust, mas pode ser usada +a partir da crate rust_decimal.

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/code/flask-em-40-minutos-ou-menos-1/index.html b/public/pt/code/flask-em-40-minutos-ou-menos-1/index.html new file mode 100644 index 0000000..a5923a0 --- /dev/null +++ b/public/pt/code/flask-em-40-minutos-ou-menos-1/index.html @@ -0,0 +1,231 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Flask em 40 Minutos ou Menos: Iniciando

+ +

Uma "breve" explicação de como colocar uma aplicação Flask em produção em 40 +minutos. Nessa primeira parte, vamos mostrar como começar um script Flask.

+ +

Flask é um micro framework web em Python, muito fácil de ser usado e +configurado. Mas o processo inteiro de como começar a aplicação, adicionar +rotas e depois disso partir para colocar em produção pode ser uma pequena dor +de cabeça. Então veremos como fazer todo o processo.

+

O VirtualEnv

+

O primeiro passo de qualquer grande aplicação Python é o VirtualEnv. +VirtualEnv é utilizado para separar as bibliotecas do Python entre aplicações +-- assim você pode ter a biblioteca X numa versão para um determinado projeto +e outra versão para outro projeto. Apenas lembre-se que o VirtualEnv gerencia +apenas bibliotecas do Python, portanto não espere que o mesmo controle +versões diferentes de MySQL, por exemplo.

+
+

VirtualEnv não vai cuidar da versão do MySQL, mas pode controlar a versão do driver para Python.")

+ +
+

Para criar um VirtualEnv:

+
python -m venv venv
+
+
+

Se ainda estiver usando Python 2, o comando é virtualenv venv.

+ +
+

Depois de executar esse comando, você verá que irá surgir um diretório +venv. O último parâmetro é justamente o diretório que será utilizado para +armazenar as informações do VirtualEnv e pode ser criado com qualquer nome e +em qualquer lugar -- inclusive fora do projeto [#venvwrapper]_.

+
+

Alguns pacotes como o VirtualEnvWrapper_ +fazem exatamente isso: Os pacotes são instalados em um diretório separado, +apenas para VirtualEnvs.

+ +
+

Uma vez criado o VirtualEnv, é preciso ativar o mesmo:

+
source venv/bin/active
+
+

Ou, se estiver usando Windows (sim, você pode rodar os comandos no Windows):

+
venv/Scripts/activate.bat
+
+

Se tudo deu certo, deve aparecer um (venv) no começo do prompt, indicando +que o VirtualEnv está ativo.

+

Apenas note o seguinte: O VirtualEnv foi projetado para ser destruído e +reconstruído quantas vezes forem necessárias. Por isso, você não deve +adicionar o diretório do VirtualEnv no seu repositório; +quem precisar utilizar, que recrie o ambiente.

+
+

Além de não colocar o diretório do virtualenv no seu repositório, tente não +instalar pacotes Python utilizando o sistema de pacotes da sua distribuição.

+ +
+
+

O que o venv faz é criar vários scripts para as tarefas +relacionadas com o mesmo -- como a ativação do VirtualEnv -- e estes +scripts mantém o caminho de onde foram criados. Com isso, se você adicionar +o mesmo no seu sistema de controle de versão, somente você poderá usar (a +não ser que a outra pessoa tenha exatamente a mesma estrutura de +diretórios). Lembre-se: VirtualEnvs existem para conter as bibliotecas que +você usa e podem ser destruídos e criados livremente -- E como podem ser +criados facilmente, não devem ser incluídos no seu controle de versão -- e +se estou me repetindo, é porque muitas pessoas fazem isso, erroneamente.

+ +
+

Requirements.txt

+

O modo mais fácil de instalar um pacote -- dentro de um VirtualEnv, obviamente +-- é utilizando o módulo pip:

+
python -m pip install flask
+
+
+

Ou, se ainda estiver usando Python 2, pip install -- se +realmente preferir, você pode usar pip install mesmo com Python 3, pois +ele instala um alias para python -m pip.

+ +
+

Mas, como comentado sobre VirtualEnv, onde a ideia é criar, destruir e criar o +ambiente quantas vezes você quiser, ficar passando a lista de pacotes a serem +instalados não faz sentido. Por isso, normalmente é gerado um arquivo com a +lista de requisitos. Esse arquivo, mais por convenção da comunidade do que por +requisito da ferramenta, é o chamado requirements.txt Nesse +arquivo você pode colocar a lista de requisitos do seu sistema, incluindo a +versão se necessário.

+
+

E, caso você tenha requisitos que são necessários somente para +desenvolvimento, a convenção diz pra ter um arquivo chamado +requirements-dev.txt, cuja a primeira linha é -r requirements.txt.

+ +
+

Por exemplo, como a versão do Flask no momento da escrita desse artigo é a +0.12.2, podemos ter um requirements.txt com o seguinte conteúdo:

+
flask==0.12.2
+
+

... indicando que queremos que seja instala a versão 0.12.2. Existe ainda o +operador ~= [#specifiers]_,que significa "versão compatível com a +indicada". Assim nos precavemos da possibilidade de ser encontrada uma falha +de segurança no Flask, sem precisar sair correndo atrás de todos os +requirements.txt com Flask para atualizar a versão e garantimos que, +quando sair a versão 0.13 (ou qualquer outra seguinte) que seja incompatível +com 0.12.2, nosso código ainda vá funcionar.

+
+

Para uma lista de todas as formas de como especificar +versões, olhe o PEP 440.

+ +
+

Assim sendo, teremos um requirements.txt com o seguinte conteúdo:

+
flask~=0.12.2
+
+

Mas e para instalar isso? Para isso existe a opção -r do pip, que ao invês de +esperar por um nome de pacote para ser instalado, a lista de pacotes é +carregada a partir do arquivo indicado. Então para +gerar o ambiente:

+
python -m pip install -r requirements.txt
+
+

O Esqueleto de uma Aplicação Flask

+

Para verificar se tudo está instalado corretamente, você pode utilizar o +seguinte arquivo de exemplo:

+
from flask import Flask
+
+app = Flask(__name__)
+
+
+@app.route('/')
+def index():
+   return 'Olá'
+
+
+

Apenas lembre-se de não chamar o nome do arquivo de flask.py, +porque esse é o nome do módulo e ao invés de importar o módulo do Flask, +ele vai tentar importar o conteúdo do próprio arquivo e, como o objeto +Flask não existe, você vai receber um erro de ImportError: cannot import name 'Flask'.

+ +
+

E para executar:

+
FLASK_APP=main.py flask run
+
+
+

Se você percebeu, a variável FLASK_APP foi definida com o +nome main.py; esse é o nome que eu escolhi para a minha aplicação (e o +nome do arquivo fonte -- aquele que não pode ser flask.py), +mas você pode usar o nome que quiser. Apenas lembre-se de usar esse mesmo +nome em FLASK_APP.

+ +
+

Se estiver tudo ok, você deve receber a mensagem

+
* Serving Flask app "main"
+* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
+
+

E acessando a URL indicada, você deverá ver o "Olá".

+

Até aqui vimos como instalar e iniciar um projeto Flask básico. No próximo +post vou falar da aplicação Flask em si.

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/fugindo-para-as-colinas-com-python/index.html b/public/pt/code/fugindo-para-as-colinas-com-python/index.html new file mode 100644 index 0000000..8148428 --- /dev/null +++ b/public/pt/code/fugindo-para-as-colinas-com-python/index.html @@ -0,0 +1,417 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Fugindo Para as Colinas Com Python

+ +

"Hello World" não mostra exatamente o poder de qualquer linguagem. +Por isso resolvi fazer uma "introdução" ao Python com um problema de +fujir para as colinas. Ou quase isso.

+ +

Um dos problemas de qualquer iniciante em qualquer linguagem é pegar o +"feeling" da linguagem. E, realcionado com isso, é o fato que a maior parte +dos códigos introdutórios de uma linguagem é o "hello world". Por exemplo:

+
print('hello world')
+
+

O que isso diz de Python? No máximo que print precisa de parentêses, +strings podem ser geradas com aspas simples e não precisa de pronto-e-vírgula +no final.

+

O que não é muita coisa.

+

Uma coisa que eu sempre digito quando acontece algum problema é

+
+

Fujam para as colinas!

+
+

Só que repetir isso toda hora não me faz um cara muito popular. É por isso que +eu fico mudando essa frase para coisas do tipo

+
+

Funam para as colijas!

+
+

Ou ainda

+
+

Lunam para as jocifas!

+
+

Obviamente eu não paro para ficar pensando em todas as possibilidades e fico +alterando letras randomicamente manualmente. Eu tenho um script para isso. Um +script em Python.

+

O Básico

+
print('Fujam para as colinas!')
+
+

Assim já podemos irritar as pessoas repetindo a mesma informação.

+

O próximo passo é preparar o terreno para a randomicidade de frase.

+
print('{}u{}am para as {}o{}i{}as!'.format('f', 'j', 'c', 'l', 'n'))
+
+

Agora já temos algumas coisas pra estudar.

+

Help incluso e format

+

Primeiro, format. format é um método dos objetos do tipo string. Como +eu sei disso? Porque, um dia, estava eu muito belo e folgado, me perguntando +"O que as strings em Python podem fazer?", abri o interpretador do Python e +digitei:

+
+

help(str)

+
+

E, lá no meio...

+
|  format(...)
+|      S.format(*args, **kwargs) -> string
+|
+|      Return a formatted version of S, using substitutions from args and kwargs.
+|      The substitutions are identified by braces ('{' and '}').
+
+

E uma das coisas legais do Python é que ele é capaz de buscar o tipo através +de um dado; e o que eu quero dizer com isso é que eu não precisaria saber que +o tipo de uma string é str, eu poderia simplesmente fazer help('fujam para as colinas') e o interpretador mostraria o mesmo help.

+

Aqui temos mais uma informação importante: *args e **kwargs. O que são +esses dois desgraçados?

+

Definindo Funções

+

Em outras linguagens esses são os chamados "variable arguments" ou "argumentos +variáveis" ou ainda "varargs". Ao invés de definir uma função que tenha um +número definido de parâmetros, varargs permite que a função tenha um número +indefinido de parâmetros. E eles funcionam da seguinte forma:

+

Vamos começar definindo uma função:

+
def soma(primeiro, segundo):
+  total = primeiro + segundo
+  return total
+
+

Uma pequena pausa para falar de uma coisa que acabamos de ver de Python, que +não tínhamos visto ainda: definição de funções e blocos.

+

Primeiro, funções são definidas com def, seguidas do nome da função, um +parênteses, a lista de argumentos separados por vírgulas, fecha parênteses e +dois pontos. Em Python, os dois pontos indicam que haverá um início de bloco.

+

Segundo, ao contrário de outras linguagens, Python não usa colchetes para +definir os blocos. Isso é feito através da identação (e, obviamente, os dois +pontos).

+

Terceiro, Python é uma linguagem de tipagem dinâmica, o que significa que não +se define o tipo do parâmetro, simplesmente se usa.

+
+

Em Python 3, é possível definir um "hint" para o tipo, da +seguinte forma:

+
def soma(primeiro: Int, segundo: Int) -> Int:
+   return primeiro + segundo
+
+

A única coisa a se cuidar é que isso é só um hint e que se for passado uma +string, não irá ocorrer qualquer erro.

+ +
+

Chamando Funções

+

Ainda, existem duas formas de passar valores para uma função:

+

A primeira é só chamar a função passando os argumentos:

+
soma(1, 2)
+
+

A segunda é que o Python aceita que sejam nomeados os argumentos:

+
soma(primeiro=1, segundo=2)
+
+

O interessante de se nomear os argumentos é que é possível passar os mesmos +fora da ordem original da função:

+
soma(segundo=2, primeiro=1)
+
+

(Essa parte de nomear os argumentos é importante para entender o **kwargs.)

+

De volta a Varargs

+

Mas voltando aos varargs, o important é notar que a função acima tem dois +parâmetros. Se eu tentar chamar a função com um número diferente de +argumentos, o Python vai reclamar:

+
>>> soma(1)
+Traceback (most recent call last):
+   File "<stdin>", line 1, in <module>
+TypeError: soma() takes exactly 2 arguments (1 given)
+
+

varargs remove essa limitação. Se eu mudar a função para:

+
def soma(*args):
+   print(args)
+
+

O que *args faz é pegar todos os argumentos e transformar numa lista. No +caso, se eu chamar:

+
soma(1, 2, 3)
+
+

O resultado seria:

+
[1, 2, 3]
+
+

E se eu chamar da forma original, com soma(1, 2), eu tenho: [#fixo]_

+
[1, 2]
+
+
+

Também é possível criar funções com parâmetros fixos e uma parte +variável, com algo do tipo def fun(param1, param2, *outros); se a +função for chamada com fun(1, 2), outros ficará como uma lista +vazia ([]); se for passado fun(1, 2, 3, 4), outros ficará com 3 +e 4, já que 1 pertence à param1 e 2 pertence à param2.

+ +
+

O que nós temos aqui é uma lista de elementos. Para fazer o soma funcionar +com uma lista ao invés de argumentos, teríamos que fazer o seguinte:

+
def soma(*argumentos):
+   total = 0
+   for valor in argumentos:
+      total = total + valor
+   return total
+
+

De novo, coisas novas:

+

De novo, blocos são marcados com dois-pontos e uma identação. Assim, o bloco +do for tem uma linha só, porque o return está no mesmo nível do +for, ele só vai ser executado depois que o for terminar.

+

E aqui vemos como percorrer elementos de uma lista: for/in faz com que +seja percorrido cada elemento de argumentos e o valor será colocado em +valor.

+

Agora que vimos varargs e listas, existe uma coisa mágica do Python que o +*, além de servir para receber um número variável de argumentos e +transformar numa lista, também serve para fazer o contrário: converter uma +lista para uma lista de argumentos.

+

De novo, com o nosso soma original:

+
def soma(primeiro, segundo):
+   return primeiro + segundo
+
+

Eu posso chamar com:

+
soma(1, 2)
+
+

Mas eu também posso chamar com:

+
argumentos = [1, 2]
+soma(*argumentos)
+
+

Varargs de kwargs

+

Nós vimos duas coisas relacionadas a chamadas de função:

+
    +
  1. É possível criar funções com número variável de parâmetros, usando *.
  2. +
  3. É possível chamar funcões passando o nome do parâmetro.
  4. +
+

O que acontece quando juntamos os dois?

+
>>> def fun(*args):
+...   print args
+
+>>> fun(args=1)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: fun() got an unexpected keyword argument 'args'
+
+

O problema aqui é que * recolhe todos os argumentos sem nome. Para +recolher os com nomes, é preciso usar **. Ele funciona praticamente da +mesma forma que * mas ao invés de uma lista, ele irá conter um dicionário +-- também conhecido como "array associativo", "objeto", "mapa" e outros nomes, +dependendo da linguagem.

+

Por exemplo:

+
def fun(**names):
+    print names
+
+fun(1)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: fun() takes exactly 0 arguments (1 given)
+
+

O problema aqui é que não foi passado nenhum argumento nomeado. Obviamente o +Python não sabe o que fazer com um valor qualquer e deu erro.

+

Agora, se a função for chamada com:

+
fun(name='Julio', age=41)
+{'age': 41, 'name': 'Julio'}
+
+

Ou seja, é possível criar uma função que só aceita parâmetro nomeados, mas é +preciso que os valores sejam buscados do dicionário ao invés de "aparecerem" +no bloco pelos parâmetros.

+

Colocando tudo junto

+

Por que tudo isso é importante?

+

Porque, como foi visto no nosso primeiro código com o format, o que a +gente precisa é passar um número variável de elementos

+
print('{}u{}am para as {}o{}i{}as!'.format('f', 'j', 'c', 'l', 'n'))
+
+

E nós precisamos alterar a ordem dos argumentos e a única forma que temos de +fazer isso é usando o varargs reverso:

+
consoantes = ['f', 'j', 'c', 'l', 'n']
+print('{}u{}am para as {}o{}i{}as!'.format(*consoantes)
+
+

Nesse momento, os dois códigos vão fazer a mesma coisa. A questão é que agora +temos uma lista que podemos mexer no conteúdo.

+

O que precisamos fazer agora: Embaralhar o conteúdo de consoantes. O resto +do código continua o mesmo, já que ele imprime as consoantes nos lugares +marcados e nós estamos passando a lista para isso.

+

Para randomizar o conteúdo, nós vamos utilizar uma das bibliotecas disponíveis +pelo próprio Python: random.

+

Para usar uma biblioteca -- que no Python são chamadas de "módulos" --, é só +fazer import e o nome da biblioteca. No nosso caso

+
import random
+
+

Mas o que diabos tem dentro de random? Bom, dá pra ver tudo no site +oficial do Python, onde tem a documentação, ou nós podemos fazer o mesmo +help(random) para ver o help ou ainda usar dir(random) para ver o +conteúdo do módulo.

+
>>> import random
+>>> dir(random)
+['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST',
+'SystemRandom', 'TWOPI', 'WichmannHill', '_BuiltinMethodType',
+'_MethodType', '__all__', '__builtins__', '__doc__', '__file__',
+'__name__', '__package__', '_acos', '_ceil', '_cos', '_e', '_exp',
+'_hashlib', '_hexlify', '_inst', '_log', '_pi', '_random', '_sin', '_sqrt',
+'_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice',
+'division', 'expovariate', 'gammavariate', 'gauss', 'getrandbits',
+'getstate', 'jumpahead', 'lognormvariate', 'normalvariate',
+'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed',
+'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate',
+'weibullvariate']
+
+

No caso, o que nós queremos é o shuffle (como eu sei? Porque eu olhei a +documentação, oras!)

+

E assim nós temos o código:

+
import random
+consoantes = ['f', 'j', 'c', 'l', 'n']
+random.shuffle(consoantes)
+print('{}u{}am para as {}o{}i{}as!'.format(*consoantes)
+
+

E está feito nosso randomizador de Fugir para as Colinas.

+

Embora aqui tenhamos alcançado nosso objetivo, existem algumas outras +coisinhas que são interessantes de se ver.

+

In-place

+

Uma das coisas que random.shuffle faz é alterar a ordem do conteúdo, não +retornando nada no resultado. Por exemplo

+
>>> import random
+>>> lista = [1, 2, 3, 4]
+>>> random.shuffle(lista)
+>>> print(lista)
+[2, 4, 1, 3]
+
+

Isso não é um problema caso a lista não seja mais necessária depois do uso (ou +a ordem original não seja mais necessária). Se fosse necessária, seria preciso +fazer uma cópia da lista antes de usar o shuffle. Existe um módulo chamado +copy para fazer cópias tanto de listas quanto de dicionários. +Entretamento, para este caso, existe uma forma mais simples.

+

Slices

+

Para acessar um elemento de uma lista, basta usar a posição do element +(começando em zero, obviamente).

+
>>> lista = ['a', 'b', 'c', 'd']
+>>> print(lista[1])
+'b'
+
+

Também é possível acessar um grupo de elementos usando :, com a posição +inicial e a posição final (que é exclusiva, ou seja, antes de chegar no +elemento indicado).

+
>>> lista = ['a', 'b', 'c', 'd']
+>>> print(lista[1:3])
+['b', 'c']
+
+
+

Existe ainda um terceiro parâmetro para slides, que é o "step". +Por exemplo,

+
>>> lista = [1, 2, 3, 4]
+>>> print(lista[::2])
+[1, 3]
+
+

Aqui foi indicado que é pra ir do começo da lista até o final, mas pulando +de dois em dois.

+

Embora não muito usado, a parte que realmente importa é que step também +aceita valores negativos, indicando que é pra seguir na ordem inversa. E o +uso mais comum é criar uma cópia da lista, mas com os valores invertidos.

+
>>> lista = [1, 2, 3, 4]
+>>> print(lista[::-1])
+[4, 3, 2, 1]
+
+ +
+

Também é possível omitir as posições: Se for omitida a primeira posição, +significa "desde o começo"; se for omitida a posição final, significa "até o +fim".

+
>>> lista = ['a', 'b', 'c', 'd']
+>>> print(lista[:3])
+['a', 'b', 'c']
+
+
>>> lista = ['a', 'b', 'c', 'd']
+>>> print(lista[1:])
+['b', 'c', 'd']
+
+

Também é possível usar índices negativos, tanto na posição inicial quanto +final, indica que é "a partir do fim da lista".

+
>>> lista = ['a', 'b', 'c', 'd']
+>>> print(lista[-2:])
+['c', 'd']
+
+

Essas operações de "pegar pedaços de uma lista a partir de uma posição inicial +e final" são chamados de slides.

+

Copiando listas por Slices

+

Mas porque eu comentei de slices? Porque, se você reparar, quando é utilizada +uma faixa, o Python retorna o resultado como uma lista. Na verdade, não é um +pedaço da lista original, é uma nova lista.

+

Considerando que:

+
    +
  1. Sem uma posição inicial, significa que é pra começar do começo da lista.
  2. +
  3. Sem uma posição final, significa que é ir até o final da lista.
  4. +
  5. Slices são cópias de uma lista.
  6. +
+

O que você acha que acontece se não forem passadas as duas posições ao mesmo +tempo?

+

Sim, você cria uma cópia da lista.

+
>>> import random
+>>> lista = [1, 2, 3, 4]
+>>> copia = lista[:]
+>>> random.shuffle(copia)
+>>> print(copia)
+[2, 4, 1, 3]
+>>> print(lista)
+[1, 2, 3, 4]
+
+

E, com essa cópia, evitamos de termos problemas com a lista passado pelo +shuffle, porque a lista original vai ter sempre os dados na mesma ordem, sem +nunca ser alterada -- desde que o shuffle seja feita na cópia.

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/index.html b/public/pt/code/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/code/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/code/microservices-artifact-ejection/index.html b/public/pt/code/microservices-artifact-ejection/index.html new file mode 100644 index 0000000..1deb01b --- /dev/null +++ b/public/pt/code/microservices-artifact-ejection/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microserviços: Expelindo Artefatos

+ +

Como eu estava comentando sobre artefatos em +microserviços, eu acredito que esqueci +de discutir um ponto importante: Como é que esses artefatos são "expelidos" do +microserviço?

+ +

"Expelido", nesse caso, significa "passa para o próximo estágio necessário", +que pode ser um bocado de coisas (algumas vezes, até mais de uma). E como eu +precisava de um palavra capciosa para chamar a atenção, já que "produz" não +tem nada de chamativo.

+

Por exemplo, se um microserviço produz um dado intermediário -- digamos que +ele conecta num serviço externo e busca uma informação, que é então processada +por outros microserviços -- então você vai possivelmente utilizar um serviço +de message broker (mensageria) para expelir o artefato. Usando um message +broker irá permitir que outros serviços fiquem escutando a criação desses +artefatos e que façam seu serviço -- produzindo novos artefatos.

+

Outra possibilidade é que esse microserviço é o fim da linha de produção e, +por isso, ele mantém o artefato consigo para ser consumido de uma forma +não assíncrona. Por exemplo, o microserviço produz elementos que são pedidos +depois uma requisição de um serviço web, e o que o microserviço precisa fazer +é produzir o artefato e mantê-lo em si, respondendo requisições mais tarde.

+

De novo, isso é semelhante a forma com que CQRS (command-query response +segregation -- segregação de comandos e queries) funciona: Você tem um lado do +seu microserviço que recebe dados e processa o artefato, e outro que permite a +consulta dos artefatos gerados.

+

Você pode até mesmo ter os dois: Quando o artefato é produzido, o microserviço +expele o mesmo pelo message broker para ser processado por outros +microserviços, e guarda o artefato localmente para ser pesquisado depois.

+

Existe até mesmo a possibilidade da parte de pesquisa/query ser apenas outros +microserviço: Ele recebe o artefato de outro microserviço e o armazena, sem +qualquer processamento (desde que você não considere "salva num armazenamento +permanente" uma forma de processamento). Isso é interessante porque a parte de +pesquisa/query do microserviço é apenas um outro microserviço ao invés de ser +uma espécie de microserviço especializado que produz, expele e armazena +artefatos.

+

Quando eu mencionando que nós salvamentos nossos artefatos no Firebase, nós +estamos basicamente construindo esse microserviço separado: Enquanto nossos +microserviços produzem artefatos, a parte de "armazenamento e pesquisa" fica a +cargo do Firebase -- mas você pode considerar isso como qualquer outro +microserviço.

+

(Esse post é simplesmente para ter alguns ponteiros a mais para quando eu for +discutir um pouco mais sobre o que eu penso sobre microserviços com auto-cura +-- e o que eu quero dizer com isso.)

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/microservices-artifact-input-state/index.html b/public/pt/code/microservices-artifact-input-state/index.html new file mode 100644 index 0000000..fea9487 --- /dev/null +++ b/public/pt/code/microservices-artifact-input-state/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microserviços: Artefato = Entrada + Estado

+ +

Projetar microserviços é um pouco complicado porque temos que pensar sobre +as coisas que cada "domínio" vai ocupar. Uma discussão entre os +desenvolvedores aqui sobre nossos projetos de microserviços me levou a +repensar como pensar microserviços.

+ +

Isso pode soar um pouco estranho para aqueles que já estão trabalhando com +microserviços -- ou que conseguiram ter uma boa visão da construção de +microserviços -- mas quando foi citado "artefato" na discussão, "caiu a ficha" +com outras coisas que eu estava pensando sobre o tópico.

+

Um fato que continua me confundindo é que a literatura sobre microserviços +começa a falar sobre "separação de domínios" e como definir cada domínio. +Embora haja alguns truques -- como "se é um substantivo, é um domínio" -- nada +é realmente tão óbvio. Alguns domínios são, na verdade, sub domínios de um +domínio maior, e aí você fica se perguntando se deve separar esses domínios ou +mantê-los num único microserviço, já que separá-los iria, invariavelmente, +criar microserviços acoplados (algo que você quer evitar quando está usando +microserviços).

+

E é aí que "artefato" encaixou no resto das coisas. Por algum tempo, eu tive a +impressão que microserviços tem que ser construídos "de trás pra frente", no +sentido de que primeiro você precisa pensar nas coisas que você precisa e +depois verificar o que você tem -- em outras palavras, você pensa primeiro +nas saídas do microserviço e depois olha o que tem de entrada. E um "artefato" +é, no final, simplesmente a saída do microserviço.

+

No nosso caso, nós estamos lidado com jogos. Cada jogo tem uma narração, tem +um placar, tem estatística e tem uma escalação. Mesmo que essa explicação +caia na regra do "é um substantivo!", na verdade ela reflete a saída do nosso +sistema: nos temos uma requisição que retorna a narração atual do jogo (que +pode ser atualizada por polling ou -- como estamos trabalhando agora -- feito +"push" diretamente para os clientes); uma requisição para retornar o placar +(que, de novo, pode ser por "polling" ou "push"); uma requisição que retorna +as estatísticas, que não são atualizadas ou exibidas de forma tão frequente, +e por isso não precisam de atualizações visuais constantes; e assim por +diante. Cada um desses é um microserviço diferente, porque cada um desses é um +artefato diferente.

+

Para clarificação: nossos artefatos são mantidos em um banco Firestore, que os +clientes fazem as requisições diretamente, mas que na maior parte do tempo vão +simplesmente receber as notificações de alteração dos dados. Mas outra forma +de manter esses dados é ter serviços separados, que responde às requisições +dos clientes -- que é bem próximo da forma que CQRS é descrito (bom, quer +dizer, seria CQRS se o microserviço recebesse comandos; eu não vou dizer que +são CQRS se o microserviço estão lidando com eventos diretamente).

+

Bom, se esses são os artefatos, onde é que o "estado" entra nessa história? O +estado é o conjunto de informações que o microserviço precisa ter para +produzir o artefato. Por exemplo, na narração, cada vez que uma nova narração +entra, ela precisa entrar na lista de narrações do jogo para que seja +produzida a narração da partida inteira. O estado também pode ajudar o +microserviço a remover narrações duplicadas.

+

Um efeito "legal" do estado é que você pode, pelo menos na teoria, perceber +que mesmo com uma nova entrada, se não houve alteração do estado, então não +vai haver alteração do artefato e não é preciso ter nenhuma saída.

+

Outra coisa a se ter em mente sobre o estado é que ele não precisa ser mantido +em memória; você pode usar qualquer tipo de armazenamento: mantenha as +narrações num banco de dados, no disco, na memória em cache ou todos os +anteriores. Decida usar o que ficar mais fácil de ser manipulado para +produzir o artefato. Uma coisa a se manter em mente sobre isso é "Se esse +microserviço morrer, ele vai conseguir voltar ao mesmo estado quando for +reiniciado?"

+

E, finalmente, as entradas. Essas podem parecer meio óbvias a princípio (o seu +microserviço está gerando dados do nada?), mas mantenha em mente que uma +entrada pode ser a origem de dados de mais de um microserviço. Por exemplo, +uma narração pode ser consumida pelo microserviço de narrações para produzir a +narração inteira da partida, mas também ser consumida pelo microserviço de +placar, que fica escutando narrações de gols para atualizar seu estado (se a +narração não for de gol, não há alteração de placar, não há alteração de +estado e não há geração do artefato).

+

Voltando aos artefatos, não se preocupe se mais de um microserviço faz +basicamente a mesma coisa que outra, mas gera um artefato completamente +diferente. Como exemplo, imagine que você quer que sejam feitas notificações +por push quando acontece um gol. Embora seja um serviço bem parecido com o +microserviço de placar, ele produz um artefato diferente (a notificação por +push vs a requisição de atualização de placar) e, por isso, deveria ser um +microserviço completamente diferente. Até pode soar meio desnecessário (ter +serviços fazendo a mesma coisa, duas vezes), mas isso desacopla as coisas se +você precisar mais informações no placar (por exemplo, adicionando o nome de +cada jogador que fizeram gols) ou mudar o consumidor do artefato (por exemplo, +mudando a implementação do push para, ao invés de fazer as chamadas +diretamente paras a APIs da Apple e Google, fazer chamadas para um serviço que +já faça tudo isso, como o da Azure).

+

Essa mudança na minha forma de pensar como construir microserviços me ajudou a +pensar nos nossos microserviços no trabalho, e também está me ajudando a +repensar algumas saídas em um projeto pessoal (que eu espero terminar e +mostrar no ano que vêm).

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/microservices-chassis/index.html b/public/pt/code/microservices-chassis/index.html new file mode 100644 index 0000000..5084da6 --- /dev/null +++ b/public/pt/code/microservices-chassis/index.html @@ -0,0 +1,144 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microserviços: Chassi

+ +

O chassi de um fleet de microserviços é definido como as bibliotecas e +frameworks que alguém deve usar quando está criando um novo microserviço.

+ +

O "chassi" é um design +pattern +conhecido, mas a literatura fala sobre a escolha de bibliotecas e frameworks +que devem ser usados quando se está criando um microserviço.

+

Por exemplo, se você está trabalhando com Java, você provavelmente teria algo +como Spring Boot como chassi para os seus microserviços, de forma que qualquer +um que comece um microserviço já tenha uma biblioteca (e conhecimento local) +de como construir.

+

E, para cada linguagem, você precisa escolher um chassi diferente -- você não +pode usar Spring Boot com Python, por exemplo.

+

Você deve ter notado que eu coloquei um "mas" no segundo parágrafo. +Pessoalmente, eu acho que a escolha do chassi vai bem além da criação de +microserviços.

+

Conhecimento Compartilhado

+

Um dos maiores fatores de se usar um chassi para o seu microserviço é o +conhecimento compartilhado entre os times. Times que utilizam o mesmo chassi +podem trocar informações em como solucionar alguns problemas, como fazer o +processamento ficar mais rápido, informações sobre releases novas e assim por +diante.

+

Mesmo que os times nunca mexam nos códigos dos outros, o simples fato que eles +podem compartilhar essas informações entre eles é um grande avanço.

+

E mesmo para times que utilizam linguagens diferentes isso é um grande ponto: +Um time pode descrever como o framework que eles utilizam permite fazer alguma +coisa de forma mais simples, de forma que outro time possa pesquisar se o seu +chassi permite fazer algo da mesma forma.

+

Aplicando uma Visão Comum

+

Enquanto o pattern descreve apenas frameworks e bibliotecas, as escolhas dos +serviços ao redor do serviço também faz parte do chassi, na minha opinião.

+

Por exemplo, um time decide usar Kafka como mensageria1 entre serviços -- o +que permite que qualquer outro time, usando qualquer outro framework, em +qualquer outra linguagem, a usar o mesmo serviço para troca de mensagens -- +permitindo que qualquer time que precise usar um serviço de troca de mensagens +possa usar a mesma instalação (mas usando tópicos diferentes), reduzindo +custos de manutenção. Mas o que acontece quando um time decide usar Kafka como +banco de dados e define o tempo de retenção para "sempre"? Isso iria confundir +completamente todos os outros. "Por que esse tópico está sempre crescendo?" +Pior, sem uma documentação de DevOps bem descrita, alguém pode ver o tópico +crescendo, verificar, ver que a política de retenção está diferente do resto e +adicionar um baseada em outros projetos.

+

Outro exemplo: Para dados relacionados, há uma instalação do PostgreSQL para +todo mundo. Cada time tem o seu próprio database e usuários. Mas um time, que +acabou ficando responsável por dois microserviços, tem um serviço com dados +que são relacionais e outro que basicamente necessita de um armazenamento de +chave-valor. Ao invés de pedir por um banco de dados chave-valor, o time +decide criar um database com apenas uma tabela, com um campo para a chave e um +campo de texto para guardar JSONs. Isso, novamente, quebra a definição do +chassi, pois seria esperado que o PostgreSQL fosse usado como banco +relacional e não como um banco chave-valor.

+

Conclusão

+

Chassis são bons para o desenvolvimento de microserviços por permitir um +início de desenvolvimento rápido e com compartilhamento de conhecimento, mas +eles vão além de apenas frameworks e bibliotecas: eles relacionado tudo ao +redor dos serviços e como esses são vistos por cada microserviço.

+
+
1 +

"Message broker".

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/code/microservices-self-healing/index.html b/public/pt/code/microservices-self-healing/index.html new file mode 100644 index 0000000..e04519b --- /dev/null +++ b/public/pt/code/microservices-self-healing/index.html @@ -0,0 +1,202 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microserviços com 'Auto Cura'

+ +

As discussões +anteriores que eu levantei +sobre microserviços foram um prelúdio para uma coisa que eu não consegui uma +solução perfeita: como é que microserviços se "curam" quando faltam dados?

+ +

Pequena recapitulação antes de falar sobre o problema: Microserviços produzem +artefatos; artefatos ou são enviados para frente por um message broker para +outros serviços ou mantidos no mesmo microserviço para requisições futuras; +microserviços podem escutar mais de uma fonte de dados para construir seus +artefatos.

+

Anteriormente eu mencionei um exemplo de um microserviço de placares que +produz um artefato com o placar de cada time e o nome dos jogadores que +fizeram os gols. Esse microserviço poderia ouvir:

+
    +
  1. A fila de times: pode ser necessária para que possamos mostrar o nome ou +sigla do time na requisição de placar; uma vez que um time aparece num +campeonato, o microserviço adiciona o mesmo no seu estado para referência +futura1.
  2. +
  3. A file da jogadores: o mesmo que acima, para que o microserviço possa +retornar o nome, apelido, número da camisa ou alguma coisa relacionada com +o jogador; de novo, o serviço fica escutando a fila de jogadores e os +guarda em seu estado.
  4. +
  5. A fila de partidas: se uma partida for acontecer, ela tem que ter um +placar, provavelmente começando com 0 sem nenhum jogador na lista de gols; +isso é feito apenas para evitar problemas com serviços pedindo placares de +partidas que ainda não começaram ou que não tiveram gols ainda; de qualquer +forma, o artefato necessário já vai estar pronto para ser entregue.
  6. +
  7. A fila de narrações: escutando a fila de narrações, o microserviço de +placar irá detectar gols, atualizar seu estado e produzir o artefato +atualizado.
  8. +
+

A palavra chave da lista acima é "poderia": dependendo da forma como os +microserviços e as mensagens são construídas, pode não ser necessário ter +acesso a tudo isso.

+

Usando mensagens completas

+

Vamos começar com a forma mais simples de evitar escutar todas essas filas: +utilizando mensagens completas.

+

Numa mensagem completa, todos os campos relacionados são enviados junto com a +informação principal. Usando o exemplo acima, o serviço poderia ouvir apenas +as filas de partidas e narração, mas esperar que a mensagem de "NovaPartida" +teria os nomes dos tipos, suas siglas, escudos, provavelmente o ID e assim +pode diante; da mesma forma para a mensagem de "NovaNarração": ela contém o +nome do jogador, o apelido, número da camisa, ID e assim pode diante.

+

O problema com mensagens completas é que elas tentem a ficarem maiores com o +tempo: Com mais microserviços sendo adicionados ao sistema, mais campos vai +sendo necessários -- e ignorados por serviços que não os precisam.

+

O lado positivo de mensagens completas é que um microserviço sempre terá toda +a informação necessária, mantendo o número de filas a serem escutadas baixo. +Esse formato também facilita a adição de outros serviços no sistema: se o +mesmo começar com um estado em branco, ele poderá construir o mesmo a partir +do zero, porque toda a informação já está lá.

+

Escutar as filas básicas, pedir o resto

+

Quase como a solução acima, o serviço escuta apenas as filas de narrações e +partidas, mas uma vez que detecta alguma informação faltante (por exemplo, o +evento de narração cita um jogador, mas esse jogador não existe no estado), o +serviço faria uma requisição por essa informação mais "fria" (jogadores, times +e produtos não são atualizados com muita frequência, por exemplo) para outro +serviço e preencheria essa informação no seu estado.

+

Isso significa que esse microserviço agora, ao invés de saber apenas como +escutar filas, também precisa ter informações de outros serviços (aqueles que +processam e armazenam os dados frios) e suas interfaces -- e, de forma geral, +também requisitaria um serviço de descoberta presente no sistema. Esses +microserviços seriam aqueles de "duas caras", que recebem informações, +armazenam o estado, produzem o artefato mas tem uma interface de requisições +ao invés de simplesmente receber, processar e passar pra frente. Fazer cache +aqui também seria recomendado, para que um serviço não faça um "flood" de +requisições da mesma informação -- e atualizações de tempo em tempo podem +fazer sentido em algumas situações.

+

As mensagens seria menores (porque é enviado apenas o ID do time/jogador) e a +recuperação de informações acontece apenas quando necessária, mas onde é +reduzido o número de escutas nas filas, é aumentado o número de requisições. +Assim como na utilização de mensagens completas, um novo serviço poderia +facilmente construir seu estado a partir do zero sem qualquer problema -- irá +fazer um monte de requisições, mas terá, eventualmente, todas as informações +necessárias.

+

Escutas todas

+

Essa é exatamente a solução apresentada no exemplo acima: o microserviço fica +escutando todas os eventos das filas com eventos relacionados e constrói o +estado a partir deles.

+

Um problema dessa solução: uma vez que as filas são assíncronas, pode +acontecer um problema com a ordenação dos dados, com gols chegando antes dos +jogadores (por vários motivos). Nesse caso... o que o serviço faz? Rejeita o +gol na esperança que o jogador apareça, para evitar uma inconsistência dos +dados, e o que o message broker coloque o evento novamente no fim da fila?

+

Uma solução seriam serviços que, junto com este, escutem por um dado +específico: o microserviço de placares escuta as quatro filas citadas, mas há +um microserviço escutando apenas a fila de jogadores. Esse serviço iria +processar os dados mais rapidamente que o placar, e serviria como "fallback" +no caso de dados faltantes, como na solução acima. Isso reduziria o tráfego de +rede, mas iria gerar dados duplicados em serviços diferentes -- embora esse +último ponto não deveria ser um problema em primeiro lugar.

+

Novos serviços iriam encontrar problemas, porque apesar de receberem +novos dados, eles não estavam presentes quando os dados frios foram +processados; eles vão precisar se comunicar com outros serviços para recuperar +essa informação, ou alguém teria que manualmente copiar os dados.

+

Fila única

+

As soluções acima trabalham com cada dado em sua própria fila, mas e se +pudéssemos colocar todos os eventos na mesma fila? Dessa forma, a ordenação +é assegurada (jogadores são sempre enfileirados antes dos gols, e os serviços +irão processar os jogadores antes de sequer verem que há um gol).

+

Isso reduz o número de filas a serem ouvidas, mas requer um bom design de +mensagens, especialmente se for utilizada alguma linguagem de tipagem +estática, que normalmente requer uma estrutura bem definida para serialização +e desserialização.

+

Mas ao mesmo tempo, resolve praticamente todos os problems: não existe +problema com a ordem de processamento, o número de filas a serem ouvidas é +baixo e as mensagens pequenas. Mas também faz com que novos serviços sofram +com a falta de dados frios, forçando-os a comunicar com outros serviços ou +terem os dados copiados manualmente quando levantados.

+

E qual o melhor?

+

Honestamente, não faço ideia. Eu tenho uma certa preferência pelas mensagens +completas simplesmente porque simplifica a estrutura dos serviços, mesmo +sabendo que rede não é de graça; se eu usasse uma linguagem dinâmica, eu +provavelmente utilizaria a fila única. Mas, de novo, não acho que haja um +"tamanho único para todos".

+

Provavelmente existem outras opções arquiteturais para resolver esses +problemas, mas essas são as que eu consigo lembrar das conversas que tivemos +no trabalho.

+
1 +

Vale notar que o microserviço pode simplesmente ignorar parte da +informação. Por exemplo, se o artefato produzido tem apenas a sigla do time, +o serviço pode remover o nome completamente de seu estado.

+
+ +
+ + + + +
+ + + + diff --git a/public/pt/code/microservices-source-of-truth/index.html b/public/pt/code/microservices-source-of-truth/index.html new file mode 100644 index 0000000..59c72c2 --- /dev/null +++ b/public/pt/code/microservices-source-of-truth/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microserviços: Onde Fica a Fonte da Verdade?

+ +

Quando estamos falando de um sistema, existe um ponto que precisamos discutir +que é onde a "fonte da verdade" está. Em monolitos, a fonte da verdade está no +armazenamento dos dados em si. Mas onde é que essa fonte fica em um sistema +que é composto de múltiplas partes?

+ +

Só para ficar claro aqui: O que eu quero dizer com "fonte da verdade" é +qualquer coisa que você possa usar para verificar se o sistema está produzindo +os valores corretos. Por exemplo, em um pipeline que conta quanto foi +transferido de cada usuário em uma CDN, a fonte da verdade podem ser os logs +(você pode ler os logs e verificar se o sistema responsável por somar os +valores está correto); num site de e-commerce, podemos assumir que a fonta da +verdade é a lista de itens comprados em cada pedido para receita total (se +você somar todas as quantidades e seus preços de venda, você vai ter a receita +total de volta).

+

Um fator importante da fonte da verdade e que você pode usar tanto para +verificar se os serviços estão corretos quanto reaplicar o conteúdo de volta +no sistema para que artefatos sejam reconstruídos.

+

Mas existe um problema: Se o sistema é distribuído e cada microserviço cria +um artefato diferente, onde é +que fica a fonte da verdade?

+

Anteriormente, eu mencionei que microserviços podem manter um estado para +produzir o artefato. Essa pode ser a fonte da verdade para o microserviço, +desde que o mesmo não apague dados antigos -- nesse caso, como é que artefatos +antigos seriam reconstruídos se você não pode retornar o estado a um estado +anterior?

+

Outra solução é alterar o microserviço de importação de dados (aquele que +captura dados de uma fonte externa) para construir a fonte da verdade; havendo +a necessidade de reconstruir artefatos, você pode simplesmente adicionar uma +API nesse microserviço para que ele republique os dados relacionados com um +determinado objeto, que irão percorrer o pipeline e cada microserviço irá +reconstruir seus artefatos.

+

E, finalmente, se você construir um pipeline de event source corretamente, +você pode criar um serviço que irá escutar todos os eventos e manter um +event source global, que você pode, novamente, expor uma API para reenviar os +eventos relacionados com um objeto.

+
+

... embora eu tenha a sensação que certos eventos precisariam ser alterados; +por exemplo, se você mandar o event source reenviar os eventos relacionados +com um epdido -- para que seja recriado o artefato desse pedido -- você pode +ter que reaplicar um evento de "criar usuário", que não vai fazer sentido +porque o objeto já existe e não deve ser criado mais um usuário com as mesmas +informações.

+

Ou isso ou você vai ter que fazer com que o serviço de pedidos peça os dados +do cliente se ele já não tiver os mesmos.

+ +
+

De qualquer forma, uma recomendação que eu tenho é sempre construir alguma +coisa que possa guardar os seus dados, de forma que você possa reconstruir +seus artefatos novamente e os serviços apagam dados antigos (que é +perfeitamente normal, diga-se de passagem).

+ + +
+ + + + +
+ + + + diff --git a/public/pt/code/multiple-distros-with-toolbox/index.html b/public/pt/code/multiple-distros-with-toolbox/index.html new file mode 100644 index 0000000..bb6cd6a --- /dev/null +++ b/public/pt/code/multiple-distros-with-toolbox/index.html @@ -0,0 +1,207 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Múltiplas Distribuições com Toolbx

+ +

Quando eu troquei meu Fedora pelo +Silverblue, eu passei a usar toolbox +para verificar pacotes e coisas do genêro. Mas quando eu precisei testar um +projeto em múltiplas distribuiçoes, eu decidi que era hora de explorar Toolbx +um pouco mais a fundo.

+

O que é?

+

Antes de mais nada, Toolbx (ou toolbox) é uma ferramente criada para +facilitar o uso de imagens com Podman. Sabe quando você +usa o Docker para criar uma imagem que você possa usar junto com a sua +instalação atual, que você possa quebrar de várias maneiras sem estragar o +sistema externo e ainda tem acesso aos seus dados? Bom, isso é o Toolbx.

+

Por padrão, no Silverblue, existe apenas uma imagem: fedora-toolbox. É a +instalação padrão do Fedora Workstation, mas você pode usar qualquer versão do +Fedora. Você pode fazer

+
toolbox create
+
+

... para criar um ambiente com o a instalação do Fedora na mesma versão que a +versão do Silverblue e então

+
toolbox enter
+
+

... para entrar na imagem. A partir daí você pode instalar qualquer coisa sem +que isso afete o seu sistema.

+

toolbox create tem uma opção para selecionar uma imagem, é foi nisso que eu +tive a ideia de usar o Toolbx para ter várias distribuições no meu sistema, +cada uma no seu contêiner isolado, com suas próprias ferramentas, e que eu +pudesse estragar a vontade sem estragar a instalação básica.

+

Usando outas imagens

+

Para usar uma imagem diferente no Toolbx, você pode simplesmente baixar a +imagem usando podman pull e o nome da imagem. Infelizmente, nem toda imagem +está pronta para ser usada, porque o Toolbx tem alguns requisitos para +conseguir interagir com a imagem.

+

Requisitos

+

Primeiro, é preciso que capsh esteja disponível dentro da imagem. O nome do +pacote depende da distribuições, mas nas imagens que eu tentei usar, nenhuma +delas tinha o mesmo instalado por padrão.

+

Segundo, você possivelmente vai precisar do "sudo" para que você possa instalar +pacotes no container e, novamente, parece que ele não é padrão nas outras +imagens.

+

Terceiro, como "sudo" não vai estar disponível, não vai haver um arquivo +sudoers, fazendo necessário que você crie um.

+

Quarto, o grupo de usuários do sudo muda de distribuição para distribuição; +algumas chamam o grupo de "sudo", outras chama de "wheel". Mas o grupo deve +existir.

+

E quinto, Toolbx vai alterar o entrypoint do container, então você precisa +garantir que o não há nenhum comando no entrypoint da imagem.

+
+

Existe uma linha que basicamente remove o entrypoint não importa o que a imagem +base usa, e eu adicionei a mesma em todos os exemplos, só por garantia.

+ +
+

Uma imagem OpenSuse

+

Vou começar com uma imagem do OpenSuse: Suse não tem um grupo de sudo, não vem +com o capsh nem com sudo. Assim, eu tive que criar minha própria imagem. +Isso pode ser feito com um arquivo Containerfile or, se você preferir, pode +criar o mesmo com o nome Dockerfile, que o Podman não tem o menor problema em +usar.

+

Assim, eu tenho esse Containerfile:

+
FROM opensuse/leap:15.1
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN groupadd wheel
+RUN zypper install -y libcap-progs sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

Os labels são apenas para informar o Toolbx que a imagem é uma imagem Toolbx. +Como não há um grupo de sudo, eu tive que criar um grupo chamado "wheel"; +libcap-progs é onde o capsh se encontra; um arquivo sudoers foi adicionado +para permitir usar sudo sem senha.

+
+

Se você estiver curioso, esse é o conteúdo inteiro do sudoers é apenas uma +linha:

+
%wheel        ALL=(ALL)       NOPASSWD: ALL
+
+ +
+

Com isso, a imagem pode ser criada com podman create . -t suse51 onde +"suse51" vai ser o nome da imagem.

+

Com a imagem criada, o ambiente do Toolbx pode ser criado com toolbox create -i <hash> suse; o <hash> é a parte do ID da imagem e suse vai ser o nome +do toolbox. Não sei porque, mas algumas vezes referenciar a imagem pelo nome (o +nome que usamos na parte do build) não parece funcionar, mas o hash sempre +funciona.

+

E, com isso, para usar o ambiente, basta usar toolbox enter suse.

+

Outras distribuições que eu tive que construir a imagem:

+

Uma Imagem Ubuntu

+

Parecido com o OpenSuse, a imagem padrão do Ubuntu não vem com capsh nem +sudo, mas isso pode ser corrigido com este Containerfile:

+
FROM ubuntu:18.04
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN apt update && apt upgrade -y
+RUN apt install -y libcap2-bin sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

Ainda, o grupo do sudo é "sudo", e o arquivo sudoers tem que refletir isso.

+

Uma Imagem Centos 7

+

Centos 7 vem com capsh, mas não com o sudo. Assim, precisamos de mais uma +imagem customizada:

+
FROM centos:7.3.1611
+
+LABEL com.github.containers.toolbox="true" \
+      com.github.debarshiray.toolbox="true"
+
+RUN yum -y update yum-skip-broken
+RUN yum install -y sudo
+COPY sudoers /etc/sudoers
+
+ENTRYPOINT []
+
+

O grupo do sudo é o "wheel", e assim o sudoers tem que ser ajustado.

+

Conclusão

+

Bom, é basicamente isso. Eu tive que trabalhar um pouco com as iagens, +verificar os logs tentando criar ambientes com toolbox create -i <imagem> <umnome> --log-devel DEBUG para ver o que o Toolbx estava encontrando de +problemas, encontrar uma solução para isso, mas depois que a primeira imagem +foi criada (a do Suse), encontrar o que estava falando foi bem fácil.

+

E agora eu não preciso ficar pulando de distribuição em distribuição para +descobrir se o nosso projeto funciona nelas.

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/pyngos-de-python-1/index.html b/public/pt/code/pyngos-de-python-1/index.html new file mode 100644 index 0000000..a4e3890 --- /dev/null +++ b/public/pt/code/pyngos-de-python-1/index.html @@ -0,0 +1,244 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pyngos de Python I

+ +

"Pyngos de Python" são pequenas explicações de Python.

+

Nesse post, vamos falor sobre generators.

+ +

Vamos começar falando sobre list comprehensions, que são bem comuns em Python. +De forma gera, um list comprehension é definido como

+
[transformação
+ for variável
+ in iterável
+ if condição]
+
+ +

Um exemplo de list comprehension em ação:

+
lista = [1, 2, 3, 4]
+lc = [i * 2 for i in lista]
+print(lc)   # [2, 4, 6, 8]
+
+

Embora útil, existe um problema: List comprehensions geram uma lista com, no +máximo, o mesmo tamanho do iterável original; se você tiver um array de 500.000 +elementos, um list comprehension que não tenha uma condição vai gerar outro +array com 500.000 elementos.

+

E, em alguns casos, isso não é necessário.

+

Antes de ver onde generators podem ser usados, veremos a sintaxe de um:

+
(transformação
+ for variável
+ in iterável
+ if condição)
+
+

Como pode ser visto, a sintaxe é bem semelhante; a diferença é que +comprehensions usam [], enquanto generators usam ().

+

E como exemplo:

+
lista = [1, 2, 3, 4]
+gen = (i * 2 for i in lista)
+print(gen)   # <generator object <genexpr> at 0x7f7f30843df0>
+
+

O que diabos é esse generator object?

+

Generators não geram os dados todos numa passada; os dados somente são +processados quando pedidos. A forma de pedir o próximo elemento é usando a +função next; quando o generator encontra o final do iterável, ele levanta a +exceção StopIteration:

+
lista = [1, 2, 3, 4]
+gen = (i * 2 for i in lista)
+print(next(gen))    # 2
+print(next(gen))    # 4
+print(next(gen))    # 6
+print(next(gen))    # 8
+print(next(gen))    # Exceção: StopIteration
+
+

Curiosamente, for sabe lidar com StopIteration e next(), o que torna +possível usar um generator diretamente no for:

+
lista = [1, 2, 3, 4]
+for i in (i * 2 for i in l):
+    print(i)    # 2, 4, 6, 8
+# Nenhuma exceção aqui.
+
+

Mas é a vantagem de usar generators?

+

A primeira vantagem pode ser vista no for acima: Imagine que lista tem +500.000 elementos. Usar list comprehensions não mudaria nada no código (com a +exceção de usar [] ao invés de ()), mas estamos gerando a multiplicação +somente quando necessário. Agora imagine que estamos procurando algo na lista +original e vamos parar assim que encontrarmos o registro: com list +comprehension, a nova lista será sempre gerada, e se o o elemento procurado for +o primeiro, acabamos gerando 499.999 elementos que não vamos usar. Com +generators, no momento que encerramos a procura, nada mais é gerado -- e +somente o elemento procurado é gerado.

+

Um exemplo mais real: Arquivos são iteráveis, onde cada requisição é uma linha +do arquivo. Se o arquivo sendo processado é um CSV, podemos fazer um generator +que separa os campos sobre a iteração do arquivo enquanto procuramos um +registro específico:

+
with open('arquivo.csv') as origem:
+   for registro in (linha.split(',') for linha in origem):
+      if registro[1] == 'entrada':
+         return registro[2]
+
+

Neste código, estamos procurando a linha do CSV cujo 2o elemento (listas +começam em 0) tem o valor "entrada"; quando encontrarmos, retornamos o valor da +coluna seguinte. A medida que o for for pedindo valores, o generator é +chamado; o generator que criamos quebra a linha usando "," como separador; como +o generator usa o iterável do arquivo (que, por baixo dos panos, também é um +generator), somente quando for pedido um registro é que uma linha será lida; +somente quando a linha vier é que vai ser feito o split. E se, por algum +motivo, o registro procurando for o primeiro, foi somente lida uma linha do +arquivo1 e feito o split somente uma vez.

+

BÔNUS: Generator Functions!

+

Existe uma forma de criar uma função que age como um generator, usando o +statement yield, da mesma forma que se usaria o statement return. A +diferença é que quando o Python encontra yield, ao invés de destruir tudo que +estava na função, ele guarda a posição atual e, na chamada do next(), +continua naquela posição.

+

Por exemplo, se tivermos:

+
def double(lista):
+   for i in lista:
+      return i * 2
+
+double([1, 2, 3, 4])
+
+

Irá retornar apenas 2 porque, ao ver o return, o Python vai destruir tudo +que a função já fez e retornar o valor indicado -- incluindo encerrar o for +antes de chegar no final.

+

Com generator functions, teríamos:

+
def double(lista):
+   for i in lista:
+      return i
+
+
+gen = double([1, 2, 3, 4])
+next(gen)   # 2
+next(gen)   # 4
+next(gen)   # 6
+next(gen)   # 8
+next(gen)   # StopIteration
+
+

Note que a chamada para a função é que retorna um generator. Tentar fazer

+
def double(lista):
+   for i in lista:
+      return i
+
+
+next(double([1, 2, 3, 4]))   # 2
+next(double([1, 2, 3, 4]))   # 2
+next(double([1, 2, 3, 4]))   # 2
+next(double([1, 2, 3, 4]))   # 2
+...
+
+

... vai gerar um novo generator a cada chamada.

+

Ainda, é possível que a função tenha mais de um yield:

+
def double(lista):
+   yield lista[0] * 2
+   yield lista[1] * 2
+   yield lista[2] * 2
+
+gen = double([4, 3, 2, 1])
+next(gen)   # 8
+next(gen)   # 6
+next(gen)   # 4
+next(gen)   # StopIteration
+
+

Aqui, a primeira chamada de next() vai retornar o valor do primeiro yield, +que é o primeiro elemento da lista multiplicado por 2; o próximo next() vai +executar o comando logo depois do primeiro yield, que é o segundo yield; e +a terceira chamada vai continuar a execução logo depois desse, que é o terceiro +yield. Como o código termina aí, o generator vai levantar a exceção +StopIteration.

+

Mas o que aconteceria se... a função nunca retornasse nada?

+
def gen():
+   i = 0
+   while True:
+      yield i * 2
+      i += 1
+
+

Neste caso, usando next() no generator, a primeira vez será retornado "0"; o +next() seguinte irá continuar o código, somando "1" ao nosso contador, +retornando para o começo do loop e retornando "2"; e assim sucessivamente até o +fim do mundo (ou até ser pressionado Ctrl+C, desligado o computador ou atingido +o número máximo permitido para inteiros em Python).

+
+
1 +

Tecnicamente, vai ser lido mais, porque o Python usa "buffers" de +leitura, carregando blocos e depois enviando apenas os bytes desde a última +posição lida até o caracter de nova linha. Mas, para simplificar as coisas, +imaginem que apenas uma linha é lida mesmo.

+
+ +
+ + + + +
+ + + + diff --git a/public/pt/code/python-2-3-six/index.html b/public/pt/code/python-2-3-six/index.html new file mode 100644 index 0000000..5800485 --- /dev/null +++ b/public/pt/code/python-2-3-six/index.html @@ -0,0 +1,343 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python 2 + 3 = Six

+ +

"Six" é uma pequena biblioteca Python que pode ajudar você a passar o seu +código de Python 2 para Python 3.

+
+

(Esse post é relacionado com a apresentação que eu fiz no dia 19 de novembro +no TchêLinux. Os slides podem ser encontrados +na área de apresentações.)

+ +
+

Antes de mais nada, uma coisa que precisamos responder é: Porque alguém usaria +Python 3?

+ +
+

Existe ainda a interpolação de strings com o novo identificador f; a +funcionalidade é semelhante à chamada str.format usando locals(), por +exemplo, f'{element} {count} é equivalmente à '{element} {count}'.format(locals()) (desde que você tenha element e count como +variáveis locais da sua função).

+ +
+

O último ponto é o mais importante. Você pode pensar "mas ainda tem três anos +até lá", mas natal está chegando, daqui a pouco é carnaval e, quando menos se +espera, é 2020.

+

O caminho para Python 3

+

Quem quiser já começar a portar seus aplicativos para Python 3, existem duas +formas:

+

A primeira é executar seus aplicativos com python -3 [script]; isso irá fazer +com que o interpretador Python avise quando qualquer instrução de código que +ele não consiga converter corretamente seja alertado. Eu executei um script +pessoal com data de 2003 e o +Python não apresentou nada.

+
+

Apenas para fins de melhor elucidação: o código que eu estava gerando já estava +mais correto e seguindo os padrões mais pythônicos; em 2014 eu ainda estava +vendo casos em que código rodando em Python 2.6 ainda usava has_keys(), que +foi deprecado no Python 2.3.

+ +
+

Existem vários motivos pra isso:

+
    +
  1. As pessoas se acostumaram a escrever código "Pythonico"; a linguagem em si +não sofreu grandes alterações.
  2. +
  3. Apesar da linguagem Python ter algumas coisas removidas, essas foram +lentamente reintroduzidas na linguagem; um exemplo é o operador de +interpolação de strings (%) que havia sido removido em favor do +str.format mas acabou voltando.
  4. +
+

A segunda forma para portar seu código para Python 3 é usar a ferramenta +2to3. Ela irá verificar as alterações conhecidas para Python 3 (por exemplo, +a transformação de print para função, a alteração de alguns pacotes da STL) +e ira apresentar um patch para ser aplicado depois.

+

Entre as conversões que o 2to3 irá fazer, está a troca de chamadas de +iter-alguma-coisa para a versão sem o prefixo (por exemplo, +iteritems() irá se tornar simplesmente items()); print será +convertido para função; serão feitos vários ajustes nas chamadas das +bibliotecas urllib e urlparse (estas duas foram agrupadas no Python 3 +e a primeira teve várias reorganizações internas); xrange passa a ser +range; raw_input agora se chama input e tem um novo tratamento de +saída, entre outros.

+

Existe apenas um pequeno problema nessa conversão de Python 2 para Python 3: +Como pode ser visto na lista acima, alguns comandos existem nas duas versões, +mas com funcionalidades diferentes; por exemplo, iteritems() é convertido +para simplesmente items(), mas os dois métodos existem em Python 2: o +primeiro retorna um iterador e o segundo retorna uma nova lista com as tuplas +de todos os elementos do dicionário (no caso do Python 3, é retornado um +iterador). Assim, apesar do código ser gramaticalmente igual tanto em Python 2 +quanto Python 3, semanticamente os dois são diferentes.

+

Esse problema de "comandos iguais com resultados diferentes" pode ser um +grande problema se o sistema está sendo executado em ambientes que não +permitem modificação fácil -- por exemplo, o mesmo é executando num Centos 4 +ou ainda necessita compabilidade com Python 2.6, ambos "problemas" sendo, na +verdade, requisitos do grupo de infraestrutura.

+

Six (e __future__) ao Resgate

+

Para resolver o problema de termos código que precisa executar nas duas +versões, existe a biblioteca Six; ela faz o +"meio de campo" entre Python 2 e Python 3 e fornece uma interface para que +código Python 2 seja portado para Python 3 mantendo a compatibilidade.

+

Num exemplo (relativamente idiota):

+
import collections
+
+class Model(object):
+    def __init__(self, word):
+        self._count = None
+        self.word = word
+        return
+
+    @property
+    def word(self):
+        return self._word
+
+    @word.setter
+    def word(self, word):
+        self._word = word
+        self._count = collections.Counter(word)
+
+    @property
+    def letters(self):
+        return self._count
+
+    def __getitem__(self, pos):
+        return self._count[pos]
+
+if __name__ == "__main__":
+    word = Model('This is an ex-parrot')
+    for letter, count in word.letters.iteritems():
+        print letter, count
+
+

Nesse exemplo, temos uma classe que guarda uma frase e a quantidade de vezes +que cada letra aparece, utilizando Counter para fazer isso (já que Counter +conta a quantidade de vezes que um elemento aparece em um iterável e strings +são iteráveis).

+

Nesse exemplo, temos os seguintes problemas:

+
    +
  1. +

    class Model(object): em Python 3, todas as classes são "new class" e o +uso do object não é mais necessário (mas não afeta o funcionamento da +classe);

    +
  2. +
  3. +

    for letter, count in word.letter.iteritems() Conforme discutido +anteriormente, iteritems() deixou de existir e passou a ser items(); +items() existe no Python 2, mas a funcionalidade é diferente. No nosso +caso aqui, o resultado da operação continua sendo o mesmo, mas o consumo de +memória irá subir cada vez que a chamada for feita.

    +
  4. +
  5. +

    print leter, count: print agora é uma função e funciona levemente +diferente da versão com Python 2.

    +
  6. +
+

Então, para deixar esse código compatível com Python 2 e Python 3 ao mesmo +tempo, temos que fazer o seguinte:

+
+

class Model(object)

+
+

Não é preciso fazer nada.

+
+

print letter, count

+
+
from __future__ import print_function
+print('{} {}'.format(letter, count))
+
+

print como função pode ser "trazido do futuro" usando o módulo +__future__ (apenas disponível para Python 2.7); como a apresentação de +várias variáveis não é recomenando usando-se vírgulas, usar o +str.format é a forma recomendada.

+

Uma opção melhor (na minha opinião) é:

+
from __future__ import print_function
+print('{letter} {count}'.format(letter=letter
+                                count=count))
+
+

Assim, os parâmetros usados na saída são nomeados e podem ser alterados. +Isto gera um erro estranho quando um nome usado na string de formato não +for passada na lista de parâmetros do format, mas em strings mais +complexas, o resultado é mais fácil de ser entendido (por exemplo, eu acho +mais fácil entender {letters} aparece {count} vezes do que {} aparece {} vezes; ainda, é possível mudar a ordem das variáveis na string de formato +sem precisar alterar a ordem na lista de parâmetros).

+

Uma opção melhor ainda é:

+
import six
+six.print_('{letter} {count}'.format(letter=letter,
+                                     count=count))
+
+

Com Six, remove-se a dependência com __future__ e assim pode-se usar o +mesmo código em Python 2.6.

+
+

for letter, count in word.letters.iteritems():

+
+
import six
+for letter, count in six.iteritems(word.letters):
+
+

Six provê uma interface unificada para iterador de itens tanto em Python 2 +quanto Python 3: six.iteritems() irá chamada iteritems() se estiver +rodando em Python e items() se estiver rodando com Python 3.

+

E, assim, nosso código relativamente idiota agora é compatível com Python 2 e +Python 3 roda de forma idêntica nos dois.

+

Mas vamos para um exemplo real:

+
import urllib
+import urlparse
+
+def add_querystring(url, querystring, value):
+	 frags = list(urlparse.urlsplit(url))
+	 query = frags[3]
+	 query_frags = urlparse.parse_qsl(query)
+	 query_frags.append((querystring, value))
+	 frags[3] = urllib.urlencode(query_frags)
+	 return urlparse.urlunsplit(frags)
+
+if __name__ == "__main__":
+	 print add_querystring('http://python.org', 'doc', 'urllib')
+	 print add_querystring('http://python.org?doc=urllib', 
+								  'page', '2')
+
+
+

Sim, sim, o código poderia ser um simples "verificar se tem uma interrogação na +URL; se tiver, adicionar & e a query string; se não tiver, adicionar ? e a +query string". A questão é: dessa forma, eu consigo fazer uma solução que vai +aceitar qualquer URL, em qualquer formato, com qualquer coisa no meio porque as +bibliotecas do STL do Python vão me garantir que a mesma vai ser parseada +corretamente.

+ +
+

Esse é um código de uma função utilizada para adicionar uma query string em +uma URL. O problema com essa função é que tanto urlib +quanto urlparse sofreram grandes modificações, ficando, inclusive, sob o +mesmo módulo (agora é tudo urllib.parse).

+

Para fazer esse código ficar compatível com Python 2 e 3 ao mesmo tempo, é +preciso usar o módulo six.moves, que contém todas essas mudanças de escopo +das bibliotecas da STL (incluindo, nesse caso, a urllib e urlparse).

+
import six
+
+def add_querystring(url, querystring, value):
+	 frags = list(six.moves.urllib.parse.urlsplit(url))
+	 query = frags[3]
+	 query_frags = six.moves.urllib.parse.parse_qsl(query)
+	 query_frags.append((querystring, value))
+	 frags[3] = six.moves.urllib.parse.urlencode(query_frags)
+	 return six.moves.urllib.parse.urlunsplit(frags)
+
+if __name__ == "__main__":
+	 six.print_(add_querystring('http://python.org', 'doc', 'urllib'))
+	 six.print_(add_querystring('http://python.org?doc=urllib', 
+										 'page', '2'))
+
+

O que foi feito, aqui, foi usar six.moves.urllib.parse. Essa estrutura não +vêm por acaso: no Python 3, as funções de urlparse agora se encontram em +urllib.parse; Six assumiu que a localização correta para as funções dentro +"de si mesma" seriam os pacotes utilizados no Python 3.

+

E, assim, temos dois exemplos de programas que conseguem rodar de forma igual +tanto em Python 3 quanto Python 2.

+

Ainda, fica a dica: Se houver algum software que você utiliza que não roda +corretamente com Python 3, utilizar o Six pode ajudar a manter o código atual +até que uma escrita resolva o problema.

+

Outras Perguntas

+

Como fica a questão de ficar sempre com o Six?

+

Boa parte das aplicações hoje botaram uma "quebra" do suporte às suas versões +que rodam em Python 2. Por exemplo, Django anunciou que em 2020 vai sair a +versão 2.0 do framework e essa versão vai suportar Python 3 apenas.

+

Quão difícil é portar para Python 3?

+

Não muito difícil -- agora. Muitas das coisas que foram removidas que davam dor +de cabeça na conversão retornaram; o caso mais clássico é o que operador de +interpolação de strings %, que foi removido e teria que ser substituído por +str.format, mas acabou retornando. Outro motivo é que os scripts são mais +"pythônicos" atualmente, muito por causa de gente como Raymond +Hettinger, que tem feito vídeos excelentes +de como escrever código em Python com Python (ou seja, código "pythônico"). E, +como anedota pessoal, eu posso comentar que meu código de 2003 rodou com +python -3 sem levantar nenhum warning.

+ +
+ + + + +
+ + + + diff --git a/public/pt/code/redid-my-nvim-config/index.html b/public/pt/code/redid-my-nvim-config/index.html new file mode 100644 index 0000000..61df756 --- /dev/null +++ b/public/pt/code/redid-my-nvim-config/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Eu Refiz Minha Configuração do NeoVim

+ +

Por algum motivo obscuro, minha instalação do NeoVim não queria mais mostrar os +alertas do LSP. Então eu decidi refazer minha configuração.

+ +

Acredite-me, eu não fiz porque "PQP, tudo quebrado". Eu acredito que eu poderia +encontrar o problema com a forma como o +LanguageClient estava +instalado -- poderia até mesmo estar desatualizado, já que eu atualizei para o +NeoVim 0.6 recentemente -- mas eu também geria instalar o TreeSitter para ter +um suporte melhor à coloração do fonte. Estes dois fatores foram suficientes +para tentar fazer uma configuração nova, e eu decidi que eu iria fazer a coisa +toda, usando o arquivo de configuração em formato Lua.

+

Eu comecei com o post do Takuya +Matsyama +como referência -- eu não costumo usar gerenciadores de pacote (e provavelmente +aí é que está o problema com o plugin desatualizado) e eu prefiro trabalhar com +submódulos e coisas do tipo -- um formato que é bem próximo da forma como o +Pathogen funciona.

+

Como eu queria mover algumas coisas da minha antiga configuração para a nova, +eu precisei procurar como "traduzí-las". Foi aí que eu encontrei um post por +Heiker Curiel, +que lista as antigas opções de configuração e como elas aparecem numa +configuração em Lua.

+

O resultado é que eu agora tenho uma instalação novinha do NeoVim, com todas as +firulas:

+

+

O arquivo de configuração (e submódulos) está no meu repositório pessoal do +Git.

+

O que ficou pra trás?

+

Enquanto eu estava migrandion, eu resolvi não adicionar algumas coisas nessa +nova configuração:

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/code/redid-my-nvim-config/vim6.png b/public/pt/code/redid-my-nvim-config/vim6.png new file mode 100644 index 0000000..e2c86f9 Binary files /dev/null and b/public/pt/code/redid-my-nvim-config/vim6.png differ diff --git a/public/pt/code/thinking-about-rust-actors/actors.png b/public/pt/code/thinking-about-rust-actors/actors.png new file mode 100644 index 0000000..bb75425 Binary files /dev/null and b/public/pt/code/thinking-about-rust-actors/actors.png differ diff --git a/public/pt/code/thinking-about-rust-actors/index.html b/public/pt/code/thinking-about-rust-actors/index.html new file mode 100644 index 0000000..f65dbf5 --- /dev/null +++ b/public/pt/code/thinking-about-rust-actors/index.html @@ -0,0 +1,173 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pensamentos Sobre Atores em Rust

+ +

Recentemente eu escrevi uma aplicação para o trabalho (desculpa, não posso +mostrar o código) que, por ser fortemente baseada em I/O, eu decidi escrever +usando Tokio e a ideia de usar Actor Model com +isso.

+

... o que me levou a pensar um pouco mais sobre isso.

+ +

Antes de mais nada, Actors em Rust são bem diferentes de atores em linguagens +com um Actor Model de verdade. Em resumo, você tem os seus atores, que rodam de +forma independente, cada ator tem uma caixa de entrada (inbox) para coisas a +serem processadas e uma "caixa de saída" -- com aspas, porque não é exatamente +isso. Um ator recebe uma mensagem, processa mesma e pode ter terminado aí ou +pode produzir algo para ser processado por outro ator -- que seria a caixa de +saída, o que normalmente difere da caixa de entrada porque a caixa de entrada +tem uma fila, mas a caixa de saída não (e é por isso que eu estava usando +"caixa de saída" com aspas antes).

+

Todas as mensagens são entregues por um "correio" (ou "post office" no inglês), +que conecta todos os atores:

+

+

Na minha implementação, o ator era um módulo com uma função chamada run(); +essa função expõe a parte de Sender de um canal MPSC +(Multiple-Producer-Single-Consumer, ou "Vários Produtos, Um Consumidor") que +haje como a caixa de entrada do ator, e o PID da tarefa, de forma que é +possível fazer um .await no loop de processamento para evitar que a aplicação +principal termine enquanto o ator ainda está ativo.

+
+

Nos exemplos abaixo, eu vou completamente ignorar a parte do Tokio e async.

+ +
+

Como não há alguma coisa que funcione como um "Correio" em Rust, eu fiz uma +ligação direta entre os atores, entregando o canal Sender de um ator como +parâmetro para o segundo, de forma que o segundo saiba para onde enviar as suas +mensagens. Algo do tipo:

+
let canal3 = ator3::run(...);
+let canal2 = ator2::run(canal3);
+ator1::run(canal2);
+
+

Nesse exemplo, seja lá o que ator1 produza, ele envia diretamente para o +"ator2" através do canal que o segundo criou; "ator2", por sua vez, produz +alguma coisa que é recebida pelo "ator3". E, com mais atores, só é preciso +ficar fazendo as conexões.

+
+

Eu estou intencionalmente ignorando os internos de cada ator e as suas funções +run(), mas elas seriam variações de:

+
fn run(..) -> (task::JoinHandle<()>, mpsc::Sender<TipoDeDadosQueOAtorRecebe>) {
+    let (tx, mut rx) = mpsc::channel::<TipoDeDadosQueOAtorRecebe>(UM_TAMANHO);
+    let task = tokio::spawn(async move {
+        while let Some(dado) = rx.recv().await {
+            let conversao = processamento_do_ator(dado);
+            // Talvez envie o "conversao" para o próximo ator?
+        }
+    });
+    (task, tx)
+}
+
+ +
+

Mas... como os atores parecem ter uma interface muito parecida, isso se parece +com uma trait!

+

Então, como deveria ser a trait de Atores?

+

Inicialmente, a função run() ou similar devem expor o PID do ator e o canal +de entrada. Algo como:

+
pub trait Actor {
+    fn run() -> (task::JoinHandle<()>, Sender<TipoDeDadosQueOAtorRecebe>);
+}
+
+

Por que TipoDeDadosQueOAtorRecebe? É por que cada ator pode ter um tipo de +mensagem diferente de entrada. Usando o pequeno exemplo acima, "ator2" poderia +estar recebendo usize e enviando Strings para o "ator3".

+

Como o tipo muda de ator para ator, nós precisamos de um tipo associado:

+
pub trait Actor {
+    type Input;
+
+    fn run() -> (task::JoinHandle<()>, Sender<Self::Input>);
+}
+
+

A ideia básica é que, uma vez que a trait seja implementada por uma struct, +nós possamos fazer algo como:

+
let ator3 = Ator3::new(...);
+let (ator3_pid, canal_ator3) = ator3::run();
+
+

Mas peraí, e como faríamos a ligação entre atores? Isso poderia ser feito com +algo simples como:

+
let ator3 = Ator3::new();
+let (ator3_pid, ator3_canal) = ator3::run();
+let ator2 = Ator2::new(ator3_canal);
+let (ator2_pid, ator2_canal) = ator2::run();
+
+

O que fica meio verboso, mas funciona.

+

Eu tenho algumas ideias de como fazer a parte de ligação mais fluente, mas eu +preciso fazer algumas explorações no tópico (principalmente porque eu acho que +dá pra usar o sistema de tipos de Rust para não permitir que sejam conectados +atores cujo tipo de entrada é diferente do tipo de saída do anterior). Quando +eu conseguir pensar em algo, eu faço um post explicando.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/code/unit-in-unittests/index.html b/public/pt/code/unit-in-unittests/index.html new file mode 100644 index 0000000..b585710 --- /dev/null +++ b/public/pt/code/unit-in-unittests/index.html @@ -0,0 +1,413 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O "Unit" de "Unit Tests"

+ +

Existem vários artigos sobre os "testes de unidade" e alguns até +falando de "a unidade dos testes"; todos estes estão errados e é +preciso parar de falar dessa forma.

+
+

(Este post é relacionado com a apresentação que eu fiz no dia 19 de +novembro no TchêLinux. Os slides podem ser encontrados na área de +apresentações.

+ +
+

Boa parte do conteúdo que eu vou comentar aqui é relacionado com o vídeo de Ian +Cooper TDD, where did it all go wrong. Quando eu +vi o vídeo, imediatamente eu comecei a relacionar os comentários dele sobre +TDD, na versão original de Kent Beck (o author do livro Test Driven +Development By Example, +que foi o responsável por "reativar" a discussão sobre testes) com uma +experiência pessoal trabalhando com TDD no mundo embedded.

+

Antes que eu entre na discussão sobre o que é TDD de verdade, o que Kent Beck +quis dizer com o seu "unit test" e essa experiência pessoal, é preciso fazer +duas perguntas:

+ +

Existem várias discussões sobre isso, incluíndo uma recente (com relação à +este post, no entanto) sobre como escrever testes de alta qualidade (em +inglês), em que o autor comenta

+

Se você estiver programando com orientação à objetos, a sua unidade devem +ser as classes; se estiver programando de forma funcional, a sua unidade +são as funções.

+

O problema é que essa visão, além de incorreta com relação ao que Kent Beck +prega no seu livro (pelo menos, segundo Ian Cooper), ela gera mais problemas +do que soluções.

+

Um exemplo errado de unidade

+

Vamos pegar a ideia geral de "unidades de teste" e aplicar num pequeno caso. +Digamos que você tenha a seguinte classe para manter seus clientes:

+
class Client:
+    def __init__(self, name):
+        self.name = name
+
+

Uma classe simples, onde você tem o nome do cliente (obviamente, num caso real, +a classe teria mais propriedades e mais uma pilha de métodos, mas para fins de +exemplo, vamos manter simples e curto.)

+

Conforme o produto evolui, surge o seguinte requerimento:

+
+

Não podem ser cadastrados clientes com apenas um nome.

+
+

Nesse ponto, você resolve aplicar os princípios SOLID, aplicando o +"Princípio da Responsabilidade Única" e gera a seguinte alteração:

+
def _multiple_names(name):
+    split_names = name.split(' ')
+    return len(split_names) > 1
+
+def _validate_name(name):
+    if not _multiple_names(name):
+        raise Exception("Invalid name")
+    return name
+
+class Client:
+    def __init__(self, name):
+        self.name = _validate_name(name)
+
+

Isso obedece boa parte do SOLID e do SRP porque a função _validade_name +tem uma única responsabilidade, dizer se o nome é valido ou não (e o "bacana" é +que, se surgir uma nova condição definindo o que é um nome válido, basta +adicionar nessa função a chamada do novo validador); ainda, _multiple_names +tem uma única responsabilidade, dizer se o nome é composto por múltiplos nomes +ou um só.

+

Até aqui, não falamos nada de teste. Então vamos lá: você criou estes três +componentes e agora quer escrever os testes. Como é preciso escrever um +teste por classe e por função, você escreve essa excelente suíte de testes:

+
import pytest
+
+def test_single_name():
+    assert not _multiple_names('Cher')
+
+def test_multiple_name():
+    assert _multiple_names('Julio Biason')
+
+def test_valid_name():
+    _validate_name('Julio Biason')
+
+def test_invalid_name():
+    with pytest.raises(Exception):
+        _validate_name('Cher')
+
+def test_client_error():
+    with pytest.raises(Exception):
+        Client(name='Cher')
+
+def test_client():
+    Client(name='Julio Biason')
+
+
+

Sim, o certo seria escrever os testes antes do código, mas isso não é o que +acontece; afinal de contas, como é que você teria um teste para a sua classe se +você não escreveu a classe ainda -- e isso é mais uma prova que a pergunta de +"unidade de teste" está errada.

+ +
+

Uma vez escritos os testes, você roda os testes e...

+
$ pytest client.py
+==== test session starts ====
+rootdir: /home/jbiason/unitt, inifile:
+collected 6 items
+
+client.py ......
+
+==== 6 passed in 0.03 seconds ====
+
+

Excelente, todos os testes passaram; e como está a cobertura de testes (que é +algo que todo mundo que fala em "unidades de teste" se preocupa, afinal de +contas, você precisa garantir que tem testes para todas as classes e todas as +funções, certo?)

+
$ pytest --cov=client client.py
+==== test session starts ====
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      25      0   100%
+
+==== 6 passed in 0.11 seconds ====
+
+

100% de cobertura; excelente! Você encerra o dia e fica vendo vídeos no +YouTube o dia todo, até que alguém do financeiro vêm com essa notícia:

+
+

"Não podemos perder a Cher, a Xuxa, a Madonna, a Björk e o String como +clientes!"

+
+

Seu pensamento é "meleca". Bom, hora de retornar o código para seu estado +anterior:

+
class Client:
+   def __init__(self, name):
+      self.name = name
+
+
+

Na verdade, a parte que deveria ser alterada é justamente a _validate_name, +que não precisa mais perguntar se o cliente tem múltiplos nomes; eu mudei no +lugar errado propositadamente para aumentar o efeito catastrófico da coisa.

+ +
+

Alteração feita, é hora de rodar os testes para ver o que aconteceu:

+
==== FAILURES ====
+____ test_client_error ____
+
+    def test_client_error():
+        with pytest.raises(Exception):
+>           Client(name='Cher')
+E           Failed: DID NOT RAISE <class 'Exception'>
+
+client.py:37: Failed
+==== 1 failed, 5 passed in 0.63 seconds ====
+
+

Ah, lógico! "Cher" agora é um nome válido e, portanto, não vai mais levantar a +exceção. Você altera o test_client_error para não esperar a exceção mais e +roda os testes de novo:

+
$ pytest  client.py
+==== test session starts ====
+rootdir: /home/jbiason/unitt, inifile:
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+==== 6 passed in 0.03 seconds ====
+
+

Só para garantir, vamos rodar com cobertura de novo:

+
$ pytest --cov=client  client.py
+==== test session starts ====
+rootdir: /home/jbiason/unitt, inifile:
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      24      0   100%
+
+==== 6 passed in 0.12 seconds ====
+
+

Aí você se dá uns tapinhas nas costas por ter arrumado as coisas super rápido +por ter pensado em seguir o SOLID, os testes escritos continuam todos +funcionando corretamente e volta a ver vídeos.

+

Entretanto, agora você criou um monstro: as funções _validate_name e +_multiple_names não são mais necessárias, mas você não vê isso porque os +testes de cobertura continuam indicando que tudo está sendo testado. E assim +sua base de código vai crescendo e ninguém vê exatamente que há partes +desnecessárias porque a cobertura, que deveria indicar partes que não estão +sendo chamadas... estão sendo chamadas (pelos testes).

+
+

Algumas linguagens compiladas utilizam o conceito de "dead code": código que +nunca é chamado e que não é necessário. Entretanto, dependendo da linguagem, +isso pode não ser indicado em lugar nenhum porque o teste está usando a função +e, portanto, ele não está realmente morto.

+ +
+

De volta a Kent Beck

+

Se voltarmos ao que Kent Beck disse no seu livro, temos que

+
+

"Rode de forma isolada", nada mais, nada menos.

+
+

Ou seja, não são "testes de unidade", mas "testes unitários", no sentido de +que o teste consegue gerar e consumir todas as informações necessárias para +completar sua execução. No nosso exemplo de clientes, um teste que faz a +pesquisa por um cliente com um certo nome não deve, de forma alguma, depender +do teste que cria clientes. O teste deve ser unitário, ele não depende de +mais nenhum outro teste para funcionar.

+

Discussões sobre "qual a unidade" é que levaram a criação de modelos como +Behavior Driven Development (BDD) e Acceptance Test-Driven Development (ATDD); +na verdade, o que elas fazem é mudar a semântica do que são os testes para que +as pessoas olhem o que precisa ser feito ao invés de sair testando "unidades".

+

O que testar

+

A aproximadamente três semanas (novamente, baseada na data deste post) +apareceu uma pergunta no Reddit sobre se devem ser testados os componentes +internos do Django, +especificamente, se um campo inteiro deve ter testes para averiguar se o mesmo +retorna erro no caso de serem passados valores não-numéricos.

+

Esse foi um ponto que, numa primeira instancia, eu achei que não, mas a +verdade é que sim, isso deve ser testado. Não porque você quer garantir que um +campo numérico só aceita valores numéricos, mas porque a sua definição desse +campo (que pode ser, por exemplo, um CEP, ou uma idade) deve aceitar somente +valores numéricos. Você não está testando se o framework retorna um erro com +valores não-numéricos, mas porque você precisa validar se o seu campo é +numérico.

+

Em outras palavras, o que deve ser testado não é como o sistema foi +implementado, mas se os requisitos pedidos estão sendo cumpridos ("a +idade/CEP deve aceitar apenas números"). Essa é a unidade dos testes, se +vocês quiserem insistir na falácia. Essa é a única unidade que deve ser +testada.

+

Ou, como melhor colocou Kent Beck:

+
+

Evite testar detalhes de implementação, teste comportamentos.

+
+

O ciclo do TDD e o LSP

+

Uma coisa que o TDD promove é o ciclo "Vermelho", "Verde", "Refatoração". Isso +pode ser "traduzido" como

+
+

Escreva seu teste que garanta um certo requisito; como não há +implementação, ele irá falhar (aparecer como vermelho nos resultados dos +testes).

+

Escreva a implementação. O teste irá passar para verde. Essa refatoração +deve ser o mínimo de código necessário para fazer o teste passar.

+

Refatore o código para remover código duplicado, má escolha de nomes de +variáveis, quebras do SOLID, etc [#unclebob]_.

+
+
+

Eu nunca consegui produzir código TDD de verdade, mas alguns vídeos, como por +exemplo Uncle Bob falando sobre test transformations, +fazem com que eu acredite que TDD puro e correto funciona.

+ +
+

Normalmente, depois de refatorar, espera-se que o código volte para o vermelho +-- ou, pelo menos, é o que o gráfico utilizado deixa a entender. Entretanto, +se você focou no requisito e não na implementação, o teste deve continuar +verde, por mais que você refatore.

+

Se voltarmos para o exemplo do nome único, nossos testes seriam apenas dois: +barrar usuários com apenas um nome e deixar passar aqueles com dois ou mais. +Todos os demais testes são desnecessários porque não fazem parte dos +requisitos. Se essa validação será feita no próprio __init__, se isso vai +ser outra classe, se vamos mandar isso para outro serviço que fará a validação +do nome, nada disso importa: o que precisamos é barrar usuários com apenas +um nome e aceitar aqueles com dois ou mais. Nada mais, nada menos.

+

Se voltamos para o SOLID, existe um princípio que se encaixa nessa +consideração: LSP - Princípio de Substituição de Liskov. Esse princípio é, na +verdade, um nome complicado para "design por contrato"; no nosso exemplo, +nosso contrato é: "Se você mandar um cliente com apenas um nome, irá ocorrer +uma falha; clientes devem ter dois nome ou mais." Se amanhã eu trocar a classe +inteira por outra, se eu reescrever a classe inteira, se eu mudar de +linguagem, o teste deverá continuar passando (claro, considerando que eu +consiga rodar os testes numa linguagem diferente da linguagem da +implementação). Meu "contrato" continua válido, não importa a implementação +que estamos falando. Meus requisitos continuam sendo verdadeiros, não importa +como eu implementei. Meu comportamento continua sendo verdadeiro, validado +pelos testes.

+

Parte disso vem da definição de requisitos. Se você não tem requisitos bem +definidos, você não tem o que testar. E ficar testando funções e/ou classes +não vai lhe ajudar em nada, porque estes não são seus requisitos e, portanto, +não fazem parte do seu contrato.

+

Como eu vi TDD funcionar de verdade

+

Eu comentei no começo desse post como o vídeo do Ian Cooper ressonou com uma +experiência pessoal trabalhando com TDD. Essa experiência foi relacionada ao +trabalho com um gerenciador de alarmes: Vários componentes do sistema iriam +gerar "eventos" e, conforme o evento gerado, o gerenciador de alarmes deveria

+
    +
  1. gerar apenas um log; 2) gerar um log e enviar um aviso pela rede; 3) ativar +um indicador de erro que continuaria ligado até que outro evento o desligasse.
  2. +
+

Como seguimos os princípios do SOLID, o código ficou separado, internamente, +em quatro componentes: um componente de tomada de decisão, que indicaria para +quais outros componentes o evento seria enviado; um componente para geração de +logs; um componente para avisos através da rede; e, finalmente, um componente +que ativaria ou desativaria alarmes relacionados com o evento. Da mesma forma, +como eu não tinha noção ainda de testar comportamentos, eu acabei escrevendo +testes que injetavam diretamente um evento que deveria ser logado no +componente de logs e verificava o resultado; um evento que deveria ser enviado +pela rede e verificava se o mesmo era gerado; um evento que deveria ser +mantido como alarme para o componente de alarmes e verificava se o mesmo era +ativado (e outro teste que enviada o evento de ativar alarme e depois enviava +o evento de desativar alarme e verificava se o mesmo ficava desativado -- +afinal de contas, um teste não pode depender de outro).

+

Entretanto, algo não "parecia" certo. No momento, parecia que tudo estava ok, +mas não tínhamos a sensação de que o aplicativo como um todo estava +funcionando. Foi nesse ponto que começamos a falar de "testes de ponta a +ponta": testes que utilizariam um componente para gerar o evento externamente +do gerenciador de alarme e, depois de chamado, verificaria o estado final do +sistema. Estes testes, apesar de serem mais complexos de serem escritos +(porque haviam várias camadas intermediárias até que que o evento partisse de +um aplicativo e chegasse ao gerenciador de alarmes), eles passaram a fazer +muito mais sentido que testar cada componente isoladamente. Na época, eu não +me liguei o porquê, mas depois do vídeo, eu entendi: Fazia mais sentido porque +estávamos testado o comportamento, não a implementação.

+

Resumo

+

Se tudo ficou complexo, eu posso resumir TDD (de verdade) da seguinte forma:

+ + +
+ + + + +
+ + + + diff --git a/public/pt/code/you-dont-need-range/index.html b/public/pt/code/you-dont-need-range/index.html new file mode 100644 index 0000000..b5fba69 --- /dev/null +++ b/public/pt/code/you-dont-need-range/index.html @@ -0,0 +1,274 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Você Não Precisa de range()

+ +

Quem está começando com Python tende a usar range() quando precisa iterar +sobre listas. Mas isso não é realmente necessário.

+ +

Quando as pessoas começam a programar em Python, elas tendem a usar +construções vindas de outras linguagens, e por isso iteram sobre uma lista da +seguinte forma:

+
a_list = [1, 2, 3, 4]
+for i in range(len(a_list)):
+    print(a_list[i])
+
+

Mas Python tem o conceito de "iteráveis", o que quer dizer que algumas coisas +podem ser iteradas diretamente, sem precisar acessar cada elemento +individualmente. Por exemplo, nossa lista anterior poderia ser iterada com:

+
a_list = [1, 2, 3, 4]
+for value in a_list:
+    print(value)
+
+

"Para cada elemento em a_list, recupere-o e chame-o de value."

+

Vários elementos são iteráveis: Strings são iteráveis, retornando cada +caractere nelas; dicionários são iteráveis, retornado cada chave neles; +conjuntos são iteráveis, retornado cada elemento neles; tuplas são iteráveis, +retornando cada elemento nelas; generators são iteráveis, retornando o próximo +valor que eles conseguem produzir.

+

Mas e se precisássemos iterar sobre mais de um elemento ao mesmo tempo?

+

Entra o zip()

+

É aí que o zip() entra. zip() permite que você junte dois iteráveis:

+
a_list = [1, 2, 3, 4]
+a_tuple = ('a', 'b', 'c', 'd')
+for mixed_tuple in zip(a_list, a_tuple):
+    print(mixed_tuple)
+
+

Esse código imprime:

+
(1, 'a')
+(2, 'b')
+(3, 'c')
+(4, 'd')
+
+

O que o zip() faz é criar uma tupla com o primeiro elemento do primeiro +iterável e o primeiro elemento do segundo iterável; depois com o segundo +elemento do primeiro iterável e o segundo elemento do segundo iterável; e +assim por diante. Você pode colocar quantos iteráveis você quiser no zip() e +ele ira produzir tuplas maiores em cada iteração.

+

Interlúdio: Destruturação

+

Uma das coisas legais de Python é "destruturação". Destruturação +(de-estruturar ou mais como "quebrar uma estrutura") permite que elementos de +um iterável sejam extraídos diretamente.

+

Por exemplo, se você tem uma tupla com dois elementos:

+
a_tuple = (1, 2)
+
+

... você provavelmente iria extrair cada um dos elementos com alguma coisa do +tipo:

+
a = a_tuple[0]
+b = a_tuple[1]
+
+

Mas com destruturação, você pode fazer isso numa única passada com:

+
(a, b) = a_tuple
+
+

Este código e o acima dele fazem exatamente a mesma coisa.

+

Mas porque destruturação é importante se estamos falando sobre iterar sobre +elementos? Porque for também tem a capacidade de destruturar:

+
a_list = [1, 2, 3, 4]
+a_tuple = ('b', 'c', 'd', 'f')
+a_string = 'aeio'
+
+for (a_number, lowercase_char, uppercase_char) in zip(a_list, a_tuple, a_string):
+    print(a_number)
+    print(lowercase_char)
+    print(uppercase_char)
+    print()
+
+
+

Lembra que eu falei que strings também eram iteráveis e cada iteração traz um +caractere? É isso.

+ +
+

Mas o que acontece quando um dos iteráveis é menor que o outro?

+
a_short_list = [1, 2]
+a_long_list [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (small, big) in zip(a_short_list, a_long_list):
+    print(small, big)
+
+

Esse código imprime:

+
1 10
+2 20
+
+

zip() pára quando o menor iterável não tem mais elementos. Para consumir +todos os elementos do iterável mais longo, você precisa de +itertools.zip_longest().

+

itertools.zip_longest()

+

zip_longest(), parte do módulo itertools, irá percorrer os iteráveis até +que nenhum deles tenha mais elementos. O que acontece com o menor deles é que +os seus valores são substituídos por None. Usando nosso exemplo anterior:

+
import itertools
+
+a_short_list = [1, 2]
+a_long_list [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (small, big) in itertools.zip_longest(a_short_list, a_long_list):
+    print(small, big)
+
+

Isso irá imprimir:

+
1 10
+2 20
+None 30
+None 40
+None 50
+None 60
+None 70
+None 80
+None 90
+
+

Cuidado com generators

+

Uma coisa que você precisa ter cuidado quando estiver usando zip() ou +zip_longest() são generators. Por que? Porque alguns deles não tem fim.

+

Vamos usar um exemplo: cycle(). cycle(), também parte do módulo itertools, +é um generator que, quando for pedido um valor, retorna o próximo valor de um +iterável mas, quando chegar ao fim deste, retorna pro começo. Por exemplo (e +eu estou usando zip() apenas para nos mantermos no tópico, mas não é preciso +usar zip() para usar cycle()):

+
a_list = [10, 20, 30, 40, 50, 60, 70, 80, 90]
+for (bullet, value) in zip(cycle(['-', '*', '.']), a_list):
+    print(bullet, value)
+
+

Este código produz:

+
- 10
+* 20
+. 30
+- 40
+* 50
+. 60
+- 70
+* 80
+. 90
+
+

O que acontece é que zip() pegou o primeiro elemento do primeiro iterável, +nosso cycle(['-', '*', '.']), que tem como primeiro valor no seu iterável +'-' e o segundo valor do segundo iterável, 10; na próxima iteração, o +segundo valor de cycle() foi '*' e o segundo valor de a_list foi 20; +na terceira iteração, cycle() retornou '.' e a_list 30; agora, na +quarta iteração, foi pedido um valor ao cycle() e, como o seu iterável +terminou, ele retorno o primeiro valor, retornando '-' de novo.

+

Certo?

+

Então qual o problema com generators?

+

Alguns generators -- como o cycle() acima -- não tem fim. Se você trocar +zip() por zip_longest() no exemplo acima, você vai ver que o código não +irá terminar. Não são todos os generators que produzem valores de forma +infinita, e você pode usá-los sem problema.

+
+

Não é só zip_longest() que tem problemas. Você pode botar dois cycle()s +num zip() e ele vai ficar gerando tuplas sem parar.

+ +
+

Certo, legal, mas e se eu precisar mostrar o índice também?

+

enumerate() ao resgate!

+

Então, nós falamos sobre usar dois iteráveis ao mesmo tempo, mas e se +precisarmos da posição também? E se a nossa lista for uma lista de resultados +ordenados e nós precisamos mostrar a posição em si?

+

De novo, você pode ficar tentado a usar range():

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for pos in range(len(winners)):
+    print(pos + 1, winners[pos].capitalize())
+
+

Isso irá imprimir:

+
1 First place
+2 Second place
+3 Third place
+4 Fourth place
+
+

Uma das coisas que você pode tentar ser esperto é tentar misturar o seu novo +conhecimento sobre zip() e fazer:

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for (pos, name) in zip(range(len(winners)), winners):
+    print(pos + 1, name.capitalize())
+
+

... que, pessoalmente, parece mais complexo do que a primeira opção. Mas +Python tem outro generator chamado enumerate() que recebe um único iterável, +mas produz tuplas com o índice e seu valor:

+
winners = ['first place', 'second place', 'third place', 'fourth place']
+for (pos, name) in enumerate(winners):
+    print(pos + 1, name.capitalize())
+
+

Melhor ainda, enumerate() tem uma opção para definir o valor inicial do +primeiro elemento, e ao invés de usar pos + 1 no print(), nós podemos +mudar o enumerate para enumerate(winners, start=1) e remover a adição no +print().

+

Conclusão

+

Iteráveis são as grandes potências de Python, como você pode ter percebido com +a lista de coisas que podem ser iteradas. Entendendo-os vai lhe ajudar a +escrever código Python melhor e mais conciso, sem perda de significado.

+
+

Esse conteúdo foi criado baseado nas discussões no Telegram do +PyTche. Se quiser, junte-se a nós para conversarmos +sobre Python.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/index.html b/public/pt/index.html new file mode 100644 index 0000000..dda4187 --- /dev/null +++ b/public/pt/index.html @@ -0,0 +1,385 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Pensamentos Sobre Atores em Rust + +

+ + +
+

Recentemente eu escrevi uma aplicação para o trabalho (desculpa, não posso +mostrar o código) que, por ser fortemente baseada em I/O, eu decidi escrever +usando Tokio e a ideia de usar Actor Model com +isso.

+

... o que me levou a pensar um pouco mais sobre isso.

+ +
+ + Read more... + +
+ +
+

+ + Pyngos de Python I + +

+ + +
+

"Pyngos de Python" são pequenas explicações de Python.

+

Nesse post, vamos falor sobre generators.

+ +
+ + Read more... + +
+ +
+

+ + Rust na Vida Real + +

+ + +
+

Já faz algum tempo que eu tenho falado sobre Rust, fazendo apresentações, indo +a meetups...

+

Mas a alguns meses eu tive a oportunidade de finalmente trabalhar num projeto +real em Rust.

+

Então, como é que foi?

+ +
+ + Read more... + +
+ +
+

+ + Múltiplas Distribuições com Toolbx + +

+ + +
+

Quando eu troquei meu Fedora pelo +Silverblue, eu passei a usar toolbox +para verificar pacotes e coisas do genêro. Mas quando eu precisei testar um +projeto em múltiplas distribuiçoes, eu decidi que era hora de explorar Toolbx +um pouco mais a fundo.

+ +
+ + Read more... + +
+ +
+

+ + Eu Refiz Minha Configuração do NeoVim + +

+ + +
+

Por algum motivo obscuro, minha instalação do NeoVim não queria mais mostrar os +alertas do LSP. Então eu decidi refazer minha configuração.

+ +
+ + Read more... + +
+ +
+

+ + Decodificando o Protocolo FAST: Exemplos + +

+ + +
+

Depois de toda a explicação sobre a definição do protocolo FAST, eu notei que +tinha uma coisa faltando: Exemplos, para que fique mais fácil de entender.

+ +
+ + Read more... + +
+ +
+

+ + Decodificando o Protocolo FAST + +

+ + +
+

Recentemente tive que trabalhar com um FAST (FIX Adapted for Streaming) e +como a documentação está espalhada, decidi colocar as coisas que descobri em um +único lugar para (minha) referência futura.

+ +
+ + Read more... + +
+ +
+

+ + Experimentos com Command Pattern em Rust + +

+ + +
+

Eu tenho feito alguns experimentos implementando o command pattern em Rust e +encontrei pelo menos duas formas de implementar.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: Statement of FSF board on election of Richard Stallman + +

+ + +
+

Depois do estranho retorno do rms ao board da Free Software +Foundation, agora ambos deram a sua versão +sobre o evento.

+

Mas eu ainda tenho a impressão que tem alguma coisa faltando.

+ +
+ + Read more... + +
+ +
+

+ + FSF e rms (De Novo) + +

+ + +
+

Mais ou menos a seis meses atrás, em 16 de setembro de 2020, Richard Stallman, +também conhecimento como "rms" reunciou sua cadeira da +FSF +(Free Software Foundation, mantenedora da família de licenças GPL) com +manchetes não-tão-boas. Há uma semana atrás, em 22 de março de 2021, rms +anunciou ao mundo que ele está de volta.

+

E agora estamos numa grande baderna. De novo

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/links/1password-linux-beta/index.html b/public/pt/links/1password-linux-beta/index.html new file mode 100644 index 0000000..3710723 --- /dev/null +++ b/public/pt/links/1password-linux-beta/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: 1Password for Linux beta is now open

+ +

1Password, a famosa ferramenta de gerenciamento de senhas, publicou um blog +sobre a liberação da versão beta da ferramenta para +Linux.

+ +

Nós sempre damos boas vindas a novas ferramentas para Linux, especialmente +aquelas com nomes já conhecidos no mercado, porque dá a sensação para o público +em geral que Linux existe e que grandes empresas reconhecem que existe e assim +por diante.

+

Mas o que me pegou de surpresa foi essa linha: "Its backend is written +completely in Rust" ("o backend da ferramente é escrito completamente em +Rust"). Não apenas porque eu sou um fã de Rust, mas porque

+
    +
  1. a aplicação não parece uma aplicação nativa; parece uma aplicação Electron;
  2. +
  3. esse tipo de acontecimento com Rust me lembra de outra tecnologia que também +não era muito conhecida, mas tomou a atenção de engenheiros e, de repente, +decolou e agora é amplamente utilizado.
  4. +
+

Essa tecnologia era o Linux. E a mesma coisa parece que está acontecendo com +Rust. E isso me dá muita esperança para o futuro.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200529/index.html b/public/pt/links/20200529/index.html new file mode 100644 index 0000000..3c334b9 --- /dev/null +++ b/public/pt/links/20200529/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links de 2020-05-29

+ +

Spotify Pelo Mundo, Mensagens de Commit do Git, Airflow, Teclas do Emacs, +Contribuindo com Open Source no Estilo Rust, Git no Seu Domínio, Vim Wiki, Não +Use Medium, Resultados do StackOverflow Survey, Problemas com o StackOverflow +Survey.

+

Spotify Most streamed track of the day by Country

+

Curioso em saber qual a música mais tocada em casa país que o Spotify tem +presença?

+

My favourite Git commit

+

Um "textão" para uma alteração de apenas um caractere? Claro, por que não?

+

Eu tenho que concordar com o ponto que é feito aqui, embora o resultado seja +um pouco grande demais pro meu gosto: Escreva mensagens de commit que +expliquem porque a mudança teve que ser feita, que outras soluções estavam +presentes, e porque a solução atual foi escolhida.

+

E é assim que uma mensagem de commit deve ser feita.

+

An Introduction to Apache Airflow

+

Eu tenho ouvido falar do Airflow por algum tempo, mas o que daibos é, o que +faz e coisas desse tipo era algo que eu não sabia.

+

Mas o Airflow é um sistema de processamento de dados (ETL) em Python, onde +cada tarefa pode ser definida isoladamente e depois combinados em um grafo +acíclico.

+

E é em Python.

+

Binding Emacs

+

Um guia prático em como usar atalhos de teclado no Emacs.

+

Contributing to Rust

+

Embora focado no projeto do Rust, esse é um relatório bem interessante sobre a +experiência pessoal em se contribuir para um projeto de código aberto -- nesse +caso, um compilador. Mas ao invés de pular diretamente para o código, tudo +começa com uma simples mudança na documentação.

+

Pontos interessantes aqui são, basicamente: Comece simples, aprenda como o +projeto funciona e as coisas vão andar sozinhas.

+

Choosing a Self-Hosted Git Service

+

Git != Github ou Gitlab. Github e Gitlab são frontends para o Git e, se você +quiser, você pode rodar uma interface diferente no seu próprio domínio.

+

Algumas outras opções apresentadas nesse post são: Cogs, Gitea, SourceHut, +Phabricator, Gitolite, Gitweb e cgit. Cada um tem suas vantagens e +desvantagens e aqui elas são exploradas.

+

Eu utilizo o cgit no meu repositório, embora eu +preferisse alguma coisa que gerasse páginas estáticas ao invés de algo +dinâmico -- eu não faço tantos commits assim para precisar recalcular tudo +toda vez.

+

Personal Wiki for Vim

+

Você sabia que pode ter o seu wiki pessoal usando apenas o Vim? Com esse +plugin, você pode manter seus dados localmente, sem precisar instalar mais +nada (além do plugin, é claro) -- e o pessoal que gosta do Emacs que me +desculpe, mas o formato é bem mais simples que o Org-Mode (mesmo que o +Org-Mode faça muito mais coisas).

+

Stop Blogging on Medium if You Care about SEO

+

Eu realmente não me importo com SEO -- honestamente, SEO é a cereja nesse bolo +do cocô que a internet se tornou -- mas tem dois pontos aqui que você tem que +prestar atenção: "Login wall for free articles" (Barreira de Login para +artigos gratuítos) e "Hidden costs of publishing on Medium" (Custos invisíveis +de se publicar no Medium), porque eles dizer duas coisas:

+ +

Assim, você está, basicamente, sendo o gerador de dinheiro pro Medium. Pô, até +mesmo o WordPress.com tem um modelo de graça sem paywall.

+

Stack Overflow Developer Survey 2020

+

StackOverflow abriu um questionário no fim do ano passado para saber dos +programadores quais linguagens eles usam, se gostam, quanto recebem, essas +coisas.

+

E agora, finalmente, saíram os resultados.

+

PS: Rust é a linguagem que os programadores mais adoram pelo 5o ano seguido.

+

Stack overflow developer survey removes Clojure

+

... mas nem tudo são flores. O subreddit de Clojure descobriu que Clojure não +estava listado e mesmo que eles tivessem preenchido o campo com a opção +pessoal deles, Clojure ainda assim não apareceu nos resultados finais.

+

Não só isso, mas no nosso grupo de Rust, perguntaram porque não tem nenhuma +biblioteca ou framework de Rust na lista (e Serde é usado amplamente) e depois +disso eu percebi que Glib também não estava nas opções -- e quem diabos é +louco o suficiente para trabalhar em C (que aprece na lista de linguagens) sem +Glib nos dias de hoje?

+

Então, a lista é legal, mas parece estar bem incompleta pros dias atuais.

+
+

Esse post foi feito com a ajuda de

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200531/index.html b/public/pt/links/20200531/index.html new file mode 100644 index 0000000..bb8ef51 --- /dev/null +++ b/public/pt/links/20200531/index.html @@ -0,0 +1,218 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links de 2020-05-31

+ +

Executando Coisas em Python, Emacs, Tudo Que Pode Dar Errado, Por Que +Acreditamos que Reescrever Dá Certo, Copyleft, Analogias Para Débito Técnico, +Liderando Projetos, Microserviços em Rust, Cidades Como Estadas, Reclamando de +Quem Reclama do Stallman.

+

The many ways to pass code to Python from the terminal

+

Esse post é curioso. Embora eu utilize Python por um bom tempo já, alguns +desses métodos eram completos desconhecidos pra mim -- por exemplo, criar um +arquivo Zip e rodar usando diretamente o interpretador.

+

Emacs - Productivity Tricks/Hacks

+

Embora eu não utilize o Emacs normalmente -- eu sou usuário de Vim de +carteirinha -- eu não posso deixar de compartilhar um post sobre Emacs que +sugere o uso do Evil, o modo que utiliza as teclas do Vim.

+

E a sugestão de usar o Helm é algo que eu tenho que usar na minha instalação +do Emacs.

+

Postmortems

+

Um fórum do Discord para postar coisas dando errado.

+

Eu tenho mencionado isso por quase um ano já: A maior parte das apresentações +que nós fizemos, quando mostramos pro público, é para falar de coisas que +acontecem de forma perfeita -- você só faz o build e ele nunca falha; você +escreve o código e nunca encontra um "corner case"; é só criar o que quiser, +tudo vai dar certo -- e isso não é a vida real.

+

Postmortems é um fórum justamente para descrever as coisas dando errado. E +existe muito mais que pode ser aprendido com coisas dando errado do que com os +passos perfeitos que não refletem a realidade.

+

Why do we fall into the rewrite trap?

+

Sim, todo mundo, nesse ponto, deve ter ouvido falar que "Refatore, Não +Reescreva". E esse post é mais do mesmo.

+

Mas tem algumas coisas que realmente me chamaram a atenção1: Primeiro, +"Cultura do Desprezo", a ideia de que algo é ruim porque é velho e ruim, e que +a coisa nova é boa porque é nova. Eu mencionei isso no meu post de "Coisas Que +Eu Aprendi Na Marra em 30 Anos de Desenvolvimento de Software", mas +"ferramenta certa para o trabalho" nada mais é que uma forma de uma agenda e a +ferramenta certa é aquela que o seu time conhece melhor.

+

Ainda, ao invés de ir para "Reescrever, RUIM!" o post indica algumas situações +em que reescrever é a opção correta -- e eu não vou mostrar spoilers, mas +parece ser realmente a situação correta.

+

Toward Copyleft Equality for All

+

Tem um monte de coisas nesse post que serviriam apenas para repetir coisas que +eu comentei em outros: Empresas estão usando Software Livre como propaganda, +se encarregando de novas features, cobrando por isso e deixando a correção de +bugs para a comunidade, por exemplo.

+

Aqui, a coisa é mais complexa, e eu não sei se eu consigo ter uma opinião +concreta sobre o que está sendo dito. Basicamente, que a ideia de "copyleft" -- +usar o copyright para garantir que um código vai continuar liberado e +acessível a todos -- tem sido subvertido com as "duplas licenças".

+

Por um lado, empresas poderiam sim deixar o código disponível e ainda cobrar +para manter o software, mas a forma como software livre tem sido usado tem +sido, na verdade, como propaganda. "Olha, é software livre!", mas escutar a +comunidade, deixar que eles apontem o destino do projeto, facilitar a +contribuição de outros, nada disso faz parte desses projetos.

+

Technical Debt Is like a Tetris Game

+

Essa pode ser a melhor analogia de como Débito Técnico funciona: É um jogo de +Tetris.

+

No começo, tudo está vazio e é simples de encaixas as peças. Mas, se você não +tomar cuidado, o jogo vai ficando cada vez mais caótico até que você perde.

+

Se essa não for uma explicação que todo mundo entenda porque é preciso parar +de ficar empilhando pecinhas e tentar limpar o campo de tempos em tempos, eu +realmente não sei o que vai fazer.

+

How to Lead a Project - as a Software Engineer

+

Uma lista de coisas que engenheiros de software devem cuidar quando se tornam +líderes de projeto.

+

Eu posso comprovar que o conceito geral apresentado aqui funciona, porque foi +o que eu fiz quando fui líder técnico de projetos.

+

Building a Microservice with Rust

+

Ok, talvez o fato que eu adore Rust pode estar relacionado com o fato d'eu +querer compartilhar algo desse tipo, mas vocês tem que concordar que esse post +é realmente complete, mostrando todos os pontos necessários para fazer um +microserviço em Rust.

+

city roads

+

Isso é um projeto curioso: Ao invés de desenhar cidades usando seus limites +geográficos, desenhe essa usando apenas as estradas.

+

Burning the House That Richard Stallman (RMS) Built: An Open Letter to GNU Maintainers Who Opposed RMS

+

Vamos reclamar de quem tá reclamando?

+

Mais um dos posts de "Deixem rms em paz!" Dessa vez, quem trabalha para a +Microsoft -- que, estranhamente pelo tom do post, não foi chamada de +Micro$oft -- são os piratas de verdade e quem trabalha na Red Hat é tão mal +caráter quanto.

+

Honestamente, não dá para negar o trabalho que o Richard Stallman fez para +promover open source. Mas ao mesmo tempo não dá pra deixar de ignorar que, por +anos, GCC ficou travado porque mudanças de arquitetura eram negadas e também +não dá pra ignorar que justamente essa "birra" em melhorar o GCC é que deu ao +Clang o espaço que ele ganhou -- lembrem-se que a Apple usava GCC inicialmente +tanto para gerar binários no Macos quanto para iOS. E também não dá para +ignorar que até um dia antes da pressão para que o rms deixasse a FSF +atingisse níveis críticos ele ainda afirmava que não havia qualquer problema +em meninas menores de idade terem relacionamentos sexuais com homens mais +velhos.

+

Esse tipo de pensamento -- "O cara fez muito, e pode falar o que quiser e +continuar fazendo o que quiser" -- é o mais puro pensamento adolescente de não +se preocupar com as consequências. "Oh, olhem as consequências da história da +Microsoft contra o software livre! Não, não olhem o que o rms anda falando e +como a postura dele prejudica projetos importantes e a comunidade, porque ele +é meu amigo".

+

A comunidade cresceu -- não apenas em número, mas também em mentalidade -- e +agora estamos nos perguntando quando é que figuras importantes vão se +responsabilizar pelo que falam e pelo que fazem.

+

... e é extremamente estranho ver um artigo como este que ataca a Microsoft e +a Red Hat, mas fala absolutamente NADA sobre o que o Google tem feito com o +termo "open source".

+
+
1 +

... especialmente com uma discussão que eu vi ontem de manhã.

+
+
+

Esse post foi feito com a ajuda de

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200601/index.html b/public/pt/links/20200601/index.html new file mode 100644 index 0000000..00c26b9 --- /dev/null +++ b/public/pt/links/20200601/index.html @@ -0,0 +1,194 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links de 2020-06-01

+ +

Sistemas Distribuídos, C em Rust, Protegendo Projetos, Sem Código, Android, +Blog de Pesquisa, Contact Tracing e Privacidade.

+

Notes on Distributed Systems for Young Bloods

+

Uma lista de "coisas que você precisa se lembrar quando estiver trabalhando +com sistemas distribuídos", não apenas para iniciantes, mas também para +aqueles que já estão fazendo isso por algum tempo, como lembrete.

+

writing c library in rust

+

Uma das coisas legais de Rust é que é possível combinar aplicações em Rust com +qualquer outra biblioteca em C. Mas não só isso, é possível escrever código +em Rust e exportar como uma interface em C -- e, com isso, combinar com +qualquer outra linguagem que consiga utilizar C, que é basicamente tudo que +tem por aí.

+

Self-Protecting Projects

+

Projetos sem um pipeline de CI/CD estão condenados ao fracasso.

+

Isso é basicamente o resumo do post e eu concordo plenamente. Existem alguns +pontos faltantes, por exemplo, você pode ter um pipeline de CI/CD e não ter +uma política para testes; mas, ao mesmo tempo, eu reconheço que não existe uma +forma fácil de medir se estão sendo testadas as coisas certas (e não, "toda e +qualquer função" não é uma métrica).

+

Ainda, a ideia de fazer a aplicação abrir tickets toda vez que ela capota é +legal, mas isso só funciona para aplicações que rodam no seu ambiente -- seria +complicado fazer uma aplicação embedded ter isso.

+

The 'No Code' Delusion

+

Ignorando o fato que o post que fala sobre o movimento de "gerar regras de +negócio sem a necessidade de um desenvolvedor", o que eu achei interessante +mesmo é a comparação visual da regra (um fluxograma) com o código (um trecho +um Python). Por que? Porque é exatamente assim que aplicações deveriam ser +escritas: Há uma lógica e ela é descrita em uma combinação de funções, cujo +conteúdo não faz parte da regra e regras não estão "escondidas" dentro de uma +função de outra regra. Nada de "deixa eu botar uma regexp aqui para validar se +o email é válido ou não". Não é isso que a regra de negócio diz, e não é isso +que o código contém. Se a regra de negócio diz "Você deve testar isso, +converter praquilo e enviar para aquele outro", é exatamente o que a função +deveria ter.

+

Por outro lado, eu não havia me ligado que mesmo descrições com fluxogramas +requerem um conhecimento: Qual símbolo representa um teste? Qual símbolo +representa "mostrar na tela"? E assim por diante.

+

O que eu não posso deixar de citar é que COBOL foi criado para que não +programadores pudesse descrever as regras de negócio e executar as mesmas; SQL +foi criado para que não programadores pudessem descrever como recuperar e +processar dados; BDD sempre foi descrito como uma forma de não-programadores +pudessem descrever as validações do sistema.

+

Google pushed to take action against Android bloatware by 50+ organizations

+

Um post do começo do ano, mas tem um ponto aqui que eu quero trazer:

+

Android é "open source", certo? Se é, então porque essas 50+ organizações não +fazem um fork e criam o seu próprio Android? Certamente, num grupo de 50+ +organizações, devem haver alguns programadores e se esses fossem colocados +para trabalhar juntos, eles poderiam resolver esse problema, certo?

+

Bom, o fato é que o Google controla o Android. Você não pode simplesmente +fazer um fork e esperar que ele irá rodar no seu dispositivo. Você não pode +simplesmente fazer um pull request e esperar que ele será, um dia, parte do +sistema.

+

"Android é open source" é uma farça. É "fontes disponíveis" ("source +available"), não "open source" em qualquer força de imaginação.

+

Why I Keep a Research Blog

+

Eu tenho pensando sobre isso por algum tempo: Eu tenho uma lista de "Coisas +Que Eu Não Sei" que eu mantenho no Joplin. A ideia é +que, quando eu tenho algum tempo livre, ou quando eu tenho alguma informação +relacionada com o tópico, eu posso adicionar na nota, até que eu me sinta com +confiança suficiente para dizer "Ok, agora eu entendo isso".

+

Mas ao mesmo tempo, eu tenho gerado esse tipo de post (os posts dos +"Links") como uma forma de +manter os links que eu acho que eu vou precisar no futuro. Então, se eu +mantenho uma lista de links de "talvez, no futuro", porque eu não coloco os +tópicos de pesquisa no meu blog também"? Por enquanto, eu só vou ter os +tópicos e nada de conteúdo (desculpem-me!) mas deixar os mesmos disponíveis +pode ajudar mais alguém.

+

Existe um ponto que tem que ser feito: Se eu compartilho links, porque não +compartilhar links relacionados com esses tópicos e deixo a ferramenta de blog +que eu uso se preocupar em agrupar essas informações? A ideia é descrever a +informação com meus minhas próprias palavras, porque essas são mais fáceis de +lembrar no futuro.

+

Eu ainda estou pensando nessa ideia, no entanto. Não faço nenhuma promessa que +vai acontecer.

+

Minnesota is now using contact tracing to track protestors, as demonstrations escalate

+

Eu tenho comentado por algum tempo sobre o fato que aplicações de "contact +tracing" (pessoas com quem o usuário do celular teve proximidade) podem soar +boas para encontrar alguém que teve contato com outra pessoa que teve COVID-19 +(de forma que essa pessoa possa ser alertada e/ou levada para um hospital, +antes que os sintomas se tornem muito fortes para qualquer tratamento), mas +que haviam sérios problemas de privacidade com eles? Bom, aqui está.

+

Uma pessoa negra foi brutalmente morta pela polícia nos EUA, e a comunidade se +amotinou ao ponto de que uma delegacia de polícia foi queimada -- eu não estou +dizendo que está certo ou errado, mas vocês tem que pensar no tipo de +indignação que faz com que pessoas botem fogo numa delegacia de polícia.

+

E as pessoas que se preocuparam que elas poderiam entrar em contato com alguém +que fosse infectado pelo COVID-19 e instalaram qualquer aplicação de "contact +tracing" agora estão sendo procuradas por sua associação com outros +manifestantes.

+

E é isso que eu tenho falado. Não existe uma política de "essa informação de +contato pode ser usada somente para controle de disseminação de doenças e +nada mais."

+
+

Esse post foi feito com a ajuda de

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200604/index.html b/public/pt/links/20200604/index.html new file mode 100644 index 0000000..0448c4f --- /dev/null +++ b/public/pt/links/20200604/index.html @@ -0,0 +1,184 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-06-03

+ +

Scotty, Pyramid e Cornice, Os Problemas Com datetime.now(), Mercurial e +Python 3, Acelerando o Python, Biblioteca Async para Requisições HTTP, +Propagandas Digitais, Google e a Web.

+

scotty: Transports you to any directory you have visited before

+

Eu tenho usado Scotty por algum tempo já e realmente tem me agradado.

+

O que Scotty faz é guardar uma lista dos diretórios pelos quais você já passou +e, depois de um tempo, você pode simplesmente fazer s <diretório> e cair +diretamente no diretório específico. Não apenas isso, mas <diretório> nem +precisa ser o nome correto do diretório; Scotty usa "fuzzy search" para +encontrar o diretório com o nome mais parecido com o que você digitou.

+

How to write a Python web API with Pyramid and Cornice

+

Pyramid is o framework web para Python menos conhecido por aí. Mas esse post +mostra como é simples fazer uma (simples) API com ele.

+

Stop Using datetime.now!

+

Embora o título seja um pouco "clickbait", o conteúdo é bem interessante. Não +apenas apontando os problemas de se usar datetime.now() (não, não é a função +em si que tem um problema, é a forma como usamos o resultado que pode gerar +problemas), mas explicando minuciosamente injeção de dependências em Python.

+

Mercurial's Journey to and Reflections on Python 3

+

Ding dong, a bruxa morreu, e o Python 2 também.

+

Mas ainda existe uma grande base de projetos em Python 2 que precisam ser +convertidos para Python 3, e o Mercurial fez isso, e aqui tem a experiencia do +mantenedor em fazer essa conversão.

+

Eu entendo que converter um projeto de Python 2 para 3 não é uma tarefa fácil, +mas tem algumas coisas erradas no post. Por exemplo, "the approach of assuming +the world is Unicode is flat out wrong and has significant implications for +systems level applications" (a ideia de assumir que o mundo é unicode é +completamente errada e tem sérias implicações para aplicações que nível de +sistema). O mundo é unicode. É só ler a parte em português desse site. É só +ler um blog em chinês ou japonês para ver como ele é. Você realmente acredita +que essas pessoas não usam aplicações de sistema em lugar algum? Ainda, o que +você acham que são mais usadas: Aplicações de nível de sistema ou nível de +usuário?

+

Não estou dizendo que a conversão é perfeita -- de certa forma, unicode +simplesmente é uma forma de tratar os bytes que estão por baixo -- mas +reclamar que a mudança fez a sua forma de pensar mais difícil não é desculpa +para não entender para onde o eco sistema está indo -- e também não quer dizer +que o seu projeto específico não é bem-vindo, mas você tem que entender que +está no caso minoritário aqui.

+

(E também não me surpreende que alguém dizendo que "mundo em unicode está +errado" vem de alguém que vive num país ASCII.)

+

Making Python Programs Blazingly Fast

+

Um conjunto de dicas de como fazer aplicações Python funcionarem mais rápido. +Algumas coisas podem não parecer fazer muito sentido (colocar uma variável +apontando pra outra dentro da mesma classe?), mas o post pelo menos explica +por que isso ajuda na performance.

+

Httpx: A next-generation HTTP client for Python

+

Requests mostrou pra todo mundo +como APIs devem funcionar, mas o projeto meio que ficou parado no tempo, sem +suporte a chamadas async (e alguns outros probleminhas na gerencia do +projeto). Agora existe Httpx, que é outra biblioteca para fazer requisições +HTTP, mas dessa vez com suporte a async e basicamente a mesma interface.

+

No-judgment digital definitions: Online advertising strategies

+

Já se perguntou como é que depois de pesquisar alguma coisa -- por exemplo, +"cadeiras gamer" -- de repente começam a surgir promoções e propagandas de +cadeiras na sua rede social?

+

Nada acontece por acaso, e isso é um efeito de todos os trackers que são +colocados numa página. Mas como é que eles identificam quem é quem é que é a +questão.

+

Esse artigo da Mozilla, embora pareça meio básico para quem acompanha, mostra +bem como essas coisas funcionam.

+

Google Is Not God of The Web

+

Outro título um pouco "clickbait" mas, de novo, conteúdo interessante.

+

Um ponto que me chamou a atenção foi "Google has the right to dictate 'Best +Practices.'" (Google tem o direito de ditar o que são as "boas práticas") que +apesar do título diz exatamente o contrário.

+

Imaginem vocês que o Google comece a dar notas de "experiência de uso" para +páginas que adotem o visual do Material. Páginas e páginas que parecem com +aplicativos Android. Mas se você utilizar o seu próprio layout, seu próprio +conjunto de cores, você vai perder pontos. E agora?

+

Esse é o grande problema da dependência que as pessoas tem com o Google, e +toda a simbiose que o mesmo tem tendo um grupo trabalhando para padrões da +web, um grupo trabalhando para fazer um browser e um grupo pra tirar proveito +do trabalho dos dois anteriores. Quando menos você usar o Google, quanto mais +você usar ferramentas de pesquisa alterativos (DuckDuckGo, Searx, e até mesmo +o Bing), quanto mais você usar outros provedores de email (ProtonMail), quanto +mais vocês usarem browsers que não sejam Chrome (Firefox, Safari, ou algum +outro baseado em WebKit), menor vai ser a probabilidade de que a internet se +torne um ambiente de uma empresa só.

+
+

Esse post foi feito com a ajuda de

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200611/index.html b/public/pt/links/20200611/index.html new file mode 100644 index 0000000..53fadf8 --- /dev/null +++ b/public/pt/links/20200611/index.html @@ -0,0 +1,175 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links comentados de 2020-06-11

+ +

Infra-estrutura Como Código (em Python), Pong em Elm, Alan Kay e Objetos, +Paywalls, Brave, Notas, Rust do Zero, Escrevendo, 51 Conceitos Que Você +Deveria Saber, MAD em CSS, Algoritmos Mágicos.

+

Why you should try pyinfra

+

Eu tenho, por algum tempo, adiado criar um playbook em +Ansible para configurar meu droplet na +DigitalOcean -- sem qualquer outro motivo que não seja minha preguiça -- e +agora tem esse modo em Python puro para configurar um ambiente e, com isso, +agora eu tenho dois modos de como não fazer -- de novo, porque eu sou +preguiçoso.

+

Recreating Pong for the Web with Elm

+

Existe algo profundamente satisfatório em ler um tutorial que começa bem no +começo e explica cada passo que deve ter feito.

+

Eu só sinto falta das parte de "Se você fizer isso, não vai funcionar/vai dar +crash".

+

Alan Kay Did Not Invent Objects

+

Ah, eu adoro esse tipo de discussão, que se repete varias vezes -- Eu +basicamente ouvi a mesma coisa toda vez que eu ia no Meetup de Elixir daqui.

+

Mas o básico é: Quando Alan Kay estava falando de "design orientado a +objetos", ele estava falando da comunicação entre objetos, não sobre +encapsulamento, herança e assim por diante.

+

Problems With Paywalls

+

Algumas das palavras no post são bastante fortes -- "Eu ficaria mais feliz em +um mundo onde os grandes jornais deixassem de existir, comparado com um mundo +onde eles existem mas seus artigos estão atrás de um paywall" -- mas o ponto +que é feito é bem real: Conteúdo atrás de um paywall usam uma ideia de "me +deixem mexer na sua imaginação/curiosidade para que você pague pelo conteúdo". +E talvez o conteúdo produzido seja feito apenas para gerar curiosidade e +produz absolutamente nada de pesquisa ou conteúdo.

+

Ao mesmo tempo, se o conteúdo fosse bom, baseado em pesquisa e tivesse +conteúdo real que viveria por um bom tempo (e não algo que fosse interessante +somente nessa semana e seria completamente esquecido na próxima), então usar +paywalls seria válido de ser pago.

+ +

Não é a primeira vez que o Brave foi pego fazendo algo moralmente questionável +com o conteúdo dos usuários. Em algum ponto, alguém começaria a se perguntar +se eles compartilhassem um link de referência com um amigo -- por exemplo, +para ter recompensas no DigitalOcean, se a outra pessoa assinasse o serviço -- +e ao invés de receber a recompensa, essa fosse para o Brave para que eles +pudessem rodar seus serviços.

+

De uma forma, isso mostra como é difícil criar um browser nos dias atuais, +mesmo que você pegue uma base de código que já exista e faça melhorias. Mas +ações moralmente questionáveis também parecem ser a forma como a maior parte +das empresas de internet funcionam hoje em dia...

+

Zettelkasten note-taking in 10 minutes

+

Eu tenho pensando numa forma de melhorar meu fluxo de notas, de forma que o +conhecimento não seja totalmente perdido. E tem aparecido um monte dessa forma +"Zettelkasten" de fazer notas na minha timeline de tempos em tempos.

+

E é bom que tenha uma introdução simples exista, mesmo que eu ainda tenha que +começar a utilizar.

+

Zero To Production #1: Setup - Toolchain, IDEs, CI

+

Se você está interessado em Rust e não tem ideia de como começar ou para onde +ir, Luca Palmieri está escrevendo um "livro" sobre todo o processo.

+

How We Write

+

Dicas como escrever bem. E as dicas são precisas e diretas.

+

50 Ideas That Changed My Life

+

Não muito como "ideias", mas mais como "conceitos".

+

Ainda, como toda boa lista, ela lista 51 conceitos, não apenas 50.

+

The Mad Magazine Fold-In Effect in CSS

+

Ah, a última página da MAD. Eu lembro ficar tentando várias vezes para +conseguir fazer as dobras direito, para que a imagem correta aparecesse. É +meio óbvio que, quando começamos a automatizar várias coisas, deveria ter um +modo de fazer isso.

+

Por outro lado, eu mantenho a mesma opinião sobre qualquer exemplo de CSS +complexo: Ok, agora centraliza o texto nesse caixa.

+

Algorithm is the Problem, Not Mark Zuckerberg

+

Ok, vamos discutir esse post por um ponto: Quem está mostrando que o COVID é +uma arma do governo chinês que saiu de control, racismo não é um problema e +pessoas brancas tambem sofrem racismo, e que decapitar estatuas é errado não +foi o que Zuckerberg fez, mas foi feito pelo "algoritmo".

+

E aqui é que está o problema: Embora Zuckerberg não tenha sido quem criou "o +algoritmo", pessoas que trabalham para ele fizeram. Ainda, "o algoritmo" não +apareceu do nada e decidiu o que você gosta, alguém foi lá e colocou isso. +Essa ideia é o que a maioria das pessoas entende errado sobre inteligência +artificial e "algoritmos": Eles não surgem do nada, alguém vai lá e coloca +essas coisa e o algoritmo simplesmente reage com o conteúdo.

+

Considere, por exemplo, o fato que o Google começou a marcar pessoas negras +como "gorilas" nas Fotos. Isso não foi um problema com "o algoritmo"; alguém +que trabalha no Google decidiu que pessoas negras não são importantes o +suficiente para adicionar no conjunto de treinamento -- ou pior, que uma +pessoa (ou grupo de pessoas) sequer pensou que adicionar pessoas negras no +conjunto de treinamento era algo que estava faltando ou mesmo que seria válido +adicionado.

+

Isso não é um problema do "algoritmo", é um problema com as pessoas. Pessoas é +que estão por trás de qualquer algoritmo "mágico" que tem por aí.

+

E embora Zuckerberg provavelmente não tenha se envolvido com a construção +desse algoritmo, as pessoas que fizeram é que são o problema. E não o +algoritmo.

+
+

Esse post foi feito com a ajuda de

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200618/index.html b/public/pt/links/20200618/index.html new file mode 100644 index 0000000..dec378c --- /dev/null +++ b/public/pt/links/20200618/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Commentados de 2020-06-18

+ +

Mensagens de Commit (de novo), Ansible, Nomes de CLIs, Feature Flags, Tamanho +dos Binários Rust, Mongo com Rust, Gerenciador de Tarefas em CLI.

+

How to write good Git commit messages

+

Eu compartilhei um link sobre mensagens de commit a quase um mês, e esse post +fala mais sobre isso -- e tem citações de coisas que eu realmente sinto falta +quando vou fazer code review.

+

Ansible: Tasks vs Roles vs Handlers

+

Mais um "Eu compartilhei algo parecido com isso a algum tempo", esse post foca +no Ansible em si ao invés de alguma outra ferramenta de configuração. Embora +não se aprofunde muito, ele explica muito das coisas de "superfície" do +Ansible.

+

The Poetics of CLI Command Names

+

Então você decidiu criar a sua própria ferramenta de linha de comando para +aprender uma nova linguagem. Parabéns. Mas o sucesso da sua ferramenta depende +(parcialmente) do nome escolhido e como você considera toda a "mística" por +trás desse nome.

+

Infelizmente, eu não concordo com alguns pontos. Por exemplo, reclamar que +cfdisk foi uma má escolha para um fdisk em curses; fdisk é bem +conhecido, e utilizar o mesmo nome na como parte do novo nome para mostrar que +é uma versão diferente e fornece como informação para quem conhece o que +fdisk o que essa aplicação faz. Mesmo caso: top e htop.

+

What Are Feature Flags?

+

No projeto que eu trabalhava antes, nós tivemos uma discussão sobre a forma +como os projetos estão utilizado feature flags.

+

Embora não seja discutido aqui, eu acredito que feature flags devem, em algum +ponto, serem removidas, tanto pelo time quando uma funcionalidade se torna +disponível para todos ou movida para uma configuração de usuário. Mas ela +precisa sair das mãos dos desenvolvedores em algum ponto e não viver para +sempre como uma flag.

+

How to minimize Rust binary size

+

Não que os binários de Rust sejam grandes -- pelo menos, em release -- mas +sempre tem alguém que reclama, principalmente quando comparados com binários +criados em outras linguagens cujos binários não são estáticos.

+

Mas sempre é bom ter um conjunto de dicas de como reduzir, "just in case".

+

Announcing our Rust Driver: Version 1.0

+

Ainda em notícias de Rust, MongoDB, a empresa, disponibilizou o driver oficial +do MongoDB, o banco de dados, em Rust.

+

Uma coisa que eu preciso dizer, lendo o anuncio, é como eles fizeram com que o +driver se encaixasse bem no eco-sistema atual, com suporte aos principais +frameworks async e a biblioteca de serialização. Um verdadeiro "funciona bem +com tudo" pela descrição.

+

unfog-cli: A simple task & time manager, written in Haskell.

+

Eu tenho um projeto pessoal a um bom tempo de fazer uma versão em linha de +comando do Toggl, mas pelo visto alguém já teve a mesma +ideia e fez o projeto antes.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200620/index.html b/public/pt/links/20200620/index.html new file mode 100644 index 0000000..ffd448c --- /dev/null +++ b/public/pt/links/20200620/index.html @@ -0,0 +1,170 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-06-20

+ +

SIGSEGV, Conferência de ActivityPub, Nomes de Branches no Git, O Eco-Sistema +do Rust, Apredendo Rust com Linha de Comando, Problemas de Design, SCP.

+

Why is there a "V" in SIGSEGV Segmentation Fault?

+

Um pouco de história dos sistemas operacionais baseados em UNIX/POSIX -- e +algo que eu nunca me preocupei realmente, principalmente considerando os nomes +das outras interrupções e alguns comandos do sistema (creat, por exemplo).

+

ActivityPub Conference 2020

+

Eu sei que ainda é cedo para conversar sobre isso -- o "call for papers" +acabou de abrir -- mas como fã do que o ActivityPub se propõe a solucionar, eu +tenho que compartilhar: Uma conferência baseada na discussão do protocolo e as +ferramentas (bom, eu acho que é sobre isso, de qualquer forma).

+

Fiquem ligados para a lista de talks no futuro.

+

On Git branch naming

+

A troca do nome do branch principal do Git para algo que não seja "master" tem +dado alguma discussão por aí, mesmo com grandes representantes de Git (Github, +por exemplo) já terem anunciado que o nome vai mudar em novos repositórios.

+

Existe sim uma questão sobre o significado do nome e o que ele representa para +um grupo significativo da população do mundo, mas o que o post mostra é que +mesmo ignorando isso, o nome "master" faz sentido na arquitetura do Git; +ele é baseado no nome utilizado pelo BitKeeper, que tinha uma arquitetura +mestre/servidor, que o Git não copiou.

+

E sim, eu concordo com todas as repostas apresentadas. E mais: Se é uma +mudança simples, não vai quebrar nada, e vai fazer com que grupos oprimidos +(no passado ou presente) não se sintam ofendidos, por que não?

+

Mas tem mais um ponto: Git é distribuído, certo? Com isso, eu quero dizer que +não existe um servidor principal; toda instalação do Git é o principal de si +mesmo. O mesmo acontece com os branches: Todo branch é uma cópia auto contida +e você não precisa colocar todas elas no mesmo balaio em algum ponto, por +exemplo, fazendo merge para o branch principal, porque não existe um branch +principal. É só um nome e ele não tem nenhuma funcionalidade especial +comparado com outros branches.

+

Understanding the Rust Ecosystem

+

Eu tenho falado que "linguagens não existem em um vácuo", e com isso eu quero +dizer que você não pode focar somente na linguagem ou numa parte relacionada a +ela, mas no todo; como é o eco-sistema dessa coisa?

+

E Rust sempre me pareceu um sistema vibrante, com todas as suas esquisitices e +legalzices. E esse post mostra boa parte do que existe no sistema, de +plataformas, passando por forums, meetups, empresas que usam a linguagem e +indo até as ferramentas mais famosas.

+

Diving into Rust with a CLI

+

Falando em Rust, Kevin K escreveu esse post sobre criar uma ferramenta de +linha de comando para baixar as tirinhas do XKCD. Mas ao invés de fazer isso +da forma mais simples possível para mostrar a linguagem, ele usou as +bibliotecas mais conhecidas para pontos específicos (explicando porque usou as +mesmas) e mostrando uma aplicação final completa.

+

Eu estou escrevendo uma outra ferramenta de linha de comando para aprender +mais sobre Rust e não chega nem de perto com o resultado apresentado aqui.

+

Stop Blaming People: It’s a Design Problem

+

Programadores são famosos por não conseguir desenhar um botão de forma correta +ou fazer com que seja extremamente complicado usar o maldito botão -- ou, em +piores casos, construindo uma interface com tantas opções que é praticamente +impossível usar a aplicação.

+

Mas não é só no mundo do software que essas coisas acontecem: O incêndio da +Catedral de Notre Dame poderia ter sido evitado se a interface não tivesse um +design indireto; o alarme de míssil balístico no Havaí não teria acontecido se +a interface para o alarme não fosse simplório. E assim por diante.

+

Algumas vezes é preciso pensar um pouco mais sobre como o serviço vai ser +usado ao invés de deixar as coisas complexas (ou muito simplórias).

+

SCP - Familiar, Simple, Insecure, and Slow

+

Que o SCP era lento eu já sabia, mas não sabia o quanto. O que me impressionou +do post foi essa linha aqui:

+
tar cf - /tmp/big_folder | ssh server 'tar xC /tmp/ -f -'
+
+

Basicamente, usando o tar para pegar o conteúdo de vários arquivos e +transformar numa sequência de bytes, enviar pelo stdout para o ssh e, de lá, +rodar o tar para desfazer a sequencia de bytes (transformando de volta em +arquivos separados). Curioso, e potencialmente 4x mais rápido que copiar os +arquivos diretamente por scp.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200621/index.html b/public/pt/links/20200621/index.html new file mode 100644 index 0000000..9dc5d4f --- /dev/null +++ b/public/pt/links/20200621/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-06-21

+ +

Google Sendo Processado Por Ignorar Incognito Mode, Exploit do Chrome por aí, +Comparando HTTP/1.1 e HTTP/2.0, Criando Tabelas em C++, Entendendo Emacs, +Licenças Open Source, Builder Pattern em Rust, Porque Não Usar Medium.

+

Google faces $5 billion lawsuit for tracking people in incognito mode

+

Empresa que faz dinheiro rastreando pessoas continua rastreando pessoas mesmo +quando essas pedem para que isso não seja feito.

+

Eu fico repetindo isso, mas me deixem colocar isso de novo: Se você depende de +qualquer coisa do Google, você pode assumir que a sua privacidade se foi. Seu +salário? Eles sabem. Seus emails secretos? Conhecidos. As coisas que você +reclama do seu chefe para seus colegas de trabalho? Tudo anotado.

+

Pior: Quando você sugere para alguém usar algum produto Google, você está +basicamente dizendo que você não se importa com a privacidade deles. Que tipo +de amigo faz isso com alguém?

+

Exclusive: Massive spying on users of Google's Chrome shows new security weakness

+

Ainda em notícias de quem não se importa com você, alerta de segurança do +Chrome sendo explorada para que outros -- além do Google -- possam espiar +você.

+

A parte interessante aqui é que a falha de segurança foi achada por uma +empresa chamada "Awake Security". Por que interessante? Porque o Google tem um +grupo especializado em encontrar falhas de segurança que, aparamente, só +consegue achar falhas de segurança em outros produtos, nunca nos deles.

+

Performance testing HTTP/1.1 vs HTTP/2 vs HTTP/2 + Server Push for REST APIs

+

Uma comparação curiosa: A forma de fazer várias requisições utilizando +diferentes versões do HTTP com diferente propriedades.

+

Obviamente, as novas versões são mais performáticas, mas temos que perguntar +se fazer todo esse monte de requisições é algo real -- no sentido de "Carregue +o site de verdade, não o site e 300 trackers e bibliotecas pra fazer animações +estúpidas".

+

tabulate: Table Maker for Modern C++

+

Meu prazer de trabalhar com C++ diminuiu um monte depois de conhecer Rust, mas +eu tenho que admitir que essa biblioteca, para geração de tabelas ASCII no +terminal, parece ser um bocado interessante.

+

A Life Configuring Emacs

+

Você quer aprender Emacs? Mas realmente aprender?

+

Aqui tem uma explicação bem completa, bem longa de como fazer coisas no Emacs.

+

Choosing a license for GoatCounter

+

Discussões sobre licenças open source são sempre legais porque sempre dá pra +aprender algo a mais sobre as licenças que existem.

+

No caso, um post analisando várias licenças sobre o sentido de além de deixar +como código aberto, também ter a possibilidade de ganhar dinheiro com o +produto.

+

The builder pattern, and a macro that keeps FFI code DRY

+

Eu guardei esse post por algum tempo por um único motivo: Como é fácil criar +o builder pattern em Rust sem qualquer biblioteca externa. Existem crates que +permite adicionar todo isso com uma entrada de #[derive], mas isso mostra +que nem isso você precisa, se estiver disposto a digitar um pouco mais.

+

Why we left Medium, and how!

+

Vocês devem ter notado que, de um tempo pra cá, nenhum dos links comentados é +do Medium. E existe um motivo para que eu não compartilhe mais conteúdo +postado lá e é justamente pelas medidas agressivas que eles tem tomado para +angariar recursos -- não que tenha algo de errado com isso, mas existem outras +formas além de bloquear usuários fora do conteúdo ou tirar funcionalidades de +quem esta publicado conteúdo -- e lembrem-se que o Medium em si não publica +nada, são outros que geram conteúdo para eles.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200703/index.html b/public/pt/links/20200703/index.html new file mode 100644 index 0000000..1abefa2 --- /dev/null +++ b/public/pt/links/20200703/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-07-03

+ +

Async Rust e Tide, Redesign do Github, Apple Se Recusando a Implementar Web +APIs, Fonte Fira, Runbooks, Async Zig.

+

Image decay as a service

+

Embora mencione "Imagem", esse post é bem completo (como os posts do Amos +normalmente são), explicando Rust assíncrono e Tide desde o começo.

+

Redesigning Github repository page

+

Github apresentou um novo layout recentemente, mas algumas coisas não estão... +bem no lugar.

+

Aqui, Nikita explora a interface passo a passo, verificando cada elemento e +como fazer como que eles funcionem.

+

Apple declined to implement 16 Web APIs in Safari due to privacy concerns

+

Lhes dou uma chance para descobrir quem foi que propôs essas 16 APIs.

+

Não pegando no pé da Apple ou querendo botar a culpa em alguém, mas algumas +dessas APIs parecem ser completamente absurdas para uma coisa da web -- a não +ser que você queria que a web se torne um sistema operacional inteiro, algo +que faria mais sentido em, sei lá, numa aplicação nativa rodando num sistema +operacional, talvez?

+

Fira

+

Mozilla se colocou para manter a fonte Fira -- e a Fira Code.

+

O único problema que eu achei: Não existem ligaduras na versão monoespaçada. +Existe uma issue aberta desde 2016 mas as ligaduras não existem ainda (pelo +menos, as mais comums, como "==", "->" e "=>", fazendo com que essas apareçam +como um único caractere).

+

Por enquanto, eu vou continuar com +Cascadia.

+

The Runbooks Project

+

Eu sou um grande fã de Runbooks. Por que? Porque, algum dia, você vai ficar no +sobreaviso e as coisas vão dar errado e você não vai saber o que fazer mas, lá +está, uma lista de coisas que podem dar errado e como corrigir.

+

E aqui temos alguns runbooks genéricos para cuidar de coisas comuns que dão +errado.

+

What is Zig's “Colorblind” Async/Await?

+

Async/await está na moda atualmente, e Zig é uma pequena linguagem que pegou +um monte de coisa de C, mas tenta corrigir esses problemas.

+

E aqui está uma introdução direta ao async/await com Zig, e assim você pode +pegar uma boa ideia de como é a linguagem.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200706/index.html b/public/pt/links/20200706/index.html new file mode 100644 index 0000000..3dd9afc --- /dev/null +++ b/public/pt/links/20200706/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-07-06

+ +

Apps do Reddit e LinkedIn Capturando a Área de Transferência do iOS, +Biblioteca Python Para Aplicações no Terminal, Fluxo de Trabalho do Zola, +Pascal Moderno, Framework de Testes para Bash, Gerenciando Dependência com +Python, Esquisitices de C.

+

Reddit and Linkedin apps also caught copying and pasting clipboard contents

+

A um tempo atrás, começaram a aparecer notícias que o TikTok estava +capturando a área de +transferência +numa atualização recente do iOS, que notifica o usuário no desktop quando +alguma coisa é copiada para a área de transferência em algum dispositivo e +vice-versa -- o resumo é que a próxima versão do iOS, quando você copia algo +em um dispositivo, o sistema notifica que algo foi adicionado na área de +transferência, e assim você pode colar o conteúdo em qualquer outro +dispositivo da Apple.

+

E agora as aplicaçòes do Reddit e do LinkedIn rodando nessa nova versão +começaram a mostrar essa notificação.

+

Já que é a primeira versão do iOS 14, pode ser que tenha alguma coisa errada +com a API e que o sistema está notificando algo que é completamente normal, e +não seria a primeira vez que a Apple cometeu esse tipo de erro em uma versão +nova do iOS. Mas, ao mesmo tempo, nós vivemos numa época onde qualquer +aplicativo quer capturar a maior quantidade de dados possíveis do usuário e +não dá pra negar que não seria estranho se o Reddit (que tem feito uma +campanha agressiva para usar o aplicativo no site mobile deles) e o LinkedIn +estivessem fazendo algo desse tipo.

+

Honestamente, eu não acho que a API esteja com problemas. A Apple fez isso de +propósito, para mostrar quem é que está abusando dos usuário sem ficar dizendo +que eles estão abusando.

+

Rich is a Python library for rich text and beautiful formatting in the terminal.

+

Me parece curioso que está acontecendo uma certa "renascença" de aplicações +para terminal nesses dias; e, acompanhando, a quantidade de bibliotecas para +ajudar desenvolvedores a fazer aplicações que fiquem mais bonitas.

+

E aqui tem mais uma dessas bibliotecas, dessa vez em Python.

+

My Zola Workflow

+

Eu uso Zola nesse blog também (e eu estou abusando da feature de tags, mas +essa é uma discussão para outra hora) e aqui Jason mostra a sua configuração +para gerar as páginas quando estiver enviando o conteúdo para o Github.

+

A única coisa que me incomoda é o uso do Docker para o Zola. Mas Zola é uma +aplicação Rust e usa um único binário e eu não vejo porque Docker seria +necessário aqui (tirando acesso as chamadas da Glib). Você poderia +simplesmente colocar o binário do Zola junto com o conteúdo e ser feliz -- eu +estou pensando em usar essa saída, quando eu parar de procrastinar e gerar o +deploy do meu blog, que hoje é um pequeno shell script.

+

Modern Object Pascal Introduction for Programmers

+

Ah, Pascal. A linguagem que nós, velha guarda, aprendemos na universidade.

+

Eu tenho que admitir que eu esqueci a maior parte das coisas sobre a linguagem +(por falta de uso) e eu sempre ficou feliz por encontrar essas dicas sobre +alguma das linguagens que eu perdi contato por anos -- sem mencionar que eu +quero escrever uma aplicação em Pascal, só por diversão.

+

Bach Testing Framework

+

Bach é um framework de testes para scripts Bash.

+

DepHell

+

Uma ferramenta para gerenciar dependências com Python. Converte de um formato +para outro e ainda permite criar dockerfiles para um isolamento maior.

+

C, what the fuck??!

+

Eu gosto de C e não vou mentir. Mesmo com suas esquisitices, é uma +linguagenzinha divertida.

+

Mas a quantidade de esquisitices -- algumas meio obscuras, como mostrado aqui +-- é realmente uma dor.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200712/index.html b/public/pt/links/20200712/index.html new file mode 100644 index 0000000..256e928 --- /dev/null +++ b/public/pt/links/20200712/index.html @@ -0,0 +1,137 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-07-12

+ +

Erlang por Exemplos, Acessibilidade, Boas Respostas no StackOverflow, Testes, +Flexbox, Servidor HTTP in C, Sorvete Afetando Carros.

+

Erlang/OTP by Example

+

Erlang esta na minha lista de linguagens que eu quero aprender e ter um "Por +Exemplos" sempre ajuda -- pelo menos, me ajudou um monte com Rust.

+

The 6 Most Common Accessibility Problems (and How to Fix Them)

+

Acessibilidade é sempre importante. E saber que tem algo parecido com o OWASP +(que mantém uma lista de falhas de segurança de aplicações web) que tem uma +lista de problemas comuns sempre ajuda. E, ainda por cima, tendo uma lista de +problemas simples e fáceis de serem resolvidos é sempre melhor.

+

Parsing city of origin / destination city from a string

+

Embora a resposta seja bem longa e não um simples "Use X", esse é o tipo de +resposta que o StackOverflow deveria ter: Mesmo que a pergunta pareça absurda, +tem uma longa explicação de como fazer, cada passo e cada problema com cada +passo até o ponto de "não é assim tão simples".

+

against testing

+

Alguém levou o que eu falei sobre testes muuuito a sério.

+

Ok, testar tudo parece errado, mas você pode ver que as coisas estão erradas +quando alguém diz que "Os testes são frágeis, quebrando devido a alterações +completamente inócuas no código". Aqui é onde está o problema: Você é um +idiota se isso acontece; você deveria estar testando comportamentos, não +implementações. É óbvio que o teste vai ser frágil porque você está testando a +coisa de forma errada.

+

Isso é um dos pontos que eu realmente não gosto dos chamados "testes de +unitários" -- no sentido de "testar cada função". Comportamento não está +contido em apenas uma função, mas surge quando as funções interagem. É por +isso que testes de integração parecem mais "corretos" pra mim: Nós ignoramos +como as coisas foram implementadas e focamos em como o sistema deve se +comportar.

+

Então sim, testar está errado e você não gosta disso, especialmente quando +você está escrevendo os testes da forma errada pra inicio de conversa.

+

Coping with flexbox

+

Flexbox é a nova coisa legal em desenvolvimento web atualmente, principalmente +porque corrige o maldito problema de "centralizar o conteúdo verticalmente e +horizontalmente". E esse tipo de explicação, que começa no básico, sempre +ajuda.

+

httpserver.h: Single header library for writing non-blocking HTTP servers in C

+

Uma coisas coisas estranhas de C é que você pode fazer basicamente tudo, +incluindo escrever um servidor HTTP não blocando em apenas um arquivo.

+

"My Car does not start when I buy Vanilla Ice Cream", said a Man to General Motors.

+

Eu adoro esse tipo de história: Coisas que não funcionam porque algo +completamente randômico e aparentemente não relacionado aconteceu.

+

Me lembra da história de "Minha senha não funciona quando eu fico em pé".

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200719/index.html b/public/pt/links/20200719/index.html new file mode 100644 index 0000000..fb778c9 --- /dev/null +++ b/public/pt/links/20200719/index.html @@ -0,0 +1,157 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-07-19

+ +

Criando Executáveis no Estilo Unix, Estruturas de Dados e Algoritmos Realmente +Usados, Fundação Zig, Rust no Linux, IA Ruim, Git Ignore, O Que É CI e CD.

+

Traditional Unix Toolchains

+

Embora o título possa dar a impressão que vai ser falado das ferramentas +comuns de unix (e pipes, e && e ||), na verdade o post fala sobre o +processo que os compiladores unix fazem quando estão convertendo seu código C +em um executável.

+

Pode ser um pouco sucinto, mas e sucinto nos lugares certos. Explica bem todo +o processo, as ferramentas envolvidas e o que elas fazem no processo inteiro.

+

Data Structures & Algorithms I Actually Used Working at Tech Companies

+

Quando estamos fazendo entrevistas de emprego, somos perguntados sobre um +monte de coisas. Mas o que realmente é usado? Me lembra aquela piada de que +as pessoas são perguntadas, na entrevista, para escreverem um algoritmo para +inverter uma árvoce binária, mas o trabalho é mover um botão 2 píxeis para a +esquerda.

+

Mas é bom saber o que é realmente utilizado, em aplicações de verdade. E não +apenas em algum CRUD ou algo do tipo, mas o que acontece em aplicações como +Skype e Uber.

+

Announcing the Zig Software Foundation

+

Zig é uma pequena linguagem que se colocou para resolver os problemas com C.

+

O que me impressionou aqui é que a comunidade Rust tem falado sobre criar uma +fundação, para que a linguagem fique aberta para todos, mas até agora não +conseguiram fazer.

+

Então, parabéns para os desenvolvedores do Zig por criarem a sua fundação!

+

Linux kernel in-tree Rust support

+

Parece que os desenvolvedores do kernel do Linux finalmente abriram as portas +para novas linguagens na área de desenvolvimento.

+

O que me parece "errado" aqui é o Linus dizendo que o "suporte a Rust" deve +estar sempre ligado, e se algo quebrar, eles podem apontar que o suporte +estava quebrado. A parte "errada" disso é que, obviamente, bota visibilidade +nas coisas que não funcionam ao invés das que funcionam. O que acontece se +tiverem módulos que funcionam corretamente, mas um deles falha? Obviamente que +todo mundo vai dizer que o suporte não funciona e que as pessoas devem +continuar com o que funciona.

+

Mas Linus, sabe como é...

+

Awful AI

+

Nem toda IA é boa. Nem toda IA vai te ajudar a encontrar um horário disponível +para todo mundo pra uma reunião. Não é toda IA que vai colocar as tags nas +suas fotos com localizações e as pessoas que você gosta -- mas que vão também +marcar pessoas negras como "gorilas". Ou talvez dizer quem é gay ou não (e +pense como isso afetaria essas pessoas em países que consideram +homossexualidade um crime). E a lista continua.

+

gitignore.io

+

Crie um .gitignore para todas as coisas do seu projeto, baseado na linguagem +e ferramentas que você usa.

+

The real difference between CI and CD

+

O que CI e CD fazem? Para que eles servem?

+

Eu tenho essa ideia de fazer uma apresentação para pessoas que estão começando +com desenvolvimento sobre isso -- porque, vocês sabem, ainda existem pessoas +que acham que fazer um git push no computador e git pull no servidor de +produção e uma boa decisão...

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200726/index.html b/public/pt/links/20200726/index.html new file mode 100644 index 0000000..b4a0165 --- /dev/null +++ b/public/pt/links/20200726/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-07-26

+ +

Internos do Datomic, Dicas para Desenvolvedores, Racismo@Google, Logs, +Programe Para Deletar, Sendo um Gerente de Produtos, Syntax Highlight, Módulos +em Rust.

+

Unofficial guide to Datomic internals

+

As partes internas de um banco de dados são sempre curiosas, pra dizer o +mínimo. E Datomic é um banco de dados curioso, onde tudo é imutável.

+

Mas entender as partes internas é sempre bom para entender onde o banco de +dados se encaixa e como tirar o máximo disso.

+

Advice to Myself When Starting Out as a Software Developer

+

Quando se está na área por algum muito tempo, é fácil esquecer como as coisas +eram quando você começou.

+

E não consigo achar nada de errado com as dicas mostradas aqui, mas eles +parecem tão... basicas. E eu quero dizer que essas dicas são algo que deveria +estar nas listas de todos os desenvolvedores, iniciantes ou veteranos.

+ +

O que? Você está dizendo que o Google é racista? Mas isso é impossível! Isso é +culpa "do algoritmo"! Google é bom, eles me dão email de graça!

+

Vocês conseguem ver como "dar coisas de graça" e "open source" (e não ouvir os +usuários) não passa de uma jogada de marketing?

+

Good Logging

+

Logs são sempre importantes -- pessoalmente, eu acho que logs (e bons logs) +são mais importantes que debugar -- mas saber como e o que logar é a chave +para fazer a coisa certa.

+

Alguns pontos são bem comuns, como os "logs gritantes", embora a solução não +seria usar WARNING e INFO, mas descobrir como definir corretamente o nível +de log de cada módulo -- e usar módulos -- parece ser o mais certo.

+

Pessoalmente, eu deixo uma pilha de mensagens de debug em alguns lugares, +como "cicatrizes" de uma batalha. Talvez algum outro desenvolvedor vai ver a +sequência de logs e pensar duas vezes antes de sair trabalhando.

+

Write code that is easy to delete, not easy to extend.

+

Essa é uma coisa que eu consigo concordar: é melhor escrever um código que +seja fácil de ser apagado do que reusado. Mas simplesmente ir copiando +diversas partes várias vezes para que seja possível apagar uma sem afetar o +restado do código não parece ser a solução.

+

Eu simplesmente iria adicionar mais abstrações, ao ponto que as funções se +tornassem tão simples que elas existiriam sem qualquer lógica de negócio; +essas lógicas seriam colocadas juntas em outras funções, descrevendo +exatamente o que a regra de negócio quer faz: +recuperar_informacao_do_servidor, alterar_informacao_de_alguma_forma, e assim +por diante. Se a regra muda, é só remover a abstração no meio da função maior.

+

"Mas isso ainda não resolve o problema!" Bom, se a regra de negócio mudou, +então você pode apagar a função maior e criar uma nova que segue a nova regra +ou simplesmente apagar -- ou adicionar -- alguma das abstrações.

+

22 Principles for Great Product Managers

+

Eu nem tinha chego na metade da lista e eu já estava "É, eu tive um gerente +que fez minha vida um inferno" e "Eu lembro quando fizeram isso e foi ótimo".

+

Syntax highlighting is a waste of an information channel

+

Mais uma vez, "eu concordo com o sentimento, mas não com a implementação". Não +que ter informação sobre tipos, ou de algum parâmetro, na sintaxe não ajude um +bocado, mas o fato é que essa informação varia conforme a situação. Em alguns +pontos, o tipo pode ser mais importante que o parâmetro, ou vice-versa, ou, +pior, pode dar foco em algo que não seja realmente importante no momento. E +tentar colocar tudo isso junto, em algum ponto, se tornaria um pesadelo -- ou +uma salada de frutas de cores que vai fazer a leitura do código e encontrar o +que importa completamente impossível.

+

Clear explanation of Rust’s module system

+

O sistema de módulos do Rust é um pouco diferente dos demais, e algumas +explorações que eu fiz me deu algumas dicas sobre como esse sistema funciona +-- mais ou menos o que é dito no post.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200802/index.html b/public/pt/links/20200802/index.html new file mode 100644 index 0000000..64362f1 --- /dev/null +++ b/public/pt/links/20200802/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-08-02

+ +

Falhas de Async/Await, Facebook Reclamando do iOS 14, Telegram no Eamcs, Go É +A Linguagem do Google, Copyleft é Copyright, Google Culpando "O Algoritmo" de +Novo, Fragmentação de Times.

+

Beware of Async/Await

+

Não tanto "cuidado com async/await", mas mais como "não use async/await da +forma errada". E agora que todas as linguagens tem o seu async/await, esse +problema pode acontecer em qualquer uma delas.

+

Facebook says Apple’s iOS 14 changes could hurt its ad targeting

+

Dá pra perceber quando a Apple está fazendo algo certo quando o Facebook diz +que uma mudança no iOS vai prejudicar as propagandas deles.

+

telega.el: GNU Emacs telegram client (unofficial)

+

E a "pia da cozinha" do Emacs só fica maior.

+

pkg.go.dev is more concerned with Google's interests than good engineering

+

Mais uma vez, eu discordo do Drew em vários pontos, mas eu tenho que dar +pontos pra ele quando ele consegue explicar um ponto muito bem.

+

Um dos principais pontos do Git é a sua decentalização. Mesmo que o uso de +facto nos dias atuais não seja decentalizado, mas infelizmente centralizado. +E o Google deveria saber disso, porque eles já tiveram o seu repositório Git +(GoogleCode) e eles... cagaram. E agora, porque eles cagaram com o mesmo, +parece que eles querem estragar as coisas ainda mais, para que as pessoas não +se liguem o tamanho da cagada.

+

E, mais uma vez, Go é a linguagem do Google. Não é a sua linguagem e eles não +estão interessados em te ajudar.

+

Open Usage Commons: a warning

+

Vamos ignorar o tom de "o mundo está acabando" do post e vamos focar no que +ele comenta:

+
    +
  1. Para ajudar desenvolvedores open source com o registro de marca, você tem +que desistir de todas as suas patentes e coisas dos tipo para o Open Usage +Commons.
  2. +
  3. Me deixem repetir isso: Você desiste de todas as suas patentes para +outra pessoa.
  4. +
+

Copyleft funciona porque, no fundo, é baseado nas leis de copyright; você pode +processar alguém que tentar roubar suas patentes e marcas se, por exemplo, +eles tentaram tirar o seu copyright do produto ou eles tentar usar sua posição +para ocupar a sua posição de "quem entende como isso foi feito".

+

Uma coisa que me lembrou no começo do post é que a GNU Foundation faz a mesma +coisa: Se você quiser que a sua aplicação seja uma aplicação GNU, você deve +passar todos as patentes e marcas para a fundação GNU. E embora pareça ser a +mesma coisa, as similaridades terminam aí:

+

Se você quiser distribuir qualquer coisa sob qualquer licença GPL (GPL, LGPL +ou AGPL), você não precisa passar nada para a GNU Foundation; o produto +ainda é seu. Se você quiser que sua aplicação seja considerada uma aplicação +GNU, a fundação ainda precisa aceitar o pedido.

+

Marcas e copyrights são muito importantes para projetos open source. Não os +entregue pra ninguém.

+

Google blames algorithm for adding porn titles to train station search results

+

Mais uma vez, a mítica desculpa "Foi o algoritmo!". Não foi um "Desculpe, nós +erramos com a base treinamento", é "o algoritmo".

+

A ideia do Google de "organizar a informação do mundo" parece cada vez mais +longe quando eles sequer entendem da informação.

+

Independence, autonomy, and too many small teams

+

Eu já vi isso: Como as pessoas acreditam na "comunicação cresce +exponencialmente" e devem ser criados times menores -- que está correto. Mas +as pessoas fazem "times menores" e não "problemas menores que possam ser +gerenciados por times menores". E é aí que as coisas começam a se desmontar.

+

Honestamente, para mim, isso parece muito com um problema em não ter um +arquiteto de sistemas, alguém que tenha uma visão geral do sistema e pense +como todas as peças se juntam.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200809/index.html b/public/pt/links/20200809/index.html new file mode 100644 index 0000000..35b9773 --- /dev/null +++ b/public/pt/links/20200809/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Commentados de 2020-08-09

+ +

VimConf, SQL Melhor, Branches no Git, Excel Estragando a Ciência, OpenJDK em +ARM, Ferramentas CLI em Rust, DataFrames em Rust, Janelas do Mundo

+

VimConf 2020 Live

+

Um pequeno ponto positivo em tudo que está acontecendo hoje em dia é a +quantidade de conferências que estão sendo transmitidas ao vivo.

+

E agora tem a conferência de VIM, VimConf, acontecendo online.

+

Pelo incrível preço de $0.

+

We Can Do Better Than SQL

+

"Olhem, olhem! Nosso produto faz algo melhor que o resto do mundo! Nós +prometemos!"

+

Embora eu consiga entender que SQL não seja perfeito -- por exemplo, será que +alguém sabe quais são e como funcionam todos os tipos de join? -- mas e uma +coisa dizer "nosso sistema é melhor" quando dá pra ver claramente que a +requisição requer mais informação do que está sendo mostrado.

+

Com certeza, as queries apresentadas ficam mais simples, mas quanto trabalho +se tem quando o banco é criado para que a query funcione? Quais são os usos +disso e quando é que as coisas ficam complicadas? Eu posso citar o exemplo de +Rust: A linguagem faz com que seja possível escrever código paralelo correto, +mas devido a isso é realmente difícil escrever algo como uma lista encadeada +sem encontrar problemas.

+

Então sim, a sua query é mágica, mas não mostrar onde é que ela capota dá zero +de informação se eu quero usar o produto ou não. SQL tem suas deficiências, +mas elas são conhecidas e documentadas.

+

git branch --delete master

+

Nada de deuses, nada de mestres.

+

Esse post é meio relacionado com outro link que eu compartilhei a uns 2 meses +atrás, mas aqui temos a explicação de como matar o branch "master" ou usar +qualquer outro no lugar.

+

Scientists rename human genes to stop Microsoft Excel from misreading them as dates

+

Em que ponto chegamos que a ciência tem que se curvar diante dos caprichos da +tecnologia...

+

OpenJDK Comes to Windows 10 on ARM

+

Se você ainda tinha dúvidas que ARM é a plataforma do futuro, aqui tem dois +pontos que vão fazer você repensar:

+ +

Rewritten in Rust: Modern Alternatives of Command-Line Tools

+

Eu compartilhei uma lista parecida anteriormente, mas eu fico sempre +esquecendo de instalar o hyperfine e eu já tive situações que eu precisava +do grex e esqueci o nome dos dois.

+

Então, mais uma vez, na esperança que eu vou lembrar de conferir meu blog +antes de mais nada.

+

Polars: Rust DataFrames

+

Ciência de Dados em Rust. Eu não achava que era possível, mas eu posso ver os +primeiros passos aqui.

+

WindowSwap

+

Esse é um projeto legal pacas, mesmo que não esteja diretamente ligado com +algo de programação.

+

Pessoas colocam câmeras nas suas janelas e você pode olhar através delas, +randomicamente.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200815/index.html b/public/pt/links/20200815/index.html new file mode 100644 index 0000000..b0a1bd0 --- /dev/null +++ b/public/pt/links/20200815/index.html @@ -0,0 +1,187 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-08-15

+ +

Documentação do Rust na Linha de Comando, Emacs Doom, Efeito Cascata de ARM na +Apple, Arquitetura de Software, Uploads com Flask, Flask e Prometheus, Rust na +Apple, Arquivos de Configuração em Rust, Builder Pattern em Rust, Arruinando +Sites de Phishing com Bash, Rode Código Online, Culto da Ação, O Que É a +Mozilla, SPA em Rust, Extensões do GNOME, Git em Rust.

+

roc: Rust command line documentation searching

+

Eu posso estar ficando muito interessado em ferramentas CLI e tal, mas +pesquisar a documentação do Rust diretamente da linha de comando parece ser +útil pacas.

+

Emacs Doom for Newbies

+

Eu prometi pra mim mesmo que eu não iria compartilhar mais links do Medium, +mas esse artigo me ajudou um bocado a entender as teclas de atalho do Emacs +Doom. E Emacs Doom é a minha distribuição Emacs favorita agora, então...

+

Apple Silicon: The Passing of Wintel

+

Eu gosto como esse artigo descreve como a simples mudança da Apple para a sua +versão de ARM pode forçar a Microsoft a mudar, usando a linha Surface. E se a +Microsoft mudar, todos os demais fabricantes terão que mudar também.

+

É tipo um conto de fadas, mas faz todo sentido!

+

Five things every developer should know about software architecture

+

Eu não olho vídeos técnicos -- mais pelo fato que meu mundo é em texto e eu +prefiro as coisas em forma textual -- mas pra mim os pontos apresentados fazem +todo sentido.

+

(E se alguém olhar o vídeo e eu estou errado, me avisem.)

+

Handling File Uploads With Flask

+

Embora uploads sejam algo simples (normalmente, e principalmente com Flask), +eu gosto de um tutorial que começa do básico, sem nenhuma frescura, e vai +adicionando features, mostrando o progresso feito para passar para uma feature +melhor que a versão anterior.

+

Monitoring Flask microservices with Prometheus

+

Uma biblioteca legal para adicionar suporte ao Prometheus em aplicações Flask.

+

Even Apple Is Interested In Migrating Their C Code To Rust

+

Tá, é nos serviços e nada a ver com macOS ou iOS ou qualquer um dos outros +OSes.

+

confy: Zero-boilerplate configuration management in Rust

+

Olha que bonitinha essa biblioteca que tem os diretórios onde arquivos de +configuração devem ficar e como devem ser carregados.

+

typed-builder

+

Uma crate interessante que permite #derivar o "builder pattern" em uma struct.

+

Stopping phishing campaigns with bash

+

Nada mais divertido que destruir um site de phishing com scripts +automatizados.

+

Try It Online

+

Uma das coisas legais do eco-sistema do Rust é o +Playground, um site que permite que você +execute código Rust sem precisar instalar o compilador Rust. Mas alguém fez +algo a mais e criou um Playground para praticamente todas as linguagens.

+

I Love MDN, or the cult of the free in action]

+

Tudo começa com um "Mas eu fiz primeiro e ninguém disse que me amava", mas +depois me acertou bem no meio com "Me lembra das pessoas partindo para um +aplauso espontâneo para os corajosos trabalhadores da saúde ao invés de exigir +que sejam pagos de forma correta para que eles pudessem fazer o trabalho +deles."

+

MDN é uma baita fonte de conhecimento da web. E, por alguma razão absurda, a +Mozilla decidiu não colocar mais dinheiro. E ninguém está falando sobre como +manter o MDN fora da Mozilla: nenhuma conversa sobre financiamento coletivo, +nenhuma conversa sobre mover para algum outro lugar para manter o projeto vivo +e tal.

+

Por falar nisso, se você está se sentido triste pela MDN e ainda está usando +Chrome: Parabéns, você é parte do problema.

+

Mozilla’s uncertain future

+

A parte interessante é como é apresentado o que a "Mozilla" realmente é, +explicando o trabalho feito pela Fundação e o trabalho feita pela Corporação.

+

Single Page Applications using Rust

+

Nesse ponto, deve ser bem claro o quanto eu gosto de posts que começam com +algo bem simples e vão construindo algo mais complexo em alguns passos.

+

E esse ainda tem os diffs entre as mudanças!

+

How To Make Ubuntu Work Like Windows 10

+

Não que eu seja fã do layout do Windows em primeiro lugar, mas uma boa coleção +de extensões do GNOME, se você estiver a fim de mudar o visual do seu sistema.

+

gitoxide: An idiomatic, modern, lean, fast, safe & pure rust implementation of git

+

Mais uma para a lista de "ferramentas comuns que foram reescritas em Rust".

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/20200829/index.html b/public/pt/links/20200829/index.html new file mode 100644 index 0000000..cfd917e --- /dev/null +++ b/public/pt/links/20200829/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Links Comentados de 2020-08-29

+ +

Propagandas Políticas Inescondíveis no YouTube, Fediverso Fora do Play Store, +Haskell do Zero, Mini-Patterns de Haskell, Thread Pools em Rust, Biblioteca de +Logging Para Aplicações Embedded em Rust, Oraculo Previsível, Falsidades Sobre +Endereços, Rastreie Isso.

+

YouTube Mobile (iOS): I keep getting Donald Trump campaign ads with no "stop showing me" option

+

Nada como começar uma lista de links comentados mostrando Google sendo... bom, +o Google.

+

Você pode pedir para ocultar propagandas que não lhe interessam. Mas parece +que algumas propagandas não podem ser ocultadas, não podem ser puladas e não +respondem como propagandas normais.

+

De certa forma, é ok que o Google decida que, se alguém pagar o bastante, eles +podem ter privilégios a mais no sistema. Afinal de contas, Google (Alphabet, +na verdade) é uma empresa, e pode decidir como as coisas funcionam nos +sistemas deles e como eles vão fazer dinheiro desses sistemas. Por outro +lado... isso é o que estamos falando a bastante tempo: Google não se importa +com o que entra no sistemas deles; Google não se importa com o que acontece +com os sistemas deles.

+

E é por isso que uma empresa que tem tanto efeito nas vidas de todo mundo não +deveria existir, pra começo de conversa.

+

Google is apparently taking down all/most fediverse apps from Google play

+

Mais uma vez, Google tem total liberdade para escolher o que eles querem dos +sistemas deles.

+

Mas temos o seguinte: ActivityPub é um protocolo que permite que qualquer +serviço compartilha informações com outros servidores que implementam o mesmo +protocolo. Não existe uma atividade específica que o protocolo trabalhe, mas a +forma mais comum atualmente é com micro-blogging (tipo o Twitter). Até aí, +tudo bem.

+

O que as pessoas querem fazer com seus serviços e por conta deles.

+

Como o protocolo é aberto, qualquer um pode implementar qualquer coisa com +ele, incluindo clientes que rodem em, digamos, Android.

+

Nos primeiros digas do protocolo, alguns servidores "maus" apareceram, mas +pessoas que gerenciam servidores com moderação resolveram que não iriam +federar com esses servidores mal-educados, basicamente deixando as maçãs ruins +fora do balaio.

+

Então sim, existem alguns serviços no universo do ActivityPub com conteúdo que +não respeitam os outros, mas esses são ignorados pela grande maioria dos +outros serviço. Será que o Google deveria banir o Chrome ou o Firefox do Play +Store porque existe conteúdo como do Breitbart na internet?

+

Haskell from 0 to IO (Maybe Hero)

+

Haskell é uma dessas linguagens exóticas que eu tentando entender o +funcionamento.

+

Eu posso dizer que entendi metade do conteúdo, antes de me perder nas +complexidades da linguagem. Eu eu pretendo ler de novo (e provavelmente de +novo) até que eu entenda.

+

Haskell mini-patterns handbook

+

E falando em Haskell, aqui temos alguns patterns (realmente pequenos) na +linguagem.

+

Deve ser consumido depois que entender a linguagem.

+

Multiple Thread Pools in Rust

+

Coincidências: Eu estava pensando em formas de melhorar a performance do meu +calculador de dhash, usando thread pools e queues para verificar arquivos e +calcular o hash para cada imagem.

+

E aí surgiu isso.

+

defmt, a highly efficient Rust logging framework for embedded devices

+

Uma nova biblioteca de logging para Rust, focada em eficiência. Mas pequena e +simples o suficiente para qualquer sistema.

+

aaronson-oracle

+

Um pequeno experimento para demostrar a previsibilidade das coisas. Depois de +um tempo, eu não consegui fazer com que o resultado ficasse abaixo de 75%.

+

Serve mais como prova que é possível prever os comportamentos de alguém quando +se tem um conjunto grande de informações. Também explica como é que de repente +você começa a receber propagandas sobre algo que você acabou de conversar com +alguém: Empresas de propaganda tem tantos dados sobre você que eles podem +prever, com uma boa acurácia, o que será do seu interesse no futuro.

+

Falsehoods programmers believe about addresses

+

Eu adoro esses posts de "falsidades".

+

Hey advertisers, track THIS

+

Mozilla pode parecer que está em maus lençóis esses dias, mas não podemos +esquecer o que eles já fizeram algo como "Track THIS", que começa a abrir +vários sites para estragar o conteúdo das empresas de rastreamento, de forma +que eles não consigam predizer nada com certeza.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/expanding-fuchsia-open-source-model/index.html b/public/pt/links/expanding-fuchsia-open-source-model/index.html new file mode 100644 index 0000000..b5d7ef0 --- /dev/null +++ b/public/pt/links/expanding-fuchsia-open-source-model/index.html @@ -0,0 +1,162 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Expanding Fuchsia's open source model

+ +

Google anunciou que eles estão mudando o modelo de código +aberto +do sistema Fuchsia. Mas o anúncio tem tantas bandeiras vermelhas que temos que +perguntar o que diabos o anúncio realmente é.

+
+

O artigo original está em inglês, e eu traduzi as frases.

+ +
+

Por exemplo: "Nós estamos desenvolvendo Fuchsia de forma aberta, no nosso +repositório git nos últimos quatro anos." Acontece que ninguém tem acesso de +escrita no repositório, apenas o Google. E, embora esteja "aberto", você não +pode sugerir alterações ou qualquer outra coisa, mesmo que você estivesse +seguindo o desenvolvimento desde a sua concepção. O modelo é tão "aberto" +quando o Adnroid, onde a única forma de contribuir com o código principal é +fazer parte do Google; você pode clonar o código do Android tanto quanto o +código do Fuchsia, mas boa sorte tentar executar o mesmo sem estragar a +garantia do seu dispositivo.

+

"Começando hoje, nos estamos expandindo o modelo de open source do Fuchsia para +que seja mais fácil para o público participar do projeto." Esse ponto é +importando para os próximos pontos, mas você tem que perguntar: O que está +realmente mudando no modelo? Eles estão mudando a licença, para permitir que +pessoas façam contribuições contínuas como um projeto open source? Eles estão +mudando as formas de comunicação para permitir pull requests de fora do Google? +Não, eles somente estão criando uma lista de discussão e escrevendo como alguém +consegue ganhar permissão para enviar patches ou se tornar um committer. Quão +aberto é um projeto que você precisa de um distintivo para fazer parte do +projeto?

+

Deixem-me tentar explicar isso usando uma analogia: Imaginem uma casa +com uma grande janela a prova de som. Vocês conseguem olhar o que tem +dentro da casa, mas não tem forma alguma que vocês consigam dizer que +o sofá fica melhor se ficar apontando para a outra parede, que um vaso +está pra cair e quebrar ou até mesmo ajudar a mover o sofá para o +outro lado da sala. Vocês não chamariam isso de uma casa aberta +(open), certo? Bom, esse é o modelo open source dos projetos do +Google: Pode olhar, mas nós não vamos te escutar e nós não vamos +deixar você entrar para mover o sofá para onde a gente quer.

+

"Ainda, estamos publicando um roteiro do Fuchsia para dar uma melhor ideia da +direção e prioridades do projeto." Lembram do primeiro ponto sobre ser mais +fácil para que o público possa contribuir com o projeto? Bom, como podem haver +contribuições do publico se a direção já está definida? E se o público decidir +que a direção deve ser outra? De qualquer forma, é uma perda de tempo para os +desenvolvedores atuais ou "fácil de contribuir" é simplesmente para conseguir +trabalho grátis e não para construir um projeto open source.

+

"Fuchsia é um projeto open source que é inclusivo por design, da arquitetura da +plataforma, para a comunidade open source que estamos construindo." Esse é um +ponto que foi levantando por outro usuário no Mastodon (olá +Berkes): Não é que alguém "constrói" uma +comunidade open source; você faz uma projeto inclusivo, aberto a qualquer um, +onde pessoas podem contribuir com código, documentação, ideias, melhorias e até +mesmo sugerindo a direção do projeto e a comunidade se constrói sozinha -- Rust +é um grande exemplo disso (e eu só estou comentando porque vou usar mais pra +frente).

+

Mas mesmo com tudo isso, vamos voltar um passo: Por que o Google mudaria o +"modelo" de tal OS? Será que eles não conseguiriam desenvolver eles mesmos, de +forma fechada? Claro que conseguiriam. O fato é que eles estão "abrindo o +código" porque provavelmente o projeto perdeu a importância dentro do Google e +ninguém se importa se o desenvolvimento continua. O roteiro provavelmente é +apenas a "lista de desejos" dos desenvolvedores originais e nada mais.

+

Ainda, existe a pergunta do "Por que Fuchsia?"; por que o Google iria investir +em um novo OS quando o Linux parece servir para praticamente todas as +necessidades deles (no final das contas, funciona bem no ChromeOS e no +Android)? Mesmo que esteja sendo desenvolvido com Rust, uma linguagem que provê +proteções de memória e deve, em teoria, prover uma experiência melhor para os +usuários, isso não significa que outras linguagens não provêem as mesmas +proteções -- Rust somente tem elas diretamente no compilador e aponta melhor +esse tipo de problemas do que outras linguagens. Mas quando você tem um sistema +operacional como o Linux, que é revisado por centenas de desenvolvedores, sendo +altamente modular e com grupos focados em diferentes subsistemas, a proteção +vem da comunidade. Google poderia, simplesmente, reescrever alguns sistemas +críticos em Rust e continuar assim, mas eles decidiram ir com a ideia de um +sistema completamente novo. E há rumores do que eles fizeram isso simplesmente +porque Linux é licenciado sob a GPL, uma licença que permite a contribuição de +qualquer um -- e versões mais recentes inclusive requerem que empresas +distribuam as chaves criptográficas para dispositivo que existem essas chaves +-- e que o Google simplesmente odeia.

+

Assim, um sistema criado (possivelmente) de puro rancor por regras que +realmente constroem uma comunidade open soruce agora está tentando criar uma +comunidade open source. Se isso não for justiça poética, eu não sei o que é.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/fsf-statement-about-rms/index.html b/public/pt/links/fsf-statement-about-rms/index.html new file mode 100644 index 0000000..b7ce824 --- /dev/null +++ b/public/pt/links/fsf-statement-about-rms/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Statement of FSF board on election of Richard Stallman

+ +

Depois do estranho retorno do rms ao board da Free Software +Foundation, agora ambos deram a sua versão +sobre o evento.

+

Mas eu ainda tenho a impressão que tem alguma coisa faltando.

+ +

Primeiro, uma breve examinada no curto anúnicio do +rms. +Embora reconheça seus comentários problemáticos, parece que ele focou em apenas +um evento -- comentários sobre Minsky --, ignorando outros que vieram depois, +como as mulheres que se sentiram inconfortáveis perto dele e pessoas comentando +a forma como ele dirigia a FSF. Ele menciona que pode parecer que ele não tem o +tom certo e a impressão que esse anúncio foi "só para falar algo" podem estar +relacionados, mas mesmo assim... Será que o board não consegue ajudar a +escrever esse tipo de coisa?

+

Segundo, e que me passou mais "vibrações negativas" foi o anúncio do board da +FSF +sobre o rms retornando ao board. Nisso, o segundo parágrafo me deu a impressão +de estar mais fora de perspectiva de todos.

+

Por exemplo, "Nós decidimos trazer o RMS de volta porque nós sentimos a falta +da sua sabedoria" ("We decided to bring RMS back because we missed his +wisdom"). O problema aqui é o uso do tom emocional: Não é que eles perceberam +que não tinham a mesma sabedora, eles só "sentiram falta". Não é que eles +perceberam uma falha no foco atual do board, eles simplesmente sentiram que +precisavam daquele "tapete que realmente deixava a sala perfeita"1.

+

Outro ponto: "Sua perspicácia histórica, legal e técnica sobre software livre +não tem comparação" ("His historical, legal and technical acumen on free +software is unrivalled"). Eu entendo o que eles querem dizer aqui, e eu +acredito que rms realmente tem um vasto conhecimento histórico, mas me parece +que, de novo, é um problema do rms. Se você tem um desenvolvedor sênior/líder +técnico no seu projeto, é esperado que essa pessoa ajude outros desenvolvedores +e gerentes passando seu conhecimento, ao ponto de que, no futuro, eles seriam +completamente irrelevantes (isso não acontece, porque ou essas pessoas sobre na +hierarquia da empresa ou novas pessoas são adicionadas ao time). Um líder +técnico/sênior que não compartilha seu conhecimento é um fracasso, na minha +opinião. Nesses 20 anos na FSF antes de renunciar à sua posiçào, rms deveria +ter compartilhado o suficiente que mesmo que seu conhecimento seja vasto, muito +estaria presente na fundação não importa o que acontecesse. Embora eu não possa +disse que o problema é especificamente o rms, porque pode ser que o board em si +não estava interessado em adquirir conhecimento (como acontece com alguns +desenvolvedores), isso é sinal de que há algo bem errado.

+

Ainda no mesmo parágrafo, "Ele continua sendo o filósofo mais articulado e um +inquestionável defensor da liberdade na computação" ("He remains the most +articulate philosopher and an unquestionably dedicated advocate of freedom in +computing"). rms admitiu que não tem o tom certo. Como é que alguém é +articulado se ele não sabe usar o tom certo e não consegue explicar seus pontos +corretamente? Conecte a isso que, no ponto seguinte, o board reconhece que "seu +estilo pessoal continua preocupante para alguns" ("his personal style remains +troubling for some") e você tem alguém que não é articulado.

+

E, finalmente, há "Nós reconhecemos a necessidade de atrair uma nova geração de +ativistas para a liberdade de software e para crescer o movimento" ("We +recognize the need to attract a new generation of activists for software +freedom and to grow the movement"). Isso é verdade, eu eu estou 100% com a FSF +nesse ponto. Exceto pelo fato que ao invés de trazer alguém da nova geração +para o assento livre no board, ele resolveram trazer alguém da antiga geração. +Se eu tivesse que mostrar as minhas credenciais de nerd, eu diria que isso é +basicamente o Kirk tomando o comando da Enterprise A do Decker e, se Decker não +estivesse lá, ele teria explodido a nave inteira no primeiro teste da +velocidade wrap. Uma nova geração é necessária para entender o novo ambiente, +nós não podemos ficar tentando usar os velhos métodos agora que é uma nova +nave.

+

A sensação que eu tivesse destes dois textos é que eles foram postados +simplesmente pra dizer "É, tá" ao invés de "Nós reconhecemos nossas falhas". Se +o rms tivesse reconhecimento seus problemas, ele teria citado os outros pontos, +indicando seu lado e indicando entendimento sobre onde foi que ele falhou. Se o +board tivesse reconhecido o problema em trazer o rms de volta, eles não +precisariam usar um tom emocional sobre ele e não colocariam isso sobre a +necessidade de uma "nova geração" enquanto permanecem com a antiga.

+

Estar errado acontece. Estender o que estava errado (comunicação, atitude, +entendimento na época) e mostrar isso é uma boa forma de crescer como pessoa. +Se você fica desviando disso, você acaba preso no mesmo lugar, fazendo os +mesmos erros de novo. E eu tenho a sensação que, nesses dois anúncios, tanto a +FSF quanto o rms estão parados no mesmo lugar.

+
+
1 +

Do original "hug that really tied the room together", dita no filme "The +Big Lebowski".

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/go-xml-vulnerability/index.html b/public/pt/links/go-xml-vulnerability/index.html new file mode 100644 index 0000000..ef41e5b --- /dev/null +++ b/public/pt/links/go-xml-vulnerability/index.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Coordinated disclosure of XML round-trip vulnerabilities in Go’s standard library

+ +

Mattermost, junto com o Google, anunciou a vulnerabilidade na +biblioteca XML padrão do +Go. Tem +algumas coisas que precisam ser examinadas nesse anúncio.

+ +

Antes de mais nada, eu preciso avisar que eu nunca gostei de Go. Eu +não gosto da forma como a organização lida com a comunidade, eu não +gosto da forma como são lidados com os erros, e eu não gosto do estilo +de código que eles usam. Eu uso qualquer oportunidade para xingar a +linguagem. Mas dessa vez, eu acho que a coisa ficou tão errada que não +tem como não falar mal.

+

Primeiro, ok, tem uma vulnerabilidade na biblioteca de XML. A +vulnerabilidade em si não é grande coisa -- basicamente, o que +acontece é que a biblioteca não mantém a ordem dos elementos conforme +a entrada -- mas o seu uso em coisas maiores, como o SAML, afeta a +forma como elas são liadas. Basicamente, algo que parece um XML/SAML +bem formado vai ser interpretado da forma errada porque o sistema está +mudando a semântica da coisa por mudar a ordem dos elementos.

+

Segundo, desde que a vulnerabilidade foi encontrada, o time de +segurança do go estava trabalhando na correção, sem sucesso. A solução +depois disso foi que "a causa raiz da vulnerabilidade não pode ser +corrigida de forma confiável." Isso quer dizer que a biblioteca padrão +agora tem uma vulnerabilidade que não pode ser corrigida.

+

Terceiro, essa vulnerabilidade foi encontrada em agosto deste ano e só +agora, quatro meses depois, a vulnerabilidade foi divulgada e +anunciada que não pode ser corrigida. Isso é bem enfurecedor porque o +Google tem um projeto chamado "Project Zero", criado para encontrar e +relatar falhas de seguranças em vários produtos. O problema é que essa +é a terceira vulnerabilidade não-tão-pequena no código do go e nenhuma +delas foi encontrada pelo Project Zero. Por outro lado, eles são bem +rápidos para encontrar e apontar -- depois de um prazo de 30 dias -- +problemas no Windows e no iOS, por exemplo.

+

Ah, e caso você esteja se perguntando quais foram essas outras +vulnerabilidades: a primeira era relacionada com bibliotecas +criptográficas +e basicamente afetou aplicações que usam Etherium. A segunda foi um +problema com a biblioteca "http", que poderia levar a uma negação de +serviço no +Kubernete.

+

Ainda... Quatro meses e nada de solução? Isso dá a sensação de que tem +algo seriamente errado com a arquitetura interna da linguagem, que +não permite que algo como ordenação seja aplicada.

+

Mas de volta ao problema inicial: Quarto, a empresa que trabalhou com +o Google e ajudou a tentar corrigir o problema apontam que eles não +acreditam que a solução apresentada pelo time do go vai realmente +corrigir o problema. Nas palavras deles, parece que o Google só quer +jogar o problema pra baixo do tapete e, quando a coisa explicar, eles +possam dizer "é seu problema, nós avisamos".

+

A solução do Google é, basicamente, "nós vamos botar na documentação e +esperar pelo menor". Então, sem correção de verdade. Honestamente, a +solução correta nesse caso seria remover a coisa toda e deixar alguém, +por sorte mais inteligente, escrever uma biblioteca XML correta. Nós +dizemos que nenhuma documentação é melhor que uma documentação errada, +então nenhuma biblioteca XML é melhor que uma biblioteca XML +vulnerável.

+

Outra solução seria criar bindings para a libxml2, que é uma +biblioteca em C que serve como base para as necessidades de XML de +outras linguagens. Isso significaria que a biblioteca padrão do go +necessitaria outras bibliotecas para ser construída.

+

Pessoalmente, com tudo que tem acontecido com a linguagem, usar a +mesma para qualquer projeto semi-sério (ou superior) é completamente +estúpido.

+

PS: Logo depois que eu postei esse artigo, eu recebi um aviso que o +time do go anunciou uma nova versão que corrige uma vulnerabilidade na +biblioteca "ssh" da stdlib. Mais uma vez, usar go para um projeto que +é pelo menos semi-sério é estupidez.

+ +
+ + + + +
+ + + + diff --git a/public/pt/links/google-illegaly-spying-workers/index.html b/public/pt/links/google-illegaly-spying-workers/index.html new file mode 100644 index 0000000..c7dbedc --- /dev/null +++ b/public/pt/links/google-illegaly-spying-workers/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Commentado: Google Espionando Ilegalmente Seus Empregados Antes de Despedí-los

+ +

TheVerge noticiou recentemente que Google estava demitindo +funcionários +baseado em informações de uma empresa contrada para espionar seus próprios +funcionarios.

+ +

Na verdade, nada disso é novo: o slogan de "Não ser mau" desapareceu a muito +tempo, e nós vemos, todos os dias, Google tratando seus usuários como gado para +o lucro. Mas agora tem se visto cada vez com mais frequência notícias do Google +tentando fazer com que seus empregados tenham um ambiente decente de trabalho.

+

Infelizmente, essa não é a única notícia do tipo: Já se sabia que tinha algo de +errado a muito tempo, quando em 2018 um grupo de funcionários organizou uma +saída do trabalho para protestar contra a forma como o Google estava lidando +com má conduta sexual e arbitração forçada -- algo que levou Andy Rubin, +criador do Android, a ser "demitido" da empresa. Desde então, o que se sabe é o +que é vazado para a empresa, senão as coisas são simplesmente escondidas +embaixo do tapete.

+

O fato que o Google tem feito algo como espionar seus próprios funcionários +mostra o quão ruim é o ambiente na empresa.

+

Antes que eu parta para uma grande reclamação sobre como essas coisas são +continuamente noticiadas, eu preciso fazer um pedido: PARE DE USAR PRODUTOS DO +GOOGLE. Quando você usa, você está basicamente dizendo para eles que é ok eles +continuarem com essa conduta.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/google-slams-microsoft/index.html b/public/pt/links/google-slams-microsoft/index.html new file mode 100644 index 0000000..a9090ec --- /dev/null +++ b/public/pt/links/google-slams-microsoft/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Commentado: Google slams Microsoft for trying 'to break the way the open web works'

+ +

Estanhos são os tempos em que o Google, tentando quebrar a forma como a web +aberta funciona, acusa a Microsoft de tentar fazer isso.

+ +

Vamos colocar as coisas sob perspectiva:

+ +

E é nesse ponto, senhores e senhoras, que a Microsoft entrou na jogada. Ao +ficar do lado das empresas de notícias e dizendo "Hey, se o Google for embora +da Austrália, vocês podem ter certeza que o Bing vai continuar funcionando". E +foi aí que o Google, sendo Google, disse "Vocês estão querendo estragar a web +aberta!"

+

Puta que pariu, Google. Vocês quebraram a web anos atrás e agora ficam +dizendo que os outros estão tentando fazer o que vocês fazem. E eu não digo +isso como defensor da Microsoft -- que eu não sou --, como defensor do governo +australiano -- que eu não sou -- ou como defensor das grandes empresas de +notícias -- que, adivinhem só, eu não sou.

+

O quanto antes o Google desaparecer da internet, melhor pra todo mundo.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/index.html b/public/pt/links/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/links/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/links/mitigating-memory-safety-issues-in-oss/index.html b/public/pt/links/mitigating-memory-safety-issues-in-oss/index.html new file mode 100644 index 0000000..90c25a4 --- /dev/null +++ b/public/pt/links/mitigating-memory-safety-issues-in-oss/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Mitigando Problemas de Segurança de Memória em Softwares Open Source

+ +

Inicialmente anunciado no HackerNews como "Google Vai Pagar Desenvolvedores +Para Portarem Seu Código Para Rust" nesse +post, +mas o conteúdo não parece ser exatamente o que é dito.

+

E parece que dessa vez os comentários do HackerNews entenderam o que o post +realmente quer dizer.

+ +

Mas me deixem fazer um resumo.

+

Primeiro, o dinheiro não irá para os desenvolvedores dos projetos open source +para que estes possam garantir a segurança dos seus projetos, ou olhar para +alternativas que tornem os projetos mais seguros. Google irá dar o dinheiro para +outra empresa -- ISRG -- para que eles escrevam novas versões de alguns +códigos. Assim, embora a ideia pareça ser boa, isso não quer dizer que eles +estarão oferecendo dinheiro para os autores trabalharem nos seus projetos; o +dinheiro irá para outra pessoa, que irá prover os patches.

+

Esse "alguém vai prover os patches" me lembra de uma talk do Brett Cannon em uma +DjangoCon. "Você vê esse cachorrinho, tão bonitinho, mas o que eu vejo são 10 +anos de caminhadas, dar comida e juntar coco."1 Assim, embora a ISRG mande +patches para melhorar projetos open source usando linguagens com proteção de +memória, não existe qualquer menção a "e continuar a fazer funcionar". Claro que +é legal ter um patch de segurança em outra linguagem no seu projeto, mas quem é +que vai continuar cuidando dela pra próxima versão? E na próxima? ISRG ou o +autor original -- que, de novo, não recebeu absolutamente nada para isso?

+

Segundo, há essa linha2:

+
+

A forma que a ISRG trabalha diretamente com os mantenedores para suportar a +reescrita de ferramentas e bibliotecas incrementalmente encaixa perfeitamente +com a nossa perspectiva aqui na Google.

+
+

O que parece estranho aqui é que nós sabemos, por um bom tempo, que Google não +trabalha para o bem comum; ela trabalha pra si mesma (e é ok para uma +empresa). Mas e se a forma segura de algum projeto não encaixar com a +"perspectiva" esperada pelo Google? Eles vão fazer um fork? Aceitar que a +perspectiva deles não é a forma correta?

+

Por exemplo, recentemente a biblioteca Cryptography trocou um componente base +para usar Rust -- o que faz todo o sentido num projeto de segurança. O problema +é para algumas pessoas, usando arquiteturas não comuns, viu seus builds +quebrando. De novo, faz +sentido que algo que é usado para segurança use uma linguagem com proteção de +memória, mas o que aconteceria se a solução proposta pela ISRG -- que, de novo, +se encaixa na perspectiva do Google -- e o autor decidir que portabilidade é +mais importante?

+

No final, parece que o Goog está tentando mais uma vez tomar controle de +projetos open source para seus propósitos e não realmente se preocupando para +que usuários finais tenha uma melhor experiência na internet.

+
+
1 +

Parafraseando, eu não me lembro exatamente das palavras usadas.

+
+
2 +

Traduzido por mim, o texto original diz: "The ISRG's approach of working +directly with maintainers to support rewriting tools and libraries +incrementally falls directly in line with our perspective here at Google."

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/plausible-agpl/index.html b/public/pt/links/plausible-agpl/index.html new file mode 100644 index 0000000..22c43c6 --- /dev/null +++ b/public/pt/links/plausible-agpl/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Open source licensing and why we're changing Plausible to the AGPL license

+ +

Plausible é um competidor do Google Analytics, sem a necessidade de expor os +dados dos seus visitante para uma empresa qualquer. E recentemente eles +mudaram a licença do produto para +APGL, e explicam o porque.

+ +

Embora eu precise admitir que eu não sou fã do tom de "EMPRESAS VÃO ROUBAR O +SEU CÓDIGO!", existe um outro ponto que precisamos considerar: E se alguém +começar a agir como intermediário do seu projeto para alguns usuários? Será que +eles vão saber que existe outro alguém trabalhando nele? E melhorias? Você não +gostaria que pessoas usando o seu produto tivessem uma experiência melhor?

+

Claro, podemos ignorar esses problemas e não nos importarmos com o que as +pessoas fazem. E daí que uma empresa pega o seu trabalho e ganha dinheiro com +ele? Você não se importa. Ok. Mas isso me dá a impressão que você não se +importa com o que você fez. Você não se importa com o seu produto. E se você +não se importa, porque eu iria me importar? Porque eu deveria me importar com +você, pra começo de conversa?

+

(Tá, eu sei: Eu estou sendo malvado. Que seja.)

+

Mas esse é o ponto, certo? Digo, eu escrevi um software. Eu gosto dele. Ele +resolve meu problema. Eu espero que outras pessoas gostem também. E só não +quero que uma entidade sem rosto venha, pegue meu software, faça algumas +alterações e tranque os usuários no sistema delas -- algo que eu, +inadvertidamente, ajudei a construir. Eu ajudei a trancar os dados de outras +pessoas num produto que eles não tem ideia de que podem tirar seus dados de +lá.

+

"Não é todo mundo que sabe programar, e daí?" Sim, não é todo mundo que vai +conseguir pegar meu script em Python ou C ou Rust ou Java e mudar alguma coisa +para resolver o problemas deles -- pense em alguém querendo acertar o Firefox +pra encaixar no que eles precisam. Mas todo mundo conhece alguém que sabe +programar. Eles podem pedir para essa pessoa para fazer a alteração. Eles podem +pagar para que essa pessoa faça uma mudança para que o software funcione +melhor para eles. Mas, para isso, eles precisam ter acesso ao código. Se uma +entidade sem rosto pega o código, faz alterações, cria um lock-in e a minha +licença não previne isso, eu sou parte do problema.

+

Não existe "um tamanho serve todos" em software. Conseguimos fazer com que um +tamanho caiba num grande número de pessoas, mas não todas. Mas nós podemos dar +as ferramentas para que as pessoas ajustem o tamanho para o que elas precisem.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/programming-sucks/index.html b/public/pt/links/programming-sucks/index.html new file mode 100644 index 0000000..5151e63 --- /dev/null +++ b/public/pt/links/programming-sucks/index.html @@ -0,0 +1,93 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Programming Sucks

+ +

Esse não é o tipo de coisa que eu normalmente compartilho, porque eu +normalmente compartilho coisas sérias (porque, vocês sabem, eu sou sério), mas +esse post tem várias tiradas engraçadas sobre os problemas da +programação.

+ +

E eu não digo "problemas" no sentido de "alguma aplicação explode" ou "uma +grande empresa diz que eles são legais, mas eles são uma coisa terrível e só +querem destruir o mundo para obter mais lucros", mas sério no sentido de +"porque diabos a maldita aplicação está explodindo", numa explicação de +não-programadores.

+

Ah, e se você acha que as metáforas foram longe demais... não foram não.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/links/whatsapp-giving-more-time-for-our-recent-update/index.html b/public/pt/links/whatsapp-giving-more-time-for-our-recent-update/index.html new file mode 100644 index 0000000..7ee4dac --- /dev/null +++ b/public/pt/links/whatsapp-giving-more-time-for-our-recent-update/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Link Comentado: Giving More Time For Our Recent Update

+ +

Recentemente o WhatsApp resolveu mudar a forma como as pessoas usam a +plataforma deles, permitindo que o Facebook possa coletar informações. Mas +houve tanta reclamando que eles decidiram dar mais tempo para que as pessoas +simplesmente aceitem a +mudança. Mas +algumas coisas parecem estranhas.

+ +

Antes de mais nada, os próximos parágrafos podem ser simplesmente o resultado +de um mau trabalho da comunicação do WhatsApp, mas a verdade é que as coisas +não parecem certas.

+

Por exemplo, eles mencionam que as pessoas estão "confusas" e que tem um "monte +de desinformação" por aí. Mas quais os pontos que as pessoas estão confusas? +Qual desinformação está sendo espalhada e qual é a verdade? Esses dois pontos +não são mencionados, e aí você não tem como saber o que é real e o que é +verdade.

+

E não há nada uma palavra sequer sobre mudança. Eles não vão mudar a descrição +da atualização para remover a confusão, eles não vão mudar a atualização. Se +acostume. Aceite ou caia fora.

+

Mas, de novo, isso pode ser simplesmente um mau trabalho do serviço de +comunicação. Não sabem o que fazer, não tem experiência nesse tipo de problema +de comunicação, então não há qualquer palavra que dê segurança que as mudanças +não são o que parecem.

+

Mas deixem-me avançar um pouco mais no assunto: WhatsApp está constantemente +afirmando que a criptografia de ponta-a-ponta não vai mudar, mesmo quando você +estiver usando o WhatsApp for Business. O post acima tem um link para o FAQ, +num texto que diz que eles estão provendo "mais opções", mas o FAQ em si mostra +que não são opções: Ele mostra coisas que vão acontecer. Se não existe uma +seleção do que pode ser desligado/desabilitado, então não é opção.

+

E mesmo que a conversa seja criptografada de ponta a ponta, não é comentado +nada sobre metadados. Metadados são importanes porque eles falam um bocado sem +dizer absolutamente nada. Por exemplo, em uma conversa criptografada de +ponta-a-ponta, ninguém pode ver o que eu discuti com a minha (não-existente) +esposa, mas os metadados mostram que a nossa localização não é mesma já faz +algum tempo (eles dizem que não capturam a localização, mas um bocado pode ser +dito sobre o IP que você se conecta no serviço deles), teve uma longa discussão +entre nós (porque, de novo, número de caracteres e número de mensagens são +puramente metadados e não dados em si) e, por algum motivo, depois dessa +conversa, eu abri outra convesa com alguém cujo perfil no Facebook diz que é um +Advogado de Divórcios. Mas não, seus dados estão seguros.

+

E por que isso é um problema? Uma das mudanças desta atualização é que "algumas +informações podem ser compartilhadas com terceiros" e você pode ter certeza que +um destes terceiros é o Facebook -- embora a parte estranhada não seja somente +isso. Mas imaginem que eu use o WhatsApp for Business para fazer um pedido na +minha pizzaria vegana favorita. De novo, metadados são compartilhados entre o +WhatsApp e o Facebook e agora o Facebook pode adicionar um ponto no meu perfil +dizendo que eu gosto de pizza vegana. Embora isso não seja ruim para mim, é +ruim para o pizzaria, porque eu vou começar a receber várias propagandas de +pizza no Facebook. E isso significa que empresas que usam o WhatsApp for +Business estão, basicamente, dando um tiro no pé usando o serviço.

+

Ainda, o que é dito no "Shared With Facebook FAQ" ("Perguntas Sobre o que É +Compartilhado com o Facebook" -- que é outro link perdido depois do blog) diz +que empresas podem usar a infraestrutura do Facebook para gerar comprovantes de +pagamento e conversas. Mas se isso ainda fosse criptografado de ponta-a-ponta, +então não seria preciso fazer qualquer alterar: Facebook seria simplesmente um +provedor de serviços para armazenamento de informações. Se ao invés do +Facebook, o WhatsApp decidisse usar os serviços de infraestrutura da AWS, seria +necessário fazer uma mudança dos termos de privacidade?

+

Não que eu esteja dizendo que essa mudança parece ser uma incrível quebra da +nossa já destruída privacidade, mas olhando de cima, certas coisas parecem +estar erradas.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/page/1/index.html b/public/pt/page/1/index.html new file mode 100644 index 0000000..b92c640 --- /dev/null +++ b/public/pt/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/public/pt/page/10/index.html b/public/pt/page/10/index.html new file mode 100644 index 0000000..a6f9728 --- /dev/null +++ b/public/pt/page/10/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + A História do Mundo Para Quem Tem Pressa - Emma Marriott + +

+ + +
+

Resumo GoodReads: +Um guia conciso e abrangente, ilustrado por mapas, para tudo o que +necessitamos saber sobre os acontecimentos mais importantes da história, desde +as antigas civilizações (Suméria, Egito e Babilônia, por exemplo) até o final +da Segunda Guerra Mundial. Esteja o leitor interessado no império de +Alexandre, o Grande ou no florescimento da república cartaginesa e sua +destruição por Roma na ascesão dos califados árabes ou na dinastia Tang, da +China, na Guerra Civil norte-americana ou nos povos maia, inca e asteca, +encontrará os fatos essenciais nesta obra igualmente essencial.

+ +
+ + Read more... + +
+ +
+

+ + Guia politicamente incorreto da história do mundo - Leandro Narloch + +

+ + +
+

GoodReads Summary: +Este livro é um guia contra a doutrinação que muitos brasileiros sofreram na +escola. Não tem a pretensão de contar a história do mundo: seu alvo são os +principais mitos sobre os últimos 2 mil anos que, apesar de terem sido +derrubados há muito tempo por historiadores, prevalecem nos livros didáticos, +nas provas do Enem, nas conversas de bar.

+ +
+ + Read more... + +
+ +
+

+ + História do Futuro: O Horizonte do Brasil no Século XXI - Miriam Leitão + +

+ + +
+

Resumo GoodReads: +História do Futuro é um grandioso livro de reportagem em que a jornalista +Míriam Leitão mapeia o território do que está por vir com base em +entrevistas, viagens, análises de dados e depoimentos de especialistas, +depois de três anos de pesquisas. Ela aponta tendências que não podem ser +ignoradas em áreas como meio ambiente e clima, demografia, educação, +economia, política, saúde, energia, agricultura, tecnologia, cidades e mundo. +E adianta que o futuro será implacável para os países que não se prepararem +para ele.

+ +
+ + Read more... + +
+ +
+

+ + Direto ao Ponto - criando produtos de forma enxuta - Paulo Caroli + +

+ + +
+

Resumo GoodReads: +Um projeto ágil é conduzido através de entregas rápidas e frequentes. Um +projeto bem executado coloca ênfase em entregas de valor de acordo com +objetivos de negócios e os usuários de destaque. Projetos ágeis promovem a +liberação incremental de software: o MVP, o produto viável mínimo, em Inglês +Minimum Viable Product (MVP), a versão mais simples de um produto que pode ser +disponibilizada para o negócio. Mas como realizar o entendimento do MVP e a +iniciação do projeto ágil o mais rápido possível? Como garantir que o time +comece o projeto com entendimento compartilhado, direção, prioridade e um +plano bem definido?

+ +
+ + Read more... + +
+ +
+

+ + Antologia da maldade: Um Dicionário de Citações, Associações Ilícitas e Ligações Perigosas - Gustavo H. B. Franco + +

+ + +
+

Resumo GoodReads: +Um livro que reúne o humor, a sabedoria - e a maldade - de figuras +proeminentes do cenário brasileiro e universal, de ontem e hoje. Os +economistas Gustavo Franco e Fabio Giambiagi organizam essa antologia de +citações cujo mote central são frases com dois dedos de maldade. Mas a maldade +que dá título ao livro não é a da perversidade e a da má índole, mas um +composto formado de maldade espirituosa, malícia, atrevimento, ironia, de +alguns maus ditos e de muito bom humor. Estão no livro citações de Nelson +Rodrigues, Millôr Fernandes, Machado de Assis, Getúlio Vargas, Winston +Churchill, Roberto Campos, Shakespeare, Jorge Luis Borges, e muitos outros, +entre banqueiros, políticos, consultores, empresários, artistas, escritores, +esportistas, filósofos, dramaturgos e cientistas. E constam também as falas de +algumas lideranças como Fernando Henrique Cardoso, Luiz Inácio Lula da Silva e +Dilma Rousseff, sem os quais nenhuma coletânea sobre a atualidade estaria +completa. Dividida por temas e organizada em ordem alfabética, a antologia +apresenta mais de setecentos verbetes, preenchidos com observações originais, +inusitadas, afiadas e divertidas sobre praticamente tudo. Encontraremos os +convencionais "Capitalismo", "Socialismo", "Amizade", "Inflação", "Traição", +"Religião", mas também outros singulares, como "Controle da mídia", +"Corrupção", "Groucho-marxismo", "Brasilidade", "Mensalão" e "Petrolão", que +estão no cerne das grandes polêmicas contemporâneas no Brasil. Inflação: +"Queremos apenas reduzir uma inflação indecente de 220% para um nível não +menos indecente de 150%, e depois o próximo governo continuará a luta." +Antonio Delfim Netto, economista e ex-ministro da Fazenda, em 1984. Inveja: "O +melhor dos bens é o que não se possui." Machado de Assis, escritor. Mineirice: +"Em Minas Gerais, a política é como crochê: não se pode dar um ponto errado, +sob pena de ter de começar tudo de novo." Itamar Franco, ex-presidente da +República.

+ +
+ + Read more... + +
+ +
+

+ + Tecnicas de Memorizacao Para Estudantes: Porque Voce Pode IR Alem - Rodrigo Vargas + +

+ + +
+

GoodReads Summary: +Cansado de estudar...estudar...e na hora da prova dar branco? Pois e...Eu +mesmo passei por isso diversas vezes na minha vida estudantil. Mas essa +experiencia me proporcionou a oportunidade de pesquisar e buscar entender o +processo da memorizacao e as tecnicas que podem fixar com muito mais qualidade +e eficacia o conteudo da materia estudada. Isto resultou no primeiro livro, +ainda em 1993, e de la para ca, a edicao foi revista e ampliada. Eu realmente +gostaria de ter tido acesso a essas informacoes quando era estudante. Mas +voce, hoje, tem essa informacao disponivel. Faca como milhares de outros +estudantes e conheca essas tecnicas simples e eficazes, para melhorar sua +capacidade de memorizacao.

+ +
+ + Read more... + +
+ +
+

+ + Pense Como Um Freak - Steven D. Levitt + +

+ + +
+

Resumo GoodReads: +The New York Times bestselling Freakonomics changed the way we see the world, +exposing the hidden side of just about everything. Then came +SuperFreakonomics, a documentary film, an award-winning podcast, and more.

+

Now, with Think Like a Freak, Steven D. Levitt and Stephen J. Dubner have +written their most revolutionary book yet. With their trademark blend of +captivating storytelling and unconventional analysis, they take us inside +their thought process and teach us all to think a bit more productively, more +creatively, more rationally—to think, that is, like a Freak.

+ +
+ + Read more... + +
+ +
+

+ + Mussum Forévis: Samba, mé e trapalhões - Juliano Barreto + +

+ + +
+

Resumo GoodReads: +Antonio Carlos Bernardes Gomes, mais conhecido como Mussum, é um dos mais +amados humoristas brasileiros. Mas você sabia que ele também era sambista? E +que era torcedor fanático da Mangueira? E que serviu a Aeronáutica? Mussum é +cultuado inclusive por quem não teve a oportunidade de vê-lo junto a Didi, +Dedé e Zacarias no saudoso programa Os Trapalhões. Mussum forévis, a primeira +biografia deste ídolo e artista multifacetado traz detalhes não só sobre sua +carreira na TV, mas como músico em conjuntos como Os 7 Modernos e Os originais +do samba. Este último inclusive costumava se apresentar como banda de apoio de +artistas do porte de Elis Regina, Jorge Ben, Jair Rodrigues, Martinho da Vila +e Baden Powell.

+ +
+ + Read more... + +
+ +
+

+ + Elon Musk: Como o CEO bilionário da SpaceX e da Tesla está moldando o nosso futuro - Ashlee Vance + +

+ + +
+

Resumo GoodReads: +Elon Musk é o empreendedor mais ousado de nosso tempo. Uma mistura de Thomas +Edison, Henry Ford, Howard Hughes e Steve Jobs, ele é o homem por trás dos +cobiçados esportivos elétricos da Tesla Motors, dos painéis e baterias de +energia solar popularizados pela SolarCity e dos foguetes espaciais da SpaceX, +construídos do zero com recursos privados e muito mais baratos que qualquer +versão já lançada pelas agências governamentais. Entre as próximas metas de +Musk está a colonização de Marte.

+ +
+ + Read more... + +
+ +
+

+ + O Herói de Mil Faces - Joseph Campbell + +

+ + +
+

Resumo GoodReads: +Apolo, Thor, Buda e outros numerosos protagonistas das religiões, mitologias, +contos de fada e do folclore universal representam simultaneamente as várias +fases de uma mesma história. O relacionamento entre seus símbolos intemporais +e os detectados nos sonhos pela moderna psicologia profunda é o ponto de +partida da interpretação oferecida por Joseph Campbell reconhecidamente, um +dos maiores estudiosos e mais profundos intérpretes da mitologia universal, +neste clássico obrigatório para compreender esse monomito que é a jornada do +herói.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/2/index.html b/public/pt/page/2/index.html new file mode 100644 index 0000000..d9a6b13 --- /dev/null +++ b/public/pt/page/2/index.html @@ -0,0 +1,383 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Link Commentado: Google slams Microsoft for trying 'to break the way the open web works' + +

+ + +
+

Estanhos são os tempos em que o Google, tentando quebrar a forma como a web +aberta funciona, acusa a Microsoft de tentar fazer isso.

+ +
+ + Read more... + +
+ +
+

+ + Bacurau (2019) + +

+ + +
+

Resumo da Wikipedia: +Num futuro próximo, Bacurau, uma pequena cidade brasileira no oeste de +Pernambuco, lamenta a perda de sua matriarca, Carmelita (Lia de Itamaracá), que +viveu até os 94 anos. Dias depois, seus habitantes aos poucos percebem algo +estranho acontecer na região.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: Mitigando Problemas de Segurança de Memória em Softwares Open Source + +

+ + +
+

Inicialmente anunciado no HackerNews como "Google Vai Pagar Desenvolvedores +Para Portarem Seu Código Para Rust" nesse +post, +mas o conteúdo não parece ser exatamente o que é dito.

+

E parece que dessa vez os comentários do HackerNews entenderam o que o post +realmente quer dizer.

+ +
+ + Read more... + +
+ +
+

+ + Pretty Lyrical Francium + +

+ +
+ +
+

+ + Link Comentado: Giving More Time For Our Recent Update + +

+ + +
+

Recentemente o WhatsApp resolveu mudar a forma como as pessoas usam a +plataforma deles, permitindo que o Facebook possa coletar informações. Mas +houve tanta reclamando que eles decidiram dar mais tempo para que as pessoas +simplesmente aceitem a +mudança. Mas +algumas coisas parecem estranhas.

+ +
+ + Read more... + +
+ +
+

+ + O problema de go não é a vulnerabilidade do XML + +

+ + +
+

Ontem eu postei alguns comentários sobre a vulnerabilidade da biblioteca XML +do go e algumas pessoas disseram que isso +não era grande coisa.

+

O problema não é a vulnerabilidade em si, no entanto.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: Coordinated disclosure of XML round-trip vulnerabilities in Go’s standard library + +

+ + +
+

Mattermost, junto com o Google, anunciou a vulnerabilidade na +biblioteca XML padrão do +Go. Tem +algumas coisas que precisam ser examinadas nesse anúncio.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: Expanding Fuchsia's open source model + +

+ + +
+

Google anunciou que eles estão mudando o modelo de código +aberto +do sistema Fuchsia. Mas o anúncio tem tantas bandeiras vermelhas que temos que +perguntar o que diabos o anúncio realmente é.

+ +
+ + Read more... + +
+ +
+

+ + Link Commentado: Google Espionando Ilegalmente Seus Empregados Antes de Despedí-los + +

+ + +
+

TheVerge noticiou recentemente que Google estava demitindo +funcionários +baseado em informações de uma empresa contrada para espionar seus próprios +funcionarios.

+ +
+ + Read more... + +
+ +
+

+ + Condensed Sodium + +

+ +
+ +
+ +
+ + + + diff --git a/public/pt/page/3/index.html b/public/pt/page/3/index.html new file mode 100644 index 0000000..7cc1c6b --- /dev/null +++ b/public/pt/page/3/index.html @@ -0,0 +1,333 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Lazy Kovar + +

+ +
+ +
+

+ + Gaga Silly Germanium + +

+ +
+ +
+

+ + Link Comentado: Programming Sucks + +

+ + +
+

Esse não é o tipo de coisa que eu normalmente compartilho, porque eu +normalmente compartilho coisas sérias (porque, vocês sabem, eu sou sério), mas +esse post tem várias tiradas engraçadas sobre os problemas da +programação.

+ +
+ + Read more... + +
+ +
+

+ + O Que Diabos a Apple Está Fazendo? + +

+ + +
+

A Apple anunciou que a nova versão do iPhone não virá com carregador ou fones +de ouvido, "para ajudar o meio-ambiente". E várias pessoas disseram que isso é +só para a empresa ganhar mais dinheiro.

+

Mas talvez tenha algo a mais nessa história.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: 1Password for Linux beta is now open + +

+ + +
+

1Password, a famosa ferramenta de gerenciamento de senhas, publicou um blog +sobre a liberação da versão beta da ferramenta para +Linux.

+ +
+ + Read more... + +
+ +
+

+ + Link Comentado: Open source licensing and why we're changing Plausible to the AGPL license + +

+ + +
+

Plausible é um competidor do Google Analytics, sem a necessidade de expor os +dados dos seus visitante para uma empresa qualquer. E recentemente eles +mudaram a licença do produto para +APGL, e explicam o porque.

+ +
+ + Read more... + +
+ +
+

+ + Tacit Beryllium + +

+ +
+ +
+

+ + Wiggly Duralim + +

+ +
+ +
+

+ + Condensed Fernico + +

+ +
+ +
+

+ + Potent Thrifty Iridium + +

+ +
+ +
+ +
+ + + + diff --git a/public/pt/page/4/index.html b/public/pt/page/4/index.html new file mode 100644 index 0000000..7ba03f1 --- /dev/null +++ b/public/pt/page/4/index.html @@ -0,0 +1,437 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Abounding Palladium + +

+ +
+ +
+

+ + Normative Robust Platinum + +

+ +
+ +
+

+ + Timeless Uranium + +

+ +
+ +
+

+ + O Valor Oculto do TikTok + +

+ + +
+

Como se 2020 não fosse estranho o suficiente, Oracle comprou as operações do +TikTok nos Estados Unidos, o que aparentemente não faz a menor sentido.

+

A não ser que faça.

+ +
+ + Read more... + +
+ +
+

+ + Carta Aberta a Movile + +

+ + +
+

Precisamos conversar sobre a forma como vocês estão se dirigindo com as +comunidades.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-08-29 + +

+ + +
+

Propagandas Políticas Inescondíveis no YouTube, Fediverso Fora do Play Store, +Haskell do Zero, Mini-Patterns de Haskell, Thread Pools em Rust, Biblioteca de +Logging Para Aplicações Embedded em Rust, Oraculo Previsível, Falsidades Sobre +Endereços, Rastreie Isso.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-08-15 + +

+ + +
+

Documentação do Rust na Linha de Comando, Emacs Doom, Efeito Cascata de ARM na +Apple, Arquitetura de Software, Uploads com Flask, Flask e Prometheus, Rust na +Apple, Arquivos de Configuração em Rust, Builder Pattern em Rust, Arruinando +Sites de Phishing com Bash, Rode Código Online, Culto da Ação, O Que É a +Mozilla, SPA em Rust, Extensões do GNOME, Git em Rust.

+ +
+ + Read more... + +
+ +
+

+ + Links Commentados de 2020-08-09 + +

+ + +
+

VimConf, SQL Melhor, Branches no Git, Excel Estragando a Ciência, OpenJDK em +ARM, Ferramentas CLI em Rust, DataFrames em Rust, Janelas do Mundo

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-08-02 + +

+ + +
+

Falhas de Async/Await, Facebook Reclamando do iOS 14, Telegram no Eamcs, Go É +A Linguagem do Google, Copyleft é Copyright, Google Culpando "O Algoritmo" de +Novo, Fragmentação de Times.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-07-26 + +

+ + +
+

Internos do Datomic, Dicas para Desenvolvedores, Racismo@Google, Logs, +Programe Para Deletar, Sendo um Gerente de Produtos, Syntax Highlight, Módulos +em Rust.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/5/index.html b/public/pt/page/5/index.html new file mode 100644 index 0000000..af7e7c1 --- /dev/null +++ b/public/pt/page/5/index.html @@ -0,0 +1,464 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Como Matar a Produtividade de Desenvolvedores + +

+ + +
+

Existem várias formas de não matar a produtividade de desenvolvedores num +projeto. Infelizmente, as reais causas nunca são comentadas.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-07-19 + +

+ + +
+

Criando Executáveis no Estilo Unix, Estruturas de Dados e Algoritmos Realmente +Usados, Fundação Zig, Rust no Linux, IA Ruim, Git Ignore, O Que É CI e CD.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-07-12 + +

+ + +
+

Erlang por Exemplos, Acessibilidade, Boas Respostas no StackOverflow, Testes, +Flexbox, Servidor HTTP in C, Sorvete Afetando Carros.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-07-06 + +

+ + +
+

Apps do Reddit e LinkedIn Capturando a Área de Transferência do iOS, +Biblioteca Python Para Aplicações no Terminal, Fluxo de Trabalho do Zola, +Pascal Moderno, Framework de Testes para Bash, Gerenciando Dependência com +Python, Esquisitices de C.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-07-03 + +

+ + +
+

Async Rust e Tide, Redesign do Github, Apple Se Recusando a Implementar Web +APIs, Fonte Fira, Runbooks, Async Zig.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-06-21 + +

+ + +
+

Google Sendo Processado Por Ignorar Incognito Mode, Exploit do Chrome por aí, +Comparando HTTP/1.1 e HTTP/2.0, Criando Tabelas em C++, Entendendo Emacs, +Licenças Open Source, Builder Pattern em Rust, Porque Não Usar Medium.

+ +
+ + Read more... + +
+ +
+

+ + Links Comentados de 2020-06-20 + +

+ + +
+

SIGSEGV, Conferência de ActivityPub, Nomes de Branches no Git, O Eco-Sistema +do Rust, Apredendo Rust com Linha de Comando, Problemas de Design, SCP.

+ +
+ + Read more... + +
+ +
+

+ + Links Commentados de 2020-06-18 + +

+ + +
+

Mensagens de Commit (de novo), Ansible, Nomes de CLIs, Feature Flags, Tamanho +dos Binários Rust, Mongo com Rust, Gerenciador de Tarefas em CLI.

+ +
+ + Read more... + +
+ +
+

+ + Links comentados de 2020-06-11 + +

+ + +
+

Infra-estrutura Como Código (em Python), Pong em Elm, Alan Kay e Objetos, +Paywalls, Brave, Notas, Rust do Zero, Escrevendo, 51 Conceitos Que Você +Deveria Saber, MAD em CSS, Algoritmos Mágicos.

+ +
+ + Read more... + +
+ +
+

+ + Python Perde a Segunda Posição Nas Linguagens Mais Amadas: Uma Reflexão + +

+ + +
+

Na pesquisa desse ano do StackOverflow, Python perdeu a segunda posição no +ranking de "Linguagens Mais Amadas" para TypeScript. No nosso grupo de Python, +as pessoas começaram a se perguntar o porque. E eu achei que seria +interessante postar minhas reflexões sobre a situação.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/6/index.html b/public/pt/page/6/index.html new file mode 100644 index 0000000..81ca0cc --- /dev/null +++ b/public/pt/page/6/index.html @@ -0,0 +1,428 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Links Comentados de 2020-06-03 + +

+ + +
+

Scotty, Pyramid e Cornice, Os Problemas Com datetime.now(), Mercurial e +Python 3, Acelerando o Python, Biblioteca Async para Requisições HTTP, +Propagandas Digitais, Google e a Web.

+ +
+ + Read more... + +
+ +
+

+ + Links de 2020-06-01 + +

+ + +
+

Sistemas Distribuídos, C em Rust, Protegendo Projetos, Sem Código, Android, +Blog de Pesquisa, Contact Tracing e Privacidade.

+ +
+ + Read more... + +
+ +
+

+ + Links de 2020-05-31 + +

+ + +
+

Executando Coisas em Python, Emacs, Tudo Que Pode Dar Errado, Por Que +Acreditamos que Reescrever Dá Certo, Copyleft, Analogias Para Débito Técnico, +Liderando Projetos, Microserviços em Rust, Cidades Como Estadas, Reclamando de +Quem Reclama do Stallman.

+ +
+ + Read more... + +
+ +
+

+ + Links de 2020-05-29 + +

+ + +
+

Spotify Pelo Mundo, Mensagens de Commit do Git, Airflow, Teclas do Emacs, +Contribuindo com Open Source no Estilo Rust, Git no Seu Domínio, Vim Wiki, Não +Use Medium, Resultados do StackOverflow Survey, Problemas com o StackOverflow +Survey.

+ +
+ + Read more... + +
+ +
+

+ + Com Licença! + +

+ + +
+

Uma conversa com apresentação sobre licenças de software livre.

+ +
+ + Read more... + +
+ +
+

+ + Rust: Programando TU, 2020-05-15 + +

+ + +
+

Mais uma vez, brincando com "tu", o "Time's Up!", em Rust.

+ +
+ + Read more... + +
+ +
+

+ + AO VIVO! + +

+ + +
+

Por causa da pandemia, pensei em fazer o que muitos estão fazendo hoje: Fazer +lives.

+ +
+ + Read more... + +
+ +
+

+ + Rust: Programando TU, 2020-05-12 + +

+ + +
+

Continuando o desenvolvimento do "tu", "Time's Up!", em Rust.

+ +
+ + Read more... + +
+ +
+

+ + Microserviços: Chassi + +

+ + +
+

O chassi de um fleet de microserviços é definido como as bibliotecas e +frameworks que alguém deve usar quando está criando um novo microserviço.

+ +
+ + Read more... + +
+ +
+

+ + Você Não Precisa de range() + +

+ + +
+

Quem está começando com Python tende a usar range() quando precisa iterar +sobre listas. Mas isso não é realmente necessário.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/7/index.html b/public/pt/page/7/index.html new file mode 100644 index 0000000..c37e6a8 --- /dev/null +++ b/public/pt/page/7/index.html @@ -0,0 +1,377 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Microserviços: Onde Fica a Fonte da Verdade? + +

+ + +
+

Quando estamos falando de um sistema, existe um ponto que precisamos discutir +que é onde a "fonte da verdade" está. Em monolitos, a fonte da verdade está no +armazenamento dos dados em si. Mas onde é que essa fonte fica em um sistema +que é composto de múltiplas partes?

+ +
+ + Read more... + +
+ +
+

+ + Código É um Livro, Testes Unitários São Corretores Ortográficos + +

+ + +
+

Se nós usássemos uma analogia para código sendo as palavras de um livro e o +sistema sendo construído como o livro inteiro, o que seriam os testes +unitários?

+ +
+ + Read more... + +
+ +
+

+ + Devaneios Sobre Testes + +

+ + +
+

Hoje em dia, boa parte dos desenvolvedores utiliza alguma metodologia de +testes. Mas o que são os testes? Para que servem? Qual o objetivo de se +testar? Estamos testando as coisas certas?

+ +
+ + Read more... + +
+ +
+

+ + Microserviços com 'Auto Cura' + +

+ + +
+

As discussões +anteriores que eu levantei +sobre microserviços foram um prelúdio para uma coisa que eu não consegui uma +solução perfeita: como é que microserviços se "curam" quando faltam dados?

+ +
+ + Read more... + +
+ +
+

+ + Microserviços: Expelindo Artefatos + +

+ + +
+

Como eu estava comentando sobre artefatos em +microserviços, eu acredito que esqueci +de discutir um ponto importante: Como é que esses artefatos são "expelidos" do +microserviço?

+ +
+ + Read more... + +
+ +
+

+ + Microserviços: Artefato = Entrada + Estado + +

+ + +
+

Projetar microserviços é um pouco complicado porque temos que pensar sobre +as coisas que cada "domínio" vai ocupar. Uma discussão entre os +desenvolvedores aqui sobre nossos projetos de microserviços me levou a +repensar como pensar microserviços.

+ +
+ + Read more... + +
+ +
+

+ + Hegel em 90 Minutos - Paul Strathern + +

+ + +
+

Resumo do GoodReads: +Hegel foi um dos filósofos mais eruditos, com imenso conhecimento de arte, +literatura, religião, filosofia, política e ciência, tanto de sua época como +de épocas passadas. Criador do método dialético, que nas mãos de Marx daria +origem à maior revolução desde a Revolução Francesa, admitia: "Apenas um homem +me entende, e mesmo ele não consegue." Alguns críticos consideram que nesse +ponto o filósofo exagerava. Terá esse homem existido realmente?

+ +
+ + Read more... + +
+ +
+

+ + Porque Você Deve Aprender Rust + +

+ + +
+

Rust é uma nova linguagem de programação que eu acredito que deveria ser vista +por desenvolvedores, mesmo que eles não venham programar em Rust.

+ +
+ + Read more... + +
+ +
+

+ + Cargo Cult + +

+ + +
+

Um dos problemas não falados na área de T.I. é o cargo cult, mas poucos +realmente sabem o que essa expressão quer dizer e de onde vem.

+ +
+ + Read more... + +
+ +
+

+ + Flask em 40 Minutos ou Menos: Iniciando + +

+ + +
+

Uma "breve" explicação de como colocar uma aplicação Flask em produção em 40 +minutos. Nessa primeira parte, vamos mostrar como começar um script Flask.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/8/index.html b/public/pt/page/8/index.html new file mode 100644 index 0000000..7dffda5 --- /dev/null +++ b/public/pt/page/8/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + Fugindo Para as Colinas Com Python + +

+ + +
+

"Hello World" não mostra exatamente o poder de qualquer linguagem. +Por isso resolvi fazer uma "introdução" ao Python com um problema de +fujir para as colinas. Ou quase isso.

+ +
+ + Read more... + +
+ +
+

+ + A Filosofia Explica as Grandes Questões da Humanidade - Clóvis de Barros Filho + +

+ + +
+

Resumo GoodReads: +O homem é livre? Deus existe? O que é um comportamento ético? Muitas das +questões que acompanham e instigam o Homem através dos tempos são temas deste +livro, A filosofia explica as grandes questões da humanidade, fruto de quase +uma década da experiência bem-sucedida do curso homônimo da Casa do Saber. +Engana-se quem pensa que os assuntos em pauta rendem reflexões herméticas ou +embrenhadas de academicismos. Clóvis de Barros Filho e Júlio Pompeu são +mestres na arte de apresentar a filosofia encarnada na vida, com humor e +exemplos cotidianos sem, no entanto, abrir mão da fidelidade às ideias +centrais de pensadores como Platão, Aristóteles, Hobbes, Maquiavel, Nietzsche +e Foucault. Os autores gostam de dizer que o resultado obtido é algo como um +excelente guia turístico, que aponta grandes atrações e revela aos visitantes +experiências novas e fascinantes. Portanto, se a sua vida tem alguma coisa a +ver com liberdade, felicidade, ética, fé, poder, esperança e conhecimento, +este livro é para você.

+ +
+ + Read more... + +
+ +
+

+ + 21 Erros Clássicos da Gestão de Projetos - Eli Rodrigues + +

+ + +
+

Resumo GoodReads: +Por que projetos fracassam? Embora cada projeto seja uma aventura única e sem +precedentes, muitos falham exatamente pelos mesmos motivos.

+

Este livro traz uma coletânea de 21 erros clássicos, obtidos através de +relatos de mais de mil alunos de gestão de projetos dos mais diversos setores +da economia. Estruturado de forma didática e bem-humorada, apresenta +detalhadamente cada situação, permitindo ao leitor conhecer essas +experiências, em vez de se arriscar apenas com suas próprias.

+ +
+ + Read more... + +
+ +
+

+ + Argo - Antonio J. Méndez + +

+ + +
+

Resumo GoodReads: +Em 4 de novembro de 1979, os funcionários da embaixada dos Estados Unidos em +Teerã são surpreendidos pela invasão de um grupo de militantes, que faz 53 +reféns. Em meio à confusão, seis diplomatas conseguem escapar e encontram +refúgio na residência do embaixador do Canadá. Mas Tony Mendez, especialista +em disfarces da CIA, sabe perfeitamente que é apenas uma questão de tempo até +que sejam encontrados. Para retirá-los do país, ele concebe um plano muito +arriscado, digno de cinema. Disfarçando-se de produtor de Hollywood e apoiado +por um elenco de agentes secretos, falsificadores e especialistas em efeitos +especiais, Mendez viaja para Teerã a pretexto de encontrar a locação perfeita +para um falso filme de ficção científica chamado Argo.

+ +
+ + Read more... + +
+ +
+

+ + Dossiê Jung - Elizabeth Mednicoff + +

+ + +
+

Resumo GoodReads: +Nesta obra, a autora descreve fatos valiosos a respeito do criador da +Psicologia Analítica, resultando em um livro rico não apenas como fonte de +informação, mas também como objeto de reflexão a respeito do ser humano e de +como ele lida com seus problemas e se relaciona com o mundo. Da infância e +juventude à idade adulta e seus últimos dias, o leitor conhecerá a trajetória +de vida do psiquiatra suíço que desde jovem se interessou por filosofia, +literatura e foi amigo de Freud. Além disso, são relatados pontos importantes +sobre a escola analítica da Psicologia fundada por Jung, incluindo os +conceitos do Inconsciente Individual e Coletivo, os Arquétipos, Anima e +Animus, o Self, a Teoria dos Tipos Psicológicos, a Dinâmica da Personalidade e +como se dá a sua formação.

+ +
+ + Read more... + +
+ +
+

+ + A Garota no Trem - Paula Hawkins + +

+ + +
+

Resumo GoodReads: +Todas as manhãs Rachel pega o trem das 8h04 de Ashbury para Londres. O +arrastar trepidante pelos trilhos faz parte de sua rotina. O percurso, que ela +conhece de cor, é um hipnotizante passeio de galpões, caixas d’água, pontes e +aconchegantes casas.

+

Em determinado trecho, o trem para no sinal vermelho. E é de lá que Rachel +observa diariamente a casa de número 15. Obcecada com seus belos habitantes – +a quem chama de Jess e Janson –, Rachel é capaz de descrever o que imagina ser +a vida perfeita do jovem casal. Até testemunhar uma cena chocante, segundos +antes de o trem dar um solavanco e seguir viagem. Poucos dias depois, ela +descobre que Jess – na verdade Megan – está desaparecida.

+ +
+ + Read more... + +
+ +
+

+ + Mujica – A revolução tranquila - Mauricio Rabuffetti + +

+ + +
+

Resumo GoodReads: +A biografia definitiva do líder político mais carismático do mundo.

+ +
+ + Read more... + +
+ +
+

+ + Turing e o Computador em 90 minutos - Paul Strathern + +

+ + +
+

Resumo GoodReads: +Sem dúvida o computador é um dos maiores feitos do século XX. Mas quantos de +nós sabemos como ele funciona? E quantos conhecem Alan Turing, pioneiro no +desenvolvimento do computador e que ajudou a decifrar os códigos Enigma +durante a II Guerra? Esse livro é um delicioso instantâneo de Turing e dos +progressos da computação.

+ +
+ + Read more... + +
+ +
+

+ + A Colher que desaparece: e outras histórias reais de loucura, amor e morte a partir dos elementos químicos - Sam Kean + +

+ + +
+

Resumo GoodReads: +Uma colher que desaparece quando colocada no chá quente, uma bizarra corrida +pelo ouro causada por um elemento (telúrio) que tem cheiro de alho, um poeta +que enlouqueceu ao ingerir lítio para se tratar de uma doença. Sam Kean nos +guia em um passeio pelas mais surpreendentes histórias envolvendo a +descoberta, o uso e a criação dos 118 elementos químicos da tabela periódica. +Pelo caminho, o autor aborda a história dos avanços científicos, desde a +descoberta do átomo até a criação de elementos artificiais, passando pela +invenção da tabela periódica e pelo estudo da radioatividade. Mostra também +como a vida humana se modificou devido ao cobre (usado em moedas por ser +"autoestéril"), ao silício (utilizado na revolução da informática) e ao urânio +(um dos grandes responsáveis pela bomba atômica).A propósito: a colher que +desaparece é feita de gálio, elemento 31 da tabela periódica, metal com a +estranha propriedade de ficar no estado líquido acima de 29ºC, temperatura +inferior à de qualquer cafezinho.

+ +
+ + Read more... + +
+ +
+

+ + Nos Bastidores da Coca-Cola - Neville Isdell + +

+ + +
+

Resumo GoodReads: +A Coca-Cola é a marca mais reconhecida e próspera do mundo, cruzando +fronteiras geográficas, linguísticas e culturais. A história da criação, do +marketing e da recriação da marca é contada pela primeira vez por um executivo +da própria companhia. Um homem cuja carreira de mais de quarenta anos o levou +a viajar o mundo inteiro e a escalar da base até o topo da pirâmide.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/page/9/index.html b/public/pt/page/9/index.html new file mode 100644 index 0000000..56dbca8 --- /dev/null +++ b/public/pt/page/9/index.html @@ -0,0 +1,469 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ + O Príncipe - Niccolò Machiavelli + +

+ +
+ +
+

+ + O "Unit" de "Unit Tests" + +

+ + +
+

Existem vários artigos sobre os "testes de unidade" e alguns até +falando de "a unidade dos testes"; todos estes estão errados e é +preciso parar de falar dessa forma.

+ +
+ + Read more... + +
+ +
+

+ + Python 2 + 3 = Six + +

+ + +
+

"Six" é uma pequena biblioteca Python que pode ajudar você a passar o seu +código de Python 2 para Python 3.

+ +
+ + Read more... + +
+ +
+

+ + Quatro Heróis e um Bardo contra a Realidade Medieval - Rodrigo Assis Mesquita + +

+ + +
+

Resumo GoodReads: +O que têm em comum um cavaleiro, um bárbaro, um mago, uma valquíria e um +bardo? Acompanhe Derick, Roderick, Broderick, Brigitte e Macedo tentando +começar uma típica aventura de resgate da Princesa, regada, se possível, a +cerveja, não hidromel.

+ +
+ + Read more... + +
+ +
+

+ + Poder & Manipulação: Como entender o mundo em vinte lições extraídas de "O Príncipe", de Maquiavel - Jacob Pétry + +

+ + +
+

GoodReads Summary: +Nesta edição, fruto de um trabalho único na história, os ensinamentos de +Maquiavel se tornam mais relacionados ao mundo atual. "Poder & Manipulação" +não é simplesmente uma nova tradução, mas uma edição da obra original, tal +como seria se ela estivesse sendo publicada agora, pela primeira vez, focada +nos temas perenes, relevantes ao mundo de hoje. E vai além: inclui uma análise +objetiva das vinte estratégias mais importantes do clássico. Ao compreender +estas lições, o leitor estará mais bem preparado para defender-se das pessoas +manipuladoras e de posse de ferramentas para agir com mais segurança, ousadia +e astúcia diante da vida.

+ +
+ + Read more... + +
+ +
+

+ + 23 Hábitos Anti-Procrastinação: Como Deixar de Ser Preguiçoso e Ter Resultados Em Sua Vida - S.J. Scott + +

+ + +
+

Resumo GoodReads: +APRENDA:: Como Parar de Procrastinar e Conseguir Ajuda Para Os Seus Hábitos +Preguiçosos.

+ +
+ + Read more... + +
+ +
+

+ + Como convencer alguém em 90 segundos - Nicholas Boothman + +

+ + +
+

Resumo GoodReads: +Como convencer alguém em 90 segundos é a garantia de uma comunicação de +sucesso, transformando as conexões instantâneas em duradouras e produtivas +relações de negócios. Neste livro, o especialista Nicholas Boothman ensina +como usar o rosto, o corpo, a atitude e a voz para causar uma primeira +impressão marcante, estabelecendo confiança imediata e criando fortes vínculos +de credibilidade.

+ +
+ + Read more... + +
+ +
+

+ + Rin Tin Tin: A Vida e a Lenda - Susan Orlean + +

+ + +
+

Resumo GoodReads: +Ele achava que o cão era imortal. Assim começa a vasta, poderosa e comovente +narrativa de Susan Orlean sobre a jornada de Rin Tin Tin – de sobrevivente +órfão a astro do cinema e ícone internacional do showbiz. Suzan, redatora da +New Yorker chamada de “patrimônio nacional” pelo Washington Post, passou cerca +de dez anos pesquisando e escrevendo sua mais cativante obra: a história de um +cão que nasceu em 1918 e nunca morreu. A narrativa começa num campo de batalha +francês da Primeira Guerra Mundial, quando Lee Duncan, um jovem soldado +americano, descobre um sobrevivente: um pastor-alemão recém-nascido nas ruínas +de um canil bombardeado. Para Duncan, que passou parte da infância num +orfanato, a sobrevivência do cão fora um milagre. Havia algo em Rin Tin Tin +que o compelia a compartilhá-lo com o mundo. Duncan o levou, então, para a +Califórnia, onde suas aptidões físicas e a capacidade de representar chamaram +a atenção da Warner Bros. Durante os dez anos seguintes, Rinty estrelou 23 +sucessos do cinema mudo que salvaram o estúdio da falência e fizeram dele o +cão mais famoso de todos os tempos. No auge da popularidade, Rin Tin Tin foi o +campeão de bilheteria de Hollywood. Ao longo das décadas seguintes, Rinty e +seus descendentes fizeram a conturbada jornada do cinema mudo ao falado, do +preto e branco à cor, do rádio à televisão, culminando no seriado de TV As +Aventuras de Rin-Tin-Tin, um dos mais populares programas da época do baby +boom. O legado do cão herói foi consolidado por Duncan e alguns outros – como +Bert Leonard, o produtor do seriado da TV, e Daphne Hereford, a proprietária +do atual Rin Tin Tin –, que dedicaram a vida para assegurar a imortalidade da +lenda. Na essência de Rin Tin Tin – a Vida e a Lenda há um tocante estudo do +duradouro vínculo entre os humanos e os animais. Mas o livro é também uma +história ricamente matizada da indústria do entretenimento e do +empreendedorismo no século XX. Abarcando um período de 90 anos, ele aborda a +mudança de status dos cães, de ajudantes em fazendas a membros diletos das +famílias urbanas, da origem do treinamento para a obediência à evolução +genética das raças, da ascensão de Hollywood ao passado e presente dos cães de +guerra. Rico de humor e emoção, repleto de momentos que certamente levarão o +leitor às lágrimas, Rin Tin Tin fez parte da prestigiadíssima lista dos 100 +MELHORES LIVROS DO ANO do New York Times, principalmente por ser uma mescla +irresistível de história, humanismo e maestria narrativa – esplêndida +celebração de um grande ícone universal por uma das mais talentosas escritoras +da atualidade.

+ +
+ + Read more... + +
+ +
+

+ + Scrum: A arte de fazer o dobro de trabalho na metade do tempo - Jeff Sutherland + +

+ + +
+

Resumo GoodReads: +Se você já foi surpreendido por quão rápido o mundo está mudando, Scrum é uma +das razões. Para aqueles que acreditam que deve haver uma maneira mais +eficiente de se fazer as coisas, este é um livro sobre o processo de gestão +que está mudando a maneira como vivemos. Desde o advento do método, já foram +registrados ganhos de produtividade de até 1.200%. Tecida com insights de +artes marciais, tomadas de decisão judicial, combate aéreo avançado, robótica +e muitas outras disciplinas, Scrum é sempre fascinante. Seja para inventar uma +tecnologia pioneira ou para estabelecer os alicerces de prosperidade de uma +família.

+ +
+ + Read more... + +
+ +
+

+ + Como a música ficou grátis - Stephen Witt + +

+ + +
+

Resumo GoodReads: +Uma trama impressionante envolvendo música, crime, dinheiro e obsessão, cujos +protagonistas são magnatas, pesquisadores respeitados, criminosos e +adolescentes nerds fissurados em tecnologia.

+ +
+ + Read more... + +
+ +
+ +
+ + + + diff --git a/public/pt/presentations/index.html b/public/pt/presentations/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/presentations/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/presentations/porque-voce-deve-aprender-rust/index.html b/public/pt/presentations/porque-voce-deve-aprender-rust/index.html new file mode 100644 index 0000000..b851efe --- /dev/null +++ b/public/pt/presentations/porque-voce-deve-aprender-rust/index.html @@ -0,0 +1,915 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Porque Você Deve Aprender Rust

+ +

Rust é uma nova linguagem de programação que eu acredito que deveria ser vista +por desenvolvedores, mesmo que eles não venham programar em Rust.

+
+

Esse post acompanha a minha apresentação Porque Você Deve Aprender +Rust.

+ +
+

Quando eu comecei a apresentação, eu pensei em chamar a mesma de "Porque Você +Deveria Aprender Rust"; mas eu pensei bem sobre isso e como a linguagem tem +vários conceitos interessantes, eu acho que o título correto deve ser "Porque +Você DEVE Aprender Rust".

+

Mas antes de começar a falar sobre Rust, é interessante que vocês conheçam +quem está dizendo que vocês "devem aprender Rust":

+

Eu comecei a programar a mais de 30 anos. Em todos esses anos, eu já programei +em Basic (usando número de linhas e Basic estruturado, também conhecido como +QBasic), dBase III Plus, Clipper (que foi a primeira linguagem que eu usei +profissionalmente), Pascal, Cobol (sim, Cobol, façam suas brincadeiras agora), +Delphi (cujo nome científico é "ObjectPascal" e possui algumas diferenças para +o Pascal original), C, C++, ActionScript (que é a linguagem para geração de +applets Flash sem usar o editor da Adobe), PHP (quem nunca?), JavaScript (quem +nunca?), Python, Objective-C, Clojure, Java, Scala (que eu não desejo que nem +meu pior inimigo tenha que programar nela) e Rust. E essas são as linguagens +que eu já escrevi código e que rodou. Fora essas, eu ainda conheço Haskell, +Perl, um pouco de Ruby e Swift, mas nessas eu não programei nada ainda.

+

Mas por que eu comentei sobre isso? Porque o que eu vou comentar aqui é, +basicamente, minha opinião, depois de conhecer essas linguagens todas. +Então, obviamente, existe um viés para os motivos que eu vou citar daqui pra +frente.

+

Mas existe uma frase do Alan Perlis, criador do ALGOL, que diz "A language +that doesn't affect the way you think about programming, is not worth knowing" +(uma linguagem que não afeta o modo que você pensa sobre programação, não vale +a pena ser aprendida). E mesmo depois de todas essas linguagens citadas acima, +Rust ainda me fez repensar coisas que eu sempre pensei quando estava +programando.

+

A Parte Burocrática

+

Antes de sair falando da linguagem, eu tenho que falar sobre a parte +burocrática da linguagem. Coisas como, por exemplo:

+ +

Rust tem uma história engraçada: Hoare começou a desenvolver a linguagem de +forma independente, em seu tempo livre. Quando ele começou a pegar gosto pela +coisa, ele veio falar com seu gerente dizendo que iria deixar a Mozilla +Foundation para poder trabalhar na sua linguagem de programação. "Que +linguagem é essa?", perguntou o gerente; Hoare afirmou que era uma linguagem +com foco em proteção de memória mas que ainda fosse uma linguagem rápida. Ao +ouvir isso, o gerente pediu para Hoare segurar o pedido de demissão e +conversou com seus superiores. E, por ter vários problemas com a estrutura em +C++ do Firefox, a Mozilla resolveu patrocinar Hoare para que ele pudesse +trabalhar na linguagem.

+
+

Eu gosto de brincar, dizendo que o Hoare chegou pro gerente dele dizendo que +iria deixar a Mozilla pra trabalhar na sua linguagem e o gerente, depois de +pedir pra ele esperar um pouco, chegou dizendo que só conseguiu 2 estagiários.

+

A verdade é que Hoare realmente quis deixar a Mozilla Foundation, mas ao +explicar os motivos -- trabalhar na sua própria linguagem, cuja principal +diferença seria a proteção de memória e velocidade -- a Mozilla se interessou +pela mesma, por causa dos problemas que eles estavam encontrando ao trabalhar +com C++. Por isso a Mozilla continuou pagando Hoare para que ele trabalhasse +na sua linguagem.

+ +
+

Uma coisa a cuidar: Aqui eu comento que a versão atual é a 1.37. Isso pode não +ser verdade no momento que você lê esse post (ou viu a apresentação) porque a +cada 6 semanas uma nova versão do Rust é liberada. Essas versões trazem +correções de bugs e novas features.

+
+

Uma outra anedota é que o primeiro projeto em Rust foi um browser -- +normalmente a gente pensa que para primeiro projeto, as linguagens querem algo +mais simples, como um microserviço ou algo parecido, mas a equipe do Rust +partiu direto para um browser.

+

O resultado, chamado Servo, hoje faz parte do Firefox +Quantum, o que diminui o +uso de memória e diminuiu o número de "crashes" da aplicação.

+

Ainda, num certo ponto, um desenvolvedor do Chrome resolveu fazer alguns +testes, utilizando SVG animados, colocando 1 elemento animado 300 vezes numa +página. Para animar todos os elementos, o Chrome conseguia manter 30 FPS; +Firefox, 20; Servo, 300 (sim, 10 vezes mais que o Chrome!).

+

Outro exemplo de Rust no Firefox é um bug que estava em aberto por 8 anos. O +bug em questão, 631527 +-- que, na verdade, é uma feature -- seria permitir que dois elementos possam +ter os estilos definidos no CSS aplicados em mais de um elemento ao mesmo +tempo; o browser lê primeiro o HTML, constrói o DOM e depois sai aplicando o +estilo em cada um dos elementos; com dois elementos um depois do outro, seria, +teoricamente, possível aplicar o estilo no primeiro ao mesmo tempo em que +aplica no segundo. O bug ficou aberto por 8 anos e duas re-escritas foram +feitas pra tentar resolver o problema. Nenhuma conseguiu prover um resultado +funcional, por vários motivos, mas principalmente por causa da forma com a +memória era compartilhada nas threads em C++. Quando o Firefox mudou para o +Quantum (de novo, em Rust, usando a base do Servo), a correção foi (conforme +descrito por Niko Matsakis na abertura do Rust Latam 2019) "trivial".

+ +
+

Motivo 1: Quem Usa, Gosta

+

Em 2019, O StackOverflow fez uma enquete com os +visitantes, perguntando, entre várias outras perguntas, qual linguagem eles +usavam e se eles gostavam de programar nessa linguagem. No resultado dessa +enquente, Rust aparece como a linguagem mais +amada... +pelo 4o ano seguido.

+

"Ah, mais isso é fácil! Os quatro caras que programam em Rust dizem que gostam +dela todo ano!", você deve estar dizendo. Na verdade, o percentual tem subido +desde a primeira vez, saindo de 76% em 2016 e indo a 83% em 2019.

+

Motivo 2: "Uma Linguagem de Baixo Nível Com Abstrações de Alto Nível"

+

Quando comparado com C, Rust tem uma performance bem semelhante:

+

Comparativo de algumas linguagens com relação à utilização de CPU, Energia e Memória

+

O gráfico acima foi tirado de uma pesquisa que foi feita para verificar qual +linguagem gasta mais +energia.

+

Na implementação utilizada, C foi a linguagem cujo código gerado usou menos +energia; em segundo, com uma utilização apenas 3% maior, Rust.

+

Ainda, em tempo de execução, a aplicação gerada em C também é a mais rápida e +Rust fica em segundo com um tempo de execução apenas 4% maior.

+

No quesito utilização de memória é que vemos algo engraçado: A linguagem que +melhor utiliza memória é Pascal, C utiliza 17% mais memória e Rust 54% a mais. +A explicação para isso pode ser pela forma como Rust trata memória, +principalmente de código, mas eu vou explicar isso melhor mais pra frente.

+

E, apesar disso tudo, Rust tem implementações de:

+ +

E considerando todo o tempo que eu passei programando em várias linguagens, se +amanhã surgisse uma linguagem que conseguisse ter uma performance melhor que +C, mas que eu tivesse que implementar minha própria lista encadeada, eu +acredito que botaria fogo em tudo e iria plantar batatas, porque, +honestamente, significa que nós não aprendemos nada sobre linguagens de +programação.

+

Motivo 3: Compilador É Chato, Mas Amigável

+

Deixem-me mostrar um código Rust:

+
fn main() {
+    let a = 2;
+    a = 3;
+    println!("{}", a);
+}
+
+

Aqui temos nosso primeiro contato com a sintaxe de Rust: fn define funções; +assim como C, main é a função que indica onde a execução começa; let deixa +definir variáveis e, apesar de não mostrar nesse trecho, as variáveis são +fortemente tipadas, mas eu não precisei colocar o tipo porque o compilador +consegue inferir o tipo sozinho (com algumas raras exceções); linhas terminam +com ;; println! tem uma exclamação porque essa função é uma macro e a +exclamação é colocada para diferenciar de funções normais (no caso, o +println! vai ser expandido pelo compilador por um conjunto maior de +comandos).

+
+

Quem já brincou com #defines em C deve saber que não existe nada que indique +o que foi digitado é uma função mesmo ou um #define que vai ser expandido em +várias outras funções; Rust não deixa isso acontecer.

+ +
+

Outra coisa a notar é que não estamos definindo o tipo de variável que a é. +Rust é uma linguagem fortemente e estaticamente tipada. O que está acontecendo +é que estamos deixando o compilador inferir qual o tipo que a deve ter -- e +por ser um inteiro, provavelmente vai ser um u32 ou u64, dependendo da +arquitetura, pois para desambiguação, Rust usa o tipo que gere um código mais +rápido, mesmo que ocupe mais memória.

+

E esse código Rust não compila.

+

Se vocês tentarem compilar esse código, vocês verão a seguinte mensagem de +erro:

+
3 |     let a = 2;
+  |         -
+  |         |
+  |         first assignment to `a`
+  |         help: make this binding mutable: `mut a`
+4 |     a = 3;
+  |     ^^^^^ cannot assign twice to immutable variable
+
+

O que acontece é que, em Rust, alem das variáveis serem fortemente tipadas, +elas também são, por padrão, imutáveis. Ou seja, não é possível, por padrão, +alterar o valor de uma variável.

+

Mas prestem atenção na mensagem de erro:

+
4 |     a = 3;
+  |     ^^^^^ cannot assign twice to immutable variable
+
+

O compilador não apenas disse qual era o erro -- "não é possível atribuir um +valor duas vezes para uma variável imutável" (indicando, ainda qual a linha) +como também passou uma dica de como corrigir esse problema:

+
  |         help: make this binding mutable: `mut a`
+
+
+

Essa parte da mensagem de erro é importante para o time de desenvolvimento do +Rust.

+

Na Rust Latam, Esteban Kuber fez uma apresentação chamada "Friendly Ferris: +Developing Kind Compiler Errors" ("Ferris Amigável: Desenvolvendo Erros +Amigáveis do Compilador", onde "Ferris" é o nome do mascote da linguagem), +onde ele conta que foi brincar com Rust pela primeira vez e recebeu um erro do +compilador sobre o código que ele tinha escrito, mas não conseguiu entender +exatamente qual era o problema.

+

Aqui fica a pergunta pra vocês: Se vocês encontrassem um erro que não +entendessem o que vocês fariam? Boa parte provavelmente diria que iria +perguntar ao Google.

+

Esteban, no entanto, resolveu abrir um issue no Github da linguagem, para ver +o que iria acontecer. A resposta? "Você tem razão, a mensagem do erro é +difícil de entender, e isso é um bug do compilador. Nós vamos arrumar." +Esteban se ofereceu pra tentar encontrar o problema, recebeu uma tutoria de +como compiladores funcionam e hoje é um dos expoentes nas questões de +mensagens de erro do compilador.

+ +
+

Motivo 4: O Borrow Checker

+

O Borrow Checker é a funcionalidade que faz o Rust ser diferente de outras +linguagens. E que também mudou como eu pensava sobre programação, apesar de +todas as linguagens listadas no começo desse post.

+

Por exemplo, no seguinte código:

+
let a = String::from("hello");
+
+
+

O que está sendo feito aqui é que está sendo criada uma string -- uma lista de +caracteres que pode ser expandida, se necessário -- utilizando uma constante +que é fixa (por ficar em uma página de código em memória) como valor inicial.

+

Quem já mexeu com C: Isso é o mesmo que alocar uma região de memória e copiar +o conteúdo de uma variável estática para a nova região alocada.

+ +
+

Quando vocês olham esse código, o que vocês pensam?

+

Eu sempre li como "A variável a recebe o valor hello".

+

Eu nunca pensei nisso como "A posição de memória apontada por a tem o valor +hello"; ou algo como let 0x3f5cbf89 = "hello".

+

Entretanto, é isso que o compilador do Rust faz: cada atribuição de variável é +considerada como um indicador de uma posição de memória, algo do tipo

+

Visão de memória pelo compilador do Rust

+

No caso, a (a nossa variável) é "dona" de uma região de memória, a +0x3f5cbf89, que tem o tamanho de 5 bytes, do tipo String.

+

E aí você faz uma atribuição de variáveis como, por exemplo:

+
fn main() {
+    let a = String::from("hello");
+    let _b = a;
+    println!("{}", a)
+}
+
+

... tudo parece normal.

+

Exceto que esse código não compila.

+
error[E0382]: borrow of moved value: `a`
+ --> src/main.rs:5:20
+  |
+4 |     let _b = a;
+  |              - value moved here
+5 |     println!("{}", a)
+  |                    ^ value borrowed here after move
+  |
+  = note: move occurs because `a` has type
+    `std::string::String`, which does not
+    implement the `Copy` trait
+
+

Por que? Porque a região de memória que a apontava (aquela que fica em +0x3f5cbf89, que tem 5 bytes e é do tipo String) agora pertence a b; a fica +apontando para... nada. E "nada", não é null: como todas as variáveis tem +que apontar para uma posição de memória, a se torna inválido e não pode mais +ser utilizado.

+

"Mas e se eu precisar acessar uma posição de memória/valor em mais de um +lugar?" Bom, aí você pode usar referências, usando &:

+
fn main() {
+    let a = String::from("hello");
+    let _b = &a;
+    println!("{}", a)
+}
+
+

Utilizar referências faz, basicamente, isso:

+

Visão de memória pelo compilador do Rust quando você usa referências

+

Existem várias regras que o Borrow Checker executa:

+ +
+

Estas três regras estão interligadas: com a memória sendo desalocada quando a +variável sai de escopo, não precisamos mais nos preocupar em fazer free() +(apesar de que, agora, precisamos nos preocupar quanto tempo queremos que a +variável/região de memória permaneça alocada através dos nossos blocos de +código); tendo apenas um dono (e esse dono muda em caso de atribuição), +evita-se o problema de um "double free()".

+ +
+ +
+

As referências não devem durar mais que a variável original para evitar que +elas continuem sendo utilizadas depois que o valor original foi feito +free().

+ +
+ +
+

Isso garante que não existam duas threads tentando escrever na mesma posição +de memória ao mesmo tempo.

+ +
+

Ok, com todas essas regras, você deve estar se perguntando: E pra que serve +tudo isso?

+

Duas respostas para essa pergunta:

+

A primeira é o seguinte código (em Go, porque é mais fácil de explicar):

+
presente := Presente { ... }
+canal <- presente
+
+

presente é uma estrutura qualquer que eu criei; canal é o canal de +comunicação entre duas threads; o que está sendo feito aqui é que uma thread +está criando uma estrutura e enviado para o outra thread.

+

Nada demais; o problema está em fazer algo do tipo:

+
presente := Presente { ... }
+canal <- presente
+presente.abrir()
+
+

Se eu enviei o presente para outra pessoa, como foi que eu abri? Se eu mandei +uma estrutura para outra thread, como foi que o compilador deixou eu fazer uma +alteração nessa estrutura, se agora ela é da outra thread?

+

A outra resposta é que chegamos ao limite do silício. Alguns podem não saber +disso, mas a pouco tempo havia uma ser "briga" entre donos de computadores pra +ver qual tinha o mais potente, e nós fazíamos isso contando vantagem com o +clock do processador: "O meu tem 3Ghz", "Ah, mas o meu tem 3Ghz e meio!" +Esse tipo de discussão sumiu, por um único motivo: não temos mais como fazer o +silício vibrar mais. A coisa ficou tão complexa que o que é feito agora é +colocar mais CPUs dentro da CPU.

+

Para tirar proveito da "CPUs dentro da CPU", precisamos de threads, e se o +compilador não proteger contra o uso inválido de memória entre as threads, nós +ainda vamos ter aqueles alertas de que a aplicação parou de funcionar as 4 da +manhã, e você vai tentar descobrir o que aconteceu e nada faz sentido.

+

A ideia do Borrow Checker é tão boa que mais linguagens estão utilizando: +Swift 5 tem um controle chamado "Exclusitivy Enforcement" que é, basicamente, +um borrow checker mais light; Ada, uma das três linguagens aceitas pela MISRA +para software em que vidas humanas estão em jogo (controle de aviões, carros e +equipamentos médicos, por exemplo), ganhou um borrow checker na última versão +(pelo menos, "última" no momento em que esse post estava sendo escrito).

+

Intervalo: Anedotas

+

Duas anedotas sobre a minha vida de programador:

+

Numa época em que eu trabalhava num projeto gigantesco em C, eu estava +esperando minha carona para voltar pra casa enquanto uma das desenvolvedoras +estava brigando com o código. "Eu não consigo entender, " -- disse ela -- "eu +estou tentando ver o tempo que uma regra de negócio leva pra executar, mas +está dando que tá levando menos de 1 segundo, quando eu sei que tem uma +pesquisa no banco que é demorada!"

+

"Como é que tu tá pegando esse tempo de execução?" -- perguntei.

+

"Eu faço um localtime no começo da execução e um localtime no final e vejo +a diferença."

+

Nesse momento, me lembrei que localtime não é thread-safe: Quando o valor é +capturado, é passada uma região de memória a ser preenchida, mas cada vez que +o localtime é chamada, a mesma região é atualizada; o que estava acontecendo +é que as outras threads, que também estavam fazendo a chamada para localtime +estavam todas apontando para a mesma região de memória e todas elas estavam +mudando na mudança de valor.

+

Em tempos mais recentes, estávamos trabalhando em Java e usando +SimpleDateFormatter. Em certos casos, começamos a receber alertas do tipo +"Data inválida: ''" ou "Data inválida: "R"". "Mas como? Tá aqui o JSON de +entrada e lá tem valor!"

+

Mais uma vez, acendeu a luzinha na minha cabeça e a primeira coisa que eu fiz +foi pesquisar "SimpleDateFormatter é thread-safe?" O primeiro resultado foi +um "Por que SimpleDateFormat não é thread-safe?" Trocamos pela versão mais +nova (outra classe) e tudo passou a funcionar normalmente.

+

Aí vem a pergunta: Se usássemos Rust ao invés de C ou Java, isso resolveria +nossos problemas?"

+

A resposta é "Sim!", porque o Rust sequer ia deixar o código compilar -- +porque, em ambos os casos, temos threads compartilhando memória mutável, que, +como vimos pelas regras do Borrow Checker, não é possível fazer em Rust.

+

Motivo 5: Tipos Algébricos

+

("Tipos Algébricos", no nosso caso, é só um nome bonito para parecer +inteligente ao invés de dizer "Enums".)

+

Rust, assim como várias outras linguagens, tem enums:

+
enum IpAddr {
+   V4,
+   V6
+}
+
+
+

Quando eu estava estuando sobre isso, eu descobri que as opções de um enum são +chamadas "variantes".

+ +
+

Mas além de ter enum, uma das coisas que Rust permite é que as opções do enum +carreguem um valor com elas.

+
enum IpAddr {
+    V4(String),
+    V6(String),
+}
+
+

Aqui temos um enum com duas opções, V4 e V6; cada um dessas opções carrega +uma string junto.

+

Mas como se usa isso?

+
let home = IpAddr::V4(String::from("127.0.0.1"));
+
+

É bem parecido com a forma em que definimos os valores de enumerações em +outras linguagens, com a String como parâmetro.

+

É importante notar que não é preciso que todas as opções tenham os mesmos +parâmetros, e é possível ter opções sem nenhum parâmetro ou mesmo mais de um.

+

E, para acessar os elementos, usamos match:

+
match home {
+    V4(address) =&gt; println!("IPv4 addr: {}", address),
+    V6(address) =&gt; println!("Ipv6 addr: {}", address),
+}
+
+

match usa pattern matching para validar as opções. No caso, se home for +V4 com um valor dentro, o valor é extraído e o println! com a string +IPv4 é usada; se for V6, o outro println! é usado.

+

A parte interessante é que se amanhã surgir o IPv8, e eu adicionar V8 no meu +enum, o código vai parar de compilar. Por que? Porque o pattern matching tem +que ser exaustivo -- ou seja, tem que capturar todas as opções possíveis. Isso +é importante para coisas como, por exemplo:

+
enum Option<T> {
+    Some(T),
+    None
+}
+
+

Esse enum é o substituto para coisas com null; lembre-se que, em Rust, todas +as variáveis devem apontar para uma região de memória e null não é um +posição de memória e, por isso, Rust não tem nulls. Assim, uma função que +poderia retornar null tem que retornar um Option e, quando é tratado o +retorno da função, é preciso tratar o valor do retorno de sucesso (Some) e +o valor com null (None); não é possível acessar o valor com o valor de +sucesso sem tetar o que acontece se não vier valor.

+

E isso nos leva ao próximo motivo que é...

+

Motivo 6: Error Control

+

Antes de entrar na questão de como Rust faz o tratamento de erros, deixem me +mostrar alguns exemplos de tratamentos em outras linguagens:

+

Em Python:

+
try:
+    something()
+except Exception:
+    pass
+
+

Em Java:

+
try {
+   something();
+} catch (Exception ex) {
+   System.out.println(ex);
+}
+
+

Ou em C:

+
FILE* f = fopen("someting.txt", "wb");
+fprintf(f, "Done!");
+fclose(f);
+
+

Qual o problema com esses três exemplos?

+

O problema é que em nenhum deles a situação do erro foi realmente tratada -- a +versão em C é a pior delas, pois se o fopen falhar por algum motivo, ele +retorna um null e tentar fazer um fprintf em um null gera um +Segmentation Fault.

+
+

Eu já fiz todos esses, na minha vida.

+ +
+

Desde a base das bibliotecas do Rust, as funções retornam esse enum:

+
enum Result<T, E> {
+    Ok(T),
+    Err(E),
+}
+
+

Como isso ajuda em alguma coisa? Bom, se tudo retorna Result, isso significa +que a única forma que eu tenho para pegar o resultado do sucesso é lidar com o +caso do erro, porque o match não vai deixar que eu simplesmente ignore isso.

+

No nosso caso do C, o correspondente seria:

+
match File::create("something.txt") {
+    Ok(fp) => fp.write_all(b"Hello world"),
+    Err(err) => println!("Failure! {}", err),
+}
+
+

Ou seja, a única forma que eu tenho de pegar o fp (file pointer) pra poder +escrever no arquivo é usando um match tratando o Ok (sucesso) e Err +(erro), e eu não tenho como pegar o fp sem fazer esse tratamento todo.

+

A única coisa que faltou é que o write também pode falhar; então teríamos

+
match File::create("something.txt") {
+    Ok(fp) => match fp.write_all(b"Hello world") {
+        Ok(_) => (),
+        Err(err) => println!("Can't write! {}", err),
+    }
+    Err(err) => println!("Failure! {}", err),
+}
+
+

... e aqui já estamos ficando verbosos demais. Para facilitar um pouco a vida, +o enum Result do Rust tem uma função chamada .unwrap(), que faz o +seguinte: se o resultado do Result for Ok, já extrai o valor e retorna o +valor em si; se o resultado for Err, chama um panic!, que faz a aplicação +"capotar":

+
let mut file = File::create("something.txt").unwrap();
+file.write(b"Hello world").unwrap();
+
+

"Mas Júlio", você deve estar pensando, "isso não é diferente do segmentation +fault". Em matéria de resultado final, não; mas se vocês pensarem bem, o que +está sendo feito é que explicitamente eu estou colocando um "aqui a aplicação +pode explodir", e não que alguma coisa em tempo de execução vai derrubar a +aplicação. E a palavra chave aqui é "explicitamente"; alguém pode considerar +que não tratar o null do fopen também é uma forma de deixar um "aqui a +aplicação pode explodir", mas não foi o compilador que deixou isso acontecer; +sempre que pode, o compilador do Rust tentou me impedir de fazer burrada.

+

Outra forma de lidar com Result é o operador ?: o que ela faz é que +caso a chamada de função retorne um Err, esse Err é passado como retorno +da função com o operador; se a função retornar um Ok, então o valor +encapsulado é retornado diretamente. Mais uma vez no nosso exemplo da escrita +em arquivo:

+
let mut file = File::create("something.txt")?;
+file.write(b"Hello world")?;
+OK(())
+
+

Como o operador vai fazer com que a função em que essas linhas estão retornem +o Err se a chamada falhar, essas três linhas tem que estar dentro uma +função que retorne um Result.

+

"Ah, barbada", você pensa, "vou botar ? em tudo e nunca lidar com o erro". +Bom, sim, é uma opção, mas existe uma função que não se pode ter Result: a +main. Assim, mais cedo ou mais tarde, o erro vai ter que ser lidado.

+
+

Existe uma forma de fazer o main retornar Result, mas ele basicamente +serve para transformar o Result num código de erro -- ou 0 em sucesso.

+ +
+

Motivo 7: Generics & Traits

+

Antes de entrar direto sobre generics e traits, vamos falar sobre qual +estrutura Rust usa para guardar os dados.

+

Rust usa structs, como C, e não classes como C++ e mais uma gama de outras +linguagens.

+

Por exemplo:

+
struct Gift {
+    package_color: String,
+    content: String
+}
+
+

Lembram que eu no começo comentei que Rust era fortemente e estaticamente +tipada e que o compilador estava inferindo o tipo dos dados para nós? Bom, +para estruturas isso não funciona, e por isso precisamos definir os tipos +aqui.

+

Para criar um elemento dessa estrutura, usamos

+
let presente = Gift { package_color: "red", content: "A GIFT!" };
+
+
+

Eu normalmente não comento isso nas apresentações que eu faço, mas é possível +criar uma estrutura do tipo

+

struct Gift(String);

+

Essa estrutura tem os campos com nomes anônimos e temos que acessar com .0 +ou .1 (se tiver um segundo campo nessa estrutura) e assim por diante.

+

Esse tipo de construção normalmente é usada para forçar novos tipos no +sistema, já que se eu quisesse receber um tipo específico de String, eu +usaria algo do tipo.

+

Outro exemplo, que talvez fique mais claro:

+
struct Celcius(f32);
+struct Farenheit(f32);
+
+

Duas estruturas -- dois tipos -- que englobam floats, mas quando eu estiver +lendo o código e ver uma função do tipo convert(c: Celcius), eu sei +exatamente qual a unidade de temperatura que eu preciso passar, deixando o +código mais claro de ser lido.

+ +
+

Generics -- a possibilidade de não definir o tipo de um dado previamente é +feito como em Java, onde os tipos genéricos são listados entre <>:

+
struct Point<T> {
+	x: T,
+	y: T,
+}
+
+

Se eu quiser criar um Point com floats de 32 bits:

+
let my_point = Point<f32>(x: 1.0, y: 2.0);
+
+

Além de aplicar Generics para estruturas, podemos aplicar o mesmo para enums +-- e nós já vimos dois exemplos disso:

+
enum Option<T> {
+    Some(T),
+    None
+}
+
+

Option, o substituto de coisas que podem ser null/não ter valor é uma +enumeração com Some que carrega um tipo qualquer, definido quando se cria +uma variável com essa variante -- e é possível deixar o compilador inferir +qual o tipo, assim como fizemos com a nos primeiros exemplos:

+
let has_value = Some(2);
+
+

Outro exemplo básico de enum genérico:

+
enum Result<T, E> {
+    Ok(T),
+    Err(E),
+}
+
+

Result também permite que sejam carregados valores com as variantes; no +caso, tanto o tipo do Ok quanto Err são genéricos e possivelmente +diferentes -- Ok pode ter um tipo T, enquanto Err tem um tipo qualquer +E, e não há nada obrigando os dois a terem o mesmo tipo, como seria se +tivéssemos:

+
enum Result<T> {
+	Ok(T),
+	Err(T)
+}
+
+

... onde tanto o tipo do sucesso quanto de erro devem ser do mesmo tipo.

+
+

Em tempo de compilação, Rust vai resolver todos os tipos que as +estruturas, enums e funções genéricas usam e vai gerar o código para esses +tipos -- ou seja, se eu tivesse duas funções que retornam Result, uma com +Result<u32, String> e Result<f32, String>, em tempo de compilação seriam +geradas duas versões diferentes de Result, com os tipos já definidos.

+

A vantagem disso é que, em tempo de execução, não é preciso tentar detectar o +tipo que está sendo passado, já que ele já foi definido muito antes. O +problema é que o código pode ficar maior -- e isso deve explicar o tamanho dos +executáveis como foi mostrado lá no começo do post.

+ +
+

Além de estruturas de dados, é possível adicionar funções atreladas à essas +estruturas:

+
impl Gift {
+	fn yell_content(&self) {
+		println!("{}", self.content);
+	}
+}
+
+

(Com exceção de hierarquias, o resultado é bem semelhante à programação +orientada e objetos.)

+

Ainda é possível definir interfaces que várias estruturas devem implementar, +utilizando-se traits:

+
trait Summary {
+    fn summarize(&self) -> String;
+}
+
+

Essa trait indica que, qualquer estrutura que queira ser compatível com ela, +tem que implementar uma função summarize que retorna uma String.

+

Para definir que uma estrutura segue a trait, utiliza-se impl/for:

+
struct Phrase {
+    phrase: String
+}
+
+impl Summary for Phrase {
+    fn summarize(&self) -> String {
+        self.phrase
+            .split_whitespace()
+            .map(|word| word.chars().nth(0).unwrap())
+            .collect()
+    }
+}
+
+
+

Se você está com curiosidade com relação ao código acima:

+
    +
  1. Pega o phrase, que foi definido na estrutura como String;
  2. +
  3. Quebra essa string pelos espaços em branco (split_whitespace), gerando +uma lista;
  4. +
  5. Transforma (map) cada elemento da lista (que chamamos de word nesse +caso) para pegar o primeiro elemento da lista de caracteres que forma a +string (chars().nth(0).unwrap()). O unwrap está aqui porque nth +retorna um Option, já que pode ser chamado com um número maior que +caracteres na String, retornando None nesse caso; o unwrap serve para +pegarmos diretamente o valor do Some e, por sorte, não vai haver nenhum +pedaço da string quebrada com split_whitespace que não tenha nenhum +caractere;
  6. +
  7. Junta (collect) todos os elementos. Como Strings são arrays/listas de +caracteres, há uma conversão direta para String.
  8. +
+

Ou seja, a função pega uma string como "Porque Você Deve Aprender Rust" e +retorna "PVDAR".

+ +
+

Traits funcionam com Generics, e assim podemos forçar a receber +estruturas/enums que tenham certas características, como em:

+
fn get_summary<T>(summarizable: T) -> String
+    where T: Summary
+{
+    ...
+}
+
+

Aqui temos uma função genérica que recebe um tipo qualquer T, mas obrigamos, +através do where que esse tipo implemente a trait Summary -- e assim +podemos chamar summarizable.summarize() sem problemas, porque a trait obriga +o tipo a ter essa função implementada.

+

Outra vantagem desse formato é que podemos ter traits próprias do nosso +sistema, mas implementar a trait para tipos já definidos na linguagem:

+
impl Summary for String { ... }
+
+

Motivo 8: Cargo

+

Cargo é o gerenciador de pacotes e +dependências do Rust. Ele também serve como gerenciador de projetos e +frontend para outras funcionalidades, como executar testes.

+

Cargo é interessante porque faz parte do pacote principal do Rust -- em outras +palavras, a linguagem já vem com um eco-sistema completo.

+

Motivo 9: Testes

+

Rust já vem com testes integrados -- e, como comentado no motivo anterior, +Cargo serve como facilitador para a execução dos testes.

+

Por exemplo, o seguinte código mostra um teste em Rust:

+
#[cfg(test)]
+mod tests {
+    #[test]
+    fn testing() {
+		assert!(1 == 1);
+    }
+}
+
+

Esse teste não precisa estar num arquivo específico (mas ajuda se você coloca +num arquivo específico); ele não precisa estar em um módulo específico (ou +seja, aquele mod tests não necessariamente precisa existir ou mesmo se +chamar tests); e as funções não precisam começar com um nome específico. +Tudo que você precisa é definir que o código somente vai existir na +configuração de testes (#[cfg(test)]) e marcar cada função que deve ser +chamada durante os testes (#[test]).

+

Para ver os resultados do teste:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.22 secs
+     Running target/debug/deps/adder-ce99bcc2479f4607
+
+running 1 test
+test tests::testing ... ok
+
+

Ao executar cargo test, todos os arquivos marcados com testes são compilados +(porque o cargo já ativou a configuração de testes e os blocos marcados são +finalmente adicionados) e executa os testes, mostrando o resultado de cada um. +Não é preciso uma biblioteca externa ou comandos a mais para escrever um +teste.

+
+

Uma coisa curiosa sobre o cargo test é que ele também sai executando tudo +que estiver no diretório examples, que normalmente contém exemplos de como +uma biblioteca funciona.

+

A parte interessante sobre isso é que durante a execução de testes de várias +bibliotecas, também é validado se os exemplos estão corretos.

+ +
+

Motivo 10: Macros

+

Macros são uma ferramenta poderosa mas realmente complexa do Rust. Tão +complexa que eu não cheguei a me aprofundar muito, mas como exemplo, deixem-me +mostrar uma biblioteca do Rust, chamada +Log-Derive:

+
#[logfn(ok = "TRACE", err = "ERROR")]
+fn call_isan(num: &str) -> Result<Success, Error> {
+    if num.len() >= 10 && num.len() <= 15 {
+        Ok(Success)
+    } else {
+        Err(Error)
+    }
+}
+
+

A parte da macro está no começo da função, no #[logfn(ok = "TRACE", err = "ERROR")]; o que ela indica é que se a função terminar com o status de Ok, +deve ser gerado um log no nível "TRACE" (abaixo de "DEBUG") e se a função sair +com status de Err, deve ser gerado um log no nível de "ERROR".

+

E aí eu pergunto: Você consegue ver alguma linha de log no código da função? +Isso é porque a macro do Log-Derive consegue acessar o código em tempo de +compilação e adicionar/alterar certas construções.

+
+

Na verdade, eu sei que existem três tipos diferentes de macros em Rust:

+
    +
  1. Macros mais simples, como a println!, que se expandem para uma combinação +maior de comandos (println! expande para a aquisição do lock da escrita +padrão -- stdout -- envio dos dados para a saída e liberação do lock, mas +você nunca teve que escrever tudo isso por conta);
  2. +
  3. Macros de implementação de funções em estruturas, que basicamente fazem a +geração de funções como vimos com impl;
  4. +
  5. E macros como a Log-Derive, que tem acesso aos tokens que formam o código +fonte e geram uma saída de tokens novamente -- e aí podem adicionar, +remover ou alterar tokens do jeito que quiserem.
  6. +
+ +
+

Motivo 11: Motivos Malucos

+

How Rust’s standard library was vulnerable for years and nobody +noticed: +Nesse artigo de 2018, Sergey Davidoff conta que achou uma falha de segurança +em uma das funções do Rust, mas devido a forma como a mesma deveria ser +chamada, era basicamente impossível de exploitar a mesma.

+

No, the problem isn’t “bad +coders”: +Esse artigo é uma resposta para as respostas de um artigo da Microsoft, em que +eles reportam que 70% de todos os crashes das aplicações no Windows se devem +ao acesso inválido de memória. Sean Griffin, criador da biblioteca +Diesel, que serve para escrever ORMs em Rust, conta que +estava trabalhando em compartilhar uma conexão do PostgreSQL entre várias +threads, e o compilador não deixou. Quando foi examinar exatamente o porque, +percebeu que realmente o que ele queria fazer poderia levar a um acesso +inválido. E Griffin tem experiência de sobra nesse campo, já que também é o +criador do Active Record do Rails.

+

Outra coisa maluca:

+

Screenshot do Github do Rust

+

A parte que vocês devem estar estranhando é a quantidade de issues que a +linguagem tem (algumas vezes o Github chega simplesmente a mostrar "5000+", +indicado que existem mais de 5000 issues abertas).

+

Como pode uma linguagem com apenas 4 anos de existência pública ter mais de +5000 issues abertas? O que acontece é que todo o processo de decisão da +linguagem passa pelo Github: Quando os desenvolvedores do core da linguagem +acreditam que uma funcionalidade deva ser adicionada (ou removida), o que eles +fazem é abrir uma issue no Github para discutir com a comunidade o que e como +isso deve ser feito.

+

Lembram que eu comentei que as questões de mensagens de erro não claras podem +(e devem) ser comunicadas para os desenvolvedores? Isso é feito pelo Github.

+

Ainda, existem "Working Groups", grupos especializados sobre discussões em +alguns tópicos. Por exemplo, existe um working group para Bancos de Dados, +discutindo como a linguagem pode facilitar a criação de conexões com vários +bancos, interfaces padrões para essas conexões e assim por diante; existe um +working group para jogos, para discutir as coisas que tornam a vida de +desenvolvedores de jogos mais fácil.

+
+

Existia um working group para CLI (command line interface, ou interface de +linha de comando) para discutir como facilitar a vida de desenvolvedores que +querem construir ferramentas de linhas de comando. Uma vez que o grupo +acreditou ter achado a melhor forma, eles publicaram um livro sobre os +achados, decisões e implementações.

+

E isso acontece com todos os working groups -- então pode esperar que, se eles +não fizeram ainda, vai sair um livro de como utilizar bancos de dados com Rust +do Database Working Group e um livro de como escrever jogos em Rust pelo Games +Working Group.

+ +
+

Por último, existe o script rustup. Lembram que eu falei +que Rust tem uma cadência de releases de seis em seis semanas? RustUp ajuda a +manter a sua instalação do Rust -- e componentes associados -- em dia. Não só +isso, mas ele permite a instalação de "toolchains" diferentes: Você pode, por +exemplo, instalar o toolchain para a arquitetura +armv7-unknown-linux-gnueabihf e, a partir da sua máquina Linux rodando Intel +gerar um executável para arquitetura ARM; ou, ainda, você pode instalar o +toolchain para a arquitetura wasm32-unknown-unknown que, na verdade, não é +uma arquitetura, é o gerador para WebAssembly, o que permite que você converta +seu código Rust para WebAssembly (com algumas restrições) -- e, embora seja +possível gerar WebAssembly em outras linguagens como C++ e C#, se você +utilizar Rust, todas as validações de acesso de memória continuam valendo.

+

E agora?

+

Bom, se depois de tudo isso você decidir que quer aprender mais sobre Rust, o +que eu posso sugerir é:

+
    +
  1. Instale o Rust usando o RustUp.
  2. +
  3. Leia o Livro do Rust; o livro que +explica todas as funcionalidades da linguagem está disponível online e é +possível comprar a versão em ePub da No Starch Press (mas não há diferença +entre a versão online e a impressa/ePub).
  4. +
  5. Confira como Rust funciona lendo o Rust By +Example. Basicamente +tudo que o Livro cobre também está aqui, mas Rust By Example usa uma forma +diferente de explicação, partindo a partir de exemplos para cada ponto.
  6. +
  7. Você pode brincar com Rust no Rust +Playground, onde é possível +editar, compilar e executar código Rust de dentro do browser. Somente um +número pequeno de bibliotecas está disponível, mas para brincar com Rust +básico é possível usar isso ao invés de instalar a linguagem inteira.
  8. +
  9. Existe um grupo de usuários de Rust no Telegram, o Rust +Brasil. Se tiver alguma dúvida, é só ir lá e +perguntar.
  10. +
+

E era isso!

+ +
+ + + + +
+ + + + diff --git a/public/pt/presentations/porque-voce-deve-aprender-rust/rust-energy.png b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-energy.png new file mode 100644 index 0000000..437af43 Binary files /dev/null and b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-energy.png differ diff --git a/public/pt/presentations/porque-voce-deve-aprender-rust/rust-issues.png b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-issues.png new file mode 100644 index 0000000..8d2109f Binary files /dev/null and b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-issues.png differ diff --git a/public/pt/presentations/porque-voce-deve-aprender-rust/rust-memory.png b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-memory.png new file mode 100644 index 0000000..1db55bc Binary files /dev/null and b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-memory.png differ diff --git a/public/pt/presentations/porque-voce-deve-aprender-rust/rust-reference.png b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-reference.png new file mode 100644 index 0000000..394b801 Binary files /dev/null and b/public/pt/presentations/porque-voce-deve-aprender-rust/rust-reference.png differ diff --git a/public/pt/projects/beryllium/index.html b/public/pt/projects/beryllium/index.html new file mode 100644 index 0000000..23b1da5 --- /dev/null +++ b/public/pt/projects/beryllium/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Tacit Beryllium

+ +

Bot do Telegram em Rust.

+
    +
  1. +

    Se o usuário envia uma mensagem com um link, mas não interagiu com o grupo +antes, a mensagem é apagada.

    +
  2. +
  3. +

    Blocklist de URLs; se a mensagem contem uma URL do blocklist, a mensagem é +apagada.

    +
  4. +
  5. +

    Mensagem de boas vindas. A ideia é colocar um texto indicando para os novos +usuários como se compartilha conteúdo no grupo (use Git, não cole código ou +imagens diretamente, etc).

    +
  6. +
  7. +

    Validação de que a conta é uma pessoa real? ("Clique aqui para confirmar que +você é uma pessoa"). Não invalida o ponto 1, já que a pessoa pode conectar, +clicar no link e simplesmente deixar um processo automatizado de postar +conteúdo.

    +
  8. +
+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/duralim/index.html b/public/pt/projects/duralim/index.html new file mode 100644 index 0000000..2e9fdd0 --- /dev/null +++ b/public/pt/projects/duralim/index.html @@ -0,0 +1,96 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Wiggly Duralim

+ +

Servidor WebDAV in Rust.

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/projects/fernico/index.html b/public/pt/projects/fernico/index.html new file mode 100644 index 0000000..89f042c --- /dev/null +++ b/public/pt/projects/fernico/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Condensed Fernico

+ +

Finanças no CLI.

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/projects/francium/index.html b/public/pt/projects/francium/index.html new file mode 100644 index 0000000..a983ef5 --- /dev/null +++ b/public/pt/projects/francium/index.html @@ -0,0 +1,90 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pretty Lyrical Francium

+ +

Last.fm Pessoal (Personal Last.Fm)

+

Serviço que roda na máquina do usuário para coletar informações sobre as +músicas tocadas, usando a API do Libre.Fm/Last.Fm.

+

Eu estou mais interessado nos gráficos do que qualquer outra coisa.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/germanium/index.html b/public/pt/projects/germanium/index.html new file mode 100644 index 0000000..1b94e94 --- /dev/null +++ b/public/pt/projects/germanium/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Gaga Silly Germanium

+ +

Git Static Generator.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/index.html b/public/pt/projects/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/projects/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/projects/iridium/index.html b/public/pt/projects/iridium/index.html new file mode 100644 index 0000000..051d65c --- /dev/null +++ b/public/pt/projects/iridium/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Potent Thrifty Iridium

+ +

ARQUIVADO pgcli faz exatamente o que eu queria.

+ +
+----------------------------------------+
+| *Connected to XXX*                     |
++----------------------------------------+
+| Query                                  |
+|                                        |
+|                                        |
+|                                        |
++----------------------------------------+
+| Results                                |
+| +----+---------+----------+------+---> |
+| | Fi | Field   | Field    | Fiel | F   |
+| +----+---------+----------+------+---> |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| | Va | Value   | Value    | Valu | V   |
+| +----+---------+----------+------+---> |
++----------------------------------------+
+
+ + + +
+ + + + +
+ + + + diff --git a/public/pt/projects/kovar/index.html b/public/pt/projects/kovar/index.html new file mode 100644 index 0000000..918a383 --- /dev/null +++ b/public/pt/projects/kovar/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Lazy Kovar

+ +

Likes Keeper (Agregador de Favoritos)

+

Um conjunto de microserviços em Rust, para explorar a possibilidade de ser +feito.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/palladium/index.html b/public/pt/projects/palladium/index.html new file mode 100644 index 0000000..bc9cc45 --- /dev/null +++ b/public/pt/projects/palladium/index.html @@ -0,0 +1,95 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Abounding Palladium

+ +

Activity Pub

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/projects/platinum/index.html b/public/pt/projects/platinum/index.html new file mode 100644 index 0000000..13a6ca0 --- /dev/null +++ b/public/pt/projects/platinum/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Normative Robust Platinum

+ +

Nomes de Projetos Rust.

+ +

Repositório: nrp.git

+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/sodium/index.html b/public/pt/projects/sodium/index.html new file mode 100644 index 0000000..312ba53 --- /dev/null +++ b/public/pt/projects/sodium/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Condensed Sodium

+ +

Aplicação web de status de clientes:

+ +
+----------------------------------+
+| +-----------+ +----------------+ |
+| | Client 1  | | Client 2       | |
+| | No issues | | Await response | |
+| +-----------+ +----------------+ |
++----------------------------------+
+
+

"Await response" é o texto da última interação.

+
+----------------------------------+
+| Client 2        [ See Contacts ] |
+|                                  |
+| New interaction:                 |
+| [                              ] |
+| [                              ] |
+| [                              ] |
+|            [ Await ] [ Success ] |
+|                                  |
+| Previous interactions:           |
+| * DATE - Asked if this works   ! |
+| * DATE - Await response        ? |
++----------------------------------+
+
+

"Previous interactions" vai do mais antigo para o mais novo.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/projects/uranium/index.html b/public/pt/projects/uranium/index.html new file mode 100644 index 0000000..b29b748 --- /dev/null +++ b/public/pt/projects/uranium/index.html @@ -0,0 +1,91 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Timeless Uranium

+ +

Time Up!

+ +

Repositório: tu.git

+ + +
+ + + + +
+ + + + diff --git a/public/pt/research/decoding-fast-examples/index.html b/public/pt/research/decoding-fast-examples/index.html new file mode 100644 index 0000000..0fd3f58 --- /dev/null +++ b/public/pt/research/decoding-fast-examples/index.html @@ -0,0 +1,290 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Decodificando o Protocolo FAST: Exemplos

+ +

Depois de toda a explicação sobre a definição do protocolo FAST, eu notei que +tinha uma coisa faltando: Exemplos, para que fique mais fácil de entender.

+
+

Mesmo aviso do post anterior: Como isso tudo é baseado na minha experiência +pessoal, algumas coisas podem estar erradas. Eu tentei o meu melhor para deixar +tudo correto, mas eu posso ter entendido alguma coisa errada, ou digitei errado +aqui.

+

Ainda, a medida que eu for encontrando casos que eu acredite sejam +interessantes, novos exemplos serão adicionados.

+ +
+

Hello World

+

Este exemplo é basicamente o mesmo da +JetTek mas é realmente +simples de explicar, então vamos nós:

+

Template

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="HelloWorld" id="1">
+    <string name="String" id="1">
+      <default value=""/>
+    </string>
+  </template>
+</templates>
+
+

Dados de Entrada

+

Bytes:

+
1110_0000   1000_0001   0100_1000   0110_0101
+0110_1100   0110_1100   0100_1111   0101_0111
+0110_1111   0111_0010   0110_1100   1110_0100
+
+

Processamento

+

O primeiro byte é o Mapa de Presença. Removendo o bit de parada, temos +110_0000. Esse Mapa de Presença tem um campo que não é descrito no template: +O Template ID (ID de Template). Como o primeiro bit está ligado, nós sabemos +que o ID está lá. Ainda, tenha em mente que o Template ID é o único campo que +nós sabemos que existe até agora; não existe nenhuma outra informação sobre o +que é aquele segundo bit no Mapa de Presença -- nós precisamos encontrar qual +template vamos usar antes de mais nada.

+

O próximo byte é lido: 1000_0001. Como mencionado acima, isso é o Template +ID. Sendo um inteiro sem sinal (e provavelmente mandatório, mas não me pergunte +como isso funciona) e removendo o bit de parada, temos o inteiro "1", que é +exatamente o mesmo ID que temos no nosso template; agora nós sabemos quais +campos devem ser processados.

+

O primeiro campo do template é uma string com um valor default. Como o campo +usa o operador Default, nós precisamos verificar se o valor está presente nos +dados de entrada ou se devemos usar esse valor default. O bit no Mapa de +Presença para este campo é 1, o que indica que a string está presente nos +dados de entrada e que nós devemos lê-la.

+

O campo é uma string, então vamos ler todos os bytes até encontrarmos um com o +bit de parada. Ainda, sendo string, nós não precisamos "juntar" os bits: cada +byte é uma letra da tabela ASCIII. A sequência é 100_10000 (72), 110_0101 +(101), 110_1100 (108), 110_1100 (108), 100_1111 (79), 101_0111 (87), +110_1111 (79), 111_0010 (114), 110_1100 (108) e 110_0100 (100). Observe +que nós consumimos todos os bites e o último tinha o bit de parada, então +terminamos o pacote com a string. Convertendo os bytes usando a tabela ASCII, +temos "HelloWorld".

+

Assim, temos o resultado: Nós recebemos um registro do tipo "HelloWorld" cujo +campo com ID "1" (chamado "String") tem o valor "HelloWorld".

+

Sequências

+

Vamos expandir nosso exemplo adicionando uma sequência e alguns operadores:

+

Template

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="HelloWorld" id="1">
+    <string name="String" id="1">
+      <default value=""/>
+    </string>
+  </template>
+
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SequenceOfSequences" id="2">
+    <sequence name="OuterSequence">
+      <length name="NoOuterSequence" id="3"/>
+      <uInt32 name="GroupID" id="2"/>
+      <sequence name="InnerSequence">
+        <length name="NoInnerSequence" id="25"/>
+        <string name="Username" id="4"/>
+        <uInt32 name="ID" id="32" presence="optional">
+          <increment/>
+        </uInt32>
+      </sequence>
+    </sequence>
+  </template>
+</templates>
+
+

Apesar do FAST ser criado para trabalhar com FIX e o mercado financeiro, não +existe nada que iniba o mesmo de ser usado para outras coisas. O novo template +descreve um group de usuários, então nós temos uma lista de grupos e, para cada +grupo, uma lista de usuários e seus IDs.

+

Dados de Entrada

+
1100_0000   1000_0010   1000_0011   0000_0011
+0010_0011   0001_1000   1110_0111   1000_0010
+1100_0000   0101_0101   0111_0011   0110_0101
+0111_0010   1011_0001   1000_0100   1000_0000
+0101_0101   0111_0011   0110_0101   0111_0010   
+1011_0010   1111_1111   1000_0001   1100_0000
+0101_0101   1011_0001   1111_1111   0000_1000 
+1000_0000   1000_0010   1100_0000   1100_1001
+1011_0110   1000_0000   0100_1101   1110_0101
+
+

Processamento

+

Como mencionado anteriormente, o primeiro byte, 1100_0000 é o Mapa de +Presença do elemento raiz. Existe apenas um bit ligado, o que indica que o +Template ID está presente.

+

Como o Template ID está presente no Mapa de Presença, nós lemos o próximo byte +1000_0010. Como este byte tem o bit de parada, nós paramos de ler. Removendo +este bit, nós temos 000_0010, que é "2", e agora sabemos que estamos lidando +com o template "SequenceOfSequences".

+

Agora que temos o template e conhecemos os campos, nós sabemos o que precisamos +ler. O primeiro campo do nosso template é uma sequência. A primeira coisa que +nós temos em uma sequência (e é a primeira coisa em todas as sequências) é o +tamanho desta. Assim, nós lemos o próximo byte, 1000_0011, que é o único byte +que precisamos ler. Ele representa um inteiro sem sinal, que é 3, então esta +sequência tem 3 registros -- e usando nossa descrição anterior, nós sabemos que +temos 3 grupos de usuários.

+

Um ponto ser visto aqui: Como todos os campos desta sequência não tem qualquer +operador, o Mapa de Presença não é necessário e, assim, ele não existe (ou, +melhor, nós não devemos tentar ler alguma coisa e assumir que é o Mapa de +Presença). Para sequências, o começo de cada registro contém um Mapa de +Presença apenas se pelo menos um dos campos na sequência precisa do Mapa. O que +não é o caso aqui.

+

Como não há Mapa de Presença para a sequência "OuterSequence", os próximos +bytes são o campo "GroupID". Nós devemos ler os bytes até encontrar o bit de +parada; assim, recebemos 0000_0011, 0010_0011, 0001_1000 e 1110_0111. +Para cada byte nós removemos o bit de mais alta ordem (o bit de parada) e +juntamos tudo em uma única coisa, neste caso, 00_0011 010_0011 001_1000 110_0111 ou simplesmente 0000_0110_1000_1100_1100_0110_0110. Este valor, +sendo um inteiro sem sinal, é "6868070".

+
+

Aqui é um bom ponto para lembrar que, como o campo é mandatório, isto significa +que este é realmente o valor para "GroupID"; se o campo fosse opcional, o valor +de verdade seria "6868069".

+ +
+

Agora para o campo "InnerSequence". O primeiro passo é recuperar o número de +elementos (o "length" da sequência). Esse é o byte 1000_0010, que é 2. Assim, +há dois usuários neste grupo.

+

Como o "InnerSequence" tem um campo que precisa do Mapa de Presença ("ID" usa o +operador Increment, o que indica que ou iremos ler o o valor vindo dos dados de +entrada ou iremos incrementar o valor anterior), o primeiro byte depois do +tamanho é o Mapa de Presença para este registro. O byte 1100_0000 indica que +o primeiro campo que precisa do Mapa de Presença está presente.

+

Mas ainda não é o momento de usar o Mapa de Presença. O campo logo após o +tamanho é "Username", que é uma string mandatória. Strings mandatórias sem +operadores estão sempre presentes e nós não precisamos olhar o Mapa de +Presença. Assim como fizemos com "String" no exemplo anterior, nós lemos os +bytes até encontrar um com o bit de parada, mas não juntamos os mesmos: +0101_0101 (85), 0111_0011 (115), 0110_0101 (101), 0111_0010 (114) e +1011_0001 (49, se removermos o bit de parada), que convertidos pela tabela +ASCII nos dá o valor "User1".

+

Agora é o momento de usar o Mapa de Presença, já que estamos lendo o campo "ID" +e ele tem um operador que usa o Mapa. O Mapa de Presença que lemos +anteriormente foi 100_0000 (com o bit de parada removido), então sim, o "ID" +está presente nos dados de entrada. Nós lemos o próximo byte, 1000_0100, que +é "4". Mas tem uma pegadinha aqui: O campo é opcional. Então embora tenhamos +lido "4", o valor de verdade é "3" -- se o valor lido fosse "0", significaria +que o ID é Null.

+

Beleza. Terminamos de ler o primeiro registro de "InnerSequence": O usuário +"User1" tem ID "3" e pertence ao grupo "6868070". Agora vamos ler o segundo +registro.

+

Não precisamos ler o tamanho de novo, mas precisamos ler o Mapa de Presença +deste registro. É o byte 1000_0000 um Mapa de Presença indicando que nenhum +dos campos com operadores estão presentes. Mas, de novo, não é hora de usar o +Mapa de Presença, porque nós temos que ler o "Username". Os bytes do campo são +0101_0101 (85), 0111_0011 (115), 0110_0101 (101), 0111_0010 (114) e +1011_0001 (50), que gera o valor "User2".

+

O segundo registro tem um Mapa de Presença vazio (1000_0000) o que indica que +o ID não está presente nos dados de entrada. Como o campo tem o operador +Increment, nós precisamos pegar o valor anterior -- "3" -- e incrementar em 1> +Assim, "User2" tem o ID "4".

+

E assim termina o "InnerSequence" do primeiro regsitro do "OuterSequence". +Agora mais rápido:

+ +
+

Changelog:

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/research/decoding-fast/index.html b/public/pt/research/decoding-fast/index.html new file mode 100644 index 0000000..66efbcd --- /dev/null +++ b/public/pt/research/decoding-fast/index.html @@ -0,0 +1,605 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Decodificando o Protocolo FAST

+ +

Recentemente tive que trabalhar com um FAST (FIX Adapted for Streaming) e +como a documentação está espalhada, decidi colocar as coisas que descobri em um +único lugar para (minha) referência futura.

+
+

Como isso é baseado na minha experiência pessoal e eu tive contato com uma +única instância disso até agora, existem algumas coisas que estão incompletas +e/ou erradas. Vou continuar atualizando este post enquanto descubro coisas +novas.

+

O changelog está no final deste post.

+ +
+

O que é o FAST

+

FAST é, basicamente, um método +de compressão para o protocolo FIX.

+

E o que é FIX

+

FIX é um +protocolo criado para as instituições financeiras trocarem informações. Embora +não haja nada "financeiramente" relacionado a ele - você poderia usar o +protocolo para qualquer coisa, basicamente - a maioria das empresas financeiras +o usa.

+

FIX é um protocolo muito simples: você tem pares de "campo ID" e "valor" +separados por um "=" (sinal de igual) e os pares são separados pelo caractere +ASCII com código 1 (que é representado por ^A em alguns editores). Alguns IDs +de campo são definidos pelo protocolo (há uma lista completa +aqui), mas cada +central pode criar seus próprios IDs.

+

Por exemplo, se você tiver o campo MsgType (ID 35) com valor "y" e o campo +Security ID (ID 48) com valor " 123456", a mensagem recebida seria

+
35=y^A48=123456
+
+

E de Volta ao FAST

+

Uma das coisas para que o FAST foi projetado é remover conteúdo duplicado e/ou +constante. Por exemplo, MsgType (ID 35) identifica que a mensagem é +"SecurityList" (lista de ativos), que contém informações sobre todos os +símbolos (seus IDs de segurança) disponíveis na Exchange. Como a Exchange é a +mesma em todos os símbolos, o FAST permite definir os campos relacionados a ela +(Source, campo ID 22, e Exchange, campo ID 207) para valores constantes, para +que não precisem ser transmitidos e, na decodificação FAST de volta a FIX, o +decodificador simplesmente adiciona o valor constante.

+

Para saber quais campos são constantes e quais não (e algumas outras +informações), o protocolo define um modelo, que possui um esquema bem definido, +para relatar essas informações.

+

O Template

+

O template é um arquivo XML que descreve os campos, seus tipos, nomes, IDs e +operadores. O protocolo em si não fornece nenhuma maneira padrão de realmente +receber esse campo e, portanto, é deixado para que a Exchange defina a forma +dos clientes encontrar este arquivo.

+

Note que o modelo descreve os IDs de campo e seus tipos, e os dados recebidos +possuem apenas os valores. Se usarmos a descrição FIX acima, o modelo define o +lado esquerdo do par, enquanto os dados de entrada têm apenas o lado direito.

+

Tipos de Campos

+

O protocolo define arquivos tipos de dados: Inteiros de 32 e 64 bits sem sinal, +Inteiros de 32 e 64 bits com sinal, strings em ASCII, strings em UTF8, +sequências, decimais e um tipo especial chamando "Mapa de Presença" (Presence +Map).

+

Uma coisa que o processamento de todos os campos é que estes usam um formato de +"bit de parada". O formato é bem parecido com o formato de UTF8, embora UTF8 +use um "bit de continuação" ao invés de "bit de parada", mas o processo de +leitura é o mesmo:

+ +

Eu vou mostrar alguns exemplos mais a frente neste post.

+

Definição dos Campos

+

O template define os campos com seus tipo nome (opcional), ID, +um indicador de presença e um operador (opcional).

+

Por exemplo, para descrever um inteiro sem sinal de 32 bits, chamado "MsgType" +com ID "35", ele seria descrito no template como

+
<uInt32 name="MsgType" id="35"/>
+
+

Como não há indicador de presença, é assumido que o campo é "mandatório" e deve +sempre deve ter um valor. Por outro lado, se a definição do campo for algo do +tipo

+
<int32 name="ImpliedMarketIndicator" id="1144" presence="optional"/>
+
+

... então o campo pode não ter valor. Isso também é definido como campo +"nulável" (nullable).

+

Campos Mandatórios e Opcionais

+

A diferença entre campos opcionais e mandatórios é que campos mandatórios +sempre tem um valor, mesmo que seja 0. Campos opcionais, por outro lado, +podem ser null e não ter valor algum.

+
+

Eu tenho a impressão que isso foi feito para que a Exchange possa marcar um +campo como "não parece na versão FIX"; então mesmo que o campo tenha uma +definição, o resultado em FIX não teria o campo.

+

Então é algo mais como "compatibilidade com versões anteriores" do que qualquer +outra coisa.

+ +
+

Tipos

+

Tipos: Inteiros

+

Para ler um inteiro, o decodificador pegaria os 7 bits mais baixos (tudo exceto +o bit de alta ordem) e mover os mesmos para o valor resultante. Se o bit de +parada estiver presente, a leitura está completa; se não estiver, deve ser +feito um "shift" de 7 bits no valor resultado e movidos os 7 bits do próximo +byte e assim por diante, até que seja encontrado um byte com o bit de parada.

+

Inteiros de 32 e 64 bits definem apenas os valores máximos de um campo e não +necessariamente usados como "número de bits a serem lidos" -- justamente por +causa do bit de parada. Se o valor excede 32 ou 64 bits, isso é considerado um +erro e o processamento deve ser abortado.

+

Inteiros com sinal funcionam exatamente igual, mas com complemento de 2.

+

Por exemplo, se os dados de entrada tem os seguintes bytes (em binário, para +ficar mais fácil de ler; eu adicionei um underscore entre cada 4 +valores, também para ficar mais fácil de ler):

+
0000_0001 1001_0010
+
+

... o decodificador irá ler o primeiro byte e ver que o bit de mais alta ordem +não está ligado, então ele mantém apenas o "1" do valor e move 7 bits à +esquerda. O segundo byte então é ligado; este tem o bit de alta ordem ligado, +então os bits restantes (no caso, "001_0010") são adicionados no valor final e +temos 1001_0010 -- ou 146.

+

Números negativos são representados por complemento de 2, então se o +decodificador receber, por exemplo:

+
0000_0011 0111_1110 1110_1110
+
+

... que, quando os bits de alta ordem são removidos, deve gerar "1111_1111 0110_1110", que é -146 (em 16 bits, apenas para ficar mais fácil de ler).

+

Quando um campo inteiro é opcional, o valor resultante deve se decrementado +em 1. O motivo é que deve haver uma forma de diferenciar entre 0 e Null. Assim, +um inteiro que seja decodificado para 0 é, na verdade, Null; para obter o valor +0 num inteiro, é enviado o valor 1, que é decrementando por 1 e volta a zero.

+

No template, os campos aparecem como

+ +

Tipos: Strings

+

Strings em ASCII são bem simples de serem lidas: Novamente, o decodificador +fica lendo os dados de entrada até que encontre um byte com o bit de mais alta +ordem ligado (novamente, o bit de parada) e converte cada byte para o +respectivo caractere em ASCII.

+

Por exemplo

+
0100_1000 0110_0101 0110_1100 0110_1100 1110_1111
+
+

... iria gerar os bytes 72, 101, 108, 108 e 111, que usando a tabela ASCII +geraria o valor "Hello". Note que o bit de parada aqui representa "acabou a +string" e os bytes não devem ser agrupados como em Inteiros.

+
+

Até aqui eu não tive nenhum contato com strings UTF8, então eu não tenho +certeza de como estes devem ser lidos. Com certeza há documentação em como +devem ser lidos, mas como esta é a minha experiência pessoal com o protocolo, +eu decidi não comentar aqui.

+ +
+

Strings opcionais são Null quando o primeiro byte tiver o bit de mais alta +ordem ligado e todos os demais desligados.

+

No template, um campo de string aparece como <string>.

+

Tipos: Sequências

+

Sequências são basicamente arrays. O primeiro campo de uma sequência é o +"tamanho" (com o tipo "<length>" no template) com o número de registros +presentes. Dentro da sequência, você tem uma lista de definições de campos, que +podem até mesmo incluir outras sequências.

+

Sequências opcionais afetam a forma como o campo de tamanho é lido: Se a +sequência é opcional, o tamanho deve ser tratado como um inteiro opcional e, +portanto, decrementando em 1.

+

No template, a sequência aparece como <sequence>, com o tamanho logo depois. +Um exemplo é

+
<sequence name="Sequence">
+  <length name="NoSequence" id="123"/>
+</sequence>
+
+
+

Eu descrevo a maior parte dos campos de tamanho com um nome que começa com +"No". Isso é porque a especificação do FIX define os tamanhos com esse prefixo.

+ +
+

Tipos: Decimais

+

Decimais são formados por dois campos: Expoente e Mantissa. A forma como isso +funciona é que se você tiver um Expoente de "-2" e uma Mantissa de "1020", o +valor resultante é 1020 * 10 ^ -2 ("1020 vezes 10 na potência -2") ou +"10.20".

+

Tanto o Expoente quanto a Mantissa são lidos como Inteiros com sinal.

+

Um Decimal opcional significa que o Expoente é opcional. A documentação diz que +a Mantissa é sempre mandatória, mas tem uma pegadinha: Se o Expoente é Null, +então a Mantissa não está presente nos dados de entrada e o Decimal inteiro é +Null; caso contrário, o decodificador deve ler a Mantissa e aplicar a forma +acima.

+

Ainda, como o Expoente e a Mantissa são dois campos, eles podem ter operadores +diferentes. Eu vou mostrar exemplos depois de explicar os Operadores, +principalmente porque eu vi os dois com operadores diferentes e a leitura é +complicada.

+

No template, um campo decimal aparece como <decimal>, com o expoente e a +mantissa como campos internos.

+
<decimal name="ADecimal" id="123">
+  <exponent/>
+  <mantissa/>
+</decimal>
+
+

Tipo: Mapa de Presença

+

Mapas de Presença são usados em conjunto com operadores. Eles são lidos da +mesma forma como Inteiros sem sinal (ler os bytes até encontrar o byte com o +bit de mais alta ordem ligado, remover os bits de alta ordem e colocar os bits +em sequência) mas não há uma conversão em si. Cada vez que o decodificador +precisa verificar se um campo está presente no Mapa de Presença, o bit é +consumido e a linha avança.

+

Mapas de Presença não estão presentes no template e a existência do Mapa ocorre +se pelo menos um dos campos precisa do Mapa de Presença. Por exemplo, se os campos +de uma sequência são todos mandatórios, não haverá Mapa de Presença nos dados +de entrada.

+

Os bits do Mapa de Presença sequem a ordem dos campos no template. Por exemplo, +se um template tem

+
    +
  1. Um campo mandatório;
  2. +
  3. Um campo com um operador que requer o Mapa de Presença (eu vou comentar +sobre estes mais pra frente);
  4. +
  5. Outro campo mandatório;
  6. +
  7. E, finalmente, outro campo com operador.
  8. +
+

... é possível ter um mapa de presença como 1110_0000, no qual:

+
    +
  1. O primeiro bit é o bit de parada, e o decodificar assume que este é o último +byte do Mapa de Presença.
  2. +
  3. O segundo bit indica que o primeiro com operador está presente. Ele não +representa o campo mandatório porque, bom, o campo é mandatório e, assim, +está sempre presente.
  4. +
  5. O segundo bit indica que o segundo campo com operador está presente.
  6. +
+

(De novo, eu vou mencionar quais operadores requerem o Mapa de Presença.)

+

Operadores

+

Operadores definem a forma como alguns campos devem ser tratados. Eu vi 5 tipos +diferentes de Operadores:

+ +

Operador: Nenhum.

+

Quando não há operador definido para o campo no template, então o operador e o +"Nenhum". Isto significa que não há forma especial de lidar com o valor de +entrada.

+

Quando um campo tem o operador "Nenhum", não haverá bit para o mesmo no Mapa de +Presença.

+

Operador: Constant

+

Um campo com o operador Constant (Constante) não irá ser enviado nos dados de +entrada e o decodificador deve assumir que o valor é o valor constante. +Anteriormente eu mencionei que uma lista de símbolos pode ter o campo 22, +"Source" e o campo 207 "Exchange", com valores contantes, e assim eles seriam +definidos como

+
<string name="Source" id="22">
+    <constant value="123"/>
+</string>
+<string name="Exchange" id="207">
+    <constant value="EXCHANGE"/>
+</string>
+
+

Existe uma pegadinha, no entanto: Se um campo contante pode ser Null +(presence="optional"), então o decodificador precisa verificar o Mapa de +Presença: Se estiver ligado, o valor contante deve ser usado; caso contrário, o +valor do campo é Null.

+

O Mapa de Presença deve ser usado apenas se o campo com valor contante é +opcional.

+

Operador: Default

+

O operador Default é parecido com o operador Constante, mas o decodificador +precisa verificar o bit do campo no Mapa de Presença; se estiver ligado, o +valor do campo deve ser lido dos dados de entrada; caso contrário, deve ser +usado o valor Default.

+
+

Uma forma de ler isso é: O valor está presente nos dados de entrada (indicado +pelo Mapa de Presença)? Leia o valor dos dados de entrada; caso contrário, use +o valor default.

+ +
+

Exemplo

+
<uInt32 name="Type" id="3">
+  <default value="1"/>
+</uInt32>
+
+

Operador: Copy

+

O operador Copy (Cópia) indica que o valor deste campo neste registro tem o +mesmo valor do registro anterior; se este é o primeiro registro, então o valor +atual deve ser usado. Se o bit no Mapa de Presença estiver ligado para este +campo, então o decodificador deve ler o campo dos dados de entrada; caso +contrário, o valor anterior deve ser usado.

+
+

Nos dados que eu vi, todo primeiro registro tinha o bit ligado.

+ +
+

Por exemplo: Com um template como:

+
<string name="MDReqID" id="262">
+    <copy/>
+</string>
+
+

... e os dados de entrada tem os seguintes registros e Mapas de Presença:

+
    +
  1. O primeiro registro tem o bit do campo ligado no Mapa de Presença e a string +é lida como "primeiro". O resultado para este campo neste registro será o +valor "primeiro".
  2. +
  3. O segundo registro não tem o bit ligado no Mapa de Presença. Assim, o +decodificador usa o valor anterior e este campo neste registro terá o valor +"primeiro" (de novo).
  4. +
  5. O terceiro registro tem o bit do Mapa de Presença ligado novamente, e é lido +o valor "segundo". Este é o valor para este campo neste registro.
  6. +
  7. O quatro registro não tem o bit ligado no Mapa de Presença e o decodificador +usa o valor "segundo" para o campo.
  8. +
+

O operador Copy pode indicar o valor inicial do campo. Por exemplo

+
<string name="MDReqID" id="262">
+    <copy value="string"/>
+</string>
+
+

Isso significa que deve usar "string" como valor anterior, mesmo no primeiro +registro.

+

Conforme indicado, campos com o operador Copy sempre aparecem no Mapa de +Presença.

+

Operador: Delta

+

Delta é um operador parecido com Copy, mas ao invés de usar o valor do registro +anterior neste campo, o novo valor deve ser calculado usando o valor anterior e +o atual. De novo, se não há valor anterior, então nenhuma operação é feita o +valor nos dados de entrada é o valor atual.

+

Um exemplo:

+
<uInt32 name="NumberOfOrders" id="346">
+    <delta/>
+</uInt32>
+
+
    +
  1. O primeiro registro vem com o valor "300". Este é o valor do campo.
  2. +
  3. O segundo registro vem com o valor "2". Este valor deve ser adicionado no +valor anterior e usado, então o valor no segundo registro é "302".
  4. +
  5. O terceiro registro vem com o valor "3". Novamente, deve ser usado o valor +anterior e o valor atual deve ser adicionar. Assim, o campo no terceiro +registro terá o valor "305".
  6. +
+

Operador: Increment

+

Increment (Incremento) funciona de forma similar ao operador Delta por estar +sempre adicionando um valor ao valor anterior, mas o valor adicionar é sempre +1.

+

Se o bit do campo estiver ligado no Mapa de Presença, o valor do campo será o +valor vindo dos dados de entrada; caso contrário, deverá ser usado o valor +anterior acrescido de 1.

+

Exemplo:

+
<uInt32 name="RptSeq" id="83">
+    <increment/>
+</uInt32>
+
+
    +
  1. O primeiro registro tem o bit ligado para o campo no Mapa de Presença e o +decodificador lê o valor "100" nos dados de entrada. Este é o valor do campo +neste registro.
  2. +
  3. O segundo registro não tem o bit ligado, então não há nada a ser lido dos +dados de entrada, mas o campo deve ter o valor "101" para este registro.
  4. +
+

Campos com o operador Increment devem aparecer no Mapa de Presença.

+

Mapa do Mapa de Presença

+

Existe um mapa simples que indica se um campo aparece ou não no Mapa de +Presença, de acordo com a JetTek:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperadorAparece para campos Mandatórios?Aparece para campos Opcionais?
NenhumNão.Não.
ConstantNão, o valor constante é sempre usado.Sim; se ligado, deve usar o valor Constante; caso contrario, o + valor do campo é Null.
CopySim; se ligado, deve usar o valor dos dados de entrada; caso + contrário, deve ser usado o valor anterior.Sim, mesma coisa que campos Mandatórios.
DefaultSim; se ligado, deve usar o valor vindo dos dados de entrada; caso + contrário, use o valor default.Sim; mesma coisa que campos Mandatórios.
DeltaNão; o valor vindo dos dados de entrada deve ser adicionado ao + anterior.Não; mesma coisa que campos Mandatórios.
IncrementSim; se ligado, deve usar o valor vindo dos dados de entrada; caso + contrário, adicionar 1 no valor anterior.Sim; mesma coisa que campos Mandatórios.
+

Versionamento de Templates

+

Eu não mencionei isso antes, mas agora que eu expliquei algumas coisas sobre os +tipos e algumas informações sobre o template, eu posso dizer que o arquivo de +template permite que existam múltiplas versões das mesmas mensagens.

+

Por exemplo

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SomeRecordType" id="1">
+    <string name="MsgType" id="35">
+      <constant value="Z"/>
+    </string>
+    <string name="SomeField" id="1"/>
+  </template>
+
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SomeRecordType" id="2">
+    <string name="MsgType" id="35">
+      <constant value="Z"/>
+    </string>
+    <string name="SomeField" id="1"/>
+    <string name="SomeOtherField" id="2">
+      <default value="A Value!"/>
+    </string>
+  </template>
+</templates>
+
+

Uma coisa que você pode notar é que existem dois templates definidos, um com ID +"1" e outro com ID "2". Ambos tem o mesmo nome e o mesmo campo com um valor +constante, mas a informação inicial dos dados de entrada indica qual destes +dois deve ser usada.

+

Os dados de entrada começam com um Mapa de Presença. O primeiro bit deste mapa +é o "Template ID". Com este Template ID, o decodificador pode encontrar a lista +de campos que devem ser processados. Este mapa também tem os campos da +sequência inicial -- no nosso exemplo, se o Template ID for "2", o outro bit no +Mapa de Presença é o indicador do "SomeOtherField".

+
+

Até agora, eu não vi dados de entrada que não tivessem o bit indicador do +template ID ligado, então eu não tenho muita certeza do que fazer caso isso +aconteça.

+ +
+

Anomalias

+

Eu chamo "anomalia" qualquer coisa que eu levei muito tempo para entender.

+

Decimais com Operadores Diferentes

+

Isso foi uma coisa meio complicada para entender inicialmente. Por exemplo:

+
<decimal name="MDEntryPX" id="270" presence="optional">
+    <exponent>
+        <default value="0"/>
+    </exponent>
+    <mantissa>
+        <delta/>
+    </mantissa>
+</decimal>
+
+

Parece simples, mas tem várias peças se movendo ao mesmo tempo aqui:

+
    +
  1. +

    O indicador presence="optional" no decimal significa que o exponent pode +ser Null e apenas isso.

    +
  2. +
  3. +

    O operador Default no Expoente significa que o decodificador deve verificar +se o expoente tem um valor presente nos dados de entrada ou se deve ser +usado o valor default de "0".

    +

    Existe um problema aqui: Se o Mapa de Presença indica que o valor está +presente e é lido o valor 0, como o campo é opcional, o decodificador deve +considerada o Expoente Null e, portanto, não há Mantissa e todo o valor é +Null.

    +
  4. +
  5. +

    O operador Delta na Mantissa deve ser usado aplicando o valor de entrada com +o valor anterior. Mas, se o Expoente não estiver com o bit ligado no Mapa de +Presença, como há um valor default, este deve ser usado e não lido dos dados +de entrada, e o valor lido deve ser usado na Mantissa.

    +
  6. +
+

Tipo isso:

+
    +
  1. O primeiro registro tem o bit no Mapa de Presença ligado e o valor lido é +"-2"; este é o Expoente. O próximo valor valor é "1020", que é o valor da +Mantissa, e o decimal inteiro é "10.20".
  2. +
  3. O segundo registro tem o bit ligado no Mapa de Presença e o valor lido é +"0". Como o Decimal é opcional, o Expoente é opcional e como 0 é Null para +campos opcionais, não há Expoente e o próximo valor não é a Mantissa. O +valor do campo neste registro é Null.
  4. +
  5. O terceiro registro não tem o bit ligado no Mapa de Presença. Como o +Expoente tem um valor default, ele fica como "0" e a Mantissa deve ser lida. +Se vier o valor "10", o decimal se torna "10" (ou "10.00" para mantermos o +mesmo número de casas decimais).
  6. +
+

Uma coisa estranha que vi foi relacionada com a forma como a Exchange estava +ordenando os resultados. Era uma sequência de ordens de compra e venda, na +quais

+
    +
  1. O primeiro registro era a ordem de venda, com um Expoente de "0" e Mantissa +de "5410". Isso significa que o valor era "5410".
  2. +
  3. O segundo registro era uma ordem de compra. Ele tinha o Expoente de "-2" e +Mantissa tinha o valor de "526604". Com o operador Delta, isso dá a Mantissa +o valor de "532014", mas como o Expoente é "-2", o valor real era de +"5420.14".
  4. +
  5. A coisa estranha aconteceu no terceiro registro, que era novamente uma ordem +de venda. O valor deveria ser o valor igual ao primeiro, mas a Exchange +mandou o valor "0" para o Expoente e Mantissa de "-526604". Com o Delta, +isso trouxe o valor de volta a "5410".
  6. +
+

Eu achei estranho que a Exchange ficou mudando entre dois Expoentes ao invés de +usar apenas um, e na época eu estava com problemas com o cálculo de Deltas no +meu código, então...

+

Sequências com Tamanho Null

+

Outra coisa que eu vi foi a Sequência opcional: Na prática não há diferença +entre uma sequência com 0 elementos e uma com o tamanho Null -- especialmente +se você pensar que o protocolo é, basicamente, um gerador de FIX. Eu não faço +ideia porque não foi padronizado que tamanhos são mandatórios e um valor de 0 +significa que não há valores ao invés de ficar fazendo uma dança ao redor de +sequências mandatórias e opcionais.

+
+

Changelog:

+ + + +
+ + + + +
+ + + + diff --git a/public/pt/research/index.html b/public/pt/research/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/research/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/reviews/books/21-erros-classicos-da-gestao-de-projetos/index.html b/public/pt/reviews/books/21-erros-classicos-da-gestao-de-projetos/index.html new file mode 100644 index 0000000..f3ce021 --- /dev/null +++ b/public/pt/reviews/books/21-erros-classicos-da-gestao-de-projetos/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

21 Erros Clássicos da Gestão de Projetos - Eli Rodrigues

+ +

Resumo GoodReads: +Por que projetos fracassam? Embora cada projeto seja uma aventura única e sem +precedentes, muitos falham exatamente pelos mesmos motivos.

+

Este livro traz uma coletânea de 21 erros clássicos, obtidos através de +relatos de mais de mil alunos de gestão de projetos dos mais diversos setores +da economia. Estruturado de forma didática e bem-humorada, apresenta +detalhadamente cada situação, permitindo ao leitor conhecer essas +experiências, em vez de se arriscar apenas com suas próprias.

+
+ ★★★☆☆ +
+

21 erros relacionados com gestão clássica de projetos. Solução: métodos ágeis. +Mas me precipito.

+

Sim, o livro fala sobre 21 erros relacionados com a gestão clássica de +projetos, com etapas bem definidas, com prazos já fixados e nenhum aceite de +transição. Ou seja, problemas que todo mundo que já teve que trabalhar com +gestão em cascata já passou e que são problemas já conhecidos e contornados +com soluções em metodologias ágeis.

+

Um problema do livro, no entanto, é que poucos dos erros tem uma solução -- +pelo menos, o livro não cita nada sobre como resolver boa parte dos erros; é +como se uma vez que o erro aconteceu, não há mais solução. Um exemplo: um dos +capítulos fala sobre porque não se escutam as soluções propostas por pessoas +da empresa mesmo ("ouvir a prata da casa"), mas não cita nenhum exemplo de +como fazer com que essas pessoas se sintam dispostas a falar, ou como coletar +essas informações. Simplesmente, existe o problema de não ouvir pessoas +técnicas da empresa. Só isso.

+

Outro problema é a seção de exemplos. São sempre cenários catastróficos, +colocados para mostrar o pior caso possível em que não há retorno para uma +solução viável.

+

E, ainda, em um ponto, cita métodos ágeis -- que, como eu falei, foi criado +justamente para resolver parte dos problemas citados -- e adicionar que é +"gambiarra" (não exatamente com essas palavras). E mais pra frente começa a +citar algumas sugestões ("sugestões", não soluções) que são baseadas nos +métodos ágeis, principalmente scrum.

+

Deve ser interessante para quem vai gerenciar um projeto para ter ideia do que +pode acontecer, mas para quem já vivenciou esses problemas ou já usou outras +metodologias, a falta de soluções é preocupante.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/23-habitos-anti-procrastinacao-como-deixar-de-ser-preguicoso-e-ter-resultados-em-sua-vida/index.html b/public/pt/reviews/books/23-habitos-anti-procrastinacao-como-deixar-de-ser-preguicoso-e-ter-resultados-em-sua-vida/index.html new file mode 100644 index 0000000..9a2e290 --- /dev/null +++ b/public/pt/reviews/books/23-habitos-anti-procrastinacao-como-deixar-de-ser-preguicoso-e-ter-resultados-em-sua-vida/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

23 Hábitos Anti-Procrastinação: Como Deixar de Ser Preguiçoso e Ter Resultados Em Sua Vida - S.J. Scott

+ +

Resumo GoodReads: +APRENDA:: Como Parar de Procrastinar e Conseguir Ajuda Para Os Seus Hábitos +Preguiçosos.

+
+ ★★☆☆☆ +
+

Grande resumo do livro: todos os 23 hábitos são: Siga o Get Things Done (GTD).

+

Ok, não é tão assim, mas uns 80% dos "hábitos" são. O livro foi construído com +a ideia de sequencias de: "Esse é o problema", "Essa é a solução", "Como se +acostumar a fazer a solução". Entretanto, boa parte de "Como se acostumar a +fazer a solução" é, realmente, o que o GTD sugere fazer para fazer com que as +coisas sejam feitas. Inclusive a ideia de pastas dentro de pastas (uma para +cada dia do mês, uma para cada mês, fica rotacionando as pastas de dias dentro +das pastas de meses) é citada nesse livro -- embora o autor tenha citado, pelo +menos, a origem do mesmo (de novo, do GTD).

+

O livro não é ruim, mas para quem já se preparou para seguir o GTD, boa parte +do que foi apresentado já é feito.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/a-colher-que-desaparece-e-outras-historias-reais-de-loucura-amor-e-morte-a-partir-dos-elementos-quimicos/index.html b/public/pt/reviews/books/a-colher-que-desaparece-e-outras-historias-reais-de-loucura-amor-e-morte-a-partir-dos-elementos-quimicos/index.html new file mode 100644 index 0000000..766ed9a --- /dev/null +++ b/public/pt/reviews/books/a-colher-que-desaparece-e-outras-historias-reais-de-loucura-amor-e-morte-a-partir-dos-elementos-quimicos/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A Colher que desaparece: e outras histórias reais de loucura, amor e morte a partir dos elementos químicos - Sam Kean

+ +

Resumo GoodReads: +Uma colher que desaparece quando colocada no chá quente, uma bizarra corrida +pelo ouro causada por um elemento (telúrio) que tem cheiro de alho, um poeta +que enlouqueceu ao ingerir lítio para se tratar de uma doença. Sam Kean nos +guia em um passeio pelas mais surpreendentes histórias envolvendo a +descoberta, o uso e a criação dos 118 elementos químicos da tabela periódica. +Pelo caminho, o autor aborda a história dos avanços científicos, desde a +descoberta do átomo até a criação de elementos artificiais, passando pela +invenção da tabela periódica e pelo estudo da radioatividade. Mostra também +como a vida humana se modificou devido ao cobre (usado em moedas por ser +"autoestéril"), ao silício (utilizado na revolução da informática) e ao urânio +(um dos grandes responsáveis pela bomba atômica).A propósito: a colher que +desaparece é feita de gálio, elemento 31 da tabela periódica, metal com a +estranha propriedade de ficar no estado líquido acima de 29ºC, temperatura +inferior à de qualquer cafezinho.

+
+ ★★★☆☆ +
+

Quando vemos a tabela períodica, vemos apenas uma coleção de elementos +descobertos (e alguns, criados) por humanos. Mas a história por trás dessas +descobertas é que os professores nunca contam -- talvez com exceção de Marie +Curie e olhe lá.

+

No livro, são contadas as formas como a tabela períodica e seus componentes +foram descobertos e montados. Ou seja, a parte humana da física e da +química.

+

Embora seja um ponto interessante de falar sobre física e química, o livro +desvaneia demais em vários pontos. Começa com um assunto e, sem concluí-lo, +passa para outro e nunca retorna. Sem contar que, em alguns pontos, o autor +parece esquecer que as explicações devem ser feitas para não-físicos e acaba +gerando conteúdos extremamente complicados de serem entendidos.

+

Com alguma revisão para evitar que os assuntos fiquem empilham sem solução e +uma revisão na acessibilidade do conteúdo, seria um livro excelente para que +várias pessoas deixassem de ver física e química como um bicho de sete +cabeças.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/a-filosofia-explica-as-grandes-questoes-da-humanidade/index.html b/public/pt/reviews/books/a-filosofia-explica-as-grandes-questoes-da-humanidade/index.html new file mode 100644 index 0000000..6149c95 --- /dev/null +++ b/public/pt/reviews/books/a-filosofia-explica-as-grandes-questoes-da-humanidade/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A Filosofia Explica as Grandes Questões da Humanidade - Clóvis de Barros Filho

+ +

Resumo GoodReads: +O homem é livre? Deus existe? O que é um comportamento ético? Muitas das +questões que acompanham e instigam o Homem através dos tempos são temas deste +livro, A filosofia explica as grandes questões da humanidade, fruto de quase +uma década da experiência bem-sucedida do curso homônimo da Casa do Saber. +Engana-se quem pensa que os assuntos em pauta rendem reflexões herméticas ou +embrenhadas de academicismos. Clóvis de Barros Filho e Júlio Pompeu são +mestres na arte de apresentar a filosofia encarnada na vida, com humor e +exemplos cotidianos sem, no entanto, abrir mão da fidelidade às ideias +centrais de pensadores como Platão, Aristóteles, Hobbes, Maquiavel, Nietzsche +e Foucault. Os autores gostam de dizer que o resultado obtido é algo como um +excelente guia turístico, que aponta grandes atrações e revela aos visitantes +experiências novas e fascinantes. Portanto, se a sua vida tem alguma coisa a +ver com liberdade, felicidade, ética, fé, poder, esperança e conhecimento, +este livro é para você.

+
+ ★★☆☆☆ +
+

Filosofia é algo complicado para se entender, sempre lidando com "meta" +fatores ao invés de tratar do fator em si.

+

E quando o autor fica divagando ao invés de explicar as coisas, entender +filosofia fica ainda pior.

+

O estilo da escrita do livro é o que realmente estraga o prazer de ler. Frases +minúsculas, falta de uso de vírgula ao continuar pensamentos (o que te força a +voltar e ler de novo, para tentar colocar as vírgulas nos lugares dos pontos +para que o pensamento siga seu fluxo normal) e uma completa divagação do +assunto (de novo, entrecortado pelas frases minúsculas) faz com que entender o +que o autor quer dizer uma tarefa praticamente impossível.

+

A sorte é que o último 1/3 do livro foi escrito por outro autor e nesse ponto +sim as coisas fazem sentido. Finalmente começa-se do princípio, vai-se ao meio +e termina-se no fim, ao invés de abrir 15 princípios no meio e nunca chegar a +um fim.

+

Vale pelo último 1/3, o resto é uma baderna de ser lido sem que se chegue a +uma conclusão.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/a-garota-no-trem/index.html b/public/pt/reviews/books/a-garota-no-trem/index.html new file mode 100644 index 0000000..37c30b5 --- /dev/null +++ b/public/pt/reviews/books/a-garota-no-trem/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A Garota no Trem - Paula Hawkins

+ +

Resumo GoodReads: +Todas as manhãs Rachel pega o trem das 8h04 de Ashbury para Londres. O +arrastar trepidante pelos trilhos faz parte de sua rotina. O percurso, que ela +conhece de cor, é um hipnotizante passeio de galpões, caixas d’água, pontes e +aconchegantes casas.

+

Em determinado trecho, o trem para no sinal vermelho. E é de lá que Rachel +observa diariamente a casa de número 15. Obcecada com seus belos habitantes – +a quem chama de Jess e Janson –, Rachel é capaz de descrever o que imagina ser +a vida perfeita do jovem casal. Até testemunhar uma cena chocante, segundos +antes de o trem dar um solavanco e seguir viagem. Poucos dias depois, ela +descobre que Jess – na verdade Megan – está desaparecida.

+
+ ★★★★☆ +
+

Mais um "resolvi ler o filme".

+

Sem partir para spoilers, o livro é interessante mais pela estrutura do que +pelo conteúdo. Não que o conteúdo seja ruim, mas é levemente cliché.

+

A estrutura, no entando, é bem mais complexa. Segue a vida de três mulheres +(uma delas, a principal, "a garota no trem"), contando como a história das +três se interage e como forma uma rede só. O problema é que, além de quebrar +eventos em três versões diferentes, três pontos de vista diferentes -- algo +que eu acho realmente interessante -- os eventos não ocorrem em ordem +cronológica. Um capítulo é sobre a mulher 1, em um dia de julho de 2013; o +próximo é da mulher 3 em janeiro de 2012; e assim por diante. Como os +capítulos são meio longos, às vezes foi preciso voltar pra tentar conectar os +espaços temporais para ter a visão do todo da história.

+

Fora isso, é um excelente mistério, com uma boa percepção dos clichés e como +utilizá-los para criar plot twists.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/a-historia-do-mundo-para-quem-tem-pressa/index.html b/public/pt/reviews/books/a-historia-do-mundo-para-quem-tem-pressa/index.html new file mode 100644 index 0000000..cb708a3 --- /dev/null +++ b/public/pt/reviews/books/a-historia-do-mundo-para-quem-tem-pressa/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A História do Mundo Para Quem Tem Pressa - Emma Marriott

+ +

Resumo GoodReads: +Um guia conciso e abrangente, ilustrado por mapas, para tudo o que +necessitamos saber sobre os acontecimentos mais importantes da história, desde +as antigas civilizações (Suméria, Egito e Babilônia, por exemplo) até o final +da Segunda Guerra Mundial. Esteja o leitor interessado no império de +Alexandre, o Grande ou no florescimento da república cartaginesa e sua +destruição por Roma na ascesão dos califados árabes ou na dinastia Tang, da +China, na Guerra Civil norte-americana ou nos povos maia, inca e asteca, +encontrará os fatos essenciais nesta obra igualmente essencial.

+
+ ★★★★★ +
+

"A História do Mundo Para Quem Tem Pressa" teve uma proposta inicial +interessante: contar, resumidamente, o resumo da história em apenas 200 +páginas. Embora interessante, o resultado é, no mínimo, curioso: Quando o +livro fala de civilizações grandiosas (com os fenícios), cuja cultura se +estende por séculos, sendo um dos maiores centros de comércio da época, em +apenas um parágrafo, a questão que fica é se era realmente o maior, pra caber +em tão pouco espaço; ao mesmo tempo, leva a questão se analisamos a grandeza +de uma civilização pelo número de parágrafos ou pelo conteúdo dos parágrafos.

+

De qualquer forma, o livro vai desde o ano 5000 a.C. até 1950 d.C., citando as +várias civilizações que surgiram, o conhecimento que temos, hoje, dessas +civilizações, e a sua repercussão. No entanto, como o livro se divide em +períodos de tempos, algumas vezes a história de uma civilização -- e suas +ramificações -- fica "cortada" no percorrer do livro. Talvez fosse mais +interessante pegar uma civilização e seguir o progresso da mesma desde a sua +primeira aparição -- no seu primeiro estado -- e seguir até os dias de hoje, +passando por suas transformações.

+

No fim, o livro se torna divertido mesmo nos tempos modernos, onde a +abundância de informações permite uma maior "manobrabilidade" do conteúdo. +Mas, como tido no começo, o livro sofre com a própria ideia de ser um livro de +história com 200 páginas e acaba sacrificando o entendimento em alguns casos.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/antologia-da-maldade-um-dicionario-de-citacoes-associacoes-ilicitas-e-ligacoes-perigosas/index.html b/public/pt/reviews/books/antologia-da-maldade-um-dicionario-de-citacoes-associacoes-ilicitas-e-ligacoes-perigosas/index.html new file mode 100644 index 0000000..714b7dd --- /dev/null +++ b/public/pt/reviews/books/antologia-da-maldade-um-dicionario-de-citacoes-associacoes-ilicitas-e-ligacoes-perigosas/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Antologia da maldade: Um Dicionário de Citações, Associações Ilícitas e Ligações Perigosas - Gustavo H. B. Franco

+ +

Resumo GoodReads: +Um livro que reúne o humor, a sabedoria - e a maldade - de figuras +proeminentes do cenário brasileiro e universal, de ontem e hoje. Os +economistas Gustavo Franco e Fabio Giambiagi organizam essa antologia de +citações cujo mote central são frases com dois dedos de maldade. Mas a maldade +que dá título ao livro não é a da perversidade e a da má índole, mas um +composto formado de maldade espirituosa, malícia, atrevimento, ironia, de +alguns maus ditos e de muito bom humor. Estão no livro citações de Nelson +Rodrigues, Millôr Fernandes, Machado de Assis, Getúlio Vargas, Winston +Churchill, Roberto Campos, Shakespeare, Jorge Luis Borges, e muitos outros, +entre banqueiros, políticos, consultores, empresários, artistas, escritores, +esportistas, filósofos, dramaturgos e cientistas. E constam também as falas de +algumas lideranças como Fernando Henrique Cardoso, Luiz Inácio Lula da Silva e +Dilma Rousseff, sem os quais nenhuma coletânea sobre a atualidade estaria +completa. Dividida por temas e organizada em ordem alfabética, a antologia +apresenta mais de setecentos verbetes, preenchidos com observações originais, +inusitadas, afiadas e divertidas sobre praticamente tudo. Encontraremos os +convencionais "Capitalismo", "Socialismo", "Amizade", "Inflação", "Traição", +"Religião", mas também outros singulares, como "Controle da mídia", +"Corrupção", "Groucho-marxismo", "Brasilidade", "Mensalão" e "Petrolão", que +estão no cerne das grandes polêmicas contemporâneas no Brasil. Inflação: +"Queremos apenas reduzir uma inflação indecente de 220% para um nível não +menos indecente de 150%, e depois o próximo governo continuará a luta." +Antonio Delfim Netto, economista e ex-ministro da Fazenda, em 1984. Inveja: "O +melhor dos bens é o que não se possui." Machado de Assis, escritor. Mineirice: +"Em Minas Gerais, a política é como crochê: não se pode dar um ponto errado, +sob pena de ter de começar tudo de novo." Itamar Franco, ex-presidente da +República.

+
+ ★★☆☆☆ +
+

Com o título principal de "Antologia da maldade", eu esperava uma lista de +citações ácidas de pessoas famosas, como praticamente todas as citações de +Winston Churchil. Infelizmente, o livro é apenas mais um livro de citações +randômicas, incluindo Mário Quintana, que provavelmente é a única pessoa cujas +citações são sempre simpáticas e amáveis.

+

Assim, de "maldade" há muito pouco, a não ser que seja considerada maldade +reproduzir citações de Nelson Rodrigues, cuja existência deveria ser atirada +no passado negro do Brasil junto com a ditadura.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/argo/index.html b/public/pt/reviews/books/argo/index.html new file mode 100644 index 0000000..f6bacb7 --- /dev/null +++ b/public/pt/reviews/books/argo/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Argo - Antonio J. Méndez

+ +

Resumo GoodReads: +Em 4 de novembro de 1979, os funcionários da embaixada dos Estados Unidos em +Teerã são surpreendidos pela invasão de um grupo de militantes, que faz 53 +reféns. Em meio à confusão, seis diplomatas conseguem escapar e encontram +refúgio na residência do embaixador do Canadá. Mas Tony Mendez, especialista +em disfarces da CIA, sabe perfeitamente que é apenas uma questão de tempo até +que sejam encontrados. Para retirá-los do país, ele concebe um plano muito +arriscado, digno de cinema. Disfarçando-se de produtor de Hollywood e apoiado +por um elenco de agentes secretos, falsificadores e especialistas em efeitos +especiais, Mendez viaja para Teerã a pretexto de encontrar a locação perfeita +para um falso filme de ficção científica chamado Argo.

+
+ ★★★☆☆ +
+

Mais um para a lista do "li um filme". Obviamente, o filme é baseado no livro +e não o contrário.

+

Ao contrário do filme, o livro passa um bom tempo explicando os fatos que +levaram à invasão da embaixada americana em Teerã, ao invés de pular +diretamente para o resgate -- o que é excelente para entender exatamente +porque a embaixada foi invadida. Praticamente a primeira metade do livro +inteiro conta os fatos que levaram à invasão, como seis funcionários da +embaixada escaparam e por onde passaram até chegar a embaixada canadense.

+

A segunda metade do livro é que foca na operação de extração (exfiltração) dos +funcionários. E não, não foi todo aquela sucessão de eventos que acontece no +filme: é bem mais simples do que é mostrado.

+

Entretanto, existem dois grandes problemas do livro:

+

O primeiro é que Mendez parece super envolvido na sua função de espião da CIA, +no clássico "faço tudo pelo meu país", batendo no peito, mas mostra-se de +certa forma indignado quando comenta que outros países fazem o mesmo. O +clássico, "não confio em ninguém, mas fico indignado quando não confiam em +mim."

+

O segundo problema é a tradução: utiliza toda a língua formal no livro, com +pedaços caindo para o popular: "a gente podia" ao invés de "nós poderíamos", +"antes de se tornar um fera na maquiagem" ao invés de "antes de se tornar +expert em maquiagem". Embora pareça bobo citar esses exemplos, eles são +extremamente contrastantes com o resto da linguagem usada.

+

No fim, o livro é muito interessante pela explicação histórica dos eventos e +para ver o quão disparate da verdade o filme é.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/como-a-musica-ficou-gratis/index.html b/public/pt/reviews/books/como-a-musica-ficou-gratis/index.html new file mode 100644 index 0000000..72ce047 --- /dev/null +++ b/public/pt/reviews/books/como-a-musica-ficou-gratis/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Como a música ficou grátis - Stephen Witt

+ +

Resumo GoodReads: +Uma trama impressionante envolvendo música, crime, dinheiro e obsessão, cujos +protagonistas são magnatas, pesquisadores respeitados, criminosos e +adolescentes nerds fissurados em tecnologia.

+
+ ★★★★☆ +
+

“Como a música ficou grátis” é uma análise dos fatos que aconteceram com a +indústria fonográfica acabou dando vários tiros nos pés até que músicas fossem +gratuitamente distribuidas pela internet.

+

E não, não estamos falando sobre as “rádios online” que hoje estão em todos os +lugares. O livro acaba antes dessa explosão, mas a história contada deixa +relativamente explicado do porque essa explosão aconteceu, se você conseguir +ligar as linhas.

+

O livro se foca na história de três pessoas (principalmente): Doug Morris, +produtor musical que descobriu vários artistas de ponta, principalmente no +mundo do rap; Karlheinz Brandenburg, do Instituto de Erlagen-Nuremberg, que +trabalhou no formato hoje conhecido como MP3; e, finalmente, Dell Glover, que +trabalhou numa das fábricas de prensagens de CDs da Universal Music e +conseguiu vazar vários álbuns antes dos seus lançamentos oficiais.

+

Embora o livro conte, de forma bem explícita, como a vida dessas três pessoas +influenciou uma indústria inteira, eu fiquei com a impressão que +acontecimentos realmente importantes nessa história tenham ficado de lado. Por +exemplo, a explosão do Napster é contada rapidamente, pulando da sua criação +diretamente para o fechamento da empresa (os criadores do Napster, Shawn +Fanning, John Fanning e Sean Parker são mencionados de relance, apenas); o +lançamento do iPod também é colocado em segundo plano, apesar de ter sido o +expoente máximo do MP3 na época apresentada pelo livro; BitTorrent aparece, +mas apenas como um novo formato de distribuição para substituir o Napster; o +Oink’s Pink Palace ganha mais proeminencia que o Pirate Bay; e, como dito +inicialmente, a explosão das “rádios de internet” sequer é mencionada (ok, +fala-se rapidamente do Spotify, mas é isso).

+

Pode ser que o ponto do livro fosse, realmente, apresentar os fatores que não +foram apresentados ao público, deixando os fatos mais “populares” de fora e +apresentando o que estava acontecendo por baixo dos panos. Mas ainda assim, é +estranho que coisas com relativa importância no contexto global da ação tenham +sido sumariamente ignorados.

+

Outro problema com o livro é a leitura. Por algum motivo, o conteúdo é +complicado de ser lido, possivelmente porque vai construindo hipótese sobre +hipótese e contexto sobre contexto, o que deixa o livro “lento” de ser lido.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/como-convencer-alguem-em-90-segundos/index.html b/public/pt/reviews/books/como-convencer-alguem-em-90-segundos/index.html new file mode 100644 index 0000000..a99cc5f --- /dev/null +++ b/public/pt/reviews/books/como-convencer-alguem-em-90-segundos/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Como convencer alguém em 90 segundos - Nicholas Boothman

+ +

Resumo GoodReads: +Como convencer alguém em 90 segundos é a garantia de uma comunicação de +sucesso, transformando as conexões instantâneas em duradouras e produtivas +relações de negócios. Neste livro, o especialista Nicholas Boothman ensina +como usar o rosto, o corpo, a atitude e a voz para causar uma primeira +impressão marcante, estabelecendo confiança imediata e criando fortes vínculos +de credibilidade.

+
+ ★★★★☆ +
+

Antes de mais nada, esse livro não é um livro de persuasão, de fazer outras +pessoas terem a mesma convicção que você; esse livro é como convencer alguém a +comprar algo de você -- seja produto ou seja você mesmo.

+

Existem vários "exercícios" para conseguir aprender as regras de convencer +alguém: como olhar alguém nos olhos, como estar sempre sorrindo, como contar +uma história que capture a atenção das pessoas.... cada ponto tem um +exercício. Além disso, no final de cada capítulo, existe um resumo do que foi +falado no livro -- embora a forma como esse resumo apareça não tenha nenhum +indicativo que é o resumo e não apenas mais um tópico do capítulo.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/direto-ao-ponto-criando-produtos-de-forma-enxuta/index.html b/public/pt/reviews/books/direto-ao-ponto-criando-produtos-de-forma-enxuta/index.html new file mode 100644 index 0000000..8e4a40b --- /dev/null +++ b/public/pt/reviews/books/direto-ao-ponto-criando-produtos-de-forma-enxuta/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Direto ao Ponto - criando produtos de forma enxuta - Paulo Caroli

+ +

Resumo GoodReads: +Um projeto ágil é conduzido através de entregas rápidas e frequentes. Um +projeto bem executado coloca ênfase em entregas de valor de acordo com +objetivos de negócios e os usuários de destaque. Projetos ágeis promovem a +liberação incremental de software: o MVP, o produto viável mínimo, em Inglês +Minimum Viable Product (MVP), a versão mais simples de um produto que pode ser +disponibilizada para o negócio. Mas como realizar o entendimento do MVP e a +iniciação do projeto ágil o mais rápido possível? Como garantir que o time +comece o projeto com entendimento compartilhado, direção, prioridade e um +plano bem definido?

+
+ ★★★☆☆ +
+

Quando comecei a ler o livro, me lembrei imediatamente de um vídeo do Robert +C. Martin explicando regras de progressão de código conforme os testes +unitários avançam: antes de explicar as regras, ele passa por todo o processo +de "escrever os testes antes do código", mostrando a evolução do código e +nesse ponto TDD faz o maior sentido do mundo. Mas quando ele chega nas regras, +você fica pensando se a regra realmente faz sentido.

+

A mesma coisa aconteceu com o livro: Paulo Caroli começa explicando os vários +conceitos e método das metologias enxutas e tudo faz sentido e parece ser a +melhor coisa do mundo. Mas depois começa a se aprofundar na inception e você +começa a pensar que talvez não faça sentido coletar todas as features e +definições e examinar tudo com os stakeholders se métodos ágeis funcionam +justamente sabendo que as coisas vão mudar no futuro. Do que adianta planejar, +discutir, desenhar e tudo mais quando se sabe que, no produto final, nem todas +as features desejadas inicialmente serão usadas ou se durante o +desenvolvimento não será detectada a mudança no curso e o resultado final será +completamente diferente do planejado inicialmente.

+

E esse ponto em específico nunca é discutido; você fica com um "waterfall" nas +mãos sabendo que nem tudo vai ser usado no final -- afinal de contas, essa é a +idéia dos métodos ágeis.

+

Então embora o livro descreva como fazer uma inception completa, com o maior +número de acertos possíveis, o fato que uma inception não parece se encaixar +na metodologia ágil nunca é discutido.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/dossie-jung/index.html b/public/pt/reviews/books/dossie-jung/index.html new file mode 100644 index 0000000..42fc97f --- /dev/null +++ b/public/pt/reviews/books/dossie-jung/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Dossiê Jung - Elizabeth Mednicoff

+ +

Resumo GoodReads: +Nesta obra, a autora descreve fatos valiosos a respeito do criador da +Psicologia Analítica, resultando em um livro rico não apenas como fonte de +informação, mas também como objeto de reflexão a respeito do ser humano e de +como ele lida com seus problemas e se relaciona com o mundo. Da infância e +juventude à idade adulta e seus últimos dias, o leitor conhecerá a trajetória +de vida do psiquiatra suíço que desde jovem se interessou por filosofia, +literatura e foi amigo de Freud. Além disso, são relatados pontos importantes +sobre a escola analítica da Psicologia fundada por Jung, incluindo os +conceitos do Inconsciente Individual e Coletivo, os Arquétipos, Anima e +Animus, o Self, a Teoria dos Tipos Psicológicos, a Dinâmica da Personalidade e +como se dá a sua formação.

+
+ ★☆☆☆☆ +
+

Vários problemas com a estrutura do livro.

+

Primeiro, não é um "Dossiê Jung". A parte sobre Jung, a pessoa, termina logo +nos primeiro quinto do livro. A vida do médico/psicólogo nunca mais é revista.

+

Depois disso, começa uma explicação da psicologia analítica, criada por Jung, +com todos os seus conceitos... E nenhum exemplo claro. Por exemplo, na parte +de símbolos, é comentado que existem símbolos fixos, mas quais são esses +símbolos (pelo menos, os primordias, como a casa e a mandala) não são citados. +Então fica tudo em conceitos e nada palpável.

+

E ainda, existe muito mais opinião ("creio" em alguns pontos) e falta de +conteúdo direto (como indicar ao leitor para "procurar na web") que realmente +tiram a ideia de que é um trabalho completo.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/elon-musk-como-o-ceo-bilionario-da-spacex-e-da-tesla-esta-moldando-o-nosso-futuro/index.html b/public/pt/reviews/books/elon-musk-como-o-ceo-bilionario-da-spacex-e-da-tesla-esta-moldando-o-nosso-futuro/index.html new file mode 100644 index 0000000..0a27b62 --- /dev/null +++ b/public/pt/reviews/books/elon-musk-como-o-ceo-bilionario-da-spacex-e-da-tesla-esta-moldando-o-nosso-futuro/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Elon Musk: Como o CEO bilionário da SpaceX e da Tesla está moldando o nosso futuro - Ashlee Vance

+ +

Resumo GoodReads: +Elon Musk é o empreendedor mais ousado de nosso tempo. Uma mistura de Thomas +Edison, Henry Ford, Howard Hughes e Steve Jobs, ele é o homem por trás dos +cobiçados esportivos elétricos da Tesla Motors, dos painéis e baterias de +energia solar popularizados pela SolarCity e dos foguetes espaciais da SpaceX, +construídos do zero com recursos privados e muito mais baratos que qualquer +versão já lançada pelas agências governamentais. Entre as próximas metas de +Musk está a colonização de Marte.

+
+ ★★★★☆ +
+

Elon é uma figura que eu respeito pela decisão, a muito tempo, de, +inicialmente, fazer um carro elétrico num mundo que já sofre demais com a +queima de combustíveis fósseis e, depois, por abrir as patentes das baterias +que alimentam esses carros.

+

Entretanto, o livro não fala realmente de Elon Musk. Essa "biografia" aborda +muito mais as empresas de Musk (o que o autor chama, mais tarde, de "Musk Co") +do que a pessoa Elon Musk. Detalhes sobre a vida, como pensa e tudo mais ficam +relegados a segundo plano enquanto que a história da SpaceX e da Tesla tomam a +frente. Sim, é uma forma de entender a pessoa vendo as decisões dela sobre +produtos importante, mas pouco se fala das decisões que Musk tomou sobre as +empresas e sim as decisões de outras pessoas sobre as empresas que ele +comanda. No fim, sobra muito da empresa e pouco da pessoa.

+

Detalhes da pessoa são somente abertos nos apêndices, onde o autor coloca +descrições completas das conversas com Elon e finalmente se tem uma idéia de +como ele pensa, mesmo que superficialmente por se tratar de pontos específicos +de discussão.

+

É um livro interessante para entender a SpaceX e a Tesla, mas pouco para se +entender Elon Musk.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/guia-politicamente-incorreto-da-historia-do-mundo/index.html b/public/pt/reviews/books/guia-politicamente-incorreto-da-historia-do-mundo/index.html new file mode 100644 index 0000000..1865642 --- /dev/null +++ b/public/pt/reviews/books/guia-politicamente-incorreto-da-historia-do-mundo/index.html @@ -0,0 +1,136 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Guia politicamente incorreto da história do mundo - Leandro Narloch

+ +

GoodReads Summary: +Este livro é um guia contra a doutrinação que muitos brasileiros sofreram na +escola. Não tem a pretensão de contar a história do mundo: seu alvo são os +principais mitos sobre os últimos 2 mil anos que, apesar de terem sido +derrubados há muito tempo por historiadores, prevalecem nos livros didáticos, +nas provas do Enem, nas conversas de bar.

+
+ ★☆☆☆☆ +
+

O título mais correto para este livro seria: "Narloch e as Fantásticas +Falácias para Provar Pontos".

+

O livro até começa bem, falando historicamente de Nero e da famigerada queima +de Roma.

+

A partir desse ponto, no entanto, a coisa desanda para um nível de falácias +que, se fossem analisadas, poderiam gerar um livro com o dobro do tamanho +deste.

+

Falando em Galileu, o autor debocha do fato dele (Galileu) ganhar a vida +escrevendo horóscopos. Mais tarde, insinua a homossexualidade de Ghandi, e +afirma "apesar disso, não podemos criticar Ghandi por suas escolhas sexuais" +(ou algo desse tipo). Sim, não é possível, porque isso é chamado ad hominem +-- que, estranhamente, é o mesmo que o autor fez com Galileu! Vale pra um, não +vale pro outro.

+

Outro caso: Afirmar que a revolução industrial ajudou os pobres da Inglaterra, +e logo depois afirma que a grande maioria que saiu do campo e foi procurar +vida melhor na cidade, morreu. De forma alguma estou criticando a revolução +industrial, mas quando "a grande maioria" morre por algo, como é que ela pode +"ter feito bem"?

+

Essas imbecilidades que beiram a infantilidade nesses 4 primeiros capítulos +fazem com que o resto do livro fique com uma sensação ruim ao ler. Não só +falácias e erros crassos de lógica percorrem o livro inteiro, a postura +política do autor também fica extremamente clara. Se houvesse, logo de cara, +um aviso sobre isso, não seria grande problema; o problema ocorre que o livro +aparentemente escolheu fatos justamente para justificar a postura política ao +invés de, obviamente, focar na história do mundo (que está ali no título).

+

Não só a qualidade lógica do conteúdo tem que ser constantemente questionada, +mas a versão do Kindle deixa muito a desejar. Além de hifenizar palavras em +lugares errados ("escol-ha", por exemplo), o autor decidiu colocar parágrafos +com bordas mais largas de forma alternativa (algumas vezes, o texto fica todo +à esquerda, outras todo a direita), usa 4 tamanhos diferentes de fontes e, +randomicamente, deixa uma palavra em negrito. Só faltou o texto inteiro estar +em comic sans.

+

Não que o livro não tenha seu conjunto de informações, mas o fato de ser, +especificamente, um amontoado de situações da história usados simplesmente +para provar (com erros de lógica que fariam os pensadores gregos rirem até a +morrerem) a posição do política do autor realmente destroem qualquer +consideração que deveria ser feita ao conteúdo real.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/hegel-em-90-minutos/index.html b/public/pt/reviews/books/hegel-em-90-minutos/index.html new file mode 100644 index 0000000..4726d18 --- /dev/null +++ b/public/pt/reviews/books/hegel-em-90-minutos/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Hegel em 90 Minutos - Paul Strathern

+ +

Resumo do GoodReads: +Hegel foi um dos filósofos mais eruditos, com imenso conhecimento de arte, +literatura, religião, filosofia, política e ciência, tanto de sua época como +de épocas passadas. Criador do método dialético, que nas mãos de Marx daria +origem à maior revolução desde a Revolução Francesa, admitia: "Apenas um homem +me entende, e mesmo ele não consegue." Alguns críticos consideram que nesse +ponto o filósofo exagerava. Terá esse homem existido realmente?

+
+ ★☆☆☆☆ +
+

Eu sei que é complicado escrever um livro sobre a história de um filósofo em +90 minutos (ou seja, em poucas páginas), considerando o efeito de sua obra, a +história pessoal e a história do mundo (já que essa molda a pessoa).

+

Mas dava pra escolher alguém que não odiasse o tópico para escrever sobre o +mesmo?

+

O autor passa uma boa parte do tempo chamando Hegel de "entediante", +"desajeitado" e considera quase impossível que algum de seus alunos realmente +gostasse dele -- ou que esse fosse capaz de encantar uma mulher. A coisa é tão +descarada contra Hegel que é impossível entender como, com todas as coisas +apontadas pelo autor, Hegel passa de tutor de uma família em Bern à reitor da +Universidade de Berlim. E como é que diabos, apesar de uma vida de conteúdo +"entediante" e que era "incapaz de seguir uma linha de raciocínio em suas +aulas", lotava salas de aula.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/historia-do-futuro-o-horizonte-do-brasil-no-seculo-xxi/index.html b/public/pt/reviews/books/historia-do-futuro-o-horizonte-do-brasil-no-seculo-xxi/index.html new file mode 100644 index 0000000..893396a --- /dev/null +++ b/public/pt/reviews/books/historia-do-futuro-o-horizonte-do-brasil-no-seculo-xxi/index.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

História do Futuro: O Horizonte do Brasil no Século XXI - Miriam Leitão

+ +

Resumo GoodReads: +História do Futuro é um grandioso livro de reportagem em que a jornalista +Míriam Leitão mapeia o território do que está por vir com base em +entrevistas, viagens, análises de dados e depoimentos de especialistas, +depois de três anos de pesquisas. Ela aponta tendências que não podem ser +ignoradas em áreas como meio ambiente e clima, demografia, educação, +economia, política, saúde, energia, agricultura, tecnologia, cidades e mundo. +E adianta que o futuro será implacável para os países que não se prepararem +para ele.

+
+ ★★☆☆☆ +
+

Quando comecei a ler esse livro, eu realmente gostei: Miriam começa falando +sobre as alterações climáticas e a destruição dos recursos naturais, mostrando +o que deu de errado e o que foi feito para corrigir esses problemas, de uma +forma brilhante.

+

Na segunda parte é discutido o problema do envelhecimento da população, +mostrando que estamos nos aproximando do ponto em que a população brasileira +vai começar a se reduzir e a pirâmide de contribuição da previdência está se +invertendo. Segurança entra nessa estatística, já que além de menos filhos, a +faixa hetaria que entraria no mercado de trabalho acaba morrendo antes de +conseguir chegar a isso (e começar a contribuir).

+

Terceira parte fala da educação, justamente porque a população está se +reduzindo, pedindo para que os trabalhadores do futuro sejam melhores educados +e preparados para mudar de situação.

+

E aí ela fala de economia e a coisa despenca.

+

Ela comenta os problemas de corrupção no país -- atualizado para até o que se +sabia no final de 2015, de uma forma realmente ampla e bem melhor explicado do +que qualquer publicação jornalistica por aí -- mas na parte de soluções só são +citados os bons e velhos discursos de sempre: desinchar o governo, abrir +barreira, reforma tributária, etc, etc, etc.

+

Acontece que se fosse fácil, já teria sido feito. Enquanto jornalista de +economia -- o que garante um conhecimento maior do que a maioria das pessoas +-- sair gritando as velhas discussões de sempre sem apresentar uma solução é +triste. E soa pior justamente porque ela É jornalista de economia.

+

(Não discordo que tem que ser feito, mas ficar simplesmente na discussão sem +apresentar soluções, mesmo a longo prazo...)

+

Desse ponto em frente, o castelo de cartas começa a desmoronar. É preciso +ensinar as pessoas a poupar, mas é preciso estimular a indústria (se as +pessoas estão poupando, a indústria vai vender pra quem?); o mundo está +passando para a transformação digital e educação deveria usar esse recurso +melhor, apresentando o mundo para as crianças, mas é preciso fazer a indústria +ser o maior contribuidor do PIB (minha senhor, se o mundo está virando +digital, não deveríamos focar nisso, que é serviço?); as escolas tem que +ensinar a pensar, mas é preciso ensinar, desde criança, a poupar (mas se era +ensinar a pensar, pra que ter algo específico?); é preciso fazer crescer o PIB +com ajuda à indústria, mas o PIB não é uma métrica boa (sem comentários); +poluição causa vários problemas de saúde e geração de energia limpa é o +futuro, mas é preciso fazer com que a petrobrás tenha uma produção maior +(temos que reduzir poluição, mas é preciso investir numa empresa que produz +poluição?); quem precisa resolver os problemas do trânsito são as cidades, mas +o culpado é o Federal por ter reduzido IPI... E por aí vai.

+

Não que o livro não seja interessante pela quantidade de informações +existentes. O problema é que, numa tentativa de mostrar caminhos para o Brasil +do futuro, Miriam acaba sugerindo fazer coisas dispersas. É como perguntar +para alguém como chegar num restaurante e essa pessoa dizer que deve-se pegar +a direita e a esquerda ao mesmo tempo. Simplesmente, não é possível.

+

Fora as questões lógicas do conteúdo, existe um problema de edição: vários +pontos aparecem com conteúdo repetido, como se a autora tivesse escrito +pedaços em momentos diferentes e sequer releu o capítulo novamente para +verificar se não há duplicação.

+

No fim, é um livro interessante pelas informações, mas como sugestões de +futuro, parece mais uma tentativa de atirar várias pedras pra ver qual, daqui +a alguns anos, atingiu o alvo -- e, as que não atingiram, serão solenemente +ignoradas.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/index.html b/public/pt/reviews/books/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/reviews/books/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/reviews/books/mujica-a-revolucao-tranquila/index.html b/public/pt/reviews/books/mujica-a-revolucao-tranquila/index.html new file mode 100644 index 0000000..8b8551a --- /dev/null +++ b/public/pt/reviews/books/mujica-a-revolucao-tranquila/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mujica – A revolução tranquila - Mauricio Rabuffetti

+ +

Resumo GoodReads: +A biografia definitiva do líder político mais carismático do mundo.

+
+ ★★☆☆☆ +
+

Chamar esse livro de "biografia" é um pouco demais. É estranho que um livro +que tenha uma pessoa na capa e no título tenha tão pouco espaço para ela.

+

Parte da história de José Mujica acontece durante a ditatura uruguaia, quando +este era guerrilheiro. Embora seja um capítulo importante da vida de Mujica, o +autor resolveu não despender tempo o suficiente sobre o assunto porque, +segundo o mesmo, há vários outros livros sobre o assunto do qual os uruguaios +querem esquecer. Entretanto, mesmo que seja a milésima vez em que algo é +falado, ele deve ser contando por questões de posicionar o "tópico" na +história.

+

A mesma coisa acontece com a questão da legalização da maconha. Embora o livro +realmente despenda tempo falando sobre a lei do então presidente Mujica, pouco +é falado da ação do presidente sobre a liberação e muito mais sobre questões +sanitárias da questão: se vicia mais ou menos, como a OEA via a questão da +legalização, os relatórios da ONU, etc, etc, etc. A parte que tangencia todas +essas questões e Mujica é simplesmente "Mujica levantou a questão da +legalização da maconha".

+

Ainda, bem no começo do livro, é dito que o povo uruguaio não vê Mujica como o +resto do mundo vê. Esse seria um ponto bem interessante de ser visto -- afinal +de contas, aqui nós somos "resto do mundo" -- mas isso nunca é levado a +frente. Termina, basicamente, com "algumas pessoas não gostaram do que Mujica +fez". Existem alguns pontos, principalmente questões diplomáticas, mas fica +basicamente no "não gostaram".

+

É interessante para se ter uma visão da questão política-diplomática do +Uruguai nos tempos de Mujica, mas muito pouco para se ter uma visão diferente +do "presidente pobre", como os grandes meios projetaram Mujica.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/mussum-forevis-samba-me-e-trapalhoes/index.html b/public/pt/reviews/books/mussum-forevis-samba-me-e-trapalhoes/index.html new file mode 100644 index 0000000..5983d1d --- /dev/null +++ b/public/pt/reviews/books/mussum-forevis-samba-me-e-trapalhoes/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mussum Forévis: Samba, mé e trapalhões - Juliano Barreto

+ +

Resumo GoodReads: +Antonio Carlos Bernardes Gomes, mais conhecido como Mussum, é um dos mais +amados humoristas brasileiros. Mas você sabia que ele também era sambista? E +que era torcedor fanático da Mangueira? E que serviu a Aeronáutica? Mussum é +cultuado inclusive por quem não teve a oportunidade de vê-lo junto a Didi, +Dedé e Zacarias no saudoso programa Os Trapalhões. Mussum forévis, a primeira +biografia deste ídolo e artista multifacetado traz detalhes não só sobre sua +carreira na TV, mas como músico em conjuntos como Os 7 Modernos e Os originais +do samba. Este último inclusive costumava se apresentar como banda de apoio de +artistas do porte de Elis Regina, Jorge Ben, Jair Rodrigues, Martinho da Vila +e Baden Powell.

+
+ ★★★★☆ +
+

Esse foi um livro que eu comprei, inicialmente, simplesmente porque estava em +promoção. No entanto, há tanta informação histórica no conteúdo que eu posso +afirmar, categoricamente, que foi uma das minhas melhores compras.

+

Seguindo a história de Antônio Carlos Bernardes Gomes, o conhecido Mussum, o +livro explora desde a infância nas ruas do futuro humorista, passando por seu +período de cadete militar (na aeronáutica), cobrindo a parte de sambista +integrante de Os Originais do Samba e concluindo com a morte do humorista, +parte integrante de Os Trapalhões.

+

Não apenas focando na pessoa-título, o livro também mostra a cena cultural e +política desde os anos 50, quando Mussum passou a fazer parte dos Originais do +Samba até o período em que era figurinha certa nos filmes dos Trapalhões. +Obviamente, isso faz com que o livro se torne maior do que o necessário -- +alguns pontos são interessantes, mas não necessariamente ligados à vida de +Antônio Carlos -- mas nem por isso o conteúdo deixa de ser informativo.

+

PS: Acabei esquecendo de mencionar: A forma como o livro foi escrito é de uma +acessibilidade tão grande que eu consegui ler todas as 440 páginas em apenas 3 +dias.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/nos-bastidores-da-coca-cola/index.html b/public/pt/reviews/books/nos-bastidores-da-coca-cola/index.html new file mode 100644 index 0000000..7124b46 --- /dev/null +++ b/public/pt/reviews/books/nos-bastidores-da-coca-cola/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Nos Bastidores da Coca-Cola - Neville Isdell

+ +

Resumo GoodReads: +A Coca-Cola é a marca mais reconhecida e próspera do mundo, cruzando +fronteiras geográficas, linguísticas e culturais. A história da criação, do +marketing e da recriação da marca é contada pela primeira vez por um executivo +da própria companhia. Um homem cuja carreira de mais de quarenta anos o levou +a viajar o mundo inteiro e a escalar da base até o topo da pirâmide.

+
+ ★★☆☆☆ +
+

O grande problema com biografias -- ou apresentações de história na primeira +pessoa -- é que é esperado que a pessoa conte sobre o que o autor sentiu; caso +contrário, tudo se torna tão impessoal que o mesmo parece uma ficção.

+

Em Always Looking Up: The Adventures of an Incurable Optimist, Neil Peart +soa impessoal e começa a cair nessa categoria de "parece ficção", mas junto +com o livro estão as cartas enviadas a um amigo, o que o trás de volta para o +lado humano. Em "Nos Bastidores da Coca-Cola", Neville Isdell nunca fala de +como se sente, e deixa uma sensação tão grande de "desumanidade" que até +quando fala da esposa, parece que o único mérito da mesma é que ela o apoiou.

+

Existem alguns casos interessantes de história mesmo, mas a narrativa se torna +cansativa pois a visão do autor é sempre de que o mesmo resolveu o problema e, +mais pra frente, houveram mais pessoas envolvidas. Foi sempre ele quem +resolveu o problema, não o grupo. Sempre no singular.

+

E o último capítulo não fala nada de Coca-Cola. Trata-se de sua visão de +economia, da qual a Coca-Cola sequer faz parte.

+

Com relação à tradução: Embora a tradução tenha se preocupado em fazer um +livro bom de ler, peca-se horrendamente quando se fala da Coca-Cola. Algumas +vezes é "Coca-Cola", outras é "Coke". Poderia ser que uma refere-se à bebida e +a outra à empresa (ou vice-versa), mas não. É como se o tradutor -- ou mesmo o +autor, nesse ponto -- não consiga ter uma visão do que é uma e o que é a +outra.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/o-heroi-de-mil-faces/index.html b/public/pt/reviews/books/o-heroi-de-mil-faces/index.html new file mode 100644 index 0000000..8195d5c --- /dev/null +++ b/public/pt/reviews/books/o-heroi-de-mil-faces/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O Herói de Mil Faces - Joseph Campbell

+ +

Resumo GoodReads: +Apolo, Thor, Buda e outros numerosos protagonistas das religiões, mitologias, +contos de fada e do folclore universal representam simultaneamente as várias +fases de uma mesma história. O relacionamento entre seus símbolos intemporais +e os detectados nos sonhos pela moderna psicologia profunda é o ponto de +partida da interpretação oferecida por Joseph Campbell reconhecidamente, um +dos maiores estudiosos e mais profundos intérpretes da mitologia universal, +neste clássico obrigatório para compreender esse monomito que é a jornada do +herói.

+
+ ★☆☆☆☆ +
+

Vou admitir que o livro ganhou de mim. Desisti de continuar lendo depois de +chegar na metade.

+

Não que o conceito de um monomito não fosse interessante o suficiente para ler +o livro até o final. Campbell ainda faz a questão ser mais interessante +ligando os pontos e conceitos do monomito com questões sociais e psicológicas +reais.

+

Acontece que Campbell, para provar seu ponto, basea-se em mitos não comuns ao +ocidente. Se o monomito fosse 100% correto, não importaria a origem do mito, +haveriam interligações com mitos conhecidos daqui; entretanto, 95% dos mitos +citados são orientais, não difundidos: mitos japoneses (nada como Musashi), +muçulmanos, africanos, aborígenes (da Austrália)... O que levanta a questão de +quão difundido é o mito ou, caso você esteja usando o "chapéu de ceticismo", +se o mito realmente existe ou se Campbell criou apenas para provar um ponto.

+

Mitos como os gregos conhecidos -- Hércules e seus 12 trabalhos, por exemplo +-- não são falados; Buda aparece, mas em coisas que apenas um budista +conheceria; Jesus aprece de relance... Tudo isso torna difícil acreditar que +os pontos são reais.

+

Os pontos em si são complexos de serem explicados, justamente por causa da +base psicológica e sociológica presente. Nesse ponto é onde surge um mito não +popular que deve ser contado. E assim você está lendo 4 páginas já sobre um +mito e esqueceu completamente o ponto que o autor queria chegar. Ou então é +apenas uma continuação de um mito começado dois capítulos atrás, que você já +esqueceu os pormenores que fazem com que o ponto faça sentido.

+

Ainda: O texto original é de 1949, um tempo em que escrever bem significava +escrever muito. Existem parágrafos gigantescos de uma frase só e páginas +inteiras que são apenas um parágrafo. A tradução de 1989 não ajuda nem um +pouco e a combinação dos dois simplesmente te faz perguntar o que diabos o +autor e o tradutor fumaram durante seus trabalhos.

+

O monomito parece ser realmente correto, mas para isso existem filmes de 3 +minutos que conseguem explicar todos os pontos de forma sucinta e com mitos +comuns hoje. Veja os filmes e esqueça o livro.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/o-principe/index.html b/public/pt/reviews/books/o-principe/index.html new file mode 100644 index 0000000..7ee43ab --- /dev/null +++ b/public/pt/reviews/books/o-principe/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O Príncipe - Niccolò Machiavelli

+ +

Resumo GoodReads: +O Príncipe é um livro que não sai de moda. Mais do que um best-seller, ele é +um clássico. Surgem novas edições e grandes estadistas encontram nesta obra +suas virtudes literárias e estratégicas. Silvio Berlusconi, presidente do +Conselho de Ministros da República italiana, apresentava assim esta obra, ao +dá-la como presente de Natal para amigos e colaboradores em 1992: "O Príncipe +é o primeiro clássico do pensamento político moderno, referência durante +gerações para estadistas e diplomatas. A obra foi concebida como um conjunto +de reflexões do autor sobre a arte de conquistar e conservar o poder em um +principado."

+
+ ★★★☆☆ +
+

Esse é o livro que gerou a expressão "maquiavélico" (e seus derivados). Eu +acredito que a parte inicial do mesmo, em que Maquiavel aponta que o livro é +um presente para um novo príncipe, foi cortada dessa edição, mas posso estar +enganado.

+

Um dos problemas dessa tradução -- mas que é explicado logo na introdução do +livro -- é que, por ser baseado num texto em italiano antigo, o mesmo foi +traduzido para um português mais rebuscado (praticamente um barroco). Algumas +partes são excruciantes de ler.

+

Fora isso, O Príncipe fala muito de como manter o poder a qualquer custo. E é +impossível não ler e não pensar em vários políticos nacionais brasileiros, que +aparentemente seguem o livrinho a risca.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/pense-como-um-freak/index.html b/public/pt/reviews/books/pense-como-um-freak/index.html new file mode 100644 index 0000000..6297e49 --- /dev/null +++ b/public/pt/reviews/books/pense-como-um-freak/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pense Como Um Freak - Steven D. Levitt

+ +

Resumo GoodReads: +The New York Times bestselling Freakonomics changed the way we see the world, +exposing the hidden side of just about everything. Then came +SuperFreakonomics, a documentary film, an award-winning podcast, and more.

+

Now, with Think Like a Freak, Steven D. Levitt and Stephen J. Dubner have +written their most revolutionary book yet. With their trademark blend of +captivating storytelling and unconventional analysis, they take us inside +their thought process and teach us all to think a bit more productively, more +creatively, more rationally—to think, that is, like a Freak.

+
+ ★★★★★ +
+

"Pense como um freak" é mais um dos livros da série do Freakonomics, onde +coisas aparentemente sem conexão são mostradas como possíveis correlações.

+

Nesse livro, Levitt e Dubner explicam algumas das "técnicas" que usam tanto +para detectar coisas sem conexões óbvias como para explicar os resultados +depois.

+

E, obviamente, não poderiam faltar as conclusões mostrando que coisas +aparentemente sem conexão na verdade estão relacionadas.

+

A parte interessante é que o livro termina nos 70%. Os demais 30% são +divididos entre um índice gigantesco de assuntos abordados e a lista de +referências utilizadas para chegarem as conclusões apresentadas.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/poder-manipulacao-como-entender-o-mundo-em-vinte-licoes-extraidas-de-o-principe-de-maquiavel/index.html b/public/pt/reviews/books/poder-manipulacao-como-entender-o-mundo-em-vinte-licoes-extraidas-de-o-principe-de-maquiavel/index.html new file mode 100644 index 0000000..222ee6a --- /dev/null +++ b/public/pt/reviews/books/poder-manipulacao-como-entender-o-mundo-em-vinte-licoes-extraidas-de-o-principe-de-maquiavel/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Poder & Manipulação: Como entender o mundo em vinte lições extraídas de "O Príncipe", de Maquiavel - Jacob Pétry

+ +

GoodReads Summary: +Nesta edição, fruto de um trabalho único na história, os ensinamentos de +Maquiavel se tornam mais relacionados ao mundo atual. "Poder & Manipulação" +não é simplesmente uma nova tradução, mas uma edição da obra original, tal +como seria se ela estivesse sendo publicada agora, pela primeira vez, focada +nos temas perenes, relevantes ao mundo de hoje. E vai além: inclui uma análise +objetiva das vinte estratégias mais importantes do clássico. Ao compreender +estas lições, o leitor estará mais bem preparado para defender-se das pessoas +manipuladoras e de posse de ferramentas para agir com mais segurança, ousadia +e astúcia diante da vida.

+
+ ★★☆☆☆ +
+

"O Príncipe" é, basicamente, um livro para perder a fé na humanidade. Tudo se +relaciona com o poder e como mantê-lo; como convencer os outros de que você é +a resposta certa e os demais estão raros -- uma fato que, se olhar as figuras +que tem aparecido no final de 2016, torna-se contuendemente óbvias, utilizando +os princípios "maquiavélicos" para se propagar na atmosfera política.

+

Entretanto, esse livro não é O Príncipe. Esse livro é uma análise sobre O +Príncipe. E embora a escolha de trechos tenha sido muito interessante, a +análise fica devendo muito para com o conteúdo. Enquanto o príncipe fala, por +exemplo, como a Alemanha se manteve unida, pronta pra guerra e adorando seu +líder, a análise resolve falar de... pessoas tímidas? O que é que A tem a ver +com B?

+

De novo, O Príncipe parece ser, pelos trechos escolhidos, bem interessante. A +análise, conteúdo desse livro, no entanto, parece se referenciar a algo +completamente diferente.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/quatro-herois-e-um-bardo-contra-a-realidade-medieval/index.html b/public/pt/reviews/books/quatro-herois-e-um-bardo-contra-a-realidade-medieval/index.html new file mode 100644 index 0000000..ec1214a --- /dev/null +++ b/public/pt/reviews/books/quatro-herois-e-um-bardo-contra-a-realidade-medieval/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Quatro Heróis e um Bardo contra a Realidade Medieval - Rodrigo Assis Mesquita

+ +

Resumo GoodReads: +O que têm em comum um cavaleiro, um bárbaro, um mago, uma valquíria e um +bardo? Acompanhe Derick, Roderick, Broderick, Brigitte e Macedo tentando +começar uma típica aventura de resgate da Princesa, regada, se possível, a +cerveja, não hidromel.

+
+ ★☆☆☆☆ +
+

Ok, não é nem um "livro", mas apenas uma história curta de quatro páginas. +Mesmo assim, não consegue chegar no ponto onde a coisa fica realmente +interessante.

+

Basicamente, uma mistura de jogos de RPG com... eu queria dizer Monty Python, +mas as absurdices que acontecem não são do nível Monty Python, sendo muito +mais cruas e sem sentido, ao ponto que a parte engraçada se perde +completamente -- ok, tem uma absurdice que é realmente engraçada, mas +ela é jogada de forma tão direta e vindo tão do nada que a piada se perde +completamente.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/rin-tin-tin-a-vida-e-a-lenda/index.html b/public/pt/reviews/books/rin-tin-tin-a-vida-e-a-lenda/index.html new file mode 100644 index 0000000..4361c4a --- /dev/null +++ b/public/pt/reviews/books/rin-tin-tin-a-vida-e-a-lenda/index.html @@ -0,0 +1,145 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rin Tin Tin: A Vida e a Lenda - Susan Orlean

+ +

Resumo GoodReads: +Ele achava que o cão era imortal. Assim começa a vasta, poderosa e comovente +narrativa de Susan Orlean sobre a jornada de Rin Tin Tin – de sobrevivente +órfão a astro do cinema e ícone internacional do showbiz. Suzan, redatora da +New Yorker chamada de “patrimônio nacional” pelo Washington Post, passou cerca +de dez anos pesquisando e escrevendo sua mais cativante obra: a história de um +cão que nasceu em 1918 e nunca morreu. A narrativa começa num campo de batalha +francês da Primeira Guerra Mundial, quando Lee Duncan, um jovem soldado +americano, descobre um sobrevivente: um pastor-alemão recém-nascido nas ruínas +de um canil bombardeado. Para Duncan, que passou parte da infância num +orfanato, a sobrevivência do cão fora um milagre. Havia algo em Rin Tin Tin +que o compelia a compartilhá-lo com o mundo. Duncan o levou, então, para a +Califórnia, onde suas aptidões físicas e a capacidade de representar chamaram +a atenção da Warner Bros. Durante os dez anos seguintes, Rinty estrelou 23 +sucessos do cinema mudo que salvaram o estúdio da falência e fizeram dele o +cão mais famoso de todos os tempos. No auge da popularidade, Rin Tin Tin foi o +campeão de bilheteria de Hollywood. Ao longo das décadas seguintes, Rinty e +seus descendentes fizeram a conturbada jornada do cinema mudo ao falado, do +preto e branco à cor, do rádio à televisão, culminando no seriado de TV As +Aventuras de Rin-Tin-Tin, um dos mais populares programas da época do baby +boom. O legado do cão herói foi consolidado por Duncan e alguns outros – como +Bert Leonard, o produtor do seriado da TV, e Daphne Hereford, a proprietária +do atual Rin Tin Tin –, que dedicaram a vida para assegurar a imortalidade da +lenda. Na essência de Rin Tin Tin – a Vida e a Lenda há um tocante estudo do +duradouro vínculo entre os humanos e os animais. Mas o livro é também uma +história ricamente matizada da indústria do entretenimento e do +empreendedorismo no século XX. Abarcando um período de 90 anos, ele aborda a +mudança de status dos cães, de ajudantes em fazendas a membros diletos das +famílias urbanas, da origem do treinamento para a obediência à evolução +genética das raças, da ascensão de Hollywood ao passado e presente dos cães de +guerra. Rico de humor e emoção, repleto de momentos que certamente levarão o +leitor às lágrimas, Rin Tin Tin fez parte da prestigiadíssima lista dos 100 +MELHORES LIVROS DO ANO do New York Times, principalmente por ser uma mescla +irresistível de história, humanismo e maestria narrativa – esplêndida +celebração de um grande ícone universal por uma das mais talentosas escritoras +da atualidade.

+
+ ★★★☆☆ +
+

Aviso: Eu nunca fui um fã de Rin Tin Tin, até porque nunca acompanhei nenhuma +das séries. Mas como "cachorreiro", me senti obrigado a pegar esse livro, até +porque estava em promoção.

+

Embora pareça que o livro irá tratar do cachorro, o contexto geral são "coisas +ao redor do primeiro cachorro chamado Rin Tin Tin, que fez alguns filmes mudos +e depois teve uma série de TV" -- até porque a parte da vida termina antes da +metade do livro.

+

Um dos problemas do livro é que a autora fica, boa parte do tempo, +conjecturando sobre o "produto" (por assim dizer) Rin Tin Tin do que focando +nos personagens. Boa parte do livro parece uma reportagem de jornal estendida +para ficar do tamanho de um livro. Também -- e aqui vou me valer do mesmo +artifício e dar a minha opinião -- o livro carece um monte de imagens: para um +produto visual (afinal de contas, 4 filmes e um seriado são visuais), algumas +fotos dos Rin Tin Tins e seus coadjuvantes ajudaria a trazer o cachorro em +evidência ao invés de ficar no produto metafísico "Rin Tin Tin".

+

No fim, ao invés de focar no cachorro, como esperado, o livro se foca no +produto e seus coadjuvantes, deixando a impressão de que tudo não passou parte +de um roteiro dentro do roteiro.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/scrum-a-arte-de-fazer-o-dobro-de-trabalho-na-metade-do-tempo/index.html b/public/pt/reviews/books/scrum-a-arte-de-fazer-o-dobro-de-trabalho-na-metade-do-tempo/index.html new file mode 100644 index 0000000..cf3ca8d --- /dev/null +++ b/public/pt/reviews/books/scrum-a-arte-de-fazer-o-dobro-de-trabalho-na-metade-do-tempo/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Scrum: A arte de fazer o dobro de trabalho na metade do tempo - Jeff Sutherland

+ +

Resumo GoodReads: +Se você já foi surpreendido por quão rápido o mundo está mudando, Scrum é uma +das razões. Para aqueles que acreditam que deve haver uma maneira mais +eficiente de se fazer as coisas, este é um livro sobre o processo de gestão +que está mudando a maneira como vivemos. Desde o advento do método, já foram +registrados ganhos de produtividade de até 1.200%. Tecida com insights de +artes marciais, tomadas de decisão judicial, combate aéreo avançado, robótica +e muitas outras disciplinas, Scrum é sempre fascinante. Seja para inventar uma +tecnologia pioneira ou para estabelecer os alicerces de prosperidade de uma +família.

+
+ ★★★★★ +
+

Aviso: Eu já conhecia o Scrum de usar o mesmo para desenvolvimento, então +certas partes já eram conhecidas. Entretanto, mesmo nesse caso, para quem já +conhece a metodologia, saber o porquê de certas coisas é um bocado +interessante.

+

O começo é meio devagar, pois Sutherland fala muito de sua vida e como chegou +a pensar no Scrum. Não há qualquer informação de como funciona, como proceder +ou até mesmo o porquê. Pelo terceiro capítulo é que as bases do Scrum começam +a ser comentadas e aí é que a coisa faz sentido.

+

O final também é um pouco de história: ao invés de continuar a explicar +exatamente como funciona o scrum (ou, de novo, os seus porquês), há uma lista +de projetos que usam Scrum e que não são relacionados com TI. Embora seja +interessante saber que há projetos desse tipo usando a metodologia, o mesmo se +torna um pouco cansativo pois, mais uma vez, não foca no scrum em si.

+

Junto com os porquês, há, no final de cada capítulo, um pequeno resumo, que +ajuda a entender melhor o processo e serve como consulta rápida na futuro. O +apêndice final inclui um "Como aplicar o Scrum" que explica de forma resumida +o passo a passo de iniciar um projeto scrum, com indicadores de onde encontrar +maiores informações dentro do próprio livro. Ou seja, o livro não serve apenas +como um "como aprender scrum", mas também possui informações suficientes para +servir de referência futura.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/tecnicas-de-memorizacao-para-estudantes-porque-voce-pode-ir-alem/index.html b/public/pt/reviews/books/tecnicas-de-memorizacao-para-estudantes-porque-voce-pode-ir-alem/index.html new file mode 100644 index 0000000..30c47e8 --- /dev/null +++ b/public/pt/reviews/books/tecnicas-de-memorizacao-para-estudantes-porque-voce-pode-ir-alem/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Tecnicas de Memorizacao Para Estudantes: Porque Voce Pode IR Alem - Rodrigo Vargas

+ +

GoodReads Summary: +Cansado de estudar...estudar...e na hora da prova dar branco? Pois e...Eu +mesmo passei por isso diversas vezes na minha vida estudantil. Mas essa +experiencia me proporcionou a oportunidade de pesquisar e buscar entender o +processo da memorizacao e as tecnicas que podem fixar com muito mais qualidade +e eficacia o conteudo da materia estudada. Isto resultou no primeiro livro, +ainda em 1993, e de la para ca, a edicao foi revista e ampliada. Eu realmente +gostaria de ter tido acesso a essas informacoes quando era estudante. Mas +voce, hoje, tem essa informacao disponivel. Faca como milhares de outros +estudantes e conheca essas tecnicas simples e eficazes, para melhorar sua +capacidade de memorizacao.

+
+ ★★☆☆☆ +
+

É difícil fazer um review de um livro de memorização sem ter algo para +memorizar no momento, mas enfim...

+

O livro trás três técnicas para memorizar coisas: reler, utilizar mnemônicos e +associação de imagens mentais. Nenhuma delas é explorada a fundo (mnemônicos +até nem precisa tanto) e 50% do livro é perdido falando como descobrir o dia +da semana de qualquer ano.

+

Simples, direto e superficial. É como preciso descrever esse livro.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/books/turing-e-o-computador-em-90-minutos/index.html b/public/pt/reviews/books/turing-e-o-computador-em-90-minutos/index.html new file mode 100644 index 0000000..df1e6db --- /dev/null +++ b/public/pt/reviews/books/turing-e-o-computador-em-90-minutos/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Turing e o Computador em 90 minutos - Paul Strathern

+ +

Resumo GoodReads: +Sem dúvida o computador é um dos maiores feitos do século XX. Mas quantos de +nós sabemos como ele funciona? E quantos conhecem Alan Turing, pioneiro no +desenvolvimento do computador e que ajudou a decifrar os códigos Enigma +durante a II Guerra? Esse livro é um delicioso instantâneo de Turing e dos +progressos da computação.

+
+ ★★★☆☆ +
+

(Em 90 minutos ou um pouco mais, no meu caso).

+

Turing sempre foi uma figura representativa na informática: sabe-se que boa +parte das suas conjecturas são o que tornaram os computadores o que são (a boa +definição de "máquina de Turing") e seus questionamentos continuam sendo +questinamentos válidos (ainda o "teste de Turing"). E conhece-se que seu +trabalho na sua máquina acabou resolvendo o problema de decifrar o Enigma, a +máquina criptográfica utilizada pelos nazistas. E sabe-se que foi preso e +sofreu castração química por ser homossexual.

+

Isso tudo pode ser visto, inclusive, no cinema.

+

Mas nem a apresentação feita nas faculdades nem o filme mostram exatamente o +que estava acontencendo: Os avanços da época por Pascal, Schickard, Leibniz, +Jacquard, Babbage e Boole; a construção do MADAM -- cuja existência nunca é +contada por causa do ENIAC; a aparência de Turing (cuja descrição deixa a +entender que sua foto clássica de cabelos cortados e barba feita era uma +anomalia); seu comportamento promíscuo, em que saída a noite para procura de +novos jovens homossexuais... Essas partes são contadas no livro em questão, +que é um resumo do livro escrito por Andrew Hodges.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/index.html b/public/pt/reviews/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/reviews/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/reviews/movies/bacurau/index.html b/public/pt/reviews/movies/bacurau/index.html new file mode 100644 index 0000000..4730152 --- /dev/null +++ b/public/pt/reviews/movies/bacurau/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Bacurau (2019)

+ +

Resumo da Wikipedia: +Num futuro próximo, Bacurau, uma pequena cidade brasileira no oeste de +Pernambuco, lamenta a perda de sua matriarca, Carmelita (Lia de Itamaracá), que +viveu até os 94 anos. Dias depois, seus habitantes aos poucos percebem algo +estranho acontecer na região.

+
+ ★★★★☆ +
+

Quando comecei a ver o filme, já fui avisado: "É estranho". E é, mas isso +funciona a favor do filme.

+

No meio do filme, fiquei com a impressão que eu estava vendo a versão nacional +de "O Alvo", com a diferença que +ao invés dos caçadores serem pessoas ricas, agora são estrangeiros -- e, com +nosso espírito de "vira latas", óbvio que eles fazem o que querem aqui.

+

No meio do filme, fui conferir a Wikipedia (em inglês) e a mesma cita o filme +como sendo "Weird Western". E sim, faz todo sentido: O "pueblo" pobre, mas que +sobrevive sozinho, os homens poderosos que vêem as pessoas do pueblo como algo +a ser utilizado e/ou apenas um entrave. E, por cima, como as pessoas do pueblo +são simplórias.

+

E, estranhamente, essa "simploriedade" funciona bem até mesmo para a história. +Logo no começo, aparece uma "nave espacial" voando, e um dos "simplórios" vê e +fica abismado. Nesse ponto é que a gente começa a se perguntar "mas o que +diabos?"

+

E essa visão, de novo, trabalha a favor do filme. Num momento mais tarde, esse +personagem fala para outro: "Olha, o pessoal tá andando por aí com um drone. +Fica de olho." A visão da simploriedade, de repente, é desfeita nesse momento e +toda a visão de "vira lata" é desfeita. Sim, é um pueblo; sim, as pessoas levam +uma vida simples; sim, os estrangeiros parecem mais "modernos". E não, isso não +os deixa superiores aos moradores do pueblo.

+

E essa visão, esquisita até, é que é o ponto importante do filme. Essa +esquisitice de apresentar de forma simplória e não ser simplório é que dá a +virada inteira do filme.

+

A única coisa que eu tenho que perguntar é: mas precisamos de um western? É +claro que vemos Clint Eastwood defendendo pueblos e achamos o máximo, e nosso +nordeste é recheado de cidades pueblos, mas será que precisamos explorar isso +usando conceitos que nos são... Estrangeiros?

+ + +
+ + + + +
+ + + + diff --git a/public/pt/reviews/movies/index.html b/public/pt/reviews/movies/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/reviews/movies/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/tags/1password/index.html b/public/pt/tags/1password/index.html new file mode 100644 index 0000000..bb2fdf9 --- /dev/null +++ b/public/pt/tags/1password/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

1password

+ + + +
+ + + + diff --git a/public/pt/tags/acessibilidade/index.html b/public/pt/tags/acessibilidade/index.html new file mode 100644 index 0000000..33a17be --- /dev/null +++ b/public/pt/tags/acessibilidade/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

acessibilidade

+ + + +
+ + + + diff --git a/public/pt/tags/activitypub/index.html b/public/pt/tags/activitypub/index.html new file mode 100644 index 0000000..4a0ee3b --- /dev/null +++ b/public/pt/tags/activitypub/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

activitypub

+ + + +
+ + + + diff --git a/public/pt/tags/actor-model/index.html b/public/pt/tags/actor-model/index.html new file mode 100644 index 0000000..ca24dbd --- /dev/null +++ b/public/pt/tags/actor-model/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

actor model

+ + + +
+ + + + diff --git a/public/pt/tags/agil/index.html b/public/pt/tags/agil/index.html new file mode 100644 index 0000000..1c6da76 --- /dev/null +++ b/public/pt/tags/agil/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ágil

+ + + +
+ + + + diff --git a/public/pt/tags/agpl/index.html b/public/pt/tags/agpl/index.html new file mode 100644 index 0000000..362b681 --- /dev/null +++ b/public/pt/tags/agpl/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

agpl

+ + + +
+ + + + diff --git a/public/pt/tags/alan-turing/index.html b/public/pt/tags/alan-turing/index.html new file mode 100644 index 0000000..4964690 --- /dev/null +++ b/public/pt/tags/alan-turing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alan turing

+ + + +
+ + + + diff --git a/public/pt/tags/algoritmos/index.html b/public/pt/tags/algoritmos/index.html new file mode 100644 index 0000000..bdf7ab0 --- /dev/null +++ b/public/pt/tags/algoritmos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

algoritmos

+ + + +
+ + + + diff --git a/public/pt/tags/android/index.html b/public/pt/tags/android/index.html new file mode 100644 index 0000000..3f2441d --- /dev/null +++ b/public/pt/tags/android/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

android

+ + + +
+ + + + diff --git a/public/pt/tags/antonio-j-mendez/index.html b/public/pt/tags/antonio-j-mendez/index.html new file mode 100644 index 0000000..777619a --- /dev/null +++ b/public/pt/tags/antonio-j-mendez/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

antonio j. mendez

+ + + +
+ + + + diff --git a/public/pt/tags/apache/index.html b/public/pt/tags/apache/index.html new file mode 100644 index 0000000..10846dc --- /dev/null +++ b/public/pt/tags/apache/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apache

+ + + +
+ + + + diff --git a/public/pt/tags/apple/index.html b/public/pt/tags/apple/index.html new file mode 100644 index 0000000..f006648 --- /dev/null +++ b/public/pt/tags/apple/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apple

+ + + +
+ + + + diff --git a/public/pt/tags/area-de-transferencia/index.html b/public/pt/tags/area-de-transferencia/index.html new file mode 100644 index 0000000..1117911 --- /dev/null +++ b/public/pt/tags/area-de-transferencia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

área de transferência

+ + + +
+ + + + diff --git a/public/pt/tags/arm/index.html b/public/pt/tags/arm/index.html new file mode 100644 index 0000000..1704570 --- /dev/null +++ b/public/pt/tags/arm/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arm

+ + + +
+ + + + diff --git a/public/pt/tags/armazenamento/index.html b/public/pt/tags/armazenamento/index.html new file mode 100644 index 0000000..0432790 --- /dev/null +++ b/public/pt/tags/armazenamento/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

armazenamento

+ + + +
+ + + + diff --git a/public/pt/tags/arquitetura-de-software/index.html b/public/pt/tags/arquitetura-de-software/index.html new file mode 100644 index 0000000..a089ff8 --- /dev/null +++ b/public/pt/tags/arquitetura-de-software/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arquitetura de software

+ + + +
+ + + + diff --git a/public/pt/tags/arquitetura/index.html b/public/pt/tags/arquitetura/index.html new file mode 100644 index 0000000..a476415 --- /dev/null +++ b/public/pt/tags/arquitetura/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arquitetura

+ + + +
+ + + + diff --git a/public/pt/tags/artefatos/index.html b/public/pt/tags/artefatos/index.html new file mode 100644 index 0000000..e33a636 --- /dev/null +++ b/public/pt/tags/artefatos/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

artefatos

+ + + +
+ + + + diff --git a/public/pt/tags/ashlee-vance/index.html b/public/pt/tags/ashlee-vance/index.html new file mode 100644 index 0000000..66f7c83 --- /dev/null +++ b/public/pt/tags/ashlee-vance/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ashlee vance

+ + + +
+ + + + diff --git a/public/pt/tags/auto-cura/index.html b/public/pt/tags/auto-cura/index.html new file mode 100644 index 0000000..078a30d --- /dev/null +++ b/public/pt/tags/auto-cura/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

auto cura

+ + + +
+ + + + diff --git a/public/pt/tags/bash/index.html b/public/pt/tags/bash/index.html new file mode 100644 index 0000000..ea1de04 --- /dev/null +++ b/public/pt/tags/bash/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bash

+ + + +
+ + + + diff --git a/public/pt/tags/biblioteca/index.html b/public/pt/tags/biblioteca/index.html new file mode 100644 index 0000000..41e61ed --- /dev/null +++ b/public/pt/tags/biblioteca/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

biblioteca

+ + + +
+ + + + diff --git a/public/pt/tags/binario/index.html b/public/pt/tags/binario/index.html new file mode 100644 index 0000000..eb95d46 --- /dev/null +++ b/public/pt/tags/binario/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

binário

+ + + +
+ + + + diff --git a/public/pt/tags/biografia/index.html b/public/pt/tags/biografia/index.html new file mode 100644 index 0000000..bc0dcd0 --- /dev/null +++ b/public/pt/tags/biografia/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

biografia

+ + + +
+ + + + diff --git a/public/pt/tags/biography/index.html b/public/pt/tags/biography/index.html new file mode 100644 index 0000000..626820f --- /dev/null +++ b/public/pt/tags/biography/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

biography

+ + + +
+ + + + diff --git a/public/pt/tags/blog/index.html b/public/pt/tags/blog/index.html new file mode 100644 index 0000000..0fddeee --- /dev/null +++ b/public/pt/tags/blog/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

blog

+ + + +
+ + + + diff --git a/public/pt/tags/book/index.html b/public/pt/tags/book/index.html new file mode 100644 index 0000000..a1c38d5 --- /dev/null +++ b/public/pt/tags/book/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

book

+ + + +
+ + + + diff --git a/public/pt/tags/books/index.html b/public/pt/tags/books/index.html new file mode 100644 index 0000000..81d3c8f --- /dev/null +++ b/public/pt/tags/books/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

books

+ + + +
+ + + + diff --git a/public/pt/tags/branches/index.html b/public/pt/tags/branches/index.html new file mode 100644 index 0000000..73176c7 --- /dev/null +++ b/public/pt/tags/branches/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

branches

+ + + +
+ + + + diff --git a/public/pt/tags/bsd/index.html b/public/pt/tags/bsd/index.html new file mode 100644 index 0000000..5c5a99b --- /dev/null +++ b/public/pt/tags/bsd/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bsd

+ + + +
+ + + + diff --git a/public/pt/tags/build/index.html b/public/pt/tags/build/index.html new file mode 100644 index 0000000..42845d4 --- /dev/null +++ b/public/pt/tags/build/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

build

+ + + +
+ + + + diff --git a/public/pt/tags/builder-pattern/index.html b/public/pt/tags/builder-pattern/index.html new file mode 100644 index 0000000..4fedb97 --- /dev/null +++ b/public/pt/tags/builder-pattern/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

builder pattern

+ + + +
+ + + + diff --git a/public/pt/tags/builder/index.html b/public/pt/tags/builder/index.html new file mode 100644 index 0000000..cb2240b --- /dev/null +++ b/public/pt/tags/builder/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

builder

+ + + +
+ + + + diff --git a/public/pt/tags/c/index.html b/public/pt/tags/c/index.html new file mode 100644 index 0000000..ac8b660 --- /dev/null +++ b/public/pt/tags/c/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

c

+ + + +
+ + + + diff --git a/public/pt/tags/cameras/index.html b/public/pt/tags/cameras/index.html new file mode 100644 index 0000000..56976ee --- /dev/null +++ b/public/pt/tags/cameras/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

câmeras

+ + + +
+ + + + diff --git a/public/pt/tags/cargo-cult/index.html b/public/pt/tags/cargo-cult/index.html new file mode 100644 index 0000000..bbaf7f8 --- /dev/null +++ b/public/pt/tags/cargo-cult/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cargo cult

+ + + +
+ + + + diff --git a/public/pt/tags/carl-jung/index.html b/public/pt/tags/carl-jung/index.html new file mode 100644 index 0000000..1cd9c41 --- /dev/null +++ b/public/pt/tags/carl-jung/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

carl jung

+ + + +
+ + + + diff --git a/public/pt/tags/carregador/index.html b/public/pt/tags/carregador/index.html new file mode 100644 index 0000000..b3930a8 --- /dev/null +++ b/public/pt/tags/carregador/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

carregador

+ + + +
+ + + + diff --git a/public/pt/tags/cd/index.html b/public/pt/tags/cd/index.html new file mode 100644 index 0000000..7d1400f --- /dev/null +++ b/public/pt/tags/cd/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cd

+ + + +
+ + + + diff --git a/public/pt/tags/ceo/index.html b/public/pt/tags/ceo/index.html new file mode 100644 index 0000000..665d01a --- /dev/null +++ b/public/pt/tags/ceo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ceo

+ + + +
+ + + + diff --git a/public/pt/tags/chassi/index.html b/public/pt/tags/chassi/index.html new file mode 100644 index 0000000..69b741e --- /dev/null +++ b/public/pt/tags/chassi/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

chassi

+ + + +
+ + + + diff --git a/public/pt/tags/chrome/index.html b/public/pt/tags/chrome/index.html new file mode 100644 index 0000000..1366d9d --- /dev/null +++ b/public/pt/tags/chrome/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

chrome

+ + + +
+ + + + diff --git a/public/pt/tags/ci/index.html b/public/pt/tags/ci/index.html new file mode 100644 index 0000000..3372b17 --- /dev/null +++ b/public/pt/tags/ci/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ci

+ + + +
+ + + + diff --git a/public/pt/tags/cidades/index.html b/public/pt/tags/cidades/index.html new file mode 100644 index 0000000..927fdc5 --- /dev/null +++ b/public/pt/tags/cidades/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cidades

+ + + +
+ + + + diff --git a/public/pt/tags/ciencia/index.html b/public/pt/tags/ciencia/index.html new file mode 100644 index 0000000..179b874 --- /dev/null +++ b/public/pt/tags/ciencia/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ciência

+ + + +
+ + + + diff --git a/public/pt/tags/citacoes/index.html b/public/pt/tags/citacoes/index.html new file mode 100644 index 0000000..9700a04 --- /dev/null +++ b/public/pt/tags/citacoes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

citações

+ + + +
+ + + + diff --git a/public/pt/tags/cli/index.html b/public/pt/tags/cli/index.html new file mode 100644 index 0000000..01fecbc --- /dev/null +++ b/public/pt/tags/cli/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cli

+ + + +
+ + + + diff --git a/public/pt/tags/clientes/index.html b/public/pt/tags/clientes/index.html new file mode 100644 index 0000000..0bc8458 --- /dev/null +++ b/public/pt/tags/clientes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clientes

+ + + +
+ + + + diff --git a/public/pt/tags/clipboard/index.html b/public/pt/tags/clipboard/index.html new file mode 100644 index 0000000..f95a0bd --- /dev/null +++ b/public/pt/tags/clipboard/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clipboard

+ + + +
+ + + + diff --git a/public/pt/tags/cloud/index.html b/public/pt/tags/cloud/index.html new file mode 100644 index 0000000..1f0af3c --- /dev/null +++ b/public/pt/tags/cloud/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cloud

+ + + +
+ + + + diff --git a/public/pt/tags/clovis-de-barros-filho/index.html b/public/pt/tags/clovis-de-barros-filho/index.html new file mode 100644 index 0000000..6ab3313 --- /dev/null +++ b/public/pt/tags/clovis-de-barros-filho/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clovis de barros filho

+ + + +
+ + + + diff --git a/public/pt/tags/coca-cola/index.html b/public/pt/tags/coca-cola/index.html new file mode 100644 index 0000000..c16a2df --- /dev/null +++ b/public/pt/tags/coca-cola/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

coca-cola

+ + + +
+ + + + diff --git a/public/pt/tags/code/index.html b/public/pt/tags/code/index.html new file mode 100644 index 0000000..0c14bbf --- /dev/null +++ b/public/pt/tags/code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

code

+ + + +
+ + + + diff --git a/public/pt/tags/codigo/index.html b/public/pt/tags/codigo/index.html new file mode 100644 index 0000000..81db666 --- /dev/null +++ b/public/pt/tags/codigo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

código

+ + + +
+ + + + diff --git a/public/pt/tags/comandos/index.html b/public/pt/tags/comandos/index.html new file mode 100644 index 0000000..cad37d1 --- /dev/null +++ b/public/pt/tags/comandos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

comandos

+ + + +
+ + + + diff --git a/public/pt/tags/command/index.html b/public/pt/tags/command/index.html new file mode 100644 index 0000000..dd92116 --- /dev/null +++ b/public/pt/tags/command/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

command

+ + + +
+ + + + diff --git a/public/pt/tags/companion-post/index.html b/public/pt/tags/companion-post/index.html new file mode 100644 index 0000000..5510da2 --- /dev/null +++ b/public/pt/tags/companion-post/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

companion post

+ + + +
+ + + + diff --git a/public/pt/tags/conexoes/index.html b/public/pt/tags/conexoes/index.html new file mode 100644 index 0000000..627ed5e --- /dev/null +++ b/public/pt/tags/conexoes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

conexões

+ + + +
+ + + + diff --git a/public/pt/tags/conferencia/index.html b/public/pt/tags/conferencia/index.html new file mode 100644 index 0000000..4114cf0 --- /dev/null +++ b/public/pt/tags/conferencia/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

conferência

+ + + +
+ + + + diff --git a/public/pt/tags/config/index.html b/public/pt/tags/config/index.html new file mode 100644 index 0000000..8b3481f --- /dev/null +++ b/public/pt/tags/config/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

config

+ + + +
+ + + + diff --git a/public/pt/tags/configuracao/index.html b/public/pt/tags/configuracao/index.html new file mode 100644 index 0000000..fe376ae --- /dev/null +++ b/public/pt/tags/configuracao/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

configuração

+ + + +
+ + + + diff --git a/public/pt/tags/contact-tracing/index.html b/public/pt/tags/contact-tracing/index.html new file mode 100644 index 0000000..a8bee54 --- /dev/null +++ b/public/pt/tags/contact-tracing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

contact tracing

+ + + +
+ + + + diff --git a/public/pt/tags/conteineres/index.html b/public/pt/tags/conteineres/index.html new file mode 100644 index 0000000..22c9ab4 --- /dev/null +++ b/public/pt/tags/conteineres/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

conteineres

+ + + +
+ + + + diff --git a/public/pt/tags/copyleft/index.html b/public/pt/tags/copyleft/index.html new file mode 100644 index 0000000..3683ab7 --- /dev/null +++ b/public/pt/tags/copyleft/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

copyleft

+ + + +
+ + + + diff --git a/public/pt/tags/cornice/index.html b/public/pt/tags/cornice/index.html new file mode 100644 index 0000000..b8fa883 --- /dev/null +++ b/public/pt/tags/cornice/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cornice

+ + + +
+ + + + diff --git a/public/pt/tags/dataframes/index.html b/public/pt/tags/dataframes/index.html new file mode 100644 index 0000000..3438475 --- /dev/null +++ b/public/pt/tags/dataframes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dataframes

+ + + +
+ + + + diff --git a/public/pt/tags/datetime/index.html b/public/pt/tags/datetime/index.html new file mode 100644 index 0000000..bb8abb8 --- /dev/null +++ b/public/pt/tags/datetime/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

datetime

+ + + +
+ + + + diff --git a/public/pt/tags/datomic/index.html b/public/pt/tags/datomic/index.html new file mode 100644 index 0000000..fbb45b5 --- /dev/null +++ b/public/pt/tags/datomic/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

datomic

+ + + +
+ + + + diff --git a/public/pt/tags/debito-tecnico/index.html b/public/pt/tags/debito-tecnico/index.html new file mode 100644 index 0000000..c9890cd --- /dev/null +++ b/public/pt/tags/debito-tecnico/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

débito técnico

+ + + +
+ + + + diff --git a/public/pt/tags/deletar/index.html b/public/pt/tags/deletar/index.html new file mode 100644 index 0000000..5bea934 --- /dev/null +++ b/public/pt/tags/deletar/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

deletar

+ + + +
+ + + + diff --git a/public/pt/tags/desenvolvedores/index.html b/public/pt/tags/desenvolvedores/index.html new file mode 100644 index 0000000..6f92c89 --- /dev/null +++ b/public/pt/tags/desenvolvedores/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

desenvolvedores

+ + + +
+ + + + diff --git a/public/pt/tags/design-patterns/index.html b/public/pt/tags/design-patterns/index.html new file mode 100644 index 0000000..be4820e --- /dev/null +++ b/public/pt/tags/design-patterns/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

design patterns

+ + + +
+ + + + diff --git a/public/pt/tags/design/index.html b/public/pt/tags/design/index.html new file mode 100644 index 0000000..e4871e6 --- /dev/null +++ b/public/pt/tags/design/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

design

+ + + +
+ + + + diff --git a/public/pt/tags/dicas/index.html b/public/pt/tags/dicas/index.html new file mode 100644 index 0000000..6086a94 --- /dev/null +++ b/public/pt/tags/dicas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dicas

+ + + +
+ + + + diff --git a/public/pt/tags/distributed/index.html b/public/pt/tags/distributed/index.html new file mode 100644 index 0000000..307d16f --- /dev/null +++ b/public/pt/tags/distributed/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

distributed

+ + + +
+ + + + diff --git a/public/pt/tags/documentacao/index.html b/public/pt/tags/documentacao/index.html new file mode 100644 index 0000000..be57a23 --- /dev/null +++ b/public/pt/tags/documentacao/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

documentação

+ + + +
+ + + + diff --git a/public/pt/tags/eco-sistema/index.html b/public/pt/tags/eco-sistema/index.html new file mode 100644 index 0000000..255ae14 --- /dev/null +++ b/public/pt/tags/eco-sistema/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

eco-sistema

+ + + +
+ + + + diff --git a/public/pt/tags/eli-rodrigues/index.html b/public/pt/tags/eli-rodrigues/index.html new file mode 100644 index 0000000..71e9d93 --- /dev/null +++ b/public/pt/tags/eli-rodrigues/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

eli rodrigues

+ + + +
+ + + + diff --git a/public/pt/tags/elizabeth-mednicoff/index.html b/public/pt/tags/elizabeth-mednicoff/index.html new file mode 100644 index 0000000..b7386e4 --- /dev/null +++ b/public/pt/tags/elizabeth-mednicoff/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elizabeth mednicoff

+ + + +
+ + + + diff --git a/public/pt/tags/elon-musk/index.html b/public/pt/tags/elon-musk/index.html new file mode 100644 index 0000000..fd32cb5 --- /dev/null +++ b/public/pt/tags/elon-musk/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elon musk

+ + + +
+ + + + diff --git a/public/pt/tags/emacs/index.html b/public/pt/tags/emacs/index.html new file mode 100644 index 0000000..b6b068f --- /dev/null +++ b/public/pt/tags/emacs/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

emacs

+ + + +
+ + + + diff --git a/public/pt/tags/embedded/index.html b/public/pt/tags/embedded/index.html new file mode 100644 index 0000000..5d972db --- /dev/null +++ b/public/pt/tags/embedded/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

embedded

+ + + +
+ + + + diff --git a/public/pt/tags/emma-marriott/index.html b/public/pt/tags/emma-marriott/index.html new file mode 100644 index 0000000..17d1a38 --- /dev/null +++ b/public/pt/tags/emma-marriott/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

emma marriott

+ + + +
+ + + + diff --git a/public/pt/tags/enderecos/index.html b/public/pt/tags/enderecos/index.html new file mode 100644 index 0000000..f337366 --- /dev/null +++ b/public/pt/tags/enderecos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

endereços

+ + + +
+ + + + diff --git a/public/pt/tags/entradas/index.html b/public/pt/tags/entradas/index.html new file mode 100644 index 0000000..40fd88a --- /dev/null +++ b/public/pt/tags/entradas/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

entradas

+ + + +
+ + + + diff --git a/public/pt/tags/erlang/index.html b/public/pt/tags/erlang/index.html new file mode 100644 index 0000000..7276175 --- /dev/null +++ b/public/pt/tags/erlang/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

erlang

+ + + +
+ + + + diff --git a/public/pt/tags/erros/index.html b/public/pt/tags/erros/index.html new file mode 100644 index 0000000..039cc58 --- /dev/null +++ b/public/pt/tags/erros/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

erros

+ + + +
+ + + + diff --git a/public/pt/tags/espionagem/index.html b/public/pt/tags/espionagem/index.html new file mode 100644 index 0000000..4d3a688 --- /dev/null +++ b/public/pt/tags/espionagem/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

espionagem

+ + + +
+ + + + diff --git a/public/pt/tags/esquisitices/index.html b/public/pt/tags/esquisitices/index.html new file mode 100644 index 0000000..14ba1a9 --- /dev/null +++ b/public/pt/tags/esquisitices/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

esquisitices

+ + + +
+ + + + diff --git a/public/pt/tags/estado/index.html b/public/pt/tags/estado/index.html new file mode 100644 index 0000000..cf1f49e --- /dev/null +++ b/public/pt/tags/estado/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

estado

+ + + +
+ + + + diff --git a/public/pt/tags/estatico/index.html b/public/pt/tags/estatico/index.html new file mode 100644 index 0000000..bd1097f --- /dev/null +++ b/public/pt/tags/estatico/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

estático

+ + + +
+ + + + diff --git a/public/pt/tags/estradas/index.html b/public/pt/tags/estradas/index.html new file mode 100644 index 0000000..a3dbc1e --- /dev/null +++ b/public/pt/tags/estradas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

estradas

+ + + +
+ + + + diff --git a/public/pt/tags/estruturas-de-dados/index.html b/public/pt/tags/estruturas-de-dados/index.html new file mode 100644 index 0000000..2dc1fde --- /dev/null +++ b/public/pt/tags/estruturas-de-dados/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

estruturas de dados

+ + + +
+ + + + diff --git a/public/pt/tags/excel/index.html b/public/pt/tags/excel/index.html new file mode 100644 index 0000000..b5c5814 --- /dev/null +++ b/public/pt/tags/excel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

excel

+ + + +
+ + + + diff --git a/public/pt/tags/exemplos/index.html b/public/pt/tags/exemplos/index.html new file mode 100644 index 0000000..20bce7b --- /dev/null +++ b/public/pt/tags/exemplos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

exemplos

+ + + +
+ + + + diff --git a/public/pt/tags/expelir/index.html b/public/pt/tags/expelir/index.html new file mode 100644 index 0000000..9da914a --- /dev/null +++ b/public/pt/tags/expelir/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

expelir

+ + + +
+ + + + diff --git a/public/pt/tags/exploit/index.html b/public/pt/tags/exploit/index.html new file mode 100644 index 0000000..cd28688 --- /dev/null +++ b/public/pt/tags/exploit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

exploit

+ + + +
+ + + + diff --git a/public/pt/tags/facebook/index.html b/public/pt/tags/facebook/index.html new file mode 100644 index 0000000..d159a95 --- /dev/null +++ b/public/pt/tags/facebook/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

facebook

+ + + +
+ + + + diff --git a/public/pt/tags/fantasia/index.html b/public/pt/tags/fantasia/index.html new file mode 100644 index 0000000..1bae590 --- /dev/null +++ b/public/pt/tags/fantasia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fantasia

+ + + +
+ + + + diff --git a/public/pt/tags/fantasy/index.html b/public/pt/tags/fantasy/index.html new file mode 100644 index 0000000..d82c265 --- /dev/null +++ b/public/pt/tags/fantasy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fantasy

+ + + +
+ + + + diff --git a/public/pt/tags/fast/index.html b/public/pt/tags/fast/index.html new file mode 100644 index 0000000..7b3f900 --- /dev/null +++ b/public/pt/tags/fast/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fast

+ + + +
+ + + + diff --git a/public/pt/tags/fediverso/index.html b/public/pt/tags/fediverso/index.html new file mode 100644 index 0000000..fbc86c8 --- /dev/null +++ b/public/pt/tags/fediverso/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fediverso

+ + + +
+ + + + diff --git a/public/pt/tags/ficcao/index.html b/public/pt/tags/ficcao/index.html new file mode 100644 index 0000000..2d2ad93 --- /dev/null +++ b/public/pt/tags/ficcao/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ficção

+ + + +
+ + + + diff --git a/public/pt/tags/filmes-2020/index.html b/public/pt/tags/filmes-2020/index.html new file mode 100644 index 0000000..e08b48a --- /dev/null +++ b/public/pt/tags/filmes-2020/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

filmes:2020

+ + + +
+ + + + diff --git a/public/pt/tags/filmes/index.html b/public/pt/tags/filmes/index.html new file mode 100644 index 0000000..697451b --- /dev/null +++ b/public/pt/tags/filmes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

filmes

+ + + +
+ + + + diff --git a/public/pt/tags/filosofia/index.html b/public/pt/tags/filosofia/index.html new file mode 100644 index 0000000..63cd9c6 --- /dev/null +++ b/public/pt/tags/filosofia/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

filosofia

+ + + +
+ + + + diff --git a/public/pt/tags/financas/index.html b/public/pt/tags/financas/index.html new file mode 100644 index 0000000..39523d6 --- /dev/null +++ b/public/pt/tags/financas/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

finanças

+ + + +
+ + + + diff --git a/public/pt/tags/fix/index.html b/public/pt/tags/fix/index.html new file mode 100644 index 0000000..bb2c86c --- /dev/null +++ b/public/pt/tags/fix/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fix

+ + + +
+ + + + diff --git a/public/pt/tags/flask/index.html b/public/pt/tags/flask/index.html new file mode 100644 index 0000000..35658b3 --- /dev/null +++ b/public/pt/tags/flask/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

flask

+ + + +
+ + + + diff --git a/public/pt/tags/flexbox/index.html b/public/pt/tags/flexbox/index.html new file mode 100644 index 0000000..2a09760 --- /dev/null +++ b/public/pt/tags/flexbox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

flexbox

+ + + +
+ + + + diff --git a/public/pt/tags/fluxo-de-dados/index.html b/public/pt/tags/fluxo-de-dados/index.html new file mode 100644 index 0000000..5a92c81 --- /dev/null +++ b/public/pt/tags/fluxo-de-dados/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fluxo de dados

+ + + +
+ + + + diff --git a/public/pt/tags/fones-de-ouvido/index.html b/public/pt/tags/fones-de-ouvido/index.html new file mode 100644 index 0000000..42438da --- /dev/null +++ b/public/pt/tags/fones-de-ouvido/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fones de ouvido

+ + + +
+ + + + diff --git a/public/pt/tags/fonte-da-verdade/index.html b/public/pt/tags/fonte-da-verdade/index.html new file mode 100644 index 0000000..3e93ba9 --- /dev/null +++ b/public/pt/tags/fonte-da-verdade/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fonte da verdade

+ + + +
+ + + + diff --git a/public/pt/tags/framework/index.html b/public/pt/tags/framework/index.html new file mode 100644 index 0000000..4f4658f --- /dev/null +++ b/public/pt/tags/framework/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

framework

+ + + +
+ + + + diff --git a/public/pt/tags/fsf/index.html b/public/pt/tags/fsf/index.html new file mode 100644 index 0000000..d5b9f88 --- /dev/null +++ b/public/pt/tags/fsf/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fsf

+ + + +
+ + + + diff --git a/public/pt/tags/fuchsia/index.html b/public/pt/tags/fuchsia/index.html new file mode 100644 index 0000000..50ee5d2 --- /dev/null +++ b/public/pt/tags/fuchsia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fuchsia

+ + + +
+ + + + diff --git a/public/pt/tags/generators/index.html b/public/pt/tags/generators/index.html new file mode 100644 index 0000000..bbb3004 --- /dev/null +++ b/public/pt/tags/generators/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

generators

+ + + +
+ + + + diff --git a/public/pt/tags/gerente-de-produtos/index.html b/public/pt/tags/gerente-de-produtos/index.html new file mode 100644 index 0000000..72d4876 --- /dev/null +++ b/public/pt/tags/gerente-de-produtos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gerente de produtos

+ + + +
+ + + + diff --git a/public/pt/tags/gestao/index.html b/public/pt/tags/gestao/index.html new file mode 100644 index 0000000..e6e78b3 --- /dev/null +++ b/public/pt/tags/gestao/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gestão

+ + + +
+ + + + diff --git a/public/pt/tags/git-ignore/index.html b/public/pt/tags/git-ignore/index.html new file mode 100644 index 0000000..fe7d980 --- /dev/null +++ b/public/pt/tags/git-ignore/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

git ignore

+ + + +
+ + + + diff --git a/public/pt/tags/git/index.html b/public/pt/tags/git/index.html new file mode 100644 index 0000000..5c8f334 --- /dev/null +++ b/public/pt/tags/git/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

git

+ + + +
+ + + + diff --git a/public/pt/tags/gnome/index.html b/public/pt/tags/gnome/index.html new file mode 100644 index 0000000..df16aff --- /dev/null +++ b/public/pt/tags/gnome/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gnome

+ + + +
+ + + + diff --git a/public/pt/tags/go/index.html b/public/pt/tags/go/index.html new file mode 100644 index 0000000..76addd8 --- /dev/null +++ b/public/pt/tags/go/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

go

+ + + +
+ + + + diff --git a/public/pt/tags/golang/index.html b/public/pt/tags/golang/index.html new file mode 100644 index 0000000..3dd0dbf --- /dev/null +++ b/public/pt/tags/golang/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

golang

+ + + +
+ + + + diff --git a/public/pt/tags/google/index.html b/public/pt/tags/google/index.html new file mode 100644 index 0000000..c660240 --- /dev/null +++ b/public/pt/tags/google/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

google

+ + + +
+ + + + diff --git a/public/pt/tags/gpl/index.html b/public/pt/tags/gpl/index.html new file mode 100644 index 0000000..d41259f --- /dev/null +++ b/public/pt/tags/gpl/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gpl

+ + + +
+ + + + diff --git a/public/pt/tags/gustavo-h-b-franco/index.html b/public/pt/tags/gustavo-h-b-franco/index.html new file mode 100644 index 0000000..fb0f2c0 --- /dev/null +++ b/public/pt/tags/gustavo-h-b-franco/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gustavo h. b. franco

+ + + +
+ + + + diff --git a/public/pt/tags/haskell/index.html b/public/pt/tags/haskell/index.html new file mode 100644 index 0000000..ffe147f --- /dev/null +++ b/public/pt/tags/haskell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

haskell

+ + + +
+ + + + diff --git a/public/pt/tags/hegel/index.html b/public/pt/tags/hegel/index.html new file mode 100644 index 0000000..aea6754 --- /dev/null +++ b/public/pt/tags/hegel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hegel

+ + + +
+ + + + diff --git a/public/pt/tags/highlight/index.html b/public/pt/tags/highlight/index.html new file mode 100644 index 0000000..c994e6d --- /dev/null +++ b/public/pt/tags/highlight/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

highlight

+ + + +
+ + + + diff --git a/public/pt/tags/historia/index.html b/public/pt/tags/historia/index.html new file mode 100644 index 0000000..02bf40d --- /dev/null +++ b/public/pt/tags/historia/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

história

+ + + +
+ + + + diff --git a/public/pt/tags/history/index.html b/public/pt/tags/history/index.html new file mode 100644 index 0000000..f011c29 --- /dev/null +++ b/public/pt/tags/history/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

history

+ + + +
+ + + + diff --git a/public/pt/tags/http/index.html b/public/pt/tags/http/index.html new file mode 100644 index 0000000..62789f3 --- /dev/null +++ b/public/pt/tags/http/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

http

+ + + +
+ + + + diff --git a/public/pt/tags/humor/index.html b/public/pt/tags/humor/index.html new file mode 100644 index 0000000..0f822d5 --- /dev/null +++ b/public/pt/tags/humor/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

humor

+ + + +
+ + + + diff --git a/public/pt/tags/ia/index.html b/public/pt/tags/ia/index.html new file mode 100644 index 0000000..c8e6cd9 --- /dev/null +++ b/public/pt/tags/ia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ia

+ + + +
+ + + + diff --git a/public/pt/tags/incognito-mode/index.html b/public/pt/tags/incognito-mode/index.html new file mode 100644 index 0000000..112277e --- /dev/null +++ b/public/pt/tags/incognito-mode/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

incognito mode

+ + + +
+ + + + diff --git a/public/pt/tags/index.html b/public/pt/tags/index.html new file mode 100644 index 0000000..749a4b0 --- /dev/null +++ b/public/pt/tags/index.html @@ -0,0 +1,1355 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ + + + 1password (1) + + + + acessibilidade (1) + + + + activitypub (2) + + + + actor model (1) + + + + ágil (2) + + + + agpl (1) + + + + alan turing (1) + + + + algoritmos (1) + + + + android (1) + + + + antonio j. mendez (1) + + + + apache (1) + + + + apple (2) + + + + área de transferência (1) + + + + arm (2) + + + + armazenamento (1) + + + + arquitetura (1) + + + + arquitetura de software (1) + + + + artefatos (3) + + + + ashlee vance (1) + + + + auto cura (1) + + + + bash (2) + + + + biblioteca (1) + + + + binário (2) + + + + biografia (4) + + + + biography (1) + + + + blog (1) + + + + book (5) + + + + books (32) + + + + branches (2) + + + + bsd (1) + + + + build (1) + + + + builder (1) + + + + builder pattern (1) + + + + c (5) + + + + câmeras (1) + + + + cargo cult (1) + + + + carl jung (1) + + + + carregador (1) + + + + cd (1) + + + + ceo (1) + + + + chassi (1) + + + + chrome (1) + + + + ci (1) + + + + cidades (1) + + + + ciência (2) + + + + citações (1) + + + + cli (5) + + + + clientes (1) + + + + clipboard (1) + + + + cloud (1) + + + + clovis de barros filho (1) + + + + coca-cola (1) + + + + code (1) + + + + código (1) + + + + comandos (1) + + + + command (1) + + + + companion post (6) + + + + conexões (1) + + + + conferência (2) + + + + config (1) + + + + configuração (1) + + + + contact tracing (1) + + + + conteineres (1) + + + + copyleft (1) + + + + cornice (1) + + + + dataframes (1) + + + + datetime (1) + + + + datomic (1) + + + + débito técnico (1) + + + + deletar (1) + + + + desenvolvedores (2) + + + + design (1) + + + + design patterns (1) + + + + dicas (1) + + + + distributed (1) + + + + documentação (1) + + + + eco-sistema (1) + + + + eli rodrigues (1) + + + + elizabeth mednicoff (1) + + + + elon musk (1) + + + + emacs (3) + + + + embedded (1) + + + + emma marriott (1) + + + + endereços (1) + + + + entradas (2) + + + + erlang (1) + + + + erros (1) + + + + espionagem (1) + + + + esquisitices (1) + + + + estado (2) + + + + estático (1) + + + + estradas (1) + + + + estruturas de dados (1) + + + + excel (1) + + + + exemplos (1) + + + + expelir (1) + + + + exploit (1) + + + + facebook (1) + + + + fantasia (1) + + + + fantasy (1) + + + + fast (2) + + + + fediverso (1) + + + + ficção (2) + + + + filmes (1) + + + + filmes:2020 (1) + + + + filosofia (2) + + + + finanças (3) + + + + fix (2) + + + + flask (2) + + + + flexbox (1) + + + + fluxo de dados (1) + + + + fones de ouvido (1) + + + + fonte da verdade (1) + + + + framework (1) + + + + fsf (2) + + + + fuchsia (1) + + + + generators (1) + + + + gerente de produtos (1) + + + + gestão (1) + + + + git (5) + + + + git ignore (1) + + + + gnome (1) + + + + go (2) + + + + golang (2) + + + + google (9) + + + + gpl (2) + + + + gustavo h. b. franco (1) + + + + haskell (1) + + + + hegel (1) + + + + highlight (1) + + + + história (7) + + + + history (3) + + + + http (2) + + + + humor (1) + + + + ia (1) + + + + incognito mode (1) + + + + ios (1) + + + + iphone (1) + + + + jacob petry (1) + + + + jeff sutherland (1) + + + + jobs (1) + + + + joseph campbell (1) + + + + juliano barreto (1) + + + + kent beck (1) + + + + kernel (1) + + + + last.fm (1) + + + + leandro narloch (1) + + + + licenças (3) + + + + licenses (1) + + + + liderando projetos (1) + + + + linguagens (1) + + + + linha de comando (1) + + + + link (1) + + + + linkedin (1) + + + + links (25) + + + + linux (3) + + + + live (3) + + + + logging (2) + + + + logs (1) + + + + lsp (1) + + + + mastodon (2) + + + + mauricio rabuffetti (1) + + + + medium (1) + + + + meetup (1) + + + + memória (1) + + + + mercurial (1) + + + + meta (1) + + + + microserviços (7) + + + + microsoft (1) + + + + miriam leitao (1) + + + + módulos (1) + + + + movile (1) + + + + mozilla (1) + + + + mujica (1) + + + + música (2) + + + + neovim (1) + + + + neville isdell (1) + + + + niccolo machiavelli (1) + + + + nicholas boothman (1) + + + + no code (1) + + + + nomes (2) + + + + notícias (1) + + + + o príncipe (1) + + + + onboarding (1) + + + + online (1) + + + + open source (1) + + + + openjdk (1) + + + + oracle (1) + + + + padrões (1) + + + + pascal (1) + + + + pattern (1) + + + + patterns (1) + + + + paul strathern (1) + + + + paula hawkins (1) + + + + paulo caroli (1) + + + + pensamentos (1) + + + + pesquisa (2) + + + + pessoal (11) + + + + phishing (1) + + + + plausible (1) + + + + podman (1) + + + + por dia (9) + + + + post-mortems (1) + + + + postgres (1) + + + + presentation (1) + + + + presentations (1) + + + + previsível (1) + + + + privacidade (3) + + + + produção:2019 (1) + + + + produtividade (1) + + + + programação (2) + + + + projeto (1) + + + + projetos (10) + + + + prometheus (1) + + + + propaganda (2) + + + + protocolo (2) + + + + psicologia (2) + + + + published:1949 (1) + + + + published:1990 (1) + + + + published:1993 (1) + + + + published:1997 (1) + + + + published:2002 (1) + + + + published:2010 (1) + + + + published:2011 (1) + + + + published:2012 (2) + + + + published:2013 (4) + + + + published:2014 (4) + + + + published:2015 (9) + + + + published:2016 (1) + + + + pyramid (1) + + + + python (9) + + + + python 2 (1) + + + + python 3 (2) + + + + racismo (1) + + + + range (1) + + + + rastreamento (1) + + + + reddit (1) + + + + redirecionamento (1) + + + + reescritas (1) + + + + requisições async (1) + + + + review (3) + + + + reviews (24) + + + + rewrites (1) + + + + rin tin tin (1) + + + + rms (2) + + + + rodrigo assis mesquita (1) + + + + rodrigo vargas (1) + + + + rss (1) + + + + rust (20) + + + + s.j. scott (1) + + + + saídas (2) + + + + sam kean (1) + + + + scotty (1) + + + + scp (1) + + + + scrobbles (1) + + + + scrum (1) + + + + segmentation fault (1) + + + + segurança (1) + + + + senhas (1) + + + + servidor (1) + + + + shell (9) + + + + sigsegv (1) + + + + site (1) + + + + six (1) + + + + software livre (1) + + + + spa (1) + + + + stackoverflow (2) + + + + stallman (2) + + + + stars:1 (5) + + + + stars:2 (8) + + + + stars:3 (7) + + + + stars:4 (5) + + + + stars:5 (3) + + + + status (1) + + + + stderr (2) + + + + stdin (3) + + + + stdout (3) + + + + stephen witt (1) + + + + steven d. levitt (1) + + + + streaming (1) + + + + subcomandos (1) + + + + susan orlean (1) + + + + syntax highlight (1) + + + + tabelas (1) + + + + tchelinux (2) + + + + technical debt (1) + + + + telegram (1) + + + + terminal (1) + + + + testes (4) + + + + testes de integração (2) + + + + testes unitários (2) + + + + tests (1) + + + + threadpools (1) + + + + ti (1) + + + + tiktok (1) + + + + timer (1) + + + + tipos (1) + + + + toolbox (1) + + + + toolbx (1) + + + + treesitter (1) + + + + tu (2) + + + + tui (1) + + + + twitch (1) + + + + twitter (1) + + + + typescript (1) + + + + unit (1) + + + + unit tests (1) + + + + unix (1) + + + + uruguai (1) + + + + uwsgi (1) + + + + video (1) + + + + videos (3) + + + + vim (2) + + + + vimconf (1) + + + + vulnerabilidade (2) + + + + web (1) + + + + webdav (1) + + + + whatsapp (1) + + + + windows (1) + + + + xml (2) + + + + youtube (2) + + + + zig (1) + + + + zola (1) + + + +
+ + + + diff --git a/public/pt/tags/ios/index.html b/public/pt/tags/ios/index.html new file mode 100644 index 0000000..fdc9700 --- /dev/null +++ b/public/pt/tags/ios/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ios

+ + + +
+ + + + diff --git a/public/pt/tags/iphone/index.html b/public/pt/tags/iphone/index.html new file mode 100644 index 0000000..f52ba8b --- /dev/null +++ b/public/pt/tags/iphone/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

iphone

+ + + +
+ + + + diff --git a/public/pt/tags/jacob-petry/index.html b/public/pt/tags/jacob-petry/index.html new file mode 100644 index 0000000..6ce9181 --- /dev/null +++ b/public/pt/tags/jacob-petry/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jacob petry

+ + + +
+ + + + diff --git a/public/pt/tags/jeff-sutherland/index.html b/public/pt/tags/jeff-sutherland/index.html new file mode 100644 index 0000000..7e9d3e3 --- /dev/null +++ b/public/pt/tags/jeff-sutherland/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jeff sutherland

+ + + +
+ + + + diff --git a/public/pt/tags/jobs/index.html b/public/pt/tags/jobs/index.html new file mode 100644 index 0000000..4fd4b13 --- /dev/null +++ b/public/pt/tags/jobs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jobs

+ + + +
+ + + + diff --git a/public/pt/tags/joseph-campbell/index.html b/public/pt/tags/joseph-campbell/index.html new file mode 100644 index 0000000..9c3451c --- /dev/null +++ b/public/pt/tags/joseph-campbell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joseph campbell

+ + + +
+ + + + diff --git a/public/pt/tags/juliano-barreto/index.html b/public/pt/tags/juliano-barreto/index.html new file mode 100644 index 0000000..f359b9e --- /dev/null +++ b/public/pt/tags/juliano-barreto/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

juliano barreto

+ + + +
+ + + + diff --git a/public/pt/tags/kent-beck/index.html b/public/pt/tags/kent-beck/index.html new file mode 100644 index 0000000..b7e1d9b --- /dev/null +++ b/public/pt/tags/kent-beck/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kent beck

+ + + +
+ + + + diff --git a/public/pt/tags/kernel/index.html b/public/pt/tags/kernel/index.html new file mode 100644 index 0000000..e45ec96 --- /dev/null +++ b/public/pt/tags/kernel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kernel

+ + + +
+ + + + diff --git a/public/pt/tags/last-fm/index.html b/public/pt/tags/last-fm/index.html new file mode 100644 index 0000000..5486e5e --- /dev/null +++ b/public/pt/tags/last-fm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

last.fm

+ + + +
+ + + + diff --git a/public/pt/tags/leandro-narloch/index.html b/public/pt/tags/leandro-narloch/index.html new file mode 100644 index 0000000..1874512 --- /dev/null +++ b/public/pt/tags/leandro-narloch/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

leandro narloch

+ + + +
+ + + + diff --git a/public/pt/tags/licencas/index.html b/public/pt/tags/licencas/index.html new file mode 100644 index 0000000..05f61dd --- /dev/null +++ b/public/pt/tags/licencas/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

licenças

+ + + +
+ + + + diff --git a/public/pt/tags/licenses/index.html b/public/pt/tags/licenses/index.html new file mode 100644 index 0000000..a993ae2 --- /dev/null +++ b/public/pt/tags/licenses/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

licenses

+ + + +
+ + + + diff --git a/public/pt/tags/liderando-projetos/index.html b/public/pt/tags/liderando-projetos/index.html new file mode 100644 index 0000000..c3a2c90 --- /dev/null +++ b/public/pt/tags/liderando-projetos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

liderando projetos

+ + + +
+ + + + diff --git a/public/pt/tags/linguagens/index.html b/public/pt/tags/linguagens/index.html new file mode 100644 index 0000000..5e24b30 --- /dev/null +++ b/public/pt/tags/linguagens/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linguagens

+ + + +
+ + + + diff --git a/public/pt/tags/linha-de-comando/index.html b/public/pt/tags/linha-de-comando/index.html new file mode 100644 index 0000000..6110abe --- /dev/null +++ b/public/pt/tags/linha-de-comando/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linha de comando

+ + + +
+ + + + diff --git a/public/pt/tags/link/index.html b/public/pt/tags/link/index.html new file mode 100644 index 0000000..8fdde01 --- /dev/null +++ b/public/pt/tags/link/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

link

+ + + +
+ + + + diff --git a/public/pt/tags/linkedin/index.html b/public/pt/tags/linkedin/index.html new file mode 100644 index 0000000..5b75705 --- /dev/null +++ b/public/pt/tags/linkedin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linkedin

+ + + +
+ + + + diff --git a/public/pt/tags/links/index.html b/public/pt/tags/links/index.html new file mode 100644 index 0000000..223d5c3 --- /dev/null +++ b/public/pt/tags/links/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

links

+ + + +
+ + + + diff --git a/public/pt/tags/linux/index.html b/public/pt/tags/linux/index.html new file mode 100644 index 0000000..6874c36 --- /dev/null +++ b/public/pt/tags/linux/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linux

+ + + +
+ + + + diff --git a/public/pt/tags/live/index.html b/public/pt/tags/live/index.html new file mode 100644 index 0000000..c7b7009 --- /dev/null +++ b/public/pt/tags/live/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

live

+ + + +
+ + + + diff --git a/public/pt/tags/logging/index.html b/public/pt/tags/logging/index.html new file mode 100644 index 0000000..547bb03 --- /dev/null +++ b/public/pt/tags/logging/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

logging

+ + + +
+ + + + diff --git a/public/pt/tags/logs/index.html b/public/pt/tags/logs/index.html new file mode 100644 index 0000000..507a414 --- /dev/null +++ b/public/pt/tags/logs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

logs

+ + + +
+ + + + diff --git a/public/pt/tags/lsp/index.html b/public/pt/tags/lsp/index.html new file mode 100644 index 0000000..e77a398 --- /dev/null +++ b/public/pt/tags/lsp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lsp

+ + + +
+ + + + diff --git a/public/pt/tags/mastodon/index.html b/public/pt/tags/mastodon/index.html new file mode 100644 index 0000000..195e207 --- /dev/null +++ b/public/pt/tags/mastodon/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mastodon

+ + + +
+ + + + diff --git a/public/pt/tags/mauricio-rabuffetti/index.html b/public/pt/tags/mauricio-rabuffetti/index.html new file mode 100644 index 0000000..2b1d327 --- /dev/null +++ b/public/pt/tags/mauricio-rabuffetti/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mauricio rabuffetti

+ + + +
+ + + + diff --git a/public/pt/tags/medium/index.html b/public/pt/tags/medium/index.html new file mode 100644 index 0000000..184454a --- /dev/null +++ b/public/pt/tags/medium/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

medium

+ + + +
+ + + + diff --git a/public/pt/tags/meetup/index.html b/public/pt/tags/meetup/index.html new file mode 100644 index 0000000..9b6f081 --- /dev/null +++ b/public/pt/tags/meetup/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meetup

+ + + +
+ + + + diff --git a/public/pt/tags/memoria/index.html b/public/pt/tags/memoria/index.html new file mode 100644 index 0000000..8100f49 --- /dev/null +++ b/public/pt/tags/memoria/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

memória

+ + + +
+ + + + diff --git a/public/pt/tags/mercurial/index.html b/public/pt/tags/mercurial/index.html new file mode 100644 index 0000000..641fe33 --- /dev/null +++ b/public/pt/tags/mercurial/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mercurial

+ + + +
+ + + + diff --git a/public/pt/tags/meta/index.html b/public/pt/tags/meta/index.html new file mode 100644 index 0000000..e77014c --- /dev/null +++ b/public/pt/tags/meta/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meta

+ + + +
+ + + + diff --git a/public/pt/tags/microservicos/index.html b/public/pt/tags/microservicos/index.html new file mode 100644 index 0000000..956ce61 --- /dev/null +++ b/public/pt/tags/microservicos/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microserviços

+ + + +
+ + + + diff --git a/public/pt/tags/microsoft/index.html b/public/pt/tags/microsoft/index.html new file mode 100644 index 0000000..ffe97b8 --- /dev/null +++ b/public/pt/tags/microsoft/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microsoft

+ + + +
+ + + + diff --git a/public/pt/tags/miriam-leitao/index.html b/public/pt/tags/miriam-leitao/index.html new file mode 100644 index 0000000..3822533 --- /dev/null +++ b/public/pt/tags/miriam-leitao/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

miriam leitao

+ + + +
+ + + + diff --git a/public/pt/tags/modulos/index.html b/public/pt/tags/modulos/index.html new file mode 100644 index 0000000..400cff0 --- /dev/null +++ b/public/pt/tags/modulos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

módulos

+ + + +
+ + + + diff --git a/public/pt/tags/movile/index.html b/public/pt/tags/movile/index.html new file mode 100644 index 0000000..d17b68f --- /dev/null +++ b/public/pt/tags/movile/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

movile

+ + + +
+ + + + diff --git a/public/pt/tags/mozilla/index.html b/public/pt/tags/mozilla/index.html new file mode 100644 index 0000000..9f8418f --- /dev/null +++ b/public/pt/tags/mozilla/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mozilla

+ + + +
+ + + + diff --git a/public/pt/tags/mujica/index.html b/public/pt/tags/mujica/index.html new file mode 100644 index 0000000..ff1bd14 --- /dev/null +++ b/public/pt/tags/mujica/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mujica

+ + + +
+ + + + diff --git a/public/pt/tags/musica/index.html b/public/pt/tags/musica/index.html new file mode 100644 index 0000000..758225d --- /dev/null +++ b/public/pt/tags/musica/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

música

+ + + +
+ + + + diff --git a/public/pt/tags/neovim/index.html b/public/pt/tags/neovim/index.html new file mode 100644 index 0000000..0ab5d26 --- /dev/null +++ b/public/pt/tags/neovim/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

neovim

+ + + +
+ + + + diff --git a/public/pt/tags/neville-isdell/index.html b/public/pt/tags/neville-isdell/index.html new file mode 100644 index 0000000..a04c6f2 --- /dev/null +++ b/public/pt/tags/neville-isdell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

neville isdell

+ + + +
+ + + + diff --git a/public/pt/tags/niccolo-machiavelli/index.html b/public/pt/tags/niccolo-machiavelli/index.html new file mode 100644 index 0000000..592b2bb --- /dev/null +++ b/public/pt/tags/niccolo-machiavelli/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

niccolo machiavelli

+ + + +
+ + + + diff --git a/public/pt/tags/nicholas-boothman/index.html b/public/pt/tags/nicholas-boothman/index.html new file mode 100644 index 0000000..d1b0178 --- /dev/null +++ b/public/pt/tags/nicholas-boothman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nicholas boothman

+ + + +
+ + + + diff --git a/public/pt/tags/no-code/index.html b/public/pt/tags/no-code/index.html new file mode 100644 index 0000000..1dc1140 --- /dev/null +++ b/public/pt/tags/no-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

no code

+ + + +
+ + + + diff --git a/public/pt/tags/nomes/index.html b/public/pt/tags/nomes/index.html new file mode 100644 index 0000000..da66227 --- /dev/null +++ b/public/pt/tags/nomes/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nomes

+ + + +
+ + + + diff --git a/public/pt/tags/noticias/index.html b/public/pt/tags/noticias/index.html new file mode 100644 index 0000000..433cb6e --- /dev/null +++ b/public/pt/tags/noticias/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

notícias

+ + + +
+ + + + diff --git a/public/pt/tags/o-principe/index.html b/public/pt/tags/o-principe/index.html new file mode 100644 index 0000000..0284669 --- /dev/null +++ b/public/pt/tags/o-principe/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

o príncipe

+ + + +
+ + + + diff --git a/public/pt/tags/onboarding/index.html b/public/pt/tags/onboarding/index.html new file mode 100644 index 0000000..d73766f --- /dev/null +++ b/public/pt/tags/onboarding/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

onboarding

+ + + +
+ + + + diff --git a/public/pt/tags/online/index.html b/public/pt/tags/online/index.html new file mode 100644 index 0000000..948d56b --- /dev/null +++ b/public/pt/tags/online/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

online

+ + + +
+ + + + diff --git a/public/pt/tags/open-source/index.html b/public/pt/tags/open-source/index.html new file mode 100644 index 0000000..673fc14 --- /dev/null +++ b/public/pt/tags/open-source/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

open source

+ + + +
+ + + + diff --git a/public/pt/tags/openjdk/index.html b/public/pt/tags/openjdk/index.html new file mode 100644 index 0000000..198822f --- /dev/null +++ b/public/pt/tags/openjdk/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

openjdk

+ + + +
+ + + + diff --git a/public/pt/tags/oracle/index.html b/public/pt/tags/oracle/index.html new file mode 100644 index 0000000..093ca06 --- /dev/null +++ b/public/pt/tags/oracle/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

oracle

+ + + +
+ + + + diff --git a/public/pt/tags/padroes/index.html b/public/pt/tags/padroes/index.html new file mode 100644 index 0000000..2f44648 --- /dev/null +++ b/public/pt/tags/padroes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

padrões

+ + + +
+ + + + diff --git a/public/pt/tags/pascal/index.html b/public/pt/tags/pascal/index.html new file mode 100644 index 0000000..9207226 --- /dev/null +++ b/public/pt/tags/pascal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pascal

+ + + +
+ + + + diff --git a/public/pt/tags/pattern/index.html b/public/pt/tags/pattern/index.html new file mode 100644 index 0000000..b907ce0 --- /dev/null +++ b/public/pt/tags/pattern/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pattern

+ + + +
+ + + + diff --git a/public/pt/tags/patterns/index.html b/public/pt/tags/patterns/index.html new file mode 100644 index 0000000..be1e007 --- /dev/null +++ b/public/pt/tags/patterns/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

patterns

+ + + +
+ + + + diff --git a/public/pt/tags/paul-strathern/index.html b/public/pt/tags/paul-strathern/index.html new file mode 100644 index 0000000..9d85ca4 --- /dev/null +++ b/public/pt/tags/paul-strathern/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paul strathern

+ + + +
+ + + + diff --git a/public/pt/tags/paula-hawkins/index.html b/public/pt/tags/paula-hawkins/index.html new file mode 100644 index 0000000..6789e8f --- /dev/null +++ b/public/pt/tags/paula-hawkins/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paula hawkins

+ + + +
+ + + + diff --git a/public/pt/tags/paulo-caroli/index.html b/public/pt/tags/paulo-caroli/index.html new file mode 100644 index 0000000..f9b78da --- /dev/null +++ b/public/pt/tags/paulo-caroli/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paulo caroli

+ + + +
+ + + + diff --git a/public/pt/tags/pensamentos/index.html b/public/pt/tags/pensamentos/index.html new file mode 100644 index 0000000..e9766b8 --- /dev/null +++ b/public/pt/tags/pensamentos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pensamentos

+ + + +
+ + + + diff --git a/public/pt/tags/pesquisa/index.html b/public/pt/tags/pesquisa/index.html new file mode 100644 index 0000000..155e8e2 --- /dev/null +++ b/public/pt/tags/pesquisa/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pesquisa

+ + + +
+ + + + diff --git a/public/pt/tags/pessoal/index.html b/public/pt/tags/pessoal/index.html new file mode 100644 index 0000000..490021f --- /dev/null +++ b/public/pt/tags/pessoal/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pessoal

+ + + +
+ + + + diff --git a/public/pt/tags/phishing/index.html b/public/pt/tags/phishing/index.html new file mode 100644 index 0000000..f2287c7 --- /dev/null +++ b/public/pt/tags/phishing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

phishing

+ + + +
+ + + + diff --git a/public/pt/tags/plausible/index.html b/public/pt/tags/plausible/index.html new file mode 100644 index 0000000..1c3c07d --- /dev/null +++ b/public/pt/tags/plausible/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

plausible

+ + + +
+ + + + diff --git a/public/pt/tags/podman/index.html b/public/pt/tags/podman/index.html new file mode 100644 index 0000000..b3dcbd8 --- /dev/null +++ b/public/pt/tags/podman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

podman

+ + + +
+ + + + diff --git a/public/pt/tags/por-dia/index.html b/public/pt/tags/por-dia/index.html new file mode 100644 index 0000000..f715dc0 --- /dev/null +++ b/public/pt/tags/por-dia/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

por dia

+ + + +
+ + + + diff --git a/public/pt/tags/post-mortems/index.html b/public/pt/tags/post-mortems/index.html new file mode 100644 index 0000000..a2225ed --- /dev/null +++ b/public/pt/tags/post-mortems/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

post-mortems

+ + + +
+ + + + diff --git a/public/pt/tags/postgres/index.html b/public/pt/tags/postgres/index.html new file mode 100644 index 0000000..8a1668b --- /dev/null +++ b/public/pt/tags/postgres/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

postgres

+ + + +
+ + + + diff --git a/public/pt/tags/presentation/index.html b/public/pt/tags/presentation/index.html new file mode 100644 index 0000000..a3fff63 --- /dev/null +++ b/public/pt/tags/presentation/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

presentation

+ + + +
+ + + + diff --git a/public/pt/tags/presentations/index.html b/public/pt/tags/presentations/index.html new file mode 100644 index 0000000..494f8df --- /dev/null +++ b/public/pt/tags/presentations/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

presentations

+ + + +
+ + + + diff --git a/public/pt/tags/previsivel/index.html b/public/pt/tags/previsivel/index.html new file mode 100644 index 0000000..362e5a7 --- /dev/null +++ b/public/pt/tags/previsivel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

previsível

+ + + +
+ + + + diff --git a/public/pt/tags/privacidade/index.html b/public/pt/tags/privacidade/index.html new file mode 100644 index 0000000..68ff6c5 --- /dev/null +++ b/public/pt/tags/privacidade/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

privacidade

+ + + +
+ + + + diff --git a/public/pt/tags/producao-2019/index.html b/public/pt/tags/producao-2019/index.html new file mode 100644 index 0000000..b46c2a6 --- /dev/null +++ b/public/pt/tags/producao-2019/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

produção:2019

+ + + +
+ + + + diff --git a/public/pt/tags/produtividade/index.html b/public/pt/tags/produtividade/index.html new file mode 100644 index 0000000..1a5860b --- /dev/null +++ b/public/pt/tags/produtividade/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

produtividade

+ + + +
+ + + + diff --git a/public/pt/tags/programacao/index.html b/public/pt/tags/programacao/index.html new file mode 100644 index 0000000..1e0ebb8 --- /dev/null +++ b/public/pt/tags/programacao/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

programação

+ + + +
+ + + + diff --git a/public/pt/tags/projeto/index.html b/public/pt/tags/projeto/index.html new file mode 100644 index 0000000..edada71 --- /dev/null +++ b/public/pt/tags/projeto/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

projeto

+ + + +
+ + + + diff --git a/public/pt/tags/projetos/index.html b/public/pt/tags/projetos/index.html new file mode 100644 index 0000000..d2e6714 --- /dev/null +++ b/public/pt/tags/projetos/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

projetos

+ + + +
+ + + + diff --git a/public/pt/tags/prometheus/index.html b/public/pt/tags/prometheus/index.html new file mode 100644 index 0000000..c1856a8 --- /dev/null +++ b/public/pt/tags/prometheus/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

prometheus

+ + + +
+ + + + diff --git a/public/pt/tags/propaganda/index.html b/public/pt/tags/propaganda/index.html new file mode 100644 index 0000000..68e729a --- /dev/null +++ b/public/pt/tags/propaganda/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

propaganda

+ + + +
+ + + + diff --git a/public/pt/tags/protocolo/index.html b/public/pt/tags/protocolo/index.html new file mode 100644 index 0000000..7d89390 --- /dev/null +++ b/public/pt/tags/protocolo/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

protocolo

+ + + +
+ + + + diff --git a/public/pt/tags/psicologia/index.html b/public/pt/tags/psicologia/index.html new file mode 100644 index 0000000..c451161 --- /dev/null +++ b/public/pt/tags/psicologia/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

psicologia

+ + + +
+ + + + diff --git a/public/pt/tags/published-1949/index.html b/public/pt/tags/published-1949/index.html new file mode 100644 index 0000000..73123d4 --- /dev/null +++ b/public/pt/tags/published-1949/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1949

+ + + +
+ + + + diff --git a/public/pt/tags/published-1990/index.html b/public/pt/tags/published-1990/index.html new file mode 100644 index 0000000..503a050 --- /dev/null +++ b/public/pt/tags/published-1990/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1990

+ + + +
+ + + + diff --git a/public/pt/tags/published-1993/index.html b/public/pt/tags/published-1993/index.html new file mode 100644 index 0000000..d5e09e3 --- /dev/null +++ b/public/pt/tags/published-1993/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1993

+ + + +
+ + + + diff --git a/public/pt/tags/published-1997/index.html b/public/pt/tags/published-1997/index.html new file mode 100644 index 0000000..9e52590 --- /dev/null +++ b/public/pt/tags/published-1997/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1997

+ + + +
+ + + + diff --git a/public/pt/tags/published-2002/index.html b/public/pt/tags/published-2002/index.html new file mode 100644 index 0000000..069d380 --- /dev/null +++ b/public/pt/tags/published-2002/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2002

+ + + +
+ + + + diff --git a/public/pt/tags/published-2010/index.html b/public/pt/tags/published-2010/index.html new file mode 100644 index 0000000..bdcf916 --- /dev/null +++ b/public/pt/tags/published-2010/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2010

+ + + +
+ + + + diff --git a/public/pt/tags/published-2011/index.html b/public/pt/tags/published-2011/index.html new file mode 100644 index 0000000..361c4a9 --- /dev/null +++ b/public/pt/tags/published-2011/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2011

+ + + +
+ + + + diff --git a/public/pt/tags/published-2012/index.html b/public/pt/tags/published-2012/index.html new file mode 100644 index 0000000..0ec04a6 --- /dev/null +++ b/public/pt/tags/published-2012/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2012

+ + + +
+ + + + diff --git a/public/pt/tags/published-2013/index.html b/public/pt/tags/published-2013/index.html new file mode 100644 index 0000000..e62c3f2 --- /dev/null +++ b/public/pt/tags/published-2013/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2013

+ + + +
+ + + + diff --git a/public/pt/tags/published-2014/index.html b/public/pt/tags/published-2014/index.html new file mode 100644 index 0000000..986d751 --- /dev/null +++ b/public/pt/tags/published-2014/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2014

+ + + +
+ + + + diff --git a/public/pt/tags/published-2015/index.html b/public/pt/tags/published-2015/index.html new file mode 100644 index 0000000..62d95e7 --- /dev/null +++ b/public/pt/tags/published-2015/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2015

+ + + +
+ + + + diff --git a/public/pt/tags/published-2016/index.html b/public/pt/tags/published-2016/index.html new file mode 100644 index 0000000..6e52c0c --- /dev/null +++ b/public/pt/tags/published-2016/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2016

+ + + +
+ + + + diff --git a/public/pt/tags/pyramid/index.html b/public/pt/tags/pyramid/index.html new file mode 100644 index 0000000..d50e0e8 --- /dev/null +++ b/public/pt/tags/pyramid/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pyramid

+ + + +
+ + + + diff --git a/public/pt/tags/python-2/index.html b/public/pt/tags/python-2/index.html new file mode 100644 index 0000000..3390e17 --- /dev/null +++ b/public/pt/tags/python-2/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

python 2

+ + + +
+ + + + diff --git a/public/pt/tags/python-3/index.html b/public/pt/tags/python-3/index.html new file mode 100644 index 0000000..dc58984 --- /dev/null +++ b/public/pt/tags/python-3/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

python 3

+ + + +
+ + + + diff --git a/public/pt/tags/python/index.html b/public/pt/tags/python/index.html new file mode 100644 index 0000000..ee8dc7b --- /dev/null +++ b/public/pt/tags/python/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

python

+ + + +
+ + + + diff --git a/public/pt/tags/racismo/index.html b/public/pt/tags/racismo/index.html new file mode 100644 index 0000000..14765ff --- /dev/null +++ b/public/pt/tags/racismo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

racismo

+ + + +
+ + + + diff --git a/public/pt/tags/range/index.html b/public/pt/tags/range/index.html new file mode 100644 index 0000000..6d2e6fe --- /dev/null +++ b/public/pt/tags/range/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

range

+ + + +
+ + + + diff --git a/public/pt/tags/rastreamento/index.html b/public/pt/tags/rastreamento/index.html new file mode 100644 index 0000000..341cc85 --- /dev/null +++ b/public/pt/tags/rastreamento/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rastreamento

+ + + +
+ + + + diff --git a/public/pt/tags/reddit/index.html b/public/pt/tags/reddit/index.html new file mode 100644 index 0000000..d09018d --- /dev/null +++ b/public/pt/tags/reddit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reddit

+ + + +
+ + + + diff --git a/public/pt/tags/redirecionamento/index.html b/public/pt/tags/redirecionamento/index.html new file mode 100644 index 0000000..7f0eb59 --- /dev/null +++ b/public/pt/tags/redirecionamento/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

redirecionamento

+ + + +
+ + + + diff --git a/public/pt/tags/reescritas/index.html b/public/pt/tags/reescritas/index.html new file mode 100644 index 0000000..8ba2536 --- /dev/null +++ b/public/pt/tags/reescritas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reescritas

+ + + +
+ + + + diff --git a/public/pt/tags/requisicoes-async/index.html b/public/pt/tags/requisicoes-async/index.html new file mode 100644 index 0000000..dd412b8 --- /dev/null +++ b/public/pt/tags/requisicoes-async/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

requisições async

+ + + +
+ + + + diff --git a/public/pt/tags/review/index.html b/public/pt/tags/review/index.html new file mode 100644 index 0000000..781f939 --- /dev/null +++ b/public/pt/tags/review/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

review

+ + + +
+ + + + diff --git a/public/pt/tags/reviews/index.html b/public/pt/tags/reviews/index.html new file mode 100644 index 0000000..fd949a9 --- /dev/null +++ b/public/pt/tags/reviews/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reviews

+ + + +
+ + + + diff --git a/public/pt/tags/rewrites/index.html b/public/pt/tags/rewrites/index.html new file mode 100644 index 0000000..d0f19f2 --- /dev/null +++ b/public/pt/tags/rewrites/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rewrites

+ + + +
+ + + + diff --git a/public/pt/tags/rin-tin-tin/index.html b/public/pt/tags/rin-tin-tin/index.html new file mode 100644 index 0000000..fd7ba2a --- /dev/null +++ b/public/pt/tags/rin-tin-tin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rin tin tin

+ + + +
+ + + + diff --git a/public/pt/tags/rms/index.html b/public/pt/tags/rms/index.html new file mode 100644 index 0000000..87b5866 --- /dev/null +++ b/public/pt/tags/rms/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rms

+ + + +
+ + + + diff --git a/public/pt/tags/rodrigo-assis-mesquita/index.html b/public/pt/tags/rodrigo-assis-mesquita/index.html new file mode 100644 index 0000000..a16a55a --- /dev/null +++ b/public/pt/tags/rodrigo-assis-mesquita/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rodrigo assis mesquita

+ + + +
+ + + + diff --git a/public/pt/tags/rodrigo-vargas/index.html b/public/pt/tags/rodrigo-vargas/index.html new file mode 100644 index 0000000..815b7be --- /dev/null +++ b/public/pt/tags/rodrigo-vargas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rodrigo vargas

+ + + +
+ + + + diff --git a/public/pt/tags/rss/index.html b/public/pt/tags/rss/index.html new file mode 100644 index 0000000..c290d5b --- /dev/null +++ b/public/pt/tags/rss/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rss

+ + + +
+ + + + diff --git a/public/pt/tags/rust/index.html b/public/pt/tags/rust/index.html new file mode 100644 index 0000000..261260b --- /dev/null +++ b/public/pt/tags/rust/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rust

+ + + +
+ + + + diff --git a/public/pt/tags/s-j-scott/index.html b/public/pt/tags/s-j-scott/index.html new file mode 100644 index 0000000..0bfb85b --- /dev/null +++ b/public/pt/tags/s-j-scott/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

s.j. scott

+ + + +
+ + + + diff --git a/public/pt/tags/saidas/index.html b/public/pt/tags/saidas/index.html new file mode 100644 index 0000000..69a352a --- /dev/null +++ b/public/pt/tags/saidas/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

saídas

+ + + +
+ + + + diff --git a/public/pt/tags/sam-kean/index.html b/public/pt/tags/sam-kean/index.html new file mode 100644 index 0000000..578fc00 --- /dev/null +++ b/public/pt/tags/sam-kean/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sam kean

+ + + +
+ + + + diff --git a/public/pt/tags/scotty/index.html b/public/pt/tags/scotty/index.html new file mode 100644 index 0000000..647a42f --- /dev/null +++ b/public/pt/tags/scotty/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scotty

+ + + +
+ + + + diff --git a/public/pt/tags/scp/index.html b/public/pt/tags/scp/index.html new file mode 100644 index 0000000..298eab9 --- /dev/null +++ b/public/pt/tags/scp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scp

+ + + +
+ + + + diff --git a/public/pt/tags/scrobbles/index.html b/public/pt/tags/scrobbles/index.html new file mode 100644 index 0000000..90c3c50 --- /dev/null +++ b/public/pt/tags/scrobbles/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scrobbles

+ + + +
+ + + + diff --git a/public/pt/tags/scrum/index.html b/public/pt/tags/scrum/index.html new file mode 100644 index 0000000..98d9c8f --- /dev/null +++ b/public/pt/tags/scrum/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scrum

+ + + +
+ + + + diff --git a/public/pt/tags/segmentation-fault/index.html b/public/pt/tags/segmentation-fault/index.html new file mode 100644 index 0000000..c533e03 --- /dev/null +++ b/public/pt/tags/segmentation-fault/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

segmentation fault

+ + + +
+ + + + diff --git a/public/pt/tags/seguranca/index.html b/public/pt/tags/seguranca/index.html new file mode 100644 index 0000000..57ae57b --- /dev/null +++ b/public/pt/tags/seguranca/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

segurança

+ + + +
+ + + + diff --git a/public/pt/tags/senhas/index.html b/public/pt/tags/senhas/index.html new file mode 100644 index 0000000..cef84f3 --- /dev/null +++ b/public/pt/tags/senhas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

senhas

+ + + +
+ + + + diff --git a/public/pt/tags/servidor/index.html b/public/pt/tags/servidor/index.html new file mode 100644 index 0000000..6746f22 --- /dev/null +++ b/public/pt/tags/servidor/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

servidor

+ + + +
+ + + + diff --git a/public/pt/tags/shell/index.html b/public/pt/tags/shell/index.html new file mode 100644 index 0000000..2caa193 --- /dev/null +++ b/public/pt/tags/shell/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

shell

+ + + +
+ + + + diff --git a/public/pt/tags/sigsegv/index.html b/public/pt/tags/sigsegv/index.html new file mode 100644 index 0000000..1702e2c --- /dev/null +++ b/public/pt/tags/sigsegv/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sigsegv

+ + + +
+ + + + diff --git a/public/pt/tags/site/index.html b/public/pt/tags/site/index.html new file mode 100644 index 0000000..bda790a --- /dev/null +++ b/public/pt/tags/site/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

site

+ + + +
+ + + + diff --git a/public/pt/tags/six/index.html b/public/pt/tags/six/index.html new file mode 100644 index 0000000..00623b1 --- /dev/null +++ b/public/pt/tags/six/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

six

+ + + +
+ + + + diff --git a/public/pt/tags/software-livre/index.html b/public/pt/tags/software-livre/index.html new file mode 100644 index 0000000..1840cf1 --- /dev/null +++ b/public/pt/tags/software-livre/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

software livre

+ + + +
+ + + + diff --git a/public/pt/tags/spa/index.html b/public/pt/tags/spa/index.html new file mode 100644 index 0000000..8e2f163 --- /dev/null +++ b/public/pt/tags/spa/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spa

+ + + +
+ + + + diff --git a/public/pt/tags/stackoverflow/index.html b/public/pt/tags/stackoverflow/index.html new file mode 100644 index 0000000..a5a2d5b --- /dev/null +++ b/public/pt/tags/stackoverflow/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stackoverflow

+ + + +
+ + + + diff --git a/public/pt/tags/stallman/index.html b/public/pt/tags/stallman/index.html new file mode 100644 index 0000000..9f229dc --- /dev/null +++ b/public/pt/tags/stallman/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stallman

+ + + +
+ + + + diff --git a/public/pt/tags/stars-1/index.html b/public/pt/tags/stars-1/index.html new file mode 100644 index 0000000..1b42d83 --- /dev/null +++ b/public/pt/tags/stars-1/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:1

+ + + +
+ + + + diff --git a/public/pt/tags/stars-2/index.html b/public/pt/tags/stars-2/index.html new file mode 100644 index 0000000..5b4b820 --- /dev/null +++ b/public/pt/tags/stars-2/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:2

+ + + +
+ + + + diff --git a/public/pt/tags/stars-3/index.html b/public/pt/tags/stars-3/index.html new file mode 100644 index 0000000..dc9a48f --- /dev/null +++ b/public/pt/tags/stars-3/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:3

+ + + +
+ + + + diff --git a/public/pt/tags/stars-4/index.html b/public/pt/tags/stars-4/index.html new file mode 100644 index 0000000..1cc19a8 --- /dev/null +++ b/public/pt/tags/stars-4/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:4

+ + + +
+ + + + diff --git a/public/pt/tags/stars-5/index.html b/public/pt/tags/stars-5/index.html new file mode 100644 index 0000000..7aed650 --- /dev/null +++ b/public/pt/tags/stars-5/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:5

+ + + +
+ + + + diff --git a/public/pt/tags/status/index.html b/public/pt/tags/status/index.html new file mode 100644 index 0000000..5fbd284 --- /dev/null +++ b/public/pt/tags/status/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

status

+ + + +
+ + + + diff --git a/public/pt/tags/stderr/index.html b/public/pt/tags/stderr/index.html new file mode 100644 index 0000000..7cef53a --- /dev/null +++ b/public/pt/tags/stderr/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stderr

+ + + +
+ + + + diff --git a/public/pt/tags/stdin/index.html b/public/pt/tags/stdin/index.html new file mode 100644 index 0000000..01becb4 --- /dev/null +++ b/public/pt/tags/stdin/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stdin

+ + + +
+ + + + diff --git a/public/pt/tags/stdout/index.html b/public/pt/tags/stdout/index.html new file mode 100644 index 0000000..3f55c7c --- /dev/null +++ b/public/pt/tags/stdout/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stdout

+ + + +
+ + + + diff --git a/public/pt/tags/stephen-witt/index.html b/public/pt/tags/stephen-witt/index.html new file mode 100644 index 0000000..fc78f01 --- /dev/null +++ b/public/pt/tags/stephen-witt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stephen witt

+ + + +
+ + + + diff --git a/public/pt/tags/steven-d-levitt/index.html b/public/pt/tags/steven-d-levitt/index.html new file mode 100644 index 0000000..0a99e68 --- /dev/null +++ b/public/pt/tags/steven-d-levitt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

steven d. levitt

+ + + +
+ + + + diff --git a/public/pt/tags/streaming/index.html b/public/pt/tags/streaming/index.html new file mode 100644 index 0000000..414b49e --- /dev/null +++ b/public/pt/tags/streaming/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

streaming

+ + + +
+ + + + diff --git a/public/pt/tags/subcomandos/index.html b/public/pt/tags/subcomandos/index.html new file mode 100644 index 0000000..e0e2d41 --- /dev/null +++ b/public/pt/tags/subcomandos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

subcomandos

+ + + +
+ + + + diff --git a/public/pt/tags/susan-orlean/index.html b/public/pt/tags/susan-orlean/index.html new file mode 100644 index 0000000..ed786b0 --- /dev/null +++ b/public/pt/tags/susan-orlean/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

susan orlean

+ + + +
+ + + + diff --git a/public/pt/tags/syntax-highlight/index.html b/public/pt/tags/syntax-highlight/index.html new file mode 100644 index 0000000..1725d85 --- /dev/null +++ b/public/pt/tags/syntax-highlight/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

syntax highlight

+ + + +
+ + + + diff --git a/public/pt/tags/tabelas/index.html b/public/pt/tags/tabelas/index.html new file mode 100644 index 0000000..dc05263 --- /dev/null +++ b/public/pt/tags/tabelas/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tabelas

+ + + +
+ + + + diff --git a/public/pt/tags/tchelinux/index.html b/public/pt/tags/tchelinux/index.html new file mode 100644 index 0000000..6d4af22 --- /dev/null +++ b/public/pt/tags/tchelinux/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tchelinux

+ + + +
+ + + + diff --git a/public/pt/tags/technical-debt/index.html b/public/pt/tags/technical-debt/index.html new file mode 100644 index 0000000..301a4c0 --- /dev/null +++ b/public/pt/tags/technical-debt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

technical debt

+ + + +
+ + + + diff --git a/public/pt/tags/telegram/index.html b/public/pt/tags/telegram/index.html new file mode 100644 index 0000000..9593ee4 --- /dev/null +++ b/public/pt/tags/telegram/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

telegram

+ + + +
+ + + + diff --git a/public/pt/tags/terminal/index.html b/public/pt/tags/terminal/index.html new file mode 100644 index 0000000..a1fde75 --- /dev/null +++ b/public/pt/tags/terminal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

terminal

+ + + +
+ + + + diff --git a/public/pt/tags/testes-de-integracao/index.html b/public/pt/tags/testes-de-integracao/index.html new file mode 100644 index 0000000..bca52e1 --- /dev/null +++ b/public/pt/tags/testes-de-integracao/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

testes de integração

+ + + +
+ + + + diff --git a/public/pt/tags/testes-unitarios/index.html b/public/pt/tags/testes-unitarios/index.html new file mode 100644 index 0000000..1cee464 --- /dev/null +++ b/public/pt/tags/testes-unitarios/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

testes unitários

+ + + +
+ + + + diff --git a/public/pt/tags/testes/index.html b/public/pt/tags/testes/index.html new file mode 100644 index 0000000..fbe7aa2 --- /dev/null +++ b/public/pt/tags/testes/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

testes

+ + + +
+ + + + diff --git a/public/pt/tags/tests/index.html b/public/pt/tags/tests/index.html new file mode 100644 index 0000000..7bce125 --- /dev/null +++ b/public/pt/tags/tests/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tests

+ + + +
+ + + + diff --git a/public/pt/tags/threadpools/index.html b/public/pt/tags/threadpools/index.html new file mode 100644 index 0000000..a2933d3 --- /dev/null +++ b/public/pt/tags/threadpools/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

threadpools

+ + + +
+ + + + diff --git a/public/pt/tags/ti/index.html b/public/pt/tags/ti/index.html new file mode 100644 index 0000000..e39bc13 --- /dev/null +++ b/public/pt/tags/ti/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ti

+ + + +
+ + + + diff --git a/public/pt/tags/tiktok/index.html b/public/pt/tags/tiktok/index.html new file mode 100644 index 0000000..25bfed3 --- /dev/null +++ b/public/pt/tags/tiktok/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tiktok

+ + + +
+ + + + diff --git a/public/pt/tags/timer/index.html b/public/pt/tags/timer/index.html new file mode 100644 index 0000000..dba1d8c --- /dev/null +++ b/public/pt/tags/timer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

timer

+ + + +
+ + + + diff --git a/public/pt/tags/tipos/index.html b/public/pt/tags/tipos/index.html new file mode 100644 index 0000000..13f99f8 --- /dev/null +++ b/public/pt/tags/tipos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tipos

+ + + +
+ + + + diff --git a/public/pt/tags/toolbox/index.html b/public/pt/tags/toolbox/index.html new file mode 100644 index 0000000..24a099b --- /dev/null +++ b/public/pt/tags/toolbox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

toolbox

+ + + +
+ + + + diff --git a/public/pt/tags/toolbx/index.html b/public/pt/tags/toolbx/index.html new file mode 100644 index 0000000..e8da190 --- /dev/null +++ b/public/pt/tags/toolbx/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

toolbx

+ + + +
+ + + + diff --git a/public/pt/tags/treesitter/index.html b/public/pt/tags/treesitter/index.html new file mode 100644 index 0000000..ec9dcc6 --- /dev/null +++ b/public/pt/tags/treesitter/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

treesitter

+ + + +
+ + + + diff --git a/public/pt/tags/tu/index.html b/public/pt/tags/tu/index.html new file mode 100644 index 0000000..9db56ff --- /dev/null +++ b/public/pt/tags/tu/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tu

+ + + +
+ + + + diff --git a/public/pt/tags/tui/index.html b/public/pt/tags/tui/index.html new file mode 100644 index 0000000..3a55685 --- /dev/null +++ b/public/pt/tags/tui/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tui

+ + + +
+ + + + diff --git a/public/pt/tags/twitch/index.html b/public/pt/tags/twitch/index.html new file mode 100644 index 0000000..4cf8fcd --- /dev/null +++ b/public/pt/tags/twitch/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

twitch

+ + + +
+ + + + diff --git a/public/pt/tags/twitter/index.html b/public/pt/tags/twitter/index.html new file mode 100644 index 0000000..9bd50ca --- /dev/null +++ b/public/pt/tags/twitter/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

twitter

+ + + +
+ + + + diff --git a/public/pt/tags/typescript/index.html b/public/pt/tags/typescript/index.html new file mode 100644 index 0000000..2d107b0 --- /dev/null +++ b/public/pt/tags/typescript/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

typescript

+ + + +
+ + + + diff --git a/public/pt/tags/unit-tests/index.html b/public/pt/tags/unit-tests/index.html new file mode 100644 index 0000000..2c9bf8f --- /dev/null +++ b/public/pt/tags/unit-tests/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

unit tests

+ + + +
+ + + + diff --git a/public/pt/tags/unit/index.html b/public/pt/tags/unit/index.html new file mode 100644 index 0000000..1a47360 --- /dev/null +++ b/public/pt/tags/unit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

unit

+ + + +
+ + + + diff --git a/public/pt/tags/unix/index.html b/public/pt/tags/unix/index.html new file mode 100644 index 0000000..930a7f2 --- /dev/null +++ b/public/pt/tags/unix/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

unix

+ + + +
+ + + + diff --git a/public/pt/tags/uruguai/index.html b/public/pt/tags/uruguai/index.html new file mode 100644 index 0000000..ee999f5 --- /dev/null +++ b/public/pt/tags/uruguai/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

uruguai

+ + + +
+ + + + diff --git a/public/pt/tags/uwsgi/index.html b/public/pt/tags/uwsgi/index.html new file mode 100644 index 0000000..9b910a3 --- /dev/null +++ b/public/pt/tags/uwsgi/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

uwsgi

+ + + +
+ + + + diff --git a/public/pt/tags/video/index.html b/public/pt/tags/video/index.html new file mode 100644 index 0000000..8281fd8 --- /dev/null +++ b/public/pt/tags/video/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

video

+ + + +
+ + + + diff --git a/public/pt/tags/videos/index.html b/public/pt/tags/videos/index.html new file mode 100644 index 0000000..5b96916 --- /dev/null +++ b/public/pt/tags/videos/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

videos

+ + + +
+ + + + diff --git a/public/pt/tags/vim/index.html b/public/pt/tags/vim/index.html new file mode 100644 index 0000000..816d2a9 --- /dev/null +++ b/public/pt/tags/vim/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vim

+ + + +
+ + + + diff --git a/public/pt/tags/vimconf/index.html b/public/pt/tags/vimconf/index.html new file mode 100644 index 0000000..350fbcb --- /dev/null +++ b/public/pt/tags/vimconf/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vimconf

+ + + +
+ + + + diff --git a/public/pt/tags/vulnerabilidade/index.html b/public/pt/tags/vulnerabilidade/index.html new file mode 100644 index 0000000..654d665 --- /dev/null +++ b/public/pt/tags/vulnerabilidade/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vulnerabilidade

+ + + +
+ + + + diff --git a/public/pt/tags/web/index.html b/public/pt/tags/web/index.html new file mode 100644 index 0000000..46d935d --- /dev/null +++ b/public/pt/tags/web/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

web

+ + + +
+ + + + diff --git a/public/pt/tags/webdav/index.html b/public/pt/tags/webdav/index.html new file mode 100644 index 0000000..9c6ab0c --- /dev/null +++ b/public/pt/tags/webdav/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

webdav

+ + + +
+ + + + diff --git a/public/pt/tags/whatsapp/index.html b/public/pt/tags/whatsapp/index.html new file mode 100644 index 0000000..e12a2e9 --- /dev/null +++ b/public/pt/tags/whatsapp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

whatsapp

+ + + +
+ + + + diff --git a/public/pt/tags/windows/index.html b/public/pt/tags/windows/index.html new file mode 100644 index 0000000..94da43c --- /dev/null +++ b/public/pt/tags/windows/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

windows

+ + + +
+ + + + diff --git a/public/pt/tags/xml/index.html b/public/pt/tags/xml/index.html new file mode 100644 index 0000000..8d6fde2 --- /dev/null +++ b/public/pt/tags/xml/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

xml

+ + + +
+ + + + diff --git a/public/pt/tags/youtube/index.html b/public/pt/tags/youtube/index.html new file mode 100644 index 0000000..b697617 --- /dev/null +++ b/public/pt/tags/youtube/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

youtube

+ + + +
+ + + + diff --git a/public/pt/tags/zig/index.html b/public/pt/tags/zig/index.html new file mode 100644 index 0000000..97c0c1b --- /dev/null +++ b/public/pt/tags/zig/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zig

+ + + +
+ + + + diff --git a/public/pt/tags/zola/index.html b/public/pt/tags/zola/index.html new file mode 100644 index 0000000..a648251 --- /dev/null +++ b/public/pt/tags/zola/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zola

+ + + +
+ + + + diff --git a/public/pt/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html b/public/pt/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html new file mode 100644 index 0000000..caeb994 --- /dev/null +++ b/public/pt/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Código É um Livro, Testes Unitários São Corretores Ortográficos

+ +

Se nós usássemos uma analogia para código sendo as palavras de um livro e o +sistema sendo construído como o livro inteiro, o que seriam os testes +unitários?

+ +

Eu vi uma analogia excelente esses dias1: Você pode pensar que o código que +você está escrevendo como um livro: Cada módulo é um capítulo, cada classe é +um parágrafo e cada função é uma frase.

+

Nessa analogia, onde é que os testes unitários ficariam?

+

Para mim, testes unitários são como corretores ortográficos -- ou, pelo menos, +os mais modernos: Você está escrevendo as palavras da forma correta? As suas +frases estão gramaticalmente corretas? O correto ortográfico vai cuidar disso.

+

Mas existe uma coisa que um corretor ortográfico não vai fazer: garantir que o +capítulo que você está escrevendo faz parte do contexto total do livro. Saindo +um pouco da analogia, deixe-me perguntar isso: Você já leu "Les Misérables"? +Eu li, e nele há um capítulo no meio do livro no qual Victor Hugo discute a +Batalha de Waterloo. Embora faça sentido no período histórico da história do +Les Misérables, o capítulo não faz o menor sentido para a história em si -- +não importa o qual correta está a pontuação, as palavras estão certas e a +gramática correta.

+

Essa é a grande falha dos testes unitários: Eles não validam o todo. O todo é +dado pelos revisores de um livro e pelos testes de integração de um sistema. +Voltando a analogia, quando os testes de integração são definidos pelos +requisitos do sistema, qualquer coisa que não esteja coberto é um capítulo que +não faz sentido no conjunto do livro.

+

A longo prazo, como escritores começam a lembrar as palavras que foram +escritas erradas e os verbos no tempo errado apontados pelo correto +ortográfico, este começa a aparecer menos e menos, assim como testes +unitários: a longo prazo, o ROI2 tende a ser cada vez menor, enquanto +testes de integração -- aqueles que validam se um "capítulo" faz sentido na +história sendo contada no "livro" -- tende a ser maior.

+

E eu achei a analogia perfeita para a forma como eu penso sobre essas duas +metodologias de testes.

+
+
1 +

... mas infelizmente eu perdi a origem dela. :(

+
+
2 +

"Return of Investment" ou "Retorno do Investimento".

+
+ +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/go-problem-is-not-the-xml-vulnerability/index.html b/public/pt/thoughts/go-problem-is-not-the-xml-vulnerability/index.html new file mode 100644 index 0000000..efb6734 --- /dev/null +++ b/public/pt/thoughts/go-problem-is-not-the-xml-vulnerability/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O problema de go não é a vulnerabilidade do XML

+ +

Ontem eu postei alguns comentários sobre a vulnerabilidade da biblioteca XML +do go e algumas pessoas disseram que isso +não era grande coisa.

+

O problema não é a vulnerabilidade em si, no entanto.

+ +

Ainda, o problema é só parcialmente com relação ao fato que a vulnerabilidade +não pode ser corrigida de forma confiável. E não é em relação à biblioteca +"http" que tinha um problema de negação-de-serviço. E não é em relação à +biblioteca de números naturais (e mais especificamente divRecursiveStep) que +causou um erro na rede de Etherium. E não é em relação que a biblioteca "ssh" +tinha uma vulnerabilidade que foi corrigida.

+

O problema é o padrão.

+

Eu não espero que as coisas tenham aquele toque místico de "tudo tem que ser +perfeito". Poxa, com a exceção do problema da biblioteca "xml", todos os outros +problemas já foram corrigidos.

+

Mas existe um padrão surgindo na biblioteca padrão do go que mostra quão pouco +cuidado foi tomado na sua construção. E, junto com esse padrão, tem o +problema que isso está na biblioteca padrão. Bibliotecas padrão deveriam, além +de prover uma infra-estrutura para aplicações maiores, serem implementações de +referencia. Por exemplo, se você quiser saber como é que diabos o Python fez +para adicionar suporte ao SQLite, basta você olhar a biblioteca padrão (FFI); +ou se você se perguntar como é que sets em Python são tão rápidos (tão rápidos +com relação ao resto das coisas em Python, quero dizer), você também +pode consultar a biblioteca padrão (sets são escritos em C); ou como é que eles +fizeram para que "namedtuples" criassem objetos magicamente (eval). Essas +partes descrevem como você deve construir algo que conecte com algo externo, +que seja rápido ou que seja mágico.

+

E esse padrão mostra que a biblioteca padrão do go está fazendo as coisas de +forma errada. Parece que o time de go focou muito em "adicionar valor" e muito +pouco em "servir de referência".

+

Outra indicação que tem algo errado com a linguagem: em quatro meses, o +problema da ordenação não pode ser corrigido. Em metade desse tempo eu consigo +escrever bindings da libxml2 em Python, ou até mesmo em Rust, mesmo não tendo +experiência alguma com o FFI de Python ou Rust. Isso significa que essa camada +que dá acesso a biblioteca padrão à coisas externas está tendo muito controle, +de forma que estruturas externas não podem ser usadas sem que sejam bagunçadas +pelo runtime. Se o FFI tivesse liberdade suficiente para expor somente a camada +mais externa, escrever uma implementação de parser XML em C e só expor as +camadas superiores seria completamente viável em quatro meses -- mesmo sem usar +a libxml2.

+

Todos esses padrão mostram que tem algo de errado com a arquitetura da +linguagem. E é por isso que eu disse que qualquer coisa no mínimo semi-séria +não deveria ser escrita em go.

+

Eu sou uma pessoa que diz coisas controversas de tempo em tempos. No começo +desse ano eu disse, em um evento, que um líder técnico que valesse o seu +próprio salário não recomendaria go para coisa alguma. E eu mantenho essa +posição. Líderes técnicos devem ver esse tipo de problema aparecer e tomar +ações para evitar que o projeto caia num buraco que seja complicado de sair +depois. E esse padrão de problemas com go já tem aparecido a muito tempo.

+

PS: Vocês devem ter notado que eu digitei "go" e não "Go" na maior parte desse +post. Isso é proposital; eu não acredito que a linguagem mereça ser chamada com +um "G" maiúsculo.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/how-to-kill-developer-productivity/index.html b/public/pt/thoughts/how-to-kill-developer-productivity/index.html new file mode 100644 index 0000000..b4cbe0c --- /dev/null +++ b/public/pt/thoughts/how-to-kill-developer-productivity/index.html @@ -0,0 +1,140 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Como Matar a Produtividade de Desenvolvedores

+ +

Existem várias formas de não matar a produtividade de desenvolvedores num +projeto. Infelizmente, as reais causas nunca são comentadas.

+ +

Recentemente vi mais um artigo de "como não matar a produtividades de +desenvolvedores", que diz exatamente o que todos os artigos sobre como não +matar a produtividade de desenvolvedores diz: Basicamente "Evite +interrupções".

+

Mas será que dá pra evitar interrupções mesmo? Não seria o "ping!" da +cafeteira uma interrupção? Não seria a bexiga cheia uma interrupção? Não seria +a campainha avisando que chegou a encomenda e/ou a tele-entrega uma +interrupção?

+

Qual é a diferença entre essas e alguém pedindo ajuda?

+

E fazer menos reuniões? Por que? Porque ninguém se liga de fazer uma pauta de +reunião para ter o que decidir? Ou será que é porque os desenvolvedores de +frontend não dão a mínima para os problemas que o pessoal de backend está +enfrentando e vice-versa?

+

Seria uma reunião marcada com uma semana de antecedência uma "interrupção"?

+

Eu não consigo ver que as interrupções em si são o problema. Imaginem o +seguinte:

+

Essa pessoa passou por um onboarding quando entrou na empresa, e foi +apresentado ao propósito da mesma, foi apresentado ao produto que a empresa +vende e como o produto funciona, foi apresentada à arquitetura do sistema, foi +explicado o motivo de cada solução aplicada, foi dado tempo para discutir +outras soluções com seus pares, não foi colocado contra a parede para explicar +cada minuto de trabalho do seu dia.

+

Dado isso, vocês conseguem imaginar que alguém fazendo uma pergunta sobre +alguma parte do sistema enquanto quem está programando está no meio da função +de frobnicar1 foo? Talvez perca algum tempo para ver em qual ponto parou, +mas como a solução já foi discutida, e já se sabe o propósito da +funcionalidade sendo introduzida, a interrupção vai afetar muito pouco o +resultado final.

+

Infelizmente, na área de TI, passamos muito tempo sendo vistos como "máquinas" +e técnicas de produção são aplicadas diretamente sem considerar que somos +pessoas (ou vocês acham que "kanban" nasceu no meio da TI mesmo e não dentro +da fábrica da Toyota?).

+

Uma máquina parada é dinheiro perdido. Parar a produção para manutenção +preventiva, sem que a máquina esteja realmente quebrada, tendo desmontar a +mesma e verificar cada uma das partes, é dinheiro perdido.

+

E, infelizmente, quando um programador não está "programando", é visto como +dinheiro perdido. E por isso coisas básicas, como explicar o porque o sistema +existe, qual a ideia do fluxo de dados dentro do mesmo, deixando que +programadores parem e discutam soluções e coisas do tipo são completamente +ignoradas: Porque a "máquina" não está produzindo.

+

E, quando é preciso parar a produção, por qualquer motivo, a produtividade vai +lá pra baixo.

+
+
1 +

Eu não se tem alguma forma melhor de traduzir +frobnicate

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/index.html b/public/pt/thoughts/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/thoughts/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/thoughts/movile/index.html b/public/pt/thoughts/movile/index.html new file mode 100644 index 0000000..7fd6568 --- /dev/null +++ b/public/pt/thoughts/movile/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Carta Aberta a Movile

+ +

Precisamos conversar sobre a forma como vocês estão se dirigindo com as +comunidades.

+ +

A uns dois anos, a Movile entrou em contato comigo, por ser organizador de +MeetUps locais, para uma "parceria".

+

Antes de mais nada, eu acredito que preciso esclarecer uma coisa: Como +organizador de MeetUps, minha preocupação deve ser com a comunidade: Como a +comunidade pode crescer, qual conteúdo a comunidade está procurando e como +manter a comunidade unida. Enfim, o foco de qualquer organizador de MeetUp deve +ser a comunidade.

+

Essa "parceria", a qual eu imaginei inicialmente que seria algo como "queremos +apresentar o conteúdo que a Movile está produzindo para a sua comunidade" -- +algo louvável e que mostraria que a Movile está interessada em compartilhar o +conhecimento e mostrar que está aqui para participar da comunidade. +Infelizmente, não foi o que aconteceu: Quanto mais pressão eu colocava para +saber o que era a parceira, menos informações eu tinha. Até que desisti de +continuar a conversa.

+

Outros organizadores participaram do evento e apontaram exatamente o que era +esperado: A Movile estaria abrindo escritório aqui e queria que fizessem +propaganda das vagas deles aqui. Nada de "parceira", apenas um "vocês nos dão, +a gente recebe".

+

Ontem recebi um novo email deles, pedindo para anunciar uma oportunidade de +estágio deles. Novamente, como organizador de MeetUp, é importante esse tipo de +oportunidade, justamente para ajudar aqueles que estão a pouco tempo na +comunidade a conseguirem conhecimento fora do grupo. Entretanto, o pedido +termina com a seguinte frase:

+
+

"Seria incrível ter esse apoio para trazermos cada vez mais pessoas da +comunidade de tecnologia para as empesas do Grupo Movile."

+
+

Não, não seria. Seria incrível se uma empresa do tamanho da Movile participasse +da comunidade; seria incrível se uma empresa do tamanho da Movile tivesse +oportunidades com o intuito de compartilhar conteúdo com a comunidade; seria +incrível se uma empresa do tamanho da Movile quisesse fazer parte da comunidade +ao invés de só tirar proveito da mesma.

+

Quem quer que seja o responsável pela comunicação da Movile realmente não +entende nada sobre comunidades.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/python-loses-2nd-place-loved-language/index.html b/public/pt/thoughts/python-loses-2nd-place-loved-language/index.html new file mode 100644 index 0000000..ef8256a --- /dev/null +++ b/public/pt/thoughts/python-loses-2nd-place-loved-language/index.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python Perde a Segunda Posição Nas Linguagens Mais Amadas: Uma Reflexão

+ +

Na pesquisa desse ano do StackOverflow, Python perdeu a segunda posição no +ranking de "Linguagens Mais Amadas" para TypeScript. No nosso grupo de Python, +as pessoas começaram a se perguntar o porque. E eu achei que seria +interessante postar minhas reflexões sobre a situação.

+ +

Antes de mais nada, eu preciso fazer um aviso de que eu adoro Python, e eu +acredito que é uma grande linguagem por ser concisa mais ainda assim bem +expressiva. Eu não acredito que tenha algum outra linguagem que chegue perto +de Python nesses quesitos.

+

Aviso dado, me deixem explicar porque eu acho que Python perdeu o segundo +lugar no coração dos desenvolvedores.

+

Tipos

+

Um dos primeiros pontos que as pessoas pensam quando falamos de "perdeu uma +posição" em qualquer ranking é porque "ficou pior". Mas eu não acho que seja o +que aconteceu aqui, e o que realmente aconteceu é que TypeScript mostrou algo +melhor para desenvolvedores.

+

TypeScript foi projetada para desenvolvimento JavaScript, uma zona onde +qualquer coisa vale, tipos são bem flexíveis e mágicos -- ao ponto de que a +maior parte das coisas produz um +Wat. Usando tipos, +certificando que você não está adicionando uma string a um array, um monte de +problemas desaparecem. Não que seja uma bala de prata, mas previne uma classe +inteira de problemas que iriam aparecer em produção.

+

Assim, em um ambiente onde coisas caóticas acontecem, de repente você tem algo +que coloca ordem de volta e você vai adorá-lo por isso. Não que os tipos sejam +a única coisa que faz com que TypeScript seja mais amado que JavaScript, mas +pode explicar parcialmente o porque.

+

(Apenas para adicionar nesse ponto: Rust ainda é a linguagem mais amada, agora +por 5 anos consecutivos, e tem uma tipagem bem forte, semelhante a Haskell, +com uma sintaxe mais próxima das linguagens mais usadas.)

+

Eu ainda acredito que, a longo prazo, type hinting pode preencher essa falha +do Python para voltar a sua posição original. Eu gostaria que se eu +adicionasse hints em todas as funções e ter algo que permitisse definir o +nível de validação em ambientes distintos: Fazer a aplicação gerar um erro se +a função fosse chamada com os tipos incorretos em desenvolvimento; gerar um +warning (no logging ou no stderr) em staging; e fazer absolutamente nada em +produção. Isso permitiria que eu tivesse o melhor de dois mundos: Dinâmico +quando desenvolvendo mas estático em testes.

+

Python 2 Morreu

+

Uma das coisas que aconteceu com o Python no começo desse ano, quando a +pesquisa foi feita, foi que Python 2 ficou sem suporte oficial. Obviamente +isso não significa que as instalações de Python 2 simplesmente pararam de +funcionar, mas deu um empurrão a mais para portar código para Python 3.

+

E, mesmo com todas as melhorias no Python 3 para ajudar a portar aplicações, +ainda assim não foi algo completamente suave. Essa mudança, essa mudança +forçada, pode ter deixado alguns desenvolvedores Python com um gosto ruim. E +ninguém quer simplesmente corrigir problemas com a linguagem, deixando as +coisas funcionarem do jeito que estavam antes, coisas estranhas e tudo mais.

+

Hype

+

Python não é mais uma linguagem "hypada".

+

Ainda é a referência para machine learnign e campos relacionados, mas o antigo +ambiente de desenvolvimento web foi capturado pelo hype de outras linguagens.

+

Python não é mais a "legalzisse" de desenvolvimento web. E porque não é mais a +legalzisse, pessoas não querem a coisa antiga; a coisa antiga não é mais +legal, então o pessoal não gosta mais dela.

+

Relacionado: Só porque alguma coisa tem hype, não quer dizer que seja +melhor; apenas faz com que as coisas sem hype se tornem "não melhores", +mesmo que não tenha havido qualquer alteração nesses últimos.

+

Relacionado

+

Um ponto que não foi levantado no grupo: Mesmo que Python tenha perdido o +segundo lugar no ranking de "Mais Amadas", Python ainda é a linguagem mais +procurada -- o que significa que ainda é a linguagem que os desenvolvedores +mais querem aprender. Se o sentimento geral fosse de "Python é ruim!", eu +duvido que a procuram ainda seria representativa -- e Python ainda tem uma +liderança considerável com relação a JavaScript.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/real-life-rust/index.html b/public/pt/thoughts/real-life-rust/index.html new file mode 100644 index 0000000..0b3f3ac --- /dev/null +++ b/public/pt/thoughts/real-life-rust/index.html @@ -0,0 +1,184 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust na Vida Real

+ +

Já faz algum tempo que eu tenho falado sobre Rust, fazendo apresentações, indo +a meetups...

+

Mas a alguns meses eu tive a oportunidade de finalmente trabalhar num projeto +real em Rust.

+

Então, como é que foi?

+

Cargo é mágico

+

A primeira aplicação que eu usei Rust foi uma parte pequena de um grande +projeto. Eu tinha que capturar valores vindos de um websocket e guardar os +mesmos num banco de dados.

+

Haviam duas opções de linguagens que eu poderia usar: Python e C. Python já +estava sendo usado em outras partes da empresa, e isso garantiria mais olhos +caso algo desse errado. C estava sendo usado em outra aplicação do mesmo +projeto, e eu poderia manter todo o projeto na mesma linguagem. Ambas +linguagens tinham alguns problemas: Eu não tinha certeza que Python conseguiria +lidar com a carga de dados de um stream contínuo do websocket e eu não queria +ter que escrever meu próprio processamento de websocket e parser de JSON em C.

+

E foi por isso que eu usei Rust nesta aplicação: Eu tinha a performance de C +com um excelente gerenciador de pacotes, e mais milhares de pacotes +disponíveis.

+

Assim, Cargo foi quem decidiu o uso de Rust no projeto. E a linguagem se provou +bem capaz, pois a aplicação fico rodando até o ponto que acabamos esquecendo +que ela estava rodando.

+

.unwrap() é o inimigo

+

Um ponto que eu faço nas minhas apresentações é que você pode usar .unwrap() +(e .expect()) para evitar ter que lidar com erros, e embora o uso deste faça +com que sua aplicação seja encerrada, você tem total controle sobre onde ela +pode ser encerrada (comparado com um NullPointerException, ou ler valores NULL, +ou não capturar as exceções corretas). Mas, no fim das contas, .unwrap() vai +te machucar. Bastante.

+

Foi o que aconteceu com a segunda aplicação que eu escrevi: A parte principal +da aplicação era ler um conjunto de bytes, e o significado destes bytes estava +nos bits que os compunham, em uma combinação de bitmaps e números num formato +tipo UTF-8. Mas não era só o parsing que estava envolvido: Havia um socket a +ser lido, e os dados parseados tinham que ser guardados num banco de dados, e +haviam os problemas usuais envolvidos nisso -- o socket poderia ser fechado +pelo servidor, nós poderíamos perder a conexão de rede, o parser poderia +produzir valores estranhos no caso de um bit perdido, que não poderia ser +guardado no banco de dados...

+

Para cada um dos problemas possíveis (que eram bem claros, já que Result é a +base de quase tudo), e como eu estava com pressa para entregar a aplicação, eu +usei um monte de .unwrap()s pelo código -- de novo, a ideia era que, se a +aplicação crasheasse, pelo menos eu disse que ela podia crashear, e iria me dar +uma mensagem mais ou menos indicando onde. A realidade é que problemas aconteciam +com tal frequência (especialmente o parser recebendo bits estranhos que +produziam valores estranhos) que a aplicação não ficava rodando por muito +tempo.

+

A solução para esses crashes constantes foi bem simples, embora trabalhoso: +trocar todo .unwrap() e .expect() por if let Ok(_) e match. Isso me deu +controle total do que fazer nos casos de valores não esperados. O resultado foi +que a aplicação rodou sem problemas por dias, ao ponto que nós, mais uma vez, +esquecemos que ela estava rodando -- exceto quando os dados de entrada mudavam +e nós tínhamos que atualizar nossos filtros.

+

Cargo de novo

+

Nesta segunda aplicação, havia um monte de coisinhas chatas no protocolo que +eram realmente complicadas de entender. Felizmente nós conseguimos capturar +alguns pacotes do serviço, que permitiria testar o parser localmente. Tudo que +eu precisava era algo que me desse uma rede de suporte para jogar esses bits e +ver como o código processaria.

+

Com C, isso normalmente significa criar outro executável para os testes e rodar +esse executável ao invés do executável real (e, pra ser honesto, é exatamente +isso que o Rust faz) mas o Cargo escondeu toda a complexidade de fazer isso. Eu +só criei test.rs nos meus módulos, marquei o mesmo com #[cfg(test)] +(indicando que o mesmo só existe na configuração de teste) e cargo test +compilou o código e rodou os testes.

+

O fato que eu tinha um framework de test e um executor de testes logo ali foi +de grande ajuda, especialmente quando um problema era encontrado.

+

Deveria ter tentado (tryed) mais

+

Um dos efeitos colaterais de trocar todo .unwrap() e .expect() for alguma +forma explícita de tratamento de erro foi o aumento da indentação do código -- +porque tudo que eu fiz foi fazer essa alteração, mas eu não quebrei o código +em funções menores.

+

Rust tem o operador try -- ? -- mas isso requer que a função com o operador +retorne um Result, que eu negligenciei na primeira passagem porque, bom, a +única saída das funções era o sucesso e falhas significavam panic!() (por +causa do .unwrap()).

+

Se eu tivesse usando Result como resultado desde o começo, eu tenho a +impressão que o código não ficaria uma bagunça com 7-8 níveis de indentação. Ou +seja, outra coisa que eu teria "ganho" se eu não tivesse usado .unwrap().

+

Async não faz menor sentido até que faz

+

A terceira aplicação no projeto precisava fazer um monte de I/O -- ler de +vários bancos de dados, enviar dados por socket, escrever de volta no banco de +dados... Parecia o perfeito experimento para um projeto async.

+

Na primeira versão que eu escrevi, eu usei tasks (funções async) da mesma forma +que eu faço com threads. Isso gerou um monte de erros do borrow checker que eu +não conseguia entender o porquê -- neste ponto, eu já conseguia entender +exatamente porque o borrow checker estava reclamando de alguma coisa numa +aplicação com threads, mas os erros eram tão confusos que eu devo ter +mencionado algo como "async não é natural em Rust". E, quando eu finalmente +consegui evitar todas as reclamações do borrow checker, a performance foi... +terrível. Algo como 0.8 registros por segundo, que era extremamente baixo para +o que estávamos esperando.

+

Com essa performance horrível, eu removi todas as coisas async e usei threads. +Isso estava mais com o que eu estava acostumado -- eu sabia exatamente o que eu +tinha feito de errado quando o borrow checker reclamava de algo -- e a +performance melhorou: O processamento passou a 7 registros por segundo.

+

Enquanto eu estava nessa reescrita, eu fiquei lendo sobre async e como +funciona, até que eu consegui formar um modelo mental para trabalhar desta +forma (mais sobre isso num post futuro). Eu consegui ter algum tempo para +efetivamente aplicar esse modelo mental -- e aí os erros do borrow checker +começaram a fazer sentido, e eu me senti produtivo de novo. O resultado? 70 +registros por segundo, uma melhoria de 10x sobre o uso de threads.

+

Conclusão

+

Tudo isso eu aprendi num espaço de 6 meses. Eu acabei trocando de emprego para +um lugar onde não há nada em Rust (por enquanto 😈), e embora a estrada do Rust +seja ingrime e cheia de curvas fechadas, eu ainda acho que vale a pena.

+

(E, até onde eu sei, todas as aplicações aqui continuam rodando...)

+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/reveries-about-testing/index.html b/public/pt/thoughts/reveries-about-testing/index.html new file mode 100644 index 0000000..e275a1f --- /dev/null +++ b/public/pt/thoughts/reveries-about-testing/index.html @@ -0,0 +1,455 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Devaneios Sobre Testes

+ +

Hoje em dia, boa parte dos desenvolvedores utiliza alguma metodologia de +testes. Mas o que são os testes? Para que servem? Qual o objetivo de se +testar? Estamos testando as coisas certas?

+
+

Esse post acompanha a minha apresentação de Filosofando Sobre +Testes.

+ +
+

Antes de começar, alguns avisos:

+
    +
  1. +

    Eu sou não ortodoxo com relação a testes. Com isso eu quero dizer que +muitas das coisas que eu vou comentar aqui são exatamente contrárias do que +todo mundo fala e da forma como muitos trabalham com testes.

    +
  2. +
  3. +

    De forma alguma, considere esse conteúdo como regras. O que eu quero é que +as pessoas parem de sair criando testes sem saber porque estão fazendo +esses testes.

    +
  4. +
  5. +

    Ainda, de forma alguma você precisa concordar com alguma coisa aqui. De +novo, a ideia é parar para pensar no que está sendo testado antes de sair +testando.

    +
  6. +
+

Agenda de coisas que eu vou comentar:

+
    +
  1. TDD no estilo Kent Beck;
  2. +
  3. "Fast Tests, Slow Tests";
  4. +
  5. Explosão de Testes Lentos;
  6. +
  7. Coverage;
  8. +
  9. Mocking.
  10. +
+

TDD no Estilo Kent Beck

+

O que me levou a repensar a forma como eu escrevia testes foi um vídeo do Ian +Cooper chamado "TDD, where it all go wrong" +("TDD, aonde é que a coisa deu errado"). No vídeo, Cooper coloca que o livro que +Beck escreveu (que deu origem a toda a revolução do TDD) diz duas coisas:

+
    +
  1. Testes devem ser executados de forma isolada, nada mais, nada menos.
  2. +
  3. Evite testar detalhes de implementação, teste comportamentos.
  4. +
+

O primeiro ponto é o que fala sobre "unit tests", significando "rodam de forma +isolada", no sentido em que um teste não depende de outro. Dessa forma, "unit +tests" seriam traduzidos como "testes unitários", não "testes de unidade" -- +não há "unidade", o teste em si é uma unidade única que não depende de outras +coisas.

+

O segundo ponto é que deve ser testado o comportamento, não a implementação. +Esse é um ponto que eu vejo falhar um bocado quando pensamos em testar todo e +qualquer classe e/ou função: E se o comportamento esperado é a combinação de +duas classes? Vale a pena escrever testes para as duas, sendo que a questão de +separar em duas classes diferentes (ou duas funções diferentes) é apenas uma +questão de implementação/simplicidade de código?

+

Ainda, outro questionamento sobre testar todas as funções e todas as classes: +o que sabemos de uma aplicação são os canais de entrada -- que pode ser por um +botão em uma interface gráfica, um texto digitado na linha de comando ou uma +requisição web -- e os canais de saída; assim, o comportamento esperado é +"dado essa entrada pelo canal de entrada, quero ter essa saída", e qualquer +coisa no meio é implementação. E para fazer a transformação de uma +entrada para uma saída específica, eu posso precisar de mais de uma função +e/ou classe; se eu estiver testando cada uma das funções, eu estou realmente +testando o comportamento ou a implementação?

+

"Mas isso é muito parecido com BDD!", você deve estar pensando. Cooper coloca +isso no vídeo acima: Como a ideia de "testar cada função/classe" se tornou a +norma do TDD, a questão do comportamento teve que ser colocado em outro +formato, o que deu origem ao ATDD (Acceptance-Test Driven Development, +Desenvolvimento Guiado por Testes de Aceitação) e BDD (Behaviour Driven +Development, Desenvolvimento Guiado por Comportamentos).

+

Um exemplo de testes de comportamento: No Subreddit do Django, foi criada +uma pergunta: Devo Escrever Testes Para os Tipos Built-In do +Django? +A questão se resume ao seguinte: Sabendo que no Django eu tenho tipos +definidos para meus dados no banco, e a partir dessas definições eu posso +criar formulários para colocar nos meus templates e esses formulários também +servem para validar os dados de entrada; assim, se eu defini que há um campo +no meu banco chamado "Ano de nascimento" -- que só pode receber números +inteiros -- e eu crio o formulário a partir do banco, coloco no meu template, +recebo os dados de volta e o próprio Django vai garantir, pelo tipo do dado no +banco, que o valor do campo é um número inteiro. Eu ainda preciso escrever um +teste para isso?

+

A resposta, no entanto, está em dar um passo atrás e fazer a seguinte +pergunta: Por que o ano é um inteiro? Obviamente, porque anos são definidos +como números1 e, portanto, o comportamento do campo foi definido bem antes do +campo ser adicionado na tabela. Ainda, imagine que, por algum acidente do +destino, eu precise guardar o ano como uma string2; se o tipo foi alterado, +o comportamento vai ser alterado também? Provavelmente não.

+

Quando eu ignorei que ano deve ser um número porque "o framework cuida disso +pra mim", eu ignorei o comportamento esperado por culpa da implementação.

+

E "teste comportamentos, não implementação".

+

Embora não factual, uma anedota: Num projeto, tínhamos um "gerenciador de +alarmes" onde, a partir de um evento, poderia ser gerado simplesmente um log, +ser gerado um log e enviado um sinal SNMP ou, dependendo da configuração do +usuário, log, SNMP e ativação de um LED no painel frontal do equipamento. +Assim, criamos um módulo com a geração do log, um módulo com o envio do SNMP e +um módulo com a ativação/desativação do LED. Embora tudo tivesse testes, nós +ainda não nos sentíamos tranquilos com aquilo. Foi quando sugeri que +escrevêssemos um teste que levantasse o serviço e enviasse os eventos e ver o +que acontecia. E, finalmente, os testes fizeram sentido. (Eu ainda vou fazer +referências a esses testes na parte de cobertura.)

+

Fast Tests, Slow Tests

+

O contraponto do que eu comentei acima pode ser algo parecido com Fast Tests, +Slow Tests, do Gary Bernhardt. +Em resumo, nessa apresentação, Bernhardt comenta que mudaram os testes e que +agora era possível executar centenas de testes em menos de 1 segundo (um +exemplo mostra aproximadamente 600 testes em 1.5 segundos).

+

O que o Bernhardt sugere é escrever testes apenas para os models, sem conexão +com o banco ou controllers; testes de controllers sem conexão com os models ou +views; e testes de views sem controllers.

+

Soa familiar (principalmente em frameworks MVC que separam cada um destes em +classes separadas)?

+

Ainda sobre esses testes, Bernhardt aponta que essas "execuções rápidas" +ajudam os desenvolvedores a testar suas alterações rapidamente (ainda soa +familiar?) mas que esses testes não substituem os testes de integração.

+

Nesse ponto é preciso se perguntar: se são escritos testes que verificam a +execução de um controller de forma isolada do resto do sistema, mas ainda é +necessário escrever os (chamados) testes de integração para garantir que o +projeto está entregando o que foi prometido entregar, o que é que está +realmente sendo testado? A impressão que deixa é que o estilo de teste pregado +por Bernhardt está mais para aderência à arquitetura do que um teste de +qualidade do sistema: Esse controller segue a estrutura de não ter conexões de +banco em si? Esse model tem apenas as funções relacionadas com o +armazenamento e recuperação dos dados, sem qualquer lógica? Se é isso, qual o +valor para meu usuário se o controller não faz nenhuma gravação no banco de +dados?

+

Não que eu acredite que testes desse tipo sejam desnecessários, mas eles +deixam a impressão que, a longo prazo, eles tendem a se parecerem, +estruturalmente, muito parecidos, enquanto que (assim chamados) testes de +integração tendem a dar mais retorno a longo prazo para a qualidade do +projeto: Testes que definem uma entrada e um resultado esperado tendem a +garantir que, a longo prazo, o funcionamento do sistema continuará sendo igual.

+

Explosão de Testes Lentos

+

A primeira consideração que surge numa declaração como a de cima é que "testes +de integração são lentos e isso vai tornar os testes lentos e reduzir a +produtividade dos desenvolvedores."

+

Sim, testes de integração são lentos, principalmente porque há um bom trabalho +em criar o estado inicial esperado, todas as entradas conforme esperado pelo sistema +de I/O (de novo, interface gráfica, linha de comando, web), percorrer todo o +percurso do processamento e verificar a saída. E sim, esperar esse tempo de +execução pode acabar distraindo o desenvolvedor.

+

Entretanto, quando um desenvolvedor está trabalhando num tratamento de algum +dado, se for uma nova funcionalidade/comportamento esperado, obviamente um +teste desse comportamento deve ser criado; se é uma alteração de +comportamento, deve haver um teste do comportamento esperado e esse deve ser +corrigido. Executar apenas esse teste é o suficiente? Não, mas já dá boas +indicações de que a funcionalidade está funcionando como prevista. Depois de +garantir que a funcionalidade está correta, o desenvolvedor pode executar a +suite de testes do elemento sendo alterado e deixar o resto para o CI.

+

Por exemplo, se eu estiver trabalhando numa funcionalidade nova de mostrar uma +mensagem de erro caso seja feito um pedido quando o produto pedido não exista +no estoque, eu tenho que escrever um novo teste que crie um produto, deixe-o +com uma quantidade 0 em estoque, faça o pedido de compra e verifique que houve +erro. Uma vez que esse teste confirme a funcionalidade, eu posso rodar os +demais testes de pedidos, e depois disso deixar o CI validar que eu não +quebrei nada no gerenciamento de estoque ou cadastro de clientes (por algum +motivo).

+

E note que provavelmente para fazer todas essas validações, eu ainda vou +precisar de várias funções/classes e testar cada uma em separado não garante a +funcionalidade, mas eu vou voltar a esse tópico quando tiver falando de +cobertura.

+

Isso me parece o mais complicado pois parece haver, ao mesmo tempo, uma +interface muito ruim das ferramentas de testes para executar suites de testes +(somente os testes de pedidos, no exemplo anterior) e preguiça em executar +apenas os testes da suite (é mais fácil chamar o comando que roda todos os +testes que lembrar do caminho específico da suite -- sem contar organização de +suites para isso).

+

Coverage

+

Ao contrário de que muitos comentam por aí, eu realmente acredito que seja bem +viável chegar a 100% de cobertura de testes: Basta apagar código.

+

A ideia é bem simples, na verdade: Se meus testes testam o comportamento do +sistema, e eu estou garantindo que esses testes passam, qualquer coisa que não +tenha cobertura indica que o código não é necessário e que, portanto, pode ser +removido.

+

Entretanto, não é qualquer código que possa ser apagado. No exemplo do +gerenciador de alarmes, apesar dos "testes unitários" cobrirem todas as +funcionalidades, aconteceu que no "teste de integração" surgiu um bloco de +código que nunca era executado. Esse bloco era responsável por validar a +entrada de um dos módulos (garantindo que não seria possível enviar um SNMP +sem mensagem, por exemplo). Entretanto, ao examinar o código durante a +execução, nós percebemos que o módulo base já estava fazendo essa validação e +que o código de proteção do módulo jamais seria chamado. Obviamente, essa é +uma questão sobre qual dos dois testes deveria ser eliminado. Mas nós tínhamos +"código morto", considerado "vivo" porque um "teste unitário" estava passando +pelas duas validações.

+

Um exemplo mais prático. Imagine uma classe que guarde dados de clientes de +um serviço web de compras3:

+
class Client:
+    def __init__(self, name):
+        self.name = name
+
+

Depois de um tempo, surge um novo requisito: Um tal de "Zézinho" +está criando usuários sem parar, sem fazer compras, só pra sujar o banco; +devemos bloquear todos os cadastros que tenham como nome do usuário apenas um +nome.

+

Aí, pensando em SOLID4, o desenvolvedor altera o código para o seguinte:

+
def _multiple_names(name):
+    split_names = name.split(' ')
+    return len(split_names) > 1
+
+def _validate_name(name):
+    if not _multiple_names(name):
+        raise Exception("Invalid name")
+    return name
+
+class Client:
+    def __init__(self, name):
+        self.name = _validate_name(name)
+
+

Agora o que acontece é que quando um cliente é criado, são passadas as +validações sobre o nome, e uma dessas é que o nome deve ter múltiplos +nomes5.

+

Nova funcionalidade, precisamos de novos testes, certo?

+
import pytest
+
+def test_single_name():
+	"""'Cher' não tem multiplos nomes."""
+    assert not _multiple_names('Cher')
+
+def test_multiple_name():
+	"""'Julio Biason' tem múltiplos nomes."""
+    assert _multiple_names('Julio Biason')
+
+def test_valid_name():
+	"""'Julio Biason' é um nome válido."""
+    _validate_name('Julio Biason')
+
+def test_invalid_name():
+	"""'Cher' não é um nome válido e por isso levanta uma exceção."""
+    with pytest.raises(Exception):
+        _validate_name('Cher')
+
+def test_client_error():
+	"""Se tentar criar uma conta com 'Cher', deve dar erro."""
+    with pytest.raises(Exception):
+        Client(name='Cher')
+
+def test_client():
+	"""Uma conta com nome 'Julio Biason' deve funcionar."""
+    Client(name='Julio Biason')
+
+

E ao rodar os testes:

+
$ pytest --cov=client client.py
+==== test session starts ====
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      25      0   100%
+
+==== 6 passed in 0.11 seconds ====
+
+

100% de cobertura e funcionalidade implantada! O desenvolvedor se dá uns +tapinhas nas costas e vai pra casa.

+

Entretanto, durante a noite, acontece de um dos gerentes ser amigo da Xuxa, +que tentou fazer uma compra e não conseguiu. O desenvolvedor chega de manhã e +vê o email do gerente e sai a corrigir o código:

+
class Client:
+    def __init__(self, name):
+        self.name = name
+
+

Pronto, não tem mais validação6 e agora a Xuxa pode comprar. Mas ao rodar +os testes:

+
==== FAILURES ====
+____ test_client_error ____
+
+    def test_client_error():
+        with pytest.raises(Exception):
+>           Client(name='Cher')
+E           Failed: DID NOT RAISE <class 'Exception'>
+
+client.py:37: Failed
+==== 1 failed, 5 passed in 0.63 seconds ====
+
+

A, é claro! Agora Cher é um nome válido e o comportamento testado é invalido. +Vamos mudar o teste para o comportamento esperado para a Cher:

+
def test_client_error():
+	"""Se tentar criar uma conta com 'Cher', deve funcionar."""
+	Client(name='Cher')
+
+

E rodando os testes de novo:

+
$ pytest --cov=client  client.py
+==== test session starts ====
+rootdir: /home/jbiason/unitt, inifile:
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      24      0   100%
+
+==== 6 passed in 0.12 seconds ====
+
+

Maravilhoso, tudo está funcionando com o comportamento esperado e ainda temos +100% de cobertura.

+

Mas você consegue ver onde está o problema desse código?

+

O problema é que _multiple_names não é mais usado em lugar algum, mas o +mesmo se mostra "vivo" porque um teste perdido continua indicando que o código +está vivo. Se tivéssemos começado com os testes de comportamento desde o +começo -- considerando entradas e saídas -- de cara veríamos que a função não +é mais necessária -- e se, num futuro, ela for... bom, é pra isso que sistemas +de controle de versão existem.

+

Embora esse possa parecer um exemplo bobo, existem outros casos em que o fluxo +de processamento dos dados pode ser alterado pelo próprio ambiente. Por +exemplo, no Django, é possível ter classes "middleware", que são capazes de +interceptar Requisições ou Respostas e alterar o resultado o mesmo. O exemplo +mais comum é o middleware de Autenticação, que adiciona informações do usuário +logado na Requisição; mas essas alterações podem ser mais profundas, como +alterar os dados do formulário. Nesses casos, a entrada (ou a +saída, ou ambos) é afetada e, portanto, escrever testes que ignorem os +middlewares não vão representar a entrada (ou saída, ou ambos) do sistema +corretamente. E aí podemos perguntar se o teste é válido por usar estados que +não existem naturalmente no sistema.

+

Mocks

+

Há um tempo, eu indicava que "mocks" deveriam ser usados para coisas externas +ao sistema. Entretanto, eu percebi que essa definição não é bem precisa -- +existem coisas externas que não devem ser mockadas -- e que uma definição +melhor para o que deve ser mockado é "qualquer coisa que esteja fora do seu +controle".

+

Por exemplo, se você está escrevendo um sistema que faz geolocalização de IPs +através de um serviço externo, você provavelmente irá mockar a chamada para o +serviço, já que ele está fora do seu controle. Mas uma chamada para o banco de +dados, quando você já utiliza um sistema/framework de abstrai toda a parte de +banco de dados (por exemplo, Django), então o banco, apesar de ser uma entidade +externa, ainda está sob seu controle e, portanto, não deveria ser mockada -- +mas como o sistema/framework oferece uma abstração do banco, então usar +qualquer banco não deve afetar o resultado.

+

Outro exemplo são microserviços. Mesmo microserviços dentro da mesma empresa +ou mesmo grupo são externos e fora do controle do projeto e, portanto, +mockados. "Mas são da mesma equipe!" Sim, mas não são do mesmo projeto, já que +a) a ideia de microserviços é justamente desacoplar esses serviços e/ou b) +estão em árvores de diretórios separados. Uma das vantagens de microserviços +da mesma equipe é que o contrato esperado por um é conhecido pela equipe e +isso pode ser mockado de forma fácil (a equipe sabe que, chamando um serviço +com dados X, haverá a resposta Y -- ou erro).

+

Conclusão

+

De novo, a ideia não é reescrever todos os testes que você tem porque +"o jeito certo, que é o meu jeito". Entretanto, eu realmente vejo muitos +testes sendo escritos "a revelia", considerando a simples métrica de "um teste +por função/classe" e, em muitos casos, isso não faz sentido e que precisariam +ser repensados. Expondo esses "pensamentos impuros" sobre testes, minha ideia +era realmente fazer com que as pessoas repensassem a forma como os testes +estão sendo criados.

+
+
1 +

A não ser que você use anos com números romanos.

+
+
2 +

O porque vai ser uma string pode ser variado: por causa de um plugin de +segurança, porque é feito um armazenamento num banco que não trabalha bem +com inteiros, por causa de uma integração com sistema legado...

+
+
3 +

Uma classe de entidades de clientes deveria ser bem mais completa que +essa, mas vamos deixar ela simples assim para fins de exemplo.

+
+
4 +

E não, isso também não é SOLID de verdade, mas vamos deixar assim de +novo para fins de exemplo.

+
+
5 +

E alguém vai me passar o link do "Falácias que Desenvolvedores Acreditam +Sobre Nomes de Usuários" por causa disso.

+
+
6 +

E sim, deveria alterar só o _validate_name, mas assim fica mais claro +onde está o problema.

+
+ +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/rms-and-fsf-again/index.html b/public/pt/thoughts/rms-and-fsf-again/index.html new file mode 100644 index 0000000..a00dabd --- /dev/null +++ b/public/pt/thoughts/rms-and-fsf-again/index.html @@ -0,0 +1,213 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

FSF e rms (De Novo)

+ +

Mais ou menos a seis meses atrás, em 16 de setembro de 2020, Richard Stallman, +também conhecimento como "rms" reunciou sua cadeira da +FSF +(Free Software Foundation, mantenedora da família de licenças GPL) com +manchetes não-tão-boas. Há uma semana atrás, em 22 de março de 2021, rms +anunciou ao mundo que ele está de volta.

+

E agora estamos numa grande baderna. De novo

+

Antes de mais nada...

+

Deixem-me deixar algo bem claro de começo: Ninguém está negando o trabalho +feito pelo rms. Ninguém está dizendo que o trabalho de criar um compilador +inteiro para produzir um sistema operacional de código aberto não tem seus +méritos. Todos esses são reconhecidos e mostram um grande trabalho para o bem +maior.

+

Entretanto...

+

Existem alegações vindo de todos os lados que rms assediava as pessoas +(principalmente mulheres), algumas pessoas se sentindo inconfortáveis com suas +palavras e sua forma de agir; e, ao mesmo tempo, temos pessoas falando que não +é tudo isso, que existe um "linchamento" acontecendo (sem mentira) e pessoas +que mostram seu apoio.

+

"Ele é uma pessoa boa ou má?" não é uma pergunta que eu pretendo responder +aqui. Isso não faz parte do que me incomoda nessa discussão toda.

+

Devido às suas opiniões fortes e reclamações gerais da sua presença, ele +resolveu renunciar a sua posição da FSF, a organização responsável pela licença +GPL e coisas relacionadas à ela, desde mantê-la ativa a ajudar desenvolvedores +com questões legais do uso da licença.

+

(Pessoalmente, embora o artigo acima diga que sua renuncia tenha sido em parte +pelas notícias de pessoas usando o "serviço" de Jeffrey Epstein de garotas +jovens como prostitutas, eu li que o apoio do rms ao Marvin Minsky, citado como +um dos clientes de Epstein, não era "Isso, sexo com menores é ok!" mas "Eu +acho que Minsky foi convencido que as garotas não eram menores de idade e +forçadas ao sexo, então ele foi parte disso sem saber" -- e, de novo, isso foi +o que eu entendi. E apenas neste ponto, para que fique claro).

+

Mas, no fim, foi o que foi apontando durante a sua renuncia.

+

E então...

+

Em 22 de março de 2021, rms apareceu num evento online, +LibrePlanet para anunciar que ele estava de +volta ao board da FSF. Não houve um anúncio oficial sobre isso, e foi uma +grande surpresa para todos.

+

Dias depois do anúncio, a RedHat, a FSFE (Free Software Foundation Europe) e +outras empresas e grupos tiraram seu apoio a FSF.

+

Mas...

+

O primeiro problema que eu vejo com tudo isso é que a FSF, enquanto promotora +da abertura de software, que mantém uma licença que permite a todos terem +acesso ao código, uma licença que promove a evolução do código fonte de forma +aberta, de repente tomou uma decisão atrás de portas fechadas sem consultar +ninguém fora do board.

+

É estranho alguém promover abertura quando as duas próprias decisões são +tomadas de forma fechada.

+

E também...

+

O segundo problema é o conteúdo do anúncio.

+

De novo, sem entrar na discussão do "Ele disso isso", "Ele não disse isso", uma +pessoa precisa entender o que foi dito que causou revolta. Não foi dito nada +sobre "Olha, o que eu disso foi tirado de contexto" ou mesmo um "Eu escolhi mal +minhas palavras e isso acabou machucando pessoas e eu prometo que vou tomar +mais cuidado no futuro"1.

+

Eu acho que, se houvesse pelo menos alguma menção à isso, a revolta atual não +seria tão forte. Não que não houvesse revolta, mas seria bem menos agressiva. +Diabos, eu acho que se houverem qualquer menção ao entendimento do porque houve +a primeira revolta, dessa vez seria bem menos dolorido.

+

E finalmente...

+

O terceiro problema é com o estado atual do software livre. Não, eu quero dizer +que "ESTAMOS SENDO ENGOLIDOS PELA GANÂNCIA CORPORATIVISTA!", embora isso seja +parcialmente verdade, mas estamos vendo a escalada de uso de licenças +"meio-que-código-aberto-mas-não-exatamente", também conhecidas como "código +disponível" como a SSPL +sendo recentemente adotada pela Elastic Corporation.

+

Então que os recursos da FSF poderiam estar sendo usadas para remover +FUD ou conceitos +errados sobre as licenças GPL, agora nós precisamos focar em "Deveria estar no +board?" O board inclusive teve que criar uma posição para que um membro haja +como diretor +e outras medidas para mostrar abertura, quando deveria haver foco em se +certificar que licenças "código disponível" não se espalhem muito.

+

Em conclusão...

+

Eu só tenho uma pergunta na minha cabeça sobre isso: Alguém precisa realmente +fazer parte do board para ajudar a FSF? Imaginem que, ao invés de dizer "Estou +de volta ao board", o anúncio do rms fosse "Estou novamente ajudando a FSF a +promover software livre". Ainda haveriam aqueles reclamando, mas acho que até +mesmo esses pensariam "Bom, pelo menos ele não é parte da FSF". E a vida +continuaria, e a FSF poderia focar na GPL e outras licençás, e ajudar empresas +a não entrarem na armadilha do "licença código-disponível é a nossa única +solução" e assim por diante.

+

Então por que entrar no board? Não existe nenhuma outra posição que o rms +poderia assumir na FSF? Eu duvido muito, mas alguém (ou alguéns) decidiu que +não era o suficiente; board ou nada.

+

"Já que ele está lá, deixa lá" como forma de amenizar a discussão não é a forma +de lidar com o problema. A menos que haja uma discussão aberta do porque -- e, +por curiosidade mórbida, por quem -- o rms retornou ao board, todo o ponto da +FSF em serem os promotores de sistemas abertos parece estremecido pra mim, +pessoalmente.

+

Post-script

+

Uma forma fácil de fazer um projeto se desfazer é a necessidade de terem +heróis. "Se essa pessoa sair de férias, o sistema cai", "O sucesso desse +projeto é por causa dessa pessoa" são sinais feios em um projeto.

+

Por exemplo, quando o Guido von Rossum decidir abdicar da sua posição de BDFL, +toda a comunidade Python estremeceu procurando uma forma de continuar -- +principalmente porque a comunidade colocou pressão sobre ele por acreditar que +a única forma de continuar progredindo fosse com o Guido na direção. A +comunidade Rust, por outro lado, foca um bocado em remover essa imagem de "Esse +é o projeto dessa pessoal", dando pequenas partes para várias pessoas: "Eu sei +que tem uma pessoa liderando a parte de "melhores mensagens de erro", eu sei +que tem uma pessoa liderando a parte de "async" (embora eu esteja vendo uma +mudança em que vai liderar isso daqui pra frente), ei sei que tem uma pessoa +liderando a parte de "Rust em ambientes embarcados" e assim por diante. Se +qualquer um desses abdica do seu post, eu não vou sentir que o ecossistema +inteiro de Rust está em perigo; é só uma parte do todo, e um substituto pode +ser encontrado porque essa pessoa não era um "herói" daquela parte.

+

A necessidade de heróis parece ser parte do problema da FSF: Sem o rms, não +havia um herói abordo para promover o projeto. Porque ninguém realmente tentou +sair da sombra do rms antes da sua renúncia, a licença terminou com um vácuo +que ninguém preencheu -- ou sentiu a necessidade de preencher. O momento da +renúncia era o momento para criar vários pequenos projetos, colocar vários +nomes (talvez um punhado de novos nomes) neste projetos e mostrar que a FSF +encontrou uma forma melhor de continuar. Mas porque eles nunca tentaram inovar, +parece que ficaram esperando um novo herói surgir e decidiram chamar o anterior +de volta.

+

Software livre não deveria ser sinônimo de rms.

+
+
1 +

Por favor pessoas, isso não é difícil! Já me xingaram por usar "caras", e +eu respondi que entendi o que eles queriam dizer, tomaria mais cuidado no +futuro e agradeci pelo aviso. Desde então, eu procuro usar "pessoas" ao invés +de "caras" (quem me conhece pessoalmente sabe que eu tenho um vício de +linguagem forte em usar "cara") e tento, sempre que possível, usar pronomes +neutros. E isso não dói absolutamente nada. E sim, em alguns casos é bem +difícil de achar um pronome neutro numa língua como português.

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/the-hidden-value-of-tiktok/index.html b/public/pt/thoughts/the-hidden-value-of-tiktok/index.html new file mode 100644 index 0000000..4ef66d4 --- /dev/null +++ b/public/pt/thoughts/the-hidden-value-of-tiktok/index.html @@ -0,0 +1,147 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O Valor Oculto do TikTok

+ +

Como se 2020 não fosse estranho o suficiente, Oracle comprou as operações do +TikTok nos Estados Unidos, o que aparentemente não faz a menor sentido.

+

A não ser que faça.

+

Contexto 1

+

Por algum motivo, o presidente dos EUA acha que uma aplicação chinesa popular +não deve operar em solo americano. Então TikTok seria banido da internet +americana.

+

Por que? Não sei, mas provavelmente por causa de uma gerra de negócios.

+

Havia uma chance para que o TikTok continuasse funcionando nos EUA: se for +controlado por uma empresa americana.

+

Contexto 2

+

Oracle é famosa por seus bancos de dados. Quando alguém diz "Oracle", a maior +parte dos desenvolvedores pensa em bancos de dados, tanto pelo banco com o +mesmo nome ou pelo MySQL ou pelo SQLite12.

+

Assim, quando as notícias de qua a Oracle estaria comprando as operações do +TikTok nos EUA apareceu, isso confundiu várias pessoas, ao ponto de dizer que +isso não serviria pra nada.

+

Mas, na verdade, serve. Um bocado. E por isso que precisamos de mais contexto.

+

Contexto 3

+

Oracle também está num mercado chamado "provedores de cloud". Esse mercado é +liderado pela Amazon com o AWS, seguido pela Microsoft com o Azure, depois pelo +Google com o Google Could Platform (GCP) e uma mistura da Huawei com o Huawei +Cloud e a Oracle com o Oracle Cloud.

+

Uma coisa importante, do ponto de vista de mercado, é quem está usando o seu +produto. Você consegue um cliente grande e pode usar eles como prova da +qualidade do seu produto.

+

AWS tem vários clientes, mas os mais proeminentes são a Amazon Store e a +Netflix; Microsoft tem todo o Office365; Google tem Spotify. E, até alguns +meses atrás, Oracle tinha nada (e a Huawei funciona no mercado chinês, que é +basicamente um mercado fechado).

+

Context 4

+

A alguns meses, a Zoom fez um anúncio surpriendente dizendo que usaria o +Oracle Cloud como provedor. +Pessoas esperavam que o anúncio indicasse algo como Microsoft ou mesmo Google +como provedores mas... Oracle? Foi uma grande surpresa mas, ao mesmo tempo, deu +à Oracle a vantagem de dizer "o serviço de video-conferência mais usado agora +roda na Oracle Cloud".

+

E isso faz sentido?

+

Faz. Não no ponto tecnológico, embora a Oracle possa tirar proveito do +conhecimento de servir vários vídeos pela internet nas suas operações de cloud, +mas dá outro nome de peso ao seu serviço de cloud. "TikTok, powered by Oracle +Cloud" é um baita anuncio.

+

E é por isso que, pra mim, isso serve um bocado.

+

O grande perdedor

+

Quando as operações do TikTok estavam a venda, Oracle não era a única +interessada: a Micrsoft estava adianta em conversas para ser o operator do +serviço nos EUA.

+

Mas apesar disso, a Microsoft não é o grande perdedor nessa venda de operações. +A Google é.

+

Lembrem que eu comentei que é considerado que o Google está no terceiro lugar +no mercado de cloud? Agora Oracle tem Zoom e TikTok como endossadores e usuário +dos serviços. E isso pode dar um baita impulso para o Oracle Cloud, mesmo que +não seja conseguindo mais clientes ou mais lucro, mas com os números de serem +hosts desses dois serviços podem dar a impressão que eles passaram do GCP.

+

É tudo uma jogada de marketing. E uma bem inteligente.

+
+
1 +

Sim, MySQL e SQLite são produtos Oracle.

+
+
2 +

NÃO! Não o SQLite! Oracle comprou o Berkeley DB, que está disponível na +maior parte das distribuições Linux.

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/thoughts/what-the-hell-is-apple-doing/index.html b/public/pt/thoughts/what-the-hell-is-apple-doing/index.html new file mode 100644 index 0000000..56888f9 --- /dev/null +++ b/public/pt/thoughts/what-the-hell-is-apple-doing/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

O Que Diabos a Apple Está Fazendo?

+ +

A Apple anunciou que a nova versão do iPhone não virá com carregador ou fones +de ouvido, "para ajudar o meio-ambiente". E várias pessoas disseram que isso é +só para a empresa ganhar mais dinheiro.

+

Mas talvez tenha algo a mais nessa história.

+ +

Apple não é uma empresa burra. Umas das coisas que eles fazem (e muito bem) é +"treinar" pessoas para aceitar o seus produtos, de uma forma que as pessoas não +percebam que estão sendo treinadas.

+

Um exemplo: A Apple desenvolveu o iPad antes do iPhone. Mas eles sabiam que as +pessoas não entenderiam porque alguém compraria uma tela de toque com (naquela +época) menos processamento que os laptops da época tinham. Mas lançando o +iPhone, eles "treinaram" as pessoas a aceitar telas de toque e, com isso, +permitiram que o iPad (e outros tablets) fossem aceitos.

+

Outro exemplo: Numa época em que o único tamanho de tela do iPhone era 4.7", em +dois (ou três) WWDCs seguidos, houveram talks sobre como usar o layout baseado +em "constraints" em aplicações iOS. A mecânica desse layout é baseada em +definir coisas como "esse elemento deve ficar X pixeis/Y% de distância desse +outro elemento (ou borda)". Mas para algo que sempre teve a mesma resolução1 +e o mesmo tamanho, por que alguém usaria isso? O motivo foi o lançamento de +iPhones com tamanhos maiores. De novo, a Apple "treinou" os desenvolvedores +para pensar de uma forma diferente antes de fazerem uma mudança.

+

E o que diabos podemos esperar com fones que não venham com carregadores ou +fones de ouvido?

+

Antes de mais nada, vamos pensar em quem não precisa de carregador ou fone de +ouvido: Pessoas que já tenham carregadores e fones de ouvido. E quem tem +carregadores e fones de ouvido que são compatíveis com iPhones? Pessoas que já +tem iPhone.

+

De certa forma, a Apple parece que aceitou que pessoas que compram um iPhone já +tem um iPhone. Não são pessoas trocando seu Android pelo equipamento da Apple, +são pessoas que querem ter a última versão do mesmo telefone. Claro, ainda +existirão pessoas que querem seu primeiro telefone e não tenham o +carregador+fone de ouvido, mas parece que esses são apenas um pequeno +percentual na visão da Apple.

+

Se esse for o caso, a parte de "ajudar o meio-ambiente" realmente faz sentido: +Menos materiais necessários, menos coisas jogadas em gavetas para nunca mais +serem usadas...

+

Mas ainda não tem nada de "treinar" nisso; é simplesmente "não usado, não +necessário". Onde é que está o treinamento nessa história?

+

E eu acredito que o plano é oferecer um plano de atualização anual diretamente +da Apple. Imagine o seguinte: Eu paga um plano, uma pequena taxa mensal ou algo +assim e, todo ano, você vai na loja da Apple, deixa seu telefone antigo e sai +com o modelo mais recente. Que negócio! E, como o modelo é a última versão da +mesma coisa, o carregador e os fones de ouvido são compatíveis.

+

Eu já vi empresas de telefonia oferecendo esse modelo, mas essa estratégia iria +tirar o meio de campo e ir diretamente para Apple. Com a vantagem -- para a +Apple -- que haveria uma entrada constante de rendimentos, ao invés de ser +concentrado numa época do ano.

+
+
1 +

Teve uma mudança de resolução da tela original para o display de retine, +mas essa mudança simplesmente duplicou a resolução anterior, e o sistema +operacional em si já fazia a mudança de "10 pixeis do lado esquerdo" para "20 +pixeis do lado esquerdo".

+
+ + +
+ + + + +
+ + + + diff --git a/public/pt/videos/com-licenca/index.html b/public/pt/videos/com-licenca/index.html new file mode 100644 index 0000000..1d0ec50 --- /dev/null +++ b/public/pt/videos/com-licenca/index.html @@ -0,0 +1,91 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Com Licença!

+ +

Uma conversa com apresentação sobre licenças de software livre.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/videos/index.html b/public/pt/videos/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/pt/videos/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/pt/videos/rust-2020-05-12/index.html b/public/pt/videos/rust-2020-05-12/index.html new file mode 100644 index 0000000..6fc056f --- /dev/null +++ b/public/pt/videos/rust-2020-05-12/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust: Programando TU, 2020-05-12

+ +

Continuando o desenvolvimento do "tu", "Time's Up!", em Rust.

+ + +
+ + + + +
+ + + + diff --git a/public/pt/videos/rust-2020-05-15/index.html b/public/pt/videos/rust-2020-05-15/index.html new file mode 100644 index 0000000..d181d2b --- /dev/null +++ b/public/pt/videos/rust-2020-05-15/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust: Programando TU, 2020-05-15

+ +

Mais uma vez, brincando com "tu", o "Time's Up!", em Rust.

+ + +
+ + + + +
+ + + + diff --git a/public/research/decoding-fast-examples/index.html b/public/research/decoding-fast-examples/index.html new file mode 100644 index 0000000..d40c797 --- /dev/null +++ b/public/research/decoding-fast-examples/index.html @@ -0,0 +1,288 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Decoding the FAST Protocol: Examples

+ +

After the whole explanation about the definition of the FAST protocol, I +noticed there was something missing: Examples, to make things easier to +understand.

+
+

Same disclaimer as before: Because this is based on my personal experience, +some things may be out of place. I tried my best to keep things correctly, but +I may have misunderstood something, or maybe I just typed the value wrong here.

+

Also, if I find any other interesting examples, I'll add them here.

+ +
+

Simple Hello World

+

This example is basically the same one in +JetTek but it is really +simple to explain, so here we go:

+

Template

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="HelloWorld" id="1">
+    <string name="String" id="1">
+      <default value=""/>
+    </string>
+  </template>
+</templates>
+
+

Incoming Data

+

Bytes:

+
1110_0000   1000_0001   0100_1000   0110_0101
+0110_1100   0110_1100   0100_1111   0101_0111
+0110_1111   0111_0010   0110_1100   1110_0100
+
+

Processing

+

The first byte is the Presence Map. Removing the stop bit, we get 110_0000. +This Presence Map have one field that isn't described in the template: The +template ID. Because the first bit is set, we know the template ID is there. +Also, keep in mind that the Template ID is the only field we know it exists so +far; there is no information whatsoever about that second bit in the Presence +Map -- we need to find out which template should be used first.

+

The next byte is read: 1000_0001. As mentioned above, this is the Template +ID. Being an unsigned integer (and probably mandatory, but don't ask me how +that works) and dropping high order bit, we get the Integer "1", which is the +exactly same ID we have in the template; now we know which fields should be +processed.

+

The first field in the template is a string with a default value. Because the +field uses the Default operator, we need to check if the value is in the data +or we should use the default value. The bit in the Presence Map for this field +is 1 meaning the value for the string is in the incoming data and we should +read it.

+

The field is string, so we keep reading every byte till we find one with the +stop bit. Also, being a string, we don't "merge" the values: each byte is a +letter in the ASCII table. The sequence is 100_1000 (72), 110_0101 (101), +110_1100 (108), 110_1100 (108), 100_1111 (79), 101_0111 (87), +110_1111 (79), 111_0010 (114), 110_1100 (108) and 110_0100 (100). +Notice that we consumed all the bytes, and the last one have the stop, so +that's the end of string. Converting the bytes using the ASCII table, we get +"HelloWorld".

+

So, there we have it: We received a record of the "HelloWorld" type, with the +field ID "1" (a.k.a. "String") with the value "HelloWorld".

+

Sequences

+

Let's expand our example to have a sequence and a few more operators:

+

Template

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="HelloWorld" id="1">
+    <string name="String" id="1">
+      <default value=""/>
+    </string>
+  </template>
+
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SequenceOfSequences" id="2">
+    <sequence name="OuterSequence">
+      <length name="NoOuterSequence" id="3"/>
+      <uInt32 name="GroupID" id="2"/>
+      <sequence name="InnerSequence">
+        <length name="NoInnerSequence" id="25"/>
+        <string name="Username" id="4"/>
+        <uInt32 name="ID" id="32" presence="optional">
+          <increment/>
+        </uInt32>
+      </sequence>
+    </sequence>
+  </template>
+</templates>
+
+

Although FAST was defined to work with FIX and the financial market, there is +nothing stopping it from being used for other things. The new template actually +describe a group of users, so we have a list of groups and, for each group, a +list of users and their IDs.

+

Incoming Data

+
1100_0000   1000_0010   1000_0011   0000_0011
+0010_0011   0001_1000   1110_0111   1000_0010
+1100_0000   0101_0101   0111_0011   0110_0101
+0111_0010   1011_0001   1000_0100   1000_0000
+0101_0101   0111_0011   0110_0101   0111_0010   
+1011_0010   1111_1111   1000_0001   1100_0000
+0101_0101   1011_0001   1111_1111   0000_1000 
+1000_0000   1000_0010   1100_0000   1100_1001
+1011_0110   1000_0000   0100_1101   1110_0101
+
+

Processing

+

As mentioned before, the first byte, 1100_0000 is the Presence Map of the +root element. There is only one bit set, which means the Template ID is +present.

+

Because the Template ID is present in the Presence Map, we read the next byte, +1000_0010. Because this byte have the stop bit, we stop reading. Removing +this stop bit gives us 000_0010, which is "2", so we know we are dealing with +the "SequenceOfSequences" template.

+

Now that we have the template and know the fields, we know what to read. The +first field in our template is a sequence. The first thing we have in the +sequence (and this is the first thing for every sequence) is the length of +it. So we read the next byte, 1000_0011, which is the only byte we need to +read. It represents an unsigned int, which is "3", so this sequence have 3 +records -- and using our description in the previous sections, we know now +that we have 3 user groups.

+

One point here: Because all fields in this sequence don't have any operators, +the Presence Map is not necessary and, thus, it doesn't exist (or, better yet, +we shouldn't try to read something and assume it is a Presence Map). For +sequences, every start of a new record contains a Presence Map only if at least +one of the fields in the sequence require a Presence Map. That's not the case +here.

+

Because there is no Presence Map for the "OuterSequence", the next bytes are +the "GroupID" field. We should read everything till we find the stop bit, so we +get 0000_0011, 0010_0011, 0001_1000 and 1110_0111. For every byte we +remove the high order bit and then join everything into a single thing, in this +case 000_0011 010_0011 001_1000 110_0111 or simply +0000_0110_1000_1100_1100_0110_0111. This value, being an unsigned int, is +"6868070".

+
+

Here is a good point to remind that, because the field is mandatory, it means +that's actually the value of "GroupID"; if the field as optional, the actual +value would be "6868069".

+ +
+

Now for he "InnerSequence" field. The first step is to gather the number of +elements (the length of the sequence). That's the 1000_0010 byte, which is +"2". So there are two users in this group.

+

Because "InnerSequence" has a field that needs the Presence Map ("ID" uses the +Increment operator, that we need either read the incoming value for it or we +should just increment the previous value), the first thing after the length is +the Presence Map for this record. The byte 1100_0000 indicates that the first +field that requires a Presence Map is present.

+

But that's not the time to use the Presence Map yet. The field after the length +is the "Username", which is a mandatory string. Mandatory strings with no +operators are always present and we don't need to check the map. Same as we did +with "String" in the example for Hello World, we read the bytes till the stop +bit, but don't merge them: 0101_0101 (85), 0111_0011 (115), 0110_0101 +(101), 0111_0010 (114) and 1011_0001 (49, if we remove the stop bit, that +is), which converted by the ASCII table gives us "User1".

+

Now it is the time to use the Presence Map, since we are reading the "ID" field +and it has an operator that requires the Presence Map. The Presence Map we read +before was 100_0000 (with the stop bit removed), so yeah, the "ID" is present +in the incoming data. We read the next byte, 1000_0100, which is "4". But +there is a gotcha here: The field is optional. So although we read "4", the +actual value is "3" -- if the value read was "0" it meant that the ID is Null.

+

Good. We just finished reading the first record of "InnerSequence": The user +"User1" has ID "3" and belongs to group "6868070". Now we read the second +record.

+

We don't need to read the length again, but we need to read the Presence Map +for this record. It is the byte 1000_0000, a Presence Map indicating that +none of the fields with operators are present. But, again, it is not the time +for the Presence Map, 'cause we have to read "Username". The bytes for the +field are 0101_0101 (85), 0111_0011 (115), 0110_0101 (101), 0111_0010 +(114) and 1011_0001 (50), which is "User2".

+

This second record have an empty presence map (1000_0000) meaning that the ID +is not present in the incoming data. Because the field has the Increment +operator, we should use the previous value -- 3 -- and increment by 1. So +"User2" have the ID 4.

+

That ends the "InnerSequence" for the first record of "OuterSequence". Going +faster now:

+ + +
+ + +
+ +

Changelog

+ + + + + +
+ + + + diff --git a/public/research/decoding-fast/index.html b/public/research/decoding-fast/index.html new file mode 100644 index 0000000..cb1ac55 --- /dev/null +++ b/public/research/decoding-fast/index.html @@ -0,0 +1,589 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Decoding the FAST Protocol

+ +

Recently I have to work with a FAST (FIX Adapted for Streaming) and because the +documentation is scattered around, I decided to put the things I discovered in a +single place for (my own) future reference.

+
+

Because this is based on my personal experience and I had contact with a single +instance of this so far, there are some things that are incomplete and/or +wrong. I'll keep updating this post as I figure out new things.

+

The changelog is in the end of the post.

+ +
+

What is FAST

+

FAST is, basically, a compression +method for the FIX protocol.

+

And What is FIX?

+

FIX is a +protocol created for financial institutions to exchange information. Although +there is nothing "financially" related to it -- you could use the protocol for +anything, basically -- most financial companies use it.

+

FIX is a very simple protocol: You have pairs of "field ID" and "value" +separated by a "=" (equal sign) and the pairs are separated by the ASCII char +with code 1 (which is represented by ^A in some editors). Some field IDs are +defined by the protocol (there is a whole list +here) but each +exchange can create their own IDs.

+

For example, if you have the field MsgType (ID 35) with value "y" and the +field Security ID (ID 48) with value "123456", the message received would be

+
35=y^A48=123456
+
+

And Back to FAST

+

One of the things FAST is designed for is removing duplicate and/or constant +content. For example, MsgType (ID 35) identifies that the message is +"SecurityList" (symbol list), which contains information about all the symbols +(the their security IDs) available in the exchange. Because the exchange is the +same in all the symbols, FAST allows defining the fields related to it (Source, +field ID 22, and Exchange, field ID 207) to constant values, so they don't need +to be transmitted and, when decoding FAST back to FIX, the decoder simply add +the constant value.

+

To know which fields are constant and which are not (and some other information), +the protocol defines a template, which have a well defined schema, to report +that information.

+

The Template

+

The template is a XML file which describes the fields, their types, names, IDs +and operators. The protocol itself doesn't provide any default way to actually +receive that field, and thus is left for the exchange to find their way.

+

Note that the template describe the field IDs and their types, and the incoming +data have only the values. If we use the FIX description above, the template +defines the left side of the pair, while the incoming data have have only the +right side.

+

Field Types

+

The protocol have a few field types: Unsigned Ints of 32 and 64 bits, Signed +Ints of 32 and 64 bits, ASCII strings, UTF-8 strings, sequences, decimals and a +special type called "Presence Map".

+

One thing to note is that all fields use a "stop bit" format. This is quite +similar to UTF8, although UTF8 uses a "continuation bit" instead of "stop bit", +but the process of reading is the same:

+ +

I'll show some examples later in this post.

+

Field definitions

+

The template defines the fields with their type, name (optional), ID, a +presence indicator and an operator (optional).

+

For example, to describe an unsigned int of 32 bits, named "MsgType" with ID +"35", it would be described in the template as

+
<uInt32 name="MsgType" id="35"/>
+
+

Because there is no indication of presence, it is assumed that the field is +"mandatory" and should always have a value. On the other hand, if the field +definition was something like

+
<int32 name="ImpliedMarketIndicator" id="1144" presence="optional"/>
+
+

... then the field may not not have a value. This is also referred as "nullable" +field.

+

Optional and Mandatory Fields

+

The difference between optional and mandatory fields is that mandatory fields +always have a value, even if 0. Optional fields, on the other hand, can be +null and have no value at all.

+
+

I have the impression that this is done if the exchange wants to mark a field +as "do not appear in the FIX version"; so even if the field have a definition, +the resulting FIX version would not have the field.

+

So it is more of a "backwards compatibility" than anything else.

+ +
+

Types

+

Types: Ints

+

To read an Int, the decoder would pick the 7 low order bits (everything except +the high order one) and move them to the resulting variable. If the stop bit is +there, the read is complete; if it is not, the result should be shifted by 7 +bits and add the 7 bits from the next byte and so on, till you find a byte with +the stop bit set.

+

The 32 and 64 bits only define the maximum value of the field and should not +necessarily be used as "number of bits to be read" -- because of the stop bit. +If the value exceeds 32 or 64 bits, that is considered an error and the +processing should be aborted.

+

Signed Int work exactly the same, but as 2's complement.

+

For example, if incoming data have the following bytes (in binary, to make it +easier to read; also, I added a single underscore between each 4 values, also +to make it easier to read):

+
0000_0001 1001_0010
+
+

... the decoder will read the first byte and see that it doesn't have the high +order bit set, so it keep just the "1" for the value and shift 7 bits to the +left. Then the second byte is read; this one have the high order bit set, so +the remaining bits (in this case "001_0010") are added to the resulting value +and get 1001_0010 -- or 146.

+

Negative numbers are represented using 2's so if the decoder receives, for +example:

+
0000_0011 0111_1110 1110_1110
+
+

... which, when the high order bits are removed, it should generate "1111_1111 0110_1110", which is -146 (in 16 bits, just to make it shorter).

+

When an integer field is optional, the result must be decremented by 1. The +reason is that it should be something to differentiate both 0 and Null. So, an +optional integer with value 0 is, actually, Null; to get the value 0 for the +field, the incoming data will have value 1, which is decremented in 1 and goes +back to 0.

+

In the template, the fields appear as

+ +

Types: Strings

+

ASCII strings are pretty simple to read: Again, the decoder keeps reading the +incoming data till you find a byte with the high order bit set (again, the stop +bit) and just convert to their respective ASCII character.

+

For example

+
0100_1000 0110_0101 0110_1100 0110_1100 1110_1111
+
+

Would generate the bytes 72, 101, 108, 108 and 111, which using the ASCII table +would result in "Hello". Note that the stop bit here represents "end of string" +and the bytes should not be grouped like in Ints.

+
+

So far, I didn't find any UTF8 strings, so I'm not quite sure how to process +them yet. Surely there is documentation around on how to read those, but since +this is my personal experience with the protocol, I decided to not mention it +here.

+ +
+

Optional strings are Null when the first byte have a stop bit set and every +other bit is zero.

+

In the template, a string field appears as <string>.

+

Types: Sequences

+

Sequences are basically arrays. The first field of a sequence is the "length" +(with the type "<length>" in the template) with the number of records +present. Inside the sequence, you have a list of field definitions, which may +even include more sequences.

+

Optional sequences affect the way the length is read: If optional, the length +should be treated as an optional Integer and thus the size is decremented by 1.

+

In the template, the sequence appears as <sequence>, with the length +following it. An example is

+
<sequence name="Sequence">
+  <length name="NoSequence" id="123"/>
+</sequence>
+
+
+

I describe most of the length fields with a name starting with "No". That's +because the FIX spec defines the lengths with that prefix.

+ +
+

Types: Decimals

+

Decimals are formed by two fields: Exponent and Mantissa. The way it works is +that if you have an Exponent of "-2" and a Mantissa of "1020", the resulting +value is 1020 * 10 ^ -2 ("1020 times 10 to the power of -2"), or "10.20".

+

Both Exponent and Mantissa are read as Signed Ints.

+

An Optional Decimal means the Exponent is optional. The documentation says that +the Mantissa is always mandatory, but there is a catch: If the Exponent is +null, then the Mantissa is not present and the whole Decimal is Null; +otherwise, the decoder is expected to read the Mantissa and the formula above +should be applied.

+

Also, because Exponent and Mantissa are two fields, they can have different +operators. I'll show some examples after the Operator, mostly because I've seen +both with different operators and they make a mess to read.

+

In the template, the decimal field appears as <decimal>, with the exponent +and mantissa as internal fields.

+
<decimal name="ADecimal" id="123">
+  <exponent/>
+  <mantissa/>
+</decimal>
+
+

Type: Presence Map

+

Presence Maps are used in conjunction with operators. They are read like +unsigned Ints are read (read bytes till you find the one with the high order +bit, remove the high order bits and put all the bits in sequence) but do not +have any conversion in themselves. Every time the decoder need to check if a +field is present in the presence map, the bit is consumed and the line +moves on.

+

Presence Maps are not present in the template and their presence is implied if +there is at least one field that requires it. For example, if all the fields in +a sequence are mandatory, there will be no Presence Map in the incoming data.

+

The bits in the Presence Map are in the order of the fields in the template. +For example, if a template with:

+
    +
  1. A mandatory field;
  2. +
  3. A field with an operator that requires the presence map (I'll mention those +later);
  4. +
  5. Another mandatory field;
  6. +
  7. And, finally, another field with operator.
  8. +
+

... it is possible to have a Presence Map as 1110_0000, in which:

+
    +
  1. The first bit is the stop bit, so the decoder assumes this is the last byte +of the presence map.
  2. +
  3. The second bit indicates that the first field with operator is present. It +does not represent the mandatory field 'cause, well, it is mandatory and, +thus, is always present.
  4. +
  5. The second bit indicates the second field with an operator is present.
  6. +
+

(Again, I'll mention which operators require the presence map.)

+

Operators

+

Operators define a way to deal with some fields. I've seen 5 different types of +operators:

+ +

Operator: No Operator

+

When there is no operator defined in the field definition in the template, then +the operator is the "no operator" operator. It means there is no special way of +dealing with the incoming value.

+

When a field have No Operator, there will be no bit in the Presence Map.

+

All the previous examples of the template have no operator.

+

Operator: Constant

+

A field with the Constant operator will not appear in the incoming data and the +decoder should assume that its value is the value in the constant. Previously I +mentioned that a list of securities may have the field 22, "Source", and field +207, "Exchange", with constant values, so they would be defined as

+
<string name="Source" id="22">
+    <constant value="123"/>
+</string>
+<string name="Exchange" id="207">
+    <constant value="EXCHANGE"/>
+</string>
+
+

There is a catch, though: When a Constant field can be Null +(presence="optional"), then the decoder needs to use the Presence Map bit; if +it is set, the constant value should be used; if it is not set, then the field +value is Null.

+

The Presence Map should be use only if there is a field with a constant value +that is optional.

+

Operator: Default

+

The Default operator is similar to the Constant operator, but if the bit for +the field is set in the Presence Map, then the value for the field should be +read in the incoming data; otherwise, the Default value should be used.

+
+

In a way, you can read this: Is the value present in the incoming data +(indicated in the Presence Map)? Then read the value in the incoming data; +otherwise, use the default value.

+ +
+

Example

+
<uInt32 name="Type" id="3">
+  <default value="1"/>
+</uInt32>
+
+

Operator: Copy

+

The copy operator indicates that the value for this record have the same value +of the previous record; if it is the first record, then the value should be +used. If the Presence Map bit is set for the field, then the decoder must read +the value in the incoming data; if it is not set, then the previous value should +be used.

+
+

In the data I saw, every first record have the bit set.

+ +
+

An example: You can have a template like

+
<string name="MDReqID" id="262">
+    <copy/>
+</string>
+
+

... and the incoming data had the following records and their Presence Maps:

+
    +
  1. The first record have the bit set for this field in the Presence Map and the +strings reads "first". The result for this field in this record will be +the value "first".
  2. +
  3. The second record doesn't have the bit set in the Presence Map. So the +decoder reuses the previous value and this record will have the field with +the value "first" (again).
  4. +
  5. The third record have the bit set again, and the value "second". This is the +value for the field in this record.
  6. +
  7. The fourth record doesn't have the bit set and the decoder reuses the value +"second" for the field.
  8. +
+

The Copy operator may have the initial value. For example

+
<string name="MDReqID" id="262">
+    <copy value="string"/>
+</string>
+
+

This means that you should use "string" as previous value, even in the first +record.

+

As pointed, fields with the Copy operator appear in the Presence Map.

+

Operator: Delta

+

Delta is an operator similar to Copy, but instead of using the value of the +previous record in this field, the new value must be computed using the previous +value and the current one. Again, if there is no previous value, then there is +no operation to be done and the incoming value is the current one.

+

An example:

+
<uInt32 name="NumberOfOrders" id="346">
+    <delta/>
+</uInt32>
+
+
    +
  1. The first record comes with the value of "300". That's the value for the +field.
  2. +
  3. The second record comes with the value "2". That should be added in the +previous value and used, so the field for the second record is "302".
  4. +
  5. The third record comes with the value "3". Again, the previous value should +be used and the current one should be added. So the field for the third +record have the value "305".
  6. +
+

Fields with the Delta operator do not appear in the Presence Map.

+

Operator: Increment

+

Increment works like the Delta operator 'cause it always add a value to the +previous one, but the value to be added is always 1.

+

If the bit for the field is set in the Presence Map, the value for the field is +the one in the incoming data; otherwise, the value will be the previous value +added by 1.

+

Example:

+
<uInt32 name="RptSeq" id="83">
+    <increment/>
+</uInt32>
+
+
    +
  1. The first record have the bit set in the Presence Map, the decoder reads the +value "100". That's the field value for the record.
  2. +
  3. The second have doesn't have the bit set, so nothing should be read from the +incoming data, but the field value should be "101" for this record.
  4. +
+

Fields with the Increment operator appear in the presence map.

+

Presence Map Map

+

There is a simple map that indicates if a field appears or not in the Presence +Map, according to JetTek:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorAppears for Mandatory Fields?Appears for Optional Fields?
No OperatorNo.No.
ConstantNo, the Constant value should always be used.Yes; if set, use the Constant value; otherwise the field value is Null.
CopyYes; if set, use the incoming value is the current value; + otherwise, use the previous value.Yes; same as Mandatory fields, but the value can be Null (e.g., it + was read as 0 for Ints or a single Null byte for Strings.
DefaultYes; if set, read the value from the incoming data; otherwise, use + the default value.Yes; same as Mandatory fields.
DeltaNo; the value in the incoming data should always be added to the + previous one.No; same as Mandatory fields.
IncrementYes; if set, read the value from the incoming data; otherwise, add + 1 to the previous value.Yes; same as Mandatory fields.
+

Template Versioning

+

I didn't mentioned this before, but now that I explained some things about the +types and some information about the template, I can point that the template +file allows multiple versions of the same message types.

+

For example

+
<?xml version="1.0" encoding="UTF-8"?>
+<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SomeRecordType" id="1">
+    <string name="MsgType" id="35">
+      <constant value="Z"/>
+    </string>
+    <string name="SomeField" id="1"/>
+  </template>
+
+  <template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="SomeRecordType" id="2">
+    <string name="MsgType" id="35">
+      <constant value="Z"/>
+    </string>
+    <string name="SomeField" id="1"/>
+    <string name="SomeOtherField" id="2">
+      <default value="A Value!"/>
+    </string>
+  </template>
+</templates>
+
+

The first thing you may notice is that there are two templates defined, one +with ID "1" and another with ID "2". Both have the same name and the same +constant value in the same field ID, but the initial data in the incoming block +defines which one should be used.

+

The incoming data starts with a Presence Map. The first bit on this is the +"Template ID". With that Template ID, the decoder can find the list of fields +that should be processed. This Presence Map also contains the map for the +fields in the root sequence -- in our example, if the Template ID decodes to +"2", the other bit in the Presence Map is the indication of the +"SomeOtherField".

+
+

So far, I didn't find any data that didn't had the bit set for the template ID, +so I'm not actually sure what would happen if the bit is unset.

+ +
+

Anomalies

+

I call "anomaly" anything that I had to spent way too much time to understand.

+

Decimals With Different Operators

+

This is one thing that made things pretty hard to grasp at first. For example:

+
<decimal name="MDEntryPX" id="270" presence="optional">
+    <exponent>
+        <default value="0"/>
+    </exponent>
+    <mantissa>
+        <delta/>
+    </mantissa>
+</decimal>
+
+

That seems simple. But there are a lot of moving pieces here:

+
    +
  1. +

    The presence="optional" in the decimal means that the exponent can be +Null and only that.

    +
  2. +
  3. +

    The Default operator in the Exponent means the decoder must check if the +Exponent have a value in the incoming data or should use the default value +of "0".

    +

    There is an issue here: If the Presence Map indicates that the value is +present and the read value is 0, because the field is optional, the decoder +should consider the Exponent Null and, thus, there is no Mantissa and +everything is Null.

    +
  4. +
  5. +

    The Delta operator in the Mantissa should be used applying the incoming +value to the previous one. But, if the Exponent is not in the presence map, +because it has a default value, that's its value and it shouldn't be read in +the incoming data and the read value is actually applied to the Mantissa.

    +
  6. +
+

Like this:

+
    +
  1. The first record have the field set in the Presence Map and it is read as +"-2"; that's the Exponent. The next value is "1020", which is the Mantissa, +so the whole decimal is "10.20";
  2. +
  3. The second record have the field set in the Presence Map and it is read as +"0". Because the decimal is optional, the exponent is optional, and because +0 is Null for optional fields, there is no Exponent, and the next value is +not the Mantissa. The value for the field in this record is Null.
  4. +
  5. The third record have the field not set in the Presence Map. Because +Exponent has a default value, it becomes "0", and the Mantissa should be read. +If the incoming data have the value "10", the decimal becomes "10" (or +"10.00", if we use the same decimal places everywhere).
  6. +
+

A weird thing I saw was related to the way the exchange was ordering the +results. It had a sequence of sell and buy orders in which

+
    +
  1. The first record was the sell order, with an Exponent of "0" and a Mantissa +of "5410". That meant the value is "5410" (pretty straight).
  2. +
  3. The second record was the buy order. It had an Exponent of "-2" and the +Mantissa had an incoming value of "526604". With the Delta operador, that +gives the value of "532014", but because the Exponent is "-2", the actual +value is "5320.14".
  4. +
  5. The weird thing happened in the third record, which was again a sell order. +The value should be exactly the same as the first, but the exchange sent an +Exponent of "0" and a Mantissa of "−526604". With the delta, that would bring +the value back to "5410".
  6. +
+

I found it weird that they kept jumping between two different Exponents instead +of using a single one, and at the time I had some issues with the delta math in +my code, so...

+

Null Length Sequences

+

Another strange thing I saw was the optional sequence: In practice there is no +difference between a sequence with 0 elements and one which the length is Null +-- specially if you think the protocol is, basically, a FIX generator. I have +no idea why it wasn't standardized that lengths are mandatory and a value of 0 +means there is no values on it instead of doing a dance around optional and +mandatory sequences.

+
+

Changelog:

+ + +
+ + + + +
+ + + + diff --git a/public/research/emacs/index.html b/public/research/emacs/index.html new file mode 100644 index 0000000..8716140 --- /dev/null +++ b/public/research/emacs/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Emacs

+ +

Complete

+

M-/

+

Copy'n'Paste

+ +

Undo

+

C-/

+ +
+ + + + +
+ + + + diff --git a/public/research/index.html b/public/research/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/research/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/research/orgmode/index.html b/public/research/orgmode/index.html new file mode 100644 index 0000000..19f69e6 --- /dev/null +++ b/public/research/orgmode/index.html @@ -0,0 +1,95 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Org-Mode

+ +

Keybinds

+

Clocking

+ +

State

+ +

Tagging

+ + +
+ + + + +
+ + + + diff --git a/public/research/python/index.html b/public/research/python/index.html new file mode 100644 index 0000000..ab1c38b --- /dev/null +++ b/public/research/python/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python

+ +

Getting the encoding of a file

+
with open('filename') as origin:
+   return origin.encoding
+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/1001-video-games-you-must-play-before-you-die/index.html b/public/reviews/books/1001-video-games-you-must-play-before-you-die/index.html new file mode 100644 index 0000000..f435fe9 --- /dev/null +++ b/public/reviews/books/1001-video-games-you-must-play-before-you-die/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

1001 Video Games You Must Play Before You Die - Tony Mott

+ +

GoodReads Summary: +For devoted gamers as well as those interested in groundbreaking graphic +design, this is the first, most comprehensive, and only critical guide ever +published to video games. The video game has arrived as entertainment and as +an art form. This is the first serious critical evaluation ever published of +the best video games and is a testament to the medium’s innovativeness and +increasing emphasis on aesthetics. Organized chronologically and for all +platforms (PC, Xbox, PlayStation, etc.) and covering all genres from the bold +(Grand Theft Auto and Halo) and dark (Resident Evil and Silent Hill) to the +spiritual (Final Fantasy) and whimsical (Legend of Zelda), the book traces the +video game from the rough early days of Pong to the latest visual fantasia.

+
+ ★★☆☆☆ +
+

For a second -- or, at least, the first chapter --, you may believe that this +book will discuss 1001 games that influenced the next generation, from the +very first pong all the way to the latest Mario. Sadly, it doesn't.

+

The whole problem is that the authors decided to use a chronological order +instead of a topic order. Instead of going "this game introduced this feature" +and then jump to the next which improved that feature, they go into games +released in the 70s, 80s, 90s, 2000s and 2010s. "Where is the harm in that?" +you may ask. Well, the harm is that the chronological order doesn't offer, +most of the time, the reason why a game should be played. I mean, yeah, +maybe "Mario World" is not a bad game, but if "Mario World 2" just improves +the old mechanics and have bigger maps, it's clear why the first shouldn't be +in the list if everything from the first I can get in a better form in the +second.

+

For example, when they talk about "Ninja Gaiden Black", the authors mention +this:

+
+

Barring a dodgy camera, Ninja Gaiden didn't have much wrong with it. That +didn't stop Team Ninja from obsessively tinkering with their masterprice, +however, and in Ninja Gaiden Black they improved on what many fighting fans +already regarded as the greatest fighting game of its generation."

+
+

And guess what? "Ninja Gaiden" is also in the list! Why would I play the first +one when the second is everything the first one has plus more?

+

Also, each game have three to four paragraphs. The first is always something +related to the game outside it: The company that developed it, some social +remark at the time, something in the game culture... anything that it is not +the game; the last paragraph try to conclude the (simplistic) review with a +positive note; the paragraphs in the middle, which should be the "Why" are not +always they "Why". Most of the Mario and Zelda games simply lack the "why". +You should play because... you should play?

+

This is why I'd prefer a topic order: Mario 1 introduced this, Mario 2 changed +this into that... It basically forces the list to have a reason instead of +seemingly being a list of "I like it".

+

Also, research seems focused on "games I played" instead of "games that +existed". For example, there is "Trine", which I can't call a bad game, but +the mechanic of "you play several characters and just jump between them based +on their abilities" I can backtrack all the way to "Captain Trueno" on MSX in +1989 -- and I'm not claiming that's where this mechanics appeared -- but +omitting it seems too much laziness. "Master of Orion", "Dota" (the mod for +Warcraft III), "Tetrifast", "King's Valley", "Stunts"... all those are games +that I can, from my childhood, bring back as previous examples of some of the +recommended games that has the same mechanics and are not listed. But, +instead, games with the same mechanics but from bigger publishers are. There +is even a game I played on MSX in the 90s that have the exactly mechanic +listed in "Warioware Inc" but, again, not listed. Heck, even "bananas.bas", +part of the MS-DOS 6.0 as an example of how powerful QBasic could be, has the +same mechanics as "Death Tank", but the later is listed as some "brilliant +mechanic never seen before".

+

In the end, it seems much more like a list of "games that we, the authors +like" than a proper "these games you should play because they describe some +advancement in games technology and/or some social discussion about the times +when they were released", which turns this into a meaningless e-peen counting +(171, by the way).

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/12-years-a-slave/index.html b/public/reviews/books/12-years-a-slave/index.html new file mode 100644 index 0000000..ec32d27 --- /dev/null +++ b/public/reviews/books/12-years-a-slave/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

12 Years a Slave - Solomon Northup

+ +

GoodReads Summary: +Twelve Years a Slave, sub-title: Narrative of Solomon Northup, citizen of +New-York, kidnapped in Washington city in 1841, and rescued in 1853, from a +cotton plantation near the Red River in Louisiana, is a memoir by Solomon +Northup as told to and edited by David Wilson. It is a slave narrative of a +black man who was born free in New York state but kidnapped in Washington, +D.C., sold into slavery, and kept in bondage for 12 years in Louisiana. He +provided details of slave markets in Washington, D.C. and New Orleans, as well +as describing at length cotton and sugar cultivation on major plantations in +Louisiana.

+
+ ★★★★☆ +
+

I'll admit that I only bought this book for the morbid curiosity of how much +flair the movie added.

+

In my view, not so much.

+

Sure, there are a few differences: Ford didn't sell Northup just because one +fight with Tibeats, but because Ford had bills to pay; it wasn't a single +fight with Tibeats, but three; the movie doesn't mention the Christmas days; +the movie doesn't show Northup genius fish catcher; the movie doesn't show +that, in the end, the guys who captured Northup actually tried to sue him +back.

+

But I believe the core of it was there. Which is impressive.

+

The book doesn't only dwell in the his enslavement years, but also paint a bit +of the historical production and live style of the US in the 1850s. The +problem at those points is that it gives the false impression that everything +is going alright with him at the time -- but after reading "Ghost Rider", I +know people in distress tend to write books like everything is alright at some +point. Still, it's weird to read such passages, like it was a matter-of-fact +and now part of the life of someone who is not the owner of his own life +anymore.

+

Also, so parts are so incredible distressing, I had to stop and remind myself +that this was not a fiction book, but actually the story of a man.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/21st-century-robot/index.html b/public/reviews/books/21st-century-robot/index.html new file mode 100644 index 0000000..33f6fc6 --- /dev/null +++ b/public/reviews/books/21st-century-robot/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

21st Century Robot: The Dr. Simon Egerton Stories - Brian David Johnson

+ +

GoodReads Summary: +When companies develop a new technology, do they ask how it might affect the +people who will actually use it? That, more or less, sums up Brian David +Johnson's duties as Intel's futurist-in-residence. In this fascinating book, +Johnson provides a collection of science fiction prototyping stories that +attempt to answer the question.

+
+ ★★☆☆☆ +
+

This is a hard book to read. Not due its writing style or large paragraphs of +something of the kind, but because you have no idea what what is real and what +is not.

+

There are some stories about the "21st Century Robot Foundation", which is a +foundation to give free, open source access to robot designs and code. Problem +is, some of those are interleaved with fiction stories that has a character of +the same name of someone in the foundation and then you never know if that's a +cool extended thingy, actual coincidence or just plain... laziness (although I +reckon that's a strong word for this).

+

There are some things that pissed me off. For example, saying "the robot brain +is the hardware and software, what we call artificial intelligence, or AI". AI +is way more than just hardware and software, you have to train something to +make it an AI, or it is just a bunch of reactive code with not actual +"intelligence". Maybe it was dumbed down to reach the general population +instead of going with proper terms, but it just annoys people that do know. +And talking about "apps to extend the robot personality" also seems a bit +far-fetched in how AI works.

+

So, maybe the idea is great and all, but ideas without backing facts are just +dreams. And for someone running a foundation, lacking the facts feels... +weird.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/301-smart-answers-to-though-interview-questions/index.html b/public/reviews/books/301-smart-answers-to-though-interview-questions/index.html new file mode 100644 index 0000000..50a818c --- /dev/null +++ b/public/reviews/books/301-smart-answers-to-though-interview-questions/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

301 Smart Answers To Though Interview Questions - Vicky Oliver

+ +

GoodReads Summary: +In today's job market, how you perform in an interview can make or break your +hiring possibilities. If you want to stand a head above the rest of the pack, +301 Smart Answers to Tough Interview Questions is the definitive guide you need +to the real, and sometimes quirky, questions employers are using to weed out +candidates.

+
+ ★☆☆☆☆ +
+

I have to be honest and say that I dropped the reading of this half-way through +it.

+

Right out of the bad, the author warns that one shouldn't simply repeat the +answers she's giving here, but put it their (the reader) own twist. And she +does a good thing by adding, after the answer, some tips around the answer +itself: why it works, what you shouldn't do, why such questions are asked...

+

But not every single answer have an explanation. They are there by themselves, +which makes a bit hard to put your own twist on them if you don't have any +pointers on why it works.

+

Also, so answers are simply... to hard to agree with. For example, if you have +kids and the interviewer asks if you had any problem staying up late working, +the answer is around the lines of "Fuck no. Fuck my kids. I love work. Go +work!" Not on those terms, but the interviewer is basically asking if you would +mind letting go of your time with your kids and you should answer "sure, fine"? +Obviously, you're trying to get that job, but what would happen if you say +something like "I don't mind staying late working instead of seeing my kids" +only to, months later, have your boss pissing on your hear for going home early +'cause one of your kids is sick? Are you going to answer "but it was my kid, +and they were sick!"? That's not what you said in the interview...

+

Obviously, there are things you can do to doing fine in an interview, but I +guess lying is not one of those.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/7-secrets-of-exceptional-leadership/index.html b/public/reviews/books/7-secrets-of-exceptional-leadership/index.html new file mode 100644 index 0000000..f5a8ee1 --- /dev/null +++ b/public/reviews/books/7-secrets-of-exceptional-leadership/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The 7 Secrets of Exceptional Leadership - Brian Tracy

+ +

GoodReads Summary: +In The Seven Secrets of Exceptional Leadership Brian describes the most +important leadership qualities practiced by top leaders worldwide. By +committing yourself to these seven "secrets" of exceptional leadership, you +can achieve all your goals as a leader in every area of your life.

+
+ ☆☆☆☆☆ +
+

Ok, I have to say that this book rubbed me in all the wrong ways.

+

First, more pictures than content. I mean, if I want to have a book about +boats, I'd get a book about boats, not about leadership.

+

Second, the rules are somewhat weird. "A leader must know themselves" I can +get behind, specially because one would have to know their own weaknesses to +lead people. "Know what they want"... why? A leader may lead people to make +things they (leader) don't even fully agree, but know it must be done. Just +knowing what you want (even couple with the other points) doesn't make you a +leader -- heck, it doesn't even fit the description of a leader.

+

This was a book that I picked up and dropped next day 'cause fuck confusing +"being a boss" with "being a leader" -- and those two are completely +different aspects.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/88-days-to-any-goal/index.html b/public/reviews/books/88-days-to-any-goal/index.html new file mode 100644 index 0000000..20630d8 --- /dev/null +++ b/public/reviews/books/88-days-to-any-goal/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

88 Days to Any Goal - Rolland Roberts

+ +

GoodReads Summary: +No summary.

+
+ ★☆☆☆☆ +
+

A whole "book" for something that is 5 (badly explained) bullet points. And a +lot of "THIS THING IS GREAT!"

+

Want to lose weight? If you do the 88 day promise, you'll become weightless!

+

Want to make more money? With the 88 day promise, you'll be richer than Jeff +Bezos!

+

I did the 88 day promise for my campaign and almost got elected as king of the +world.

+

Want to get impervious to bullets? All you need is the 88 day promise!

+

A young Kal-El once decided to become stronger and, in 88 days, he was +Superman!

+

Jokes apart, there is very little information about what the heck the 88 day +promise is. Just focusing on something for 88 day is enough? Can I focus on +becoming impervious to bullets? Any goal is valid? How to proceed, just set a +goal and that's it?

+

No, it's not. There is a "first week, you take a time out". Suuuuure, I'll +stop working for a whole week to recover my energies and then I'll focus for 2 +weeks and take another week out for recharging.

+

Honestly, I felt like reading some very long ad for snake oil.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/97-things-every-programmer-should-know/index.html b/public/reviews/books/97-things-every-programmer-should-know/index.html new file mode 100644 index 0000000..082cf65 --- /dev/null +++ b/public/reviews/books/97-things-every-programmer-should-know/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

97 Things Every Programmer Should Know: Collective Wisdom from the Experts - Kevlin Henney

+ +

GoodReads Summary: +Tap into the wisdom of experts to learn what every programmer should know, no +matter what language you use. With the 97 short and extremely useful tips for +programmers in this book, you'll expand your skills by adopting new approaches +to old problems, learning appropriate best practices, and honing your craft +through sound advice.

+
+ ★★★☆☆ +
+

It's kinda weird to read a book that your experience agrees with what it is +said: I have a collection of things I learnt in 30 years doing software +development, and a lot of things said in the book agree with it.

+

Now, because there are several authors, the writing style changes a lot: Some +are really dense and difficult to follow, some others are simple and fun to +read, and some feel really repetitive.

+

One of the downsides of the book is that they should get a more diverse group. +Sure, Uncle Bob is highly influential and has a lot of good tips, but giving +him 3 articles, when there are only 6 women and 2 black men in the list of +authors seems kinda a waste1.

+

Sure, for people starting in the development world, it's a good book, giving +some pointers on where to start, but for people who are in the area for some +time (and may already read some books/posts about the topics), it may feel a +bit like a waste of time.

+

Highlights

+
+

Repetition in Process Calls for Automation

+
+
+

Repetition in Logic Calls for Abstraction

+
+
+

learn much faster by writing test code

+
+
+

ANYONE WHO HAS WORKED IN SOFTWARE LONG ENOUGH has heard questions like this: +I’m getting exception XYZ. Do you know what the problem is?

+
+

Note: I get that a lot!

+
+

As you work on a project, you will understand more of the problem domain +and, hopefully, find more effective ways of reaching the goal

+
+
+

Hint: Write code because it adds value, not because it amuses you.)

+
+

Note: Well, and what actually "adds value"? Does refactoring something adds +value, if the only thing it does is making it easier for me to understand?

+
+

That isn’t YAGNI. If you don’t need it right now, don’t write it right now.)

+
+
+

The primary purpose of software estimation is not to predict a project’s +outcome; it is to determine whether a project’s targets are realistic enough +to allow the project to be controlled to meet them

+
+
+

Try to learn from other people’s mistakes, so that your code won’t contain +the same ones.

+
+

Note: Work on new mistakes :)

+
+

IN ALL BUT THE SMALLEST DEVELOPMENT PROJECT, people work with people.

+
+
+

Compared to “hard” engineering, the software development world is at about +the same place the bridge builders were when the common strategy was to +build a bridge and then roll something heavy over it. If it stayed up, it +was a good bridge. If not, well, time to go back to the drawing board

+
+
+

A bridge builder would never hear from his boss, “Don’t bother doing +structural analysis on that building—we have a tight deadline.

+
+
+
1 +

No, I'm not saying that Uncle Bob isn't worth getting 3 spots, so maybe +the list should have more than 97 points to let others also have a spot.

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/a-bug-hunters-diary-a-guided-tour-through-the-wilds-of-software-security/index.html b/public/reviews/books/a-bug-hunters-diary-a-guided-tour-through-the-wilds-of-software-security/index.html new file mode 100644 index 0000000..4aac157 --- /dev/null +++ b/public/reviews/books/a-bug-hunters-diary-a-guided-tour-through-the-wilds-of-software-security/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A Bug Hunter's Diary: A Guided Tour Through the Wilds of Software Security - Tobias Klein

+ +

GoodReads Summary: +Seemingly simple bugs can have drastic consequences, allowing attackers to +compromise systems, escalate local privileges, and otherwise wreak havoc on a +system.

+
+ ★★★★☆ +
+

For a long time you keep hearing things like "don't use this 'cause it can be +exploited", but you really never saw something like that being exploited. And +then comes this book and shows how someone can use everything you know you +can't use to actually call something it wasn't expected to be called.

+

Confusing? Well, it's a very complex issue that involves the call stack and +assembly and registers and all that. But the book goes into length explaining +and showing those things (so, yeah, some knowledge of assembly is required).

+

In the end, it's a good book about those "things" you know your shouldn't use, +and what happens when you actually use them.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/a-devils-chaplain/index.html b/public/reviews/books/a-devils-chaplain/index.html new file mode 100644 index 0000000..d4d68bb --- /dev/null +++ b/public/reviews/books/a-devils-chaplain/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

A Devil's Chaplain: Reflections on Hope, Lies, Science, and Love

+ +

Goodreads summary: +Richard Dawkins's essays are an enthusiastic testament to the power of +rigorous, scientific examination, and they span many different corners of his +personal and professional life. He revisits the meme, the unit of cultural +information that he named and wrote about in his groundbreaking work The +Selfish Gene. He makes moving tributes to friends and colleagues, including a +eulogy for novelist Douglas Adams; he shares correspondence with the +evolutionary biologist Stephen Jay Gould; and he visits with the famed +paleoanthropologists Richard and Maeve Leakey at their African wildlife +preserve. He concludes the essays with a vivid note to his ten-year-old +daughter, reminding her to remain curious, to ask questions, and to live the +examined life.

+
+ ★★☆☆☆ +
+

A better name for this book would be "Dawkins, by Dawkins". It's a collection +of articles written by Dawkins, selected by Dawkins himself.

+

The first thing I noticed is that, for a "smart" person, Dawkins surely can't +write. It seems he tries to shove so much stuff in an article that, at some +later point, you start asking yourself what the heck was the point he was +trying to make to start with.

+

The other thing I noticed is how much he likes to quote other people. The very +first article is so full of quotes, it feels like more than half of it is +simply quotes. And absolutely a sloppy job in stitching them together.

+

On top of that, there is a constant feeling that Dawkins believes he's +"Neo-Darwinian Prime": The only person capable of talking about new Darwinian +theories, and calling other theories wrong. I have the feeling that, in the +foreword for a Stephen Gould book, Dawkins claimed the book was wrong. But, +then again, with the mess Dawkins do with its ideas, I'm not actually sure if +it was a review or a foreword.

+

And even if, through this book, Dawkins claims that he has a good relationship +with Gould, the fact that he keeps claiming he believes Gould theories are +wrong, and that general feeling that he's the only one that can claim to be +neo Darwinian makes me believe that he, actually, didn't.

+

In general, I'm not even sure if this book gives a good impression of Dawkins.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/ad-astra/index.html b/public/reviews/books/ad-astra/index.html new file mode 100644 index 0000000..3bbcada --- /dev/null +++ b/public/reviews/books/ad-astra/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Ad Astra - Jack Campbell

+ +

GoodReads Summary: +In Jack Campbell’s New York Times bestselling Lost Fleet series, Campbell’s +hero Captain Black Jack Geary explores the furthest reaches of space. Here, +Campbell explores what kinds of problems mankind might face as our horizons +expand. The third in a series of collections of Campbell’s short stories +includes some of Campbell’s favorite stories, and some of his earliest. A +brand new author’s note accompanies each story.

+
+ ★★★★★ +
+

While short stories may not give a general sense of the whole -- 'cause they +are, after all, short -- the stories here are very interesting, and very good +sci-fi.

+

Honestly, it's really hard to give some indication of how the stories go +without going into spoilers.

+

But, again, there are very good stories, some even touching, some discussing +social issues (without being "in your face", like any good Star Trek episode).

+

And the narration is pretty good too. Easy to read, easy to keep going.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/adult-stuff/index.html b/public/reviews/books/adult-stuff/index.html new file mode 100644 index 0000000..f1f39b2 --- /dev/null +++ b/public/reviews/books/adult-stuff/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Adult Stuff: Things You Need to Know to Win at Real Life - Robert Boesel, Matt Moore

+ +

GoodReads Summary: +Sometimes your first steps into the "real world" send you falling flat on your +face. It's natural to be optimistic about new experiences, but most of us set +ourselves up only to be let down every time. And disappointment hurts like a +$%&*#.

+

News flash: You don't have to be an Einstein to survive adult life. You don't +even have to abandon your standards to get what you want. All you have to do +is keep your expectations realistic.

+
+ ★★★☆☆ +
+

Alright, right up front, let me say that it is weird to read a book about "How +to Survive Real Life When You Just Got Passed Your Teens and Now Need to Work +and Keep a Place and Have a Life" when you're 43. But here we are.

+

One thing the book does (although a bit too flourish for my taste) is to +destroy all those dreams of a perfect life: Oh, you're out of your parents +apartment? Sure, you can have that huge loft Tom Hanks have in "Big", or a +nice apartment like the ones in "Friends"? NOT! Oh, sharing with someone you +go fine? It will be like "Friends", every day! SIKE!

+

So, yeah, it is not that bad, but it is not a dream.

+

But instead of saying "Nope" all the time, the book tries to give some advice +on how to survive this dark times. I think it missed the point sometimes; for +example: dripping faucet? Hire someone. Why not buy two, play with one till +you understand how it fits and then try the other one. Sure, hiring someone +and watching over their shoulder how to do is something I do all this time -- +I'm not kidding here -- but you can also experiment yourself. You'd pay +double, but if you manage to understand how things work, you'll have a spare +and if you break it, at least you got it shouldn't work.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/all-quiet-on-the-western-front/index.html b/public/reviews/books/all-quiet-on-the-western-front/index.html new file mode 100644 index 0000000..2a7e9a1 --- /dev/null +++ b/public/reviews/books/all-quiet-on-the-western-front/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

All Quiet on the Western Front - Erich Maria Remarque

+ +

GoodReads Summary: +In 1914 a room full of German schoolboys, fresh-faced and idealistic, are +goaded by their schoolmaster to troop off to the ‘glorious war’. With the fire +and patriotism of youth they sign up. What follows is the moving story of a +young ‘unknown soldier’ experiencing the horror and disillusionment of life in +the trenches.

+
+ ★★★★★ +
+

I was sure that in the forewords there was something about "this is not a book +to promote war" or anything of the sorts. But alas, the forewords are

+
+

This book is to be neither an accusation nor a confession, and least of all +an adventure, for death is not an adventure to those who stand face to face +with it. It will try simply to tell of a generation of men who, even though +they may have escaped shells, were destroyed by the war.

+
+

... which basically describes the whole book.

+

The book follows the story of a young German soldier from the beginning of +World War I till almost its end. In following him, we learn how training was, +how going to the battle front was like, how friendships were forged, how +soldiers survived with the small support from the higher ups, how the rest of +the society view and treated those who were in the front and how society lived +while the war was raging.

+

Again, my surprise was the "promote war" foreword that I thought existed. +'Cause the book goes far away from it. From it's gory description of the +battles, from it's depressing tales of how the society lived, from the sad +state most were left when the tides of war changed against those fighting, to +the complete desolation of describing how it is to lose someone who fought and +helped others in the front, this is far from being a "promotion" of war; if +such, it's more of a long story about how governments would engage war without +worrying with the poor souls (real people!) who actually got guns in their +guns and run against other poor souls that also didn't appear as a single +bleep in their government plans.

+

It's a brutal, sad description of what war really yes.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/all-you-need-is-kill/index.html b/public/reviews/books/all-you-need-is-kill/index.html new file mode 100644 index 0000000..18b881d --- /dev/null +++ b/public/reviews/books/all-you-need-is-kill/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

All You Need Is Kill - Hiroshi Sakurazaka

+ +

GoodReads Summary: +When the alien Gitai invade, Keiji Kiriya is just one of many raw recruits +shoved into a suit of battle armor and sent out to kill. Keiji dies on the +battlefield, only to find himself reborn each morning to fight and die again +and again. On the 158th iteration though, he sees something different, +something out of place: the female soldier known as the Bitch of War. Is the +Bitch the key to Keiji’s escape, or to his final death?

+
+ ★★★★☆ +
+

I admit I got this book because of "Edge of Tomorrow", which I watched before +reading the book. As usual, only the concept of the story is the same in both. +Apart from "soldier keeps repeating the same day over and over again due alien +technology", there is absolutely nothing in common with the movie.

+

The story starts slowly, mostly because Keiji Kiriya is still a fresh guy. But +he still kills one special alien and gains temporal superpowers. When that +happens, the story picks up and it's really hard to drop it. Then the story +stops to tell the backstory of Rita Vrataski and the pace drops a bit; then it +goes back to the fight and it picks up again. That's probably how I read this +thing so fast.

+

In a way, the book is more brutal than the movie, as much as "Jarhead" the +book is more brutal than "Jarhead" the movie. Also, the explanation for the +"time travel" -- which in the book is no time travel at all, being much more +akin to the way Kitty Pride sends people in the time in "X-Men: Days of Future +Past" -- seems much more plausible than the movie.

+

It is a short but interesting story, nonetheless.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/american-gods/index.html b/public/reviews/books/american-gods/index.html new file mode 100644 index 0000000..f7e201a --- /dev/null +++ b/public/reviews/books/american-gods/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

American Gods - Neil Gaiman

+ +

GoodReads Summary: +Days before his release from prison, Shadow's wife, Laura, dies in a +mysterious car crash. Numbly, he makes his way back home. On the plane, he +encounters the enigmatic Mr Wednesday, who claims to be a refugee from a +distant war, a former god and the king of America.

+

Together they embark on a profoundly strange journey across the heart of the +USA, whilst all around them a storm of preternatural and epic proportions +threatens to break.

+
+ ★★★★★ +
+

A very hard book to read

+

When I was halfway through it, I though I'd give this book 4 stars; when I was +3/4 through it, I though about giving it only 3 stars; then, in the very end, +I decided to give 5 stars.

+

Thing is, this is not an easy book to read. It's freaking hard, opening +several threads at once, which give the feel that you're reading things that +make absolutely nothing to the story. And then, in the very end, all threads +are neatly closed. If you manage to keep up to the continuous words that feel +worthless and read till the end, you'll get a nicely packaged story, worth +your time.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/an-illustrated-book-of-bad-arguments/index.html b/public/reviews/books/an-illustrated-book-of-bad-arguments/index.html new file mode 100644 index 0000000..1648c60 --- /dev/null +++ b/public/reviews/books/an-illustrated-book-of-bad-arguments/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

An Illustrated Book of Bad Arguments - Ali Almossawi

+ +

GoodReads Summary: +This book is aimed at newcomers to the field of logical reasoning, +particularly those who, to borrow a phrase from Pascal, are so made that they +understand best through visuals. I have selected a small set of common errors +in reasoning and visualized them using memorable illustrations that are +supplemented with lots of examples. The hope is that the reader will learn +from these pages some of the most common pitfalls in arguments and be able to +identify and avoid them in practice.

+
+ ★★★★☆ +
+

Short, but fun.

+

It's a really fun read, but really really short (I managed to read the whole +thing in about 40 minutes). I expected a little bit more, some more examples, +some other types of fallacies and so on.

+

It's not that the book is bad, quite the contrary. It's a fun read.

+

But short.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/angularjs/index.html b/public/reviews/books/angularjs/index.html new file mode 100644 index 0000000..4d88a47 --- /dev/null +++ b/public/reviews/books/angularjs/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

AngularJS - Brad Green

+ +

GoodReads Summary: +Develop smaller, lighter web apps that are simple to create and easy to test, +extend, and maintain as they grow. This hands-on guide introduces you to +AngularJS, the open source JavaScript framework that uses +Model–view–controller (MVC) architecture, data binding, client-side templates, +and dependency injection to create a much-needed structure for building web +apps.

+
+ ★★☆☆☆ +
+

Teaches the basic, but it's really out of date.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/ansible-from-beginner-to-pro/index.html b/public/reviews/books/ansible-from-beginner-to-pro/index.html new file mode 100644 index 0000000..c4bebad --- /dev/null +++ b/public/reviews/books/ansible-from-beginner-to-pro/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Ansible: From Beginner to Pro - Michael Heap

+ +

GoodReads Summary: +This book is your concise guide to Ansible, the simple way to automate apps +and IT infrastructure. In less than 250 pages, this book takes you from +knowing nothing about configuration management to understanding how to use +Ansible in a professional setting.

+
+ ★★★☆☆ +
+

It's kinda hard to put a review on this. I mean, yes, it takes you from the +basics of Ansible, explaining how to build a playbook, split things into +roles, adding triggers... the normal Ansible stuff.

+

The problem lies on the Python part. Ansible is built on top of Python and the +book mentions the current version of Python: 2.6. Problem is, Python 2.6 was +released in 2008 and the 2.x series in unsupported at this point. Surely, it's +a matter of time for this kind of stuff to happen, but still...

+

Also, it seems the author didn't really know Python. The last part, when +talking about building your own Ansible module, it uses the long version to +build dictionaries, dict(key=value), instead of the classic and short +{'key': value}. There is no explanation why use this version instead.

+

Sure, at this point, it helps beginners with Ansible, but I'm not quite sure +if the "Pro" part still holds up.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/answers-to-questions-youve-never-asked/index.html b/public/reviews/books/answers-to-questions-youve-never-asked/index.html new file mode 100644 index 0000000..818817f --- /dev/null +++ b/public/reviews/books/answers-to-questions-youve-never-asked/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Answers to Questions You’ve Never Asked: Explaining the What If in Science, Geography and the Absurd - Joseph Pisenti

+ +

GoodReads summary: +Fun facts for kids of all ages: When you take the most absurd parts of history, +science, economics and geography, you end up with a pretty confusing picture of +humanity. Why do we have borders, what’s the furthest you can get from the +ocean, how do you qualify as a country and why did Vikings wear those silly +helmets? These are just a few of the strange questions that bounce around the +head of YouTube sensation Joseph Pisenti, aka RealLifeLore.

+
+ ★★★☆☆ +
+

Another trivia book. And this one is... weird.

+

Instead of coming directly with trivia, the book focus on the history +behind the fact (e.g., the size of the Roman Empire is giving talking about the +annexed countries). On the other hand, the way to get to the history is +strange, to say the least: How many countries today would encompass the Roman +Empire, if it didn't fall?

+

Also, the last 1/3 of the book is devoted to American presidents, which is +interesting... if you're American.

+

(And yes, I know I'm picky about this kind of stuff, but some one has to +be, right?)

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/antifragile-systems-and-teams/index.html b/public/reviews/books/antifragile-systems-and-teams/index.html new file mode 100644 index 0000000..5057ff9 --- /dev/null +++ b/public/reviews/books/antifragile-systems-and-teams/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Antifragile Systems and Teams - Dave Zwieback

+ +

GoodReads Summary: +All complex computer systems eventually break, despite all of the +heavy-handed, bureaucratic change-management processes we throw at them. But +some systems are clearly more fragile than others, depending on how well they +cope with stress. In this O’Reilly report, Dave Zwieback explains how the +DevOps methodology can help make your system antifragile.

+
+ ★★☆☆☆ +
+

Not really a book, just a paper. But a badly constructed paper.

+

It doesn't describe what an "antifragile system" is in deep (ok, it's a +paper); lists only two examples of antifragile systems; focus too much on +devops.

+

Sadly, nothing useful -- something you can take with you and use when building +your own system or leading your team -- in this.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/apache-kafka/index.html b/public/reviews/books/apache-kafka/index.html new file mode 100644 index 0000000..a20403a --- /dev/null +++ b/public/reviews/books/apache-kafka/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Apache Kafka - Nishant Garg

+ +

GoodReads Summary: +The book will follow a step-by-step tutorial approach which will show the +readers how to use Apache Kafka for messaging from scratch.Apache Kafka is for +readers with software development experience, but no prior exposure to Apache +Kafka or similar technologies is assumed. This book is also for enterprise +application developers and big data enthusiasts who have worked with other +publisher-subscriber based systems and now want to explore Apache Kafka as a +futuristic scalable solution. (less)

+
+ ★☆☆☆☆ +
+

After reading the book, I ended up with more questions than I had when I started reading:

+
    +
  1. What Kafka is good for?
  2. +
  3. What are the use cases for Kafka?
  4. +
  5. When I should NOT use Kafka?
  6. +
  7. How Kafka compares to other options?
  8. +
  9. What is a topic?
  10. +
  11. How to create a pipeline to process information, in a way that I have multiple lines of processing?
  12. +
+

Not only the book goes straight to "You install this way, you write a simple +app, and that's it", it uses some very terse phrases, which makes really hard +to read. Things like "This, at times, leads to redevelopment of information +producers or consumers to provide an integration point between them", which is +terse but has absolutely no information at all. There is even an introduction +to Hadoop as "Resource sharing, stability, availability, and scalability are a +few of the many challenges of distributed computing. Nowadays, an additional +challenge is to process extremely large volumes of data in TBs or PBs." -- +which says absolutely NOTHING about what Hadoop is and how it works.

+

Again, if you want to know less about Kafka, that's a good book for it.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/arrival/index.html b/public/reviews/books/arrival/index.html new file mode 100644 index 0000000..be13c53 --- /dev/null +++ b/public/reviews/books/arrival/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Arrival - Ted Chiang

+ +

GoodReads Summary: +From a soaring Babylonian tower that connects a flat Earth with the heavens +above, to a world where angelic visitations are a wondrous and terrifying part +of everyday life; from a neural modification that eliminates the appeal of +physical beauty, to an alien language that challenges our very perception of +time and reality... Chiang's rigorously imagined stories invite us to question +our understanding of the universe and our place in it.

+
+ ★★★★★ +
+

I'll be honest (again) and admit that I bought the book because of the movie +(again -- the same thing happened with [book:All You Need Is +Kill|6255949]/Edge of Tomorrow). This time, though, I haven't seen the movie +yet, so I basically "read the movie" before watching it.

+

Thing is, this is not just about Arrival. It's a collection of stories by +Ted Chiang -- one of them is "The Story of Your Life", which is the base for +the movie. You have "Tower of Babylon", which is kinda like a fantasy story if +said tower actually reached the heavens; "Understand", which takes a stab in a +"Limitless" kinda-way; "Division By Zero", which talks about mathematics but +it is actually about people (Pro-tip: if you read, keep an eye on the +"chapter" numbers; it will explain the story); "Story of Your Life", which, +again, is the base for the Arrival movie; "Seventy-Two Letters", about a world +where golems and controlling stuff with written stuff actually exists; "The +Evolution About Human Science", a short story about a future when humans can't +keep up with their own science; "Hell is the Absence of God", about angels +(although the author explains it in the end, it felt much more like "this is +hell" than anything else); and "Liking What You See: A Documentary", which +feels like a huge discussion about beauty and propaganda.

+

In general, all stories are pretty easy and interesting to read -- reading the +whole book in two days may be a testament of this. The whole style reminded me +of Asimov's writing, although I could skip half paragraphs without missing +anything in the story, while that wouldn't be an option in Asimov stories.

+

The endings are also kinda loose, but because there are hidden clues about the +story itself in other parts -- like in "Division By Zero" -- I guess I just +didn't get them yet.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/backbonejs-essentials/index.html b/public/reviews/books/backbonejs-essentials/index.html new file mode 100644 index 0000000..8fdb0d4 --- /dev/null +++ b/public/reviews/books/backbonejs-essentials/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Backbone.js Essentials - Jeremy Walker

+ +

GoodReads Summary: +Construct top-notch web applications by mastering the powerful tools provided +by Backbone.js Gain insights into how to simplify data management and create +single-page web applications with powerful user interfaces This is a +fast-paced guide on how to test, document, and leverage third-party libraries, +and helps you get the most out of Backbone.js.

+
+ ★★★☆☆ +
+

This is the second book about Backbone and, honestly, the more I read, the +less I understand about it; but I believe that's absolutely only my fault.

+

Although the book explains each of the Backbone classes in deep, it never +really connects one to another. It seriously lack a whole description on how +to build an app from start to finish. Even if you know everything about +collections and models (and that they represent a table and a record, +respectively), how to create a View and how to route things around, you +seriously lack the idea behind connecting one to another -- although Views are +shown using Models directly, it should actually go on how to draw several +models from a collection in a single step, for example.

+

So, although good for understanding Backbone classes, it lacks on the general +building of a Backbone app.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/backbonejs-testing/index.html b/public/reviews/books/backbonejs-testing/index.html new file mode 100644 index 0000000..2fe3f63 --- /dev/null +++ b/public/reviews/books/backbonejs-testing/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Backbone.Js Testing - Ryan Roemer

+ +

GoodReads Summary: +This book is packed with the step by step tutorial and instructions in recipe +format helping you setup test infrastructure and gradually advance your skills +to plan, develop, and test your backbone applications.If you are a JavaScript +developer looking for recipes to create and implement test support for your +backbone application, then this book is ideal for you.

+
+ ★★★★☆ +
+

At the very begin of the book, the author mentioned that, for the sake of +showing tests, there would be a complete application to be used as an example. +My thought, at this point was: Finally, a book talking more about how to +connect Backbone elements than Backbone.js Essentials. Well, I was mistaken.

+

There isn't much of Backbone itself in this book. When it says "Backbone.js +Testing", it actually means that Backbone is just a background thingy to +talk about Mocha, Chai and Sinon. If the author decided to write a "React.js +Testing", there wouldn't be more much in the topics, just a few adjustments +there and there.

+

This means this book is bad? Actually not. Although not focusing directly on +Backbone, it does focus a lot on testing and all related libraries. Even if +you don't work with Backbone -- but have at least some general idea about how +it works -- it is a damn good book about JavaScript testing.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/being-there/index.html b/public/reviews/books/being-there/index.html new file mode 100644 index 0000000..1a092e4 --- /dev/null +++ b/public/reviews/books/being-there/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Being There - Jerzy Kosiński

+ +

GoodReads Summary: +A modern classic now available from Grove Press, Being There is one of the +most popular and significant works from a writer of international stature. It +is the story of Chauncey Gardiner - Chance, an enigmatic but distinguished man +who emerges from nowhere to become an heir to the throne of a Wall Street +tycoon, a presidential policy adviser, and a media icon. Truly "a man without +qualities," Chance's straightforward responses to popular concerns are +heralded as visionary. But though everyone is quoting him, no one is sure what +he's really saying. And filling in the blanks in his background proves +impossible. Being There is a brilliantly satiric look at the unreality of +American media culture that is, if anything, more trenchant now than ever.

+
+ ★★☆☆☆ +
+

It's a somewhat funny story. It's also short. But I can't stop thinking "What +the heck I just read?"

+

I've seen a lot about the movie (with the same name) but I've never seen the +movie itself. So I read the book.

+

But the story... I don't know if Kosinski just wanted to write something funny +or was trying to make a statement about the higher classes. 'Cause Chance is +dumb as a brick, but after being hit by a car of a high society socialite, +suddenly he's elevated to the point of being the smartest, most desired person +around.

+

So you see the kind of comic situations you could do with this. But also, +because everything sees him as a super smart persona, you can't stop thinking +that, maybe, Kosinski wanted to point how being rich isn't synonymous of +"being intelligent".

+

And, because you never know where the author is pointing at the the story ends +rather abruptly, I can't really say it's a good story.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/black-hat-python-python-programming-for-hackers-and-pentesters/index.html b/public/reviews/books/black-hat-python-python-programming-for-hackers-and-pentesters/index.html new file mode 100644 index 0000000..60527da --- /dev/null +++ b/public/reviews/books/black-hat-python-python-programming-for-hackers-and-pentesters/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Black Hat Python: Python Programming for Hackers and Pentesters - Justin Seitz

+ +

GoodReads Summary: +When it comes to creating powerful and effective hacking tools, Python is the +language of choice for most security analysts. But just how does the magic +happen?

+
+ ★★☆☆☆ +
+

The very first chapter give me high hopes for this book: Since Python is +basically part of every single Linux install, you could do a shitton +retrieving system and user information by just using the normal packages. You +won't even need to install nmap or similar; using plain Python packages, you +could check which services are running and such.

+

But then, things go downhill.

+

After the first chapter, you start to add Python packages, which means you +need to have root access -- and even if you use something like a virtualenv, +you still would announce yourself by requesting things over the net using +easy_install (the book never mentions pip -- heck, +it doesn't even mentions virtualenv to avoid being root), which could be +easily blocked by sysadmins if your company doesn't have anything with Python.

+

And it doesn't stop at that: after these starting chapters, it start hacking +Windows machines. Heck, Python is not installed by default on Windows and a +py2exe executable weights something like 15Mb, which isn't much in bandwidth, +but it's noticeable. And then it starts installing packages and more packages +and requesting to run things as administrator, which would surely be a hassle.

+

The Python code itself is simplistic, to say the least. At the very first +chapters I noticed that the code was basically C code translated to Python, +which wouldn't be a problem if you're thinking about replacing basic hack code +with Python code -- because it is easier to find Python installed than GCC, +for example -- but with the problems cited above actually make me think that +the author never really cared about Pythonic code, just did the very minimum +to make code run and that's it.

+

So, it's a bad book about hacking because it requires privileged access +beforehand and it's a bad book about Python because it doesn't follow Python +good practices. In the end, it's just a book with a few interesting Python +libraries, nothing more.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/brave-new-world/index.html b/public/reviews/books/brave-new-world/index.html new file mode 100644 index 0000000..fa886bf --- /dev/null +++ b/public/reviews/books/brave-new-world/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Brave New World - Aldous Huxley

+ +

GoodReads Summary: +Brave New World is a dystopian novel by English author Aldous Huxley, written in 1931 and published in 1932. Largely set in a futuristic World State, inhabited by genetically modified citizens and an intelligence-based social hierarchy, the novel anticipates huge scientific advancements in reproductive technology, sleep-learning, psychological manipulation and classical conditioning that are combined to make a dystopian society which is challenged by only a single individual: the story's protagonist.

+
+ ★★★☆☆ +
+

There is a weird thing about "Brave New World". Well, there are a bunch of +weird things, like the pacing, the idea in the early chapters which make it +confusing to see where the author wants to go but, on top of that, there is +this dystopian future (apparently, 300 or 400 years from the early 20th +century) that sounds so much like our days.

+

The book opens with a very dystopian society: People are bred, not born, and +the needs of the society decide the type of people who will be born: Do we +need more administrators? Then we'll have this kind of people; do we need more +workers? Then we'll have a bunch of twins with low IQ that will be prepared to +do menial tasks.

+

Not only that, but people are thought, at the very age, by continuous +reinforcement propaganda that things like "marriage", "naturally born", +"father", "mother" and other things are actually bad; we need more money being +spent in the country, so let's train people to like being outside the cities; +clothing is thrown away because that makes the clothing industry prosper +(instead of simply mending); people are actually encouraged to be promiscuous +(sorta) in other to never feel lonely.

+

(In part, this resonates a bit with The Robots of Dawn, but while in Aurora +people would engage sex when they felt like, in Brave New World people engage +sex because they are massively pressured since their early training to do so.)

+

But then again there are small pockets of people who are not part of the +society, being kept in Savage Reservations. And when one of such "savages" +is brought back into society, then we have our discussion about total free +will and the workings of a completely conditioned and "harmonic" (with quotes) +society.

+

Again, it's weird to understand where the author wants to go in the early +chapters, but the final chapters (with the exception of the end of the last +one) are pretty damn thought provoking.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/broetry/index.html b/public/reviews/books/broetry/index.html new file mode 100644 index 0000000..98997b8 --- /dev/null +++ b/public/reviews/books/broetry/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Broetry Poetry for Dudes - Brian McGackin

+ +

GoodReads Summary: +As contemporary poets sing the glories of birds, birch trees, and +menstruation, regular guys are left scratching their heads. Who can speak for +Everyman? Who will articulate his love for Xbox 360, for Mama Celeste's frozen +pizza, for the cinematic oeuvre of Bruce Willis?

+
+ ★★★★☆ +
+

Don't let the title fool you: It may sound like a book with bro-dude stuff, +like women being bitches, the parties all nights to get bitches and so on, but +there is none of this here.

+

It's more about life, about growing up, with some fun tones -- I specially +recommend the one that describes a whole life in 3 or so pages using only +movie titles.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/c-succinctly/index.html b/public/reviews/books/c-succinctly/index.html new file mode 100644 index 0000000..8e0fc07 --- /dev/null +++ b/public/reviews/books/c-succinctly/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

C# Succinctly - Joe Mayo

+ +

GoodReads Summary: +(No summary.)

+
+ ★★☆☆☆ +
+

I know that "succinctly" doesn't mean "let's explore everything", but there are +some things that really need some better explanations.

+

First of all, this is not a book for starters. If you never coded in your +live, getting the basics will be really hard. Second, there are some things +that, because you already coded, look a bit weird in the way that either C# is +a magical language or there is something really wrong with the code.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/central-station/index.html b/public/reviews/books/central-station/index.html new file mode 100644 index 0000000..76b39f1 --- /dev/null +++ b/public/reviews/books/central-station/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Central Station - Lavie Tidhar

+ +

GoodReads Summary: +When Boris Chong returns to Tel Aviv from Mars, much has changed. Boris’s +ex-lover is raising a strangely familiar child who can tap into the datastream +of a mind with the touch of a finger. His cousin is infatuated with a +robotnik—a damaged cyborg soldier who might as well be begging for parts. His +father is terminally-ill with a multigenerational mind-plague. And a hunted +data-vampire has followed Boris to where she is forbidden to return.

+
+ ★☆☆☆☆ +
+

There is something incredibly satisfying in reading a book in which the +characters are not some sort of American-centered or -inspired story -- heck, +even All You Need Is Kill feels a +lot like an American story than a Japanese one. But here? No. Names are +"alien", 'cause you're not used to see them, like mixing Chinese and Russian +names. And Hebrew names. And the location doesn't look like the general things +we usually read.

+

But while the ambience feels nice, the plot doesn't. I mean, sure, there are +some incredible elements that could be explored in future novels, but here they +are thrown and forgotten and never really explored properly. You have children +with weird abilities that are never explained; you have a diseased women whose +sickness grants some powers, but something mythical happens with her (and the +children) and then she suddenly disappears. Was she cured? Does she lives a +normal life now? Does the mythical thing killed her?

+

And you have some mythical gods walking around, something that people take as +annoyance, but they appear only after the middle of the book, out of the blue. +I mean, sure, by the description, they are annoying -- 'cause they are gods, +after all, and can do whatever, whenever they want -- and people doesn't seem +to really like them, but how the heck we spent this whole time without knowing +anything about them? And then, this god appears, do some crazy things, and +disappear and never mentioned again.

+

This kind of "starting a thread and never putting a connection in them" happens +over and over again, just ruining the feeling from the book.

+

And the ending... It feels like the author simply decided "Ok, I had enough; I +need an ending" and just put something there to mark it as ended and gone.

+

There is a lot of points that could be explored in the future from here, but +here... not much is.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/changing-planes-stories/index.html b/public/reviews/books/changing-planes-stories/index.html new file mode 100644 index 0000000..19fba01 --- /dev/null +++ b/public/reviews/books/changing-planes-stories/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Changing Planes: Stories - Ursula K. Le Guin

+ +

GoodReads Summary: +Sita Dulip has missed her flight. But instead of listening to garbled +announcements in the airport, she has found a method of bypassing the crowds +at the desks, the long lines at the toilets, the nasty lunch, the whimpering +children and punitive parents, the bookless bookstores, and the blue plastic +chairs bolted to the floor.

+
+ ★★★★☆ +
+

This was the first book of Ursula that I've read, even if I'm used to read +Scifi from Asimov, Clark and Heinlein. But Ursula is a complete different +style from those.

+

"Changing Planes" can be described as "she took her dreams and turned into +stories". It's a story of several "planes" of existence, each with its own +history, its own culture and its own people. Each is different from the other +in almost non-overlapping fashion.

+

At first it's kinda weird and uninteresting -- till you realize how much +creativity one has to have to come up with several different different planets +and their history.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/christopher-walken-a-to-z/index.html b/public/reviews/books/christopher-walken-a-to-z/index.html new file mode 100644 index 0000000..0d7403c --- /dev/null +++ b/public/reviews/books/christopher-walken-a-to-z/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Christopher Walken A to Z: The Man, the Movies, the Legend - Robert Schnakenberg

+ +

GoodReads Summary: +The Complete Guide To All Things Walken.

+
+ ★★★☆☆ +
+

It's "The Big Bad Book of Bill Murray", but for Christopher Walken: Stories, +people, movies, things related to the Christopher Walken, in alphabetical +order.

+

Is it good? Well, that's the point I can really say. One thing that annoys me +is that most of what is said in the book comes from other sources; Walken is +never interviewed, but all the information is taken from other books and +interviews and whatnot, but nothing directly said for the book. Also, because +I'm not a super-fan, I can't validate if things are interesting or not, so it +ends up being a compilation of information about an (recluse, private) actor.

+

It may be good if you just found out about Christopher Walken and want some +opinion about his movies, and what to watch next and such and get some +information in the more boring scenes.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/chthon/index.html b/public/reviews/books/chthon/index.html new file mode 100644 index 0000000..43ebfba --- /dev/null +++ b/public/reviews/books/chthon/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Chthon - Piers Anthony

+ +

Goodreads Summary: +Chthon was Piers Anthony’s first published novel in 1967, written over the +course of seven years. He started it when he was in the US Army, so it has a +long prison sequence that is reminiscent of that experience, being dark and +grim. It features Aton Five, a space man who commits the crime of falling in +love with the dangerous, alluring Minionette and is therefore condemned to +death in the subterranean prison of Chthon. It uses flashbacks to show how he +came to know the Minionette, and flash-forwards to show how he dealt with her +after his escape from prison. The author regards this as perhaps the most +intricately structured novel the science fantasy genre has seen. It was a +contender for awards, but not a winner.

+
+ ★★☆☆☆ +
+

A lot it is said about this book about its narrative structure, starting in +the "present" and then doing flashbacks explaining some point (sometimes) and +then showing the future in "flash forwards". The thing is, "flash forwards" +don't feel like "flash forwards"; the simply appear as if the future is the +present and the present became a flashback.

+

Also, the flashbacks sometimes are not explanative and a bit too long. The +very first one doesn't explain anything about the current state of the story, +and it is so long you have to wonder if the story actually moved back or it is +talking about something else.

+

There is also some weird jumps in the story that made me feel like I skipped a +whole page for some unknown reason, and I had to track back, see that I didn't +skip anything and the story simply did a (small) jump in the plot.

+

The characters are really bland. One of the topics, the fact that a race +actually feels hate as love (and no, that's not a spoiler, 'cause you don't +know who I'm talking about), is actually really bad explained and explored -- +and the weird fact that, as the author puts in the post words in the end, that +was the origin of the book.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/clean-code-a-handbook-of-agile-software-craftsmanship/index.html b/public/reviews/books/clean-code-a-handbook-of-agile-software-craftsmanship/index.html new file mode 100644 index 0000000..905e946 --- /dev/null +++ b/public/reviews/books/clean-code-a-handbook-of-agile-software-craftsmanship/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin

+ +

GoodReads Summary: +Even bad code can function. But if code isn't clean, it can bring a +development organization to its knees. Every year, countless hours and +significant resources are lost because of poorly written code. But it doesn't +have to be that way.

+
+ ★★★☆☆ +
+

About the edition

+

If there is one single weird thing about the Kindle edition is the code +formatting. While reading code in non-monospaced font is weird but not +impossible, reading code in non-monospaced font that is justified like normal +text is.

+

The really annoying part is that, at the end of the book, the full listing of +the discussed code is shown as "images", large blocks of code that don't +follow the selected Kindle background and doesn't seem to allow selection, but +it is monospaced and it is not justified. Why won't they use +it all over the code is beyond me.

+

About the content

+

The book goes with a good start, listing almost all the pet peeves I have with +other people code ("why the fuck they named things like +this?", "why the hell this function have that many +parameters?" and so on -- heck, even the problem with consistent style was +there). Although it points the problem and how to improved it, it sometimes +lacks the why those changes need to be made.

+

But, then, things start to really go downhill, with lots of stuff that +contradicts previous statements (specially the Single Responsibility +Principle), and a bunch of things that are language specific. There is one +really good chapter that picks a code and goes slowly showing the principles +discussed in the start of the book, applying one after the other, so you can +see the code changing and becoming easier to read. The sad part is that it is +used only once.

+

Honestly, I which there was a lot more of "why you should do this", only +because as a seasoned programmer, I agree -- and use -- with a lot of the +points in the book, but I lack the experience the tell younger programmers +why they should not do what they are doing.

+

It's a good book, nonetheless, although not exceptionally good.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/clojure-for-machine-learning/index.html b/public/reviews/books/clojure-for-machine-learning/index.html new file mode 100644 index 0000000..07eac5f --- /dev/null +++ b/public/reviews/books/clojure-for-machine-learning/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Clojure for Machine Learning - Akhil Wali

+ +

GoodReads Summary: +Clojure for Machine Learning is an introduction to machine learning techniques +and algorithms. This book demonstrates how you can apply these techniques to +real-world problems using the Clojure programming language.

+

It explores many machine learning techniques and also describes how to use +Clojure to build machine learning systems. This book starts off by introducing +the simple machine learning problems of regression and classification. It also +describes how you can implement these machine learning techniques in Clojure. +The book also demonstrates several Clojure libraries, which can be useful in +solving machine learning problems.

+
+ ★★☆☆☆ +
+

If I ever read a book with a misleading title, that would be it.

+

Not because there is no Clojure in it, but the amount of Clojure used is +minimal compared to the whole.

+

Also, not because there is no Machine Learning in it, but the book goes as +deep as explaining the algorithms behind each common machine learning +technique, without explaining when you should use it. There is ample +discussion about the mathematical context of each method, but it explains +absolutely nothing about machine learning itself -- it's purely a bunch of +mathematical equations that could be use to extract some pattern, but it's +hardly "machine learning" at this point.

+

(Also: Neural networks as "unsupervised learning"?!?)

+

So, good book on the math behind some machine learning equations, very bad +clojure, very bad machine learning.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/clojure-for-the-brave-and-true/index.html b/public/reviews/books/clojure-for-the-brave-and-true/index.html new file mode 100644 index 0000000..610bf56 --- /dev/null +++ b/public/reviews/books/clojure-for-the-brave-and-true/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Clojure for the Brave and True - Daniel Higginbotham

+ +

GoodReads Summary: +As a Lisp-style functional programming language, Clojure lets you write robust +and elegant code, and because it runs on the Java Virtual Machine, you can +take advantage of the vast Java ecosystem. Clojure for the Brave and True +offers a "dessert-first" approach: you'll start playing with real programs +immediately, as you steadily acclimate to the abstract but powerful features +of Lisp and functional programming. Inside you'll find an offbeat, practical +guide to Clojure, filled with quirky sample programs that catch cheese thieves +and track glittery vampires.

+
+ ★★★☆☆ +
+

There must be something wrong with Lisp (and Lisp-like) people that when they +write about their language, they show the code first, then explain what they +wrote -- which is kinda weird, because you read code that you barely +understand what it is doing at first, then they explain and you have to go +back and read it again to finally "click" it. And, sometimes, they forget what +code they just wrote and you're left with commands that you have no idea what +they do.

+

There is also a weird sense of humor, which I believe it could be fun if you +watch whatever TV series the author uses as reference. For someone that +doesn't follow and doesn't know what he's talking about, it's just... weird -- +and not fun at all. Fortunately, the "humor" tones down to the end, which +makes more "pleasant" to read.

+

While it covers a lot of ground in the book, some pieces really fall short in +their examples. Threading and process fall short due the use of +sleep, which is not something you'd normally write; the last +appendix, about a tool called "Boot" tries to explain some concepts about +tasks and middlewares with things that are not tasks and do not reflect the +real world. Lacking this connection to real use of a tool just make things +harder to udnerstand -- and even harder to see where you'd use it.

+

It's not the worst book about a Lisp-like language I've read -- and heck, it +does a good job selling the language, to the point I'm already thinking +about writing something in it -- but damn if these problems don't appear in +every single one of those.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/coffeescript-application-development/index.html b/public/reviews/books/coffeescript-application-development/index.html new file mode 100644 index 0000000..bb86fdd --- /dev/null +++ b/public/reviews/books/coffeescript-application-development/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

CoffeeScript Application Development - Ian Young

+ +

GoodReads Summary: +What JavaScript user wouldnt want to be able to dramatically reduce +application development time This book will teach you the clean, elegant +CoffeeScript language and show you how to build stunning applications. +Overview Learn the ins and outs of the CoffeeScript language, and understand +how the transformation happens behind the scenes Use practical examples to put +your new skills to work towards building a functional web application, written +entirely in CoffeeScript Understand the language concepts from short, +easy-to-understand examples which can be practised by applying them to your +ongoing project In Detail JavaScript is becoming one of the key languages in +web development. It is now more important than ever across a growing list of +platforms. CoffeeScript puts the fun back into JavaScript programming with +elegant syntax and powerful features. CoffeeScript Application Development +will give you an in-depth look at the CoffeeScript language, all while +building a working web application. Along the way, youll see all the great +features CoffeeScript has to offer, and learn how to use them to deal with +real problems like sprawling codebases, incomplete data, and asynchronous web +requests. Through the course of this book you will learn the CoffeeScript +syntax and see it demonstrated with simple examples. As you go, youll put your +new skills into practice by building a web application, piece by piece. Youll +start with standard language features such as loops, functions, and string +manipulation. Then, well delve into advanced features like classes and +inheritance. Learn advanced idioms to deal with common occurrences like +external web requests, and hone your technique for development tasks like +debugging and refactoring. CoffeeScript Application Development will teach you +not only how to write CoffeeScript, but also how to build solid applications +that run smoothly and are a pleasure to maintain.

+
+ ★★★★☆ +
+

In these days of ECMAScript 6, it's nice to see where a bunch of ideas of it +came from.

+

Coffee is a lot like the new JavaScript standard (just a bit more brackets). +The book manages to explain and show all the little nice things about it, +keeping a single application from start to finish, which helps a lot in +understanding the flows of it.

+

I just got a bit miffed with the upbeat tone of the book. It's not a full +Pollyanna, but a lot of "that looks a lot cleaner, don't it?" and "It's even +prettier than normal Javascript" gets into you pretty quick.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/concise-guide-to-databases/index.html b/public/reviews/books/concise-guide-to-databases/index.html new file mode 100644 index 0000000..c37866e --- /dev/null +++ b/public/reviews/books/concise-guide-to-databases/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Concise Guide To Databases - Peter Lake, Paul Crowther

+ +

GoodReads +Summary: +This easy-to-read textbook/reference presents a comprehensive introduction to +databases, opening with a concise history of databases and of data as an +organisational asset. As relational database management systems are no longer +the only database solution, the book takes a wider view of database technology, +encompassing big data, NoSQL, object and object-relational, and in-memory +databases. The text also examines the issues of scalability, availability, +performance and security encountered when building and running a database in the +real world.

+
+ ★☆☆☆☆ +
+

Let me get something out of my system straight away: This book needs some +serious proof-reading. The authors seem to have an aversion to commas, and +that makes reading some sentences really hard ("Is that an adjective or a noun? +Oh, heck, I though it was an adjective, and now things don't make sense; let me +read that again as a noun to see if that works.") There are a lot of repeat +content (three times there is a discussion on how HDD prices are falling, how +the price per megabyte is falling and how SSD is faster than HD). All the +abstracts, the first part of every chapter, are just some copy'n'paste from a +few phrases of the first part after the abstract. And there are "is in the a +Microsoft", "none encrypted protocol" and there is even a "[company] and there +product". And two paragraphs one-next-to-the-other have "OS" written in 3 +different ways ("o/s", "O/S" and "OS"). Oh, and there is no definitive style for +anything: Sometimes quotations would have a larger margin compared to the rest +of the text and sometimes they won't; all commands (including SQL queries and +related commands to be entered in databases) are all in the same font as the +rest of the text (with one single exception in the end of the book); sometimes +there are sub-sub-sections (like "14.4.1.1) and sometimes it just uses bold text +with no numeration.

+

But, if the book was actually nice (and easy) to read, besides all that, does is +live to its title? No.

+

Is it "Concise"? Well, not quite. The printed version is 300+ pages long, which +I could hardly call "concise". A lot of content could be removed with no affect +in the end, like the step-by-step explanation of all 5 levels of database +normalization (which is also arguable if that makes sense in a book that should +discuss databases), the explanation of XML (which is not arguable and feels +completely lost in a book about databases) and discussions on what to do when a +disk fails.

+

Is it a "Guide"? Not quite. The book does explore (lightly) different databases, +but fails to point where each makes sense: What kind of data/database +structure makes sense in a relational database? What kind of data fits better on +a NoSQL database? When it makes sense to use Hadoop?

+

Is it about "Databases"? That's where the book fails hard, in my opinion. Sure, +it talks about Oracle, and a bit about Mongo, and Oracle, and some about +Cassandra, and Oracle, and they even mention Hadoop. And then Oracle. It feels +like the whole book is just a huge propaganda on how to operate Oracle, how +Oracle tools work, and so on. Sure they talk about other databases, but when +every example is about Oracle, you have to wonder why.

+

Another example of how the book leans towards Oracle: There is a single mention +to PostgreSQL, saying that it "is popular with personal computer users". Heck, +AWS RDS was launched 4 years prior to the publishing of this book and it already +had the PostgreSQL layer. Since early 2000s, every time someone asked "What +database should I use for my project?" there was at least one "PostgreSQL" +answer. But, since PostgreSQL is in direct competition with Oracle, you can see +why it is largely ignored.

+

So, hard to read and doesn't fill the topic it proposes in its title. "7 +Databases in 7 Weeks" does a better job about being a Guide to Databases than +this.

+
+

ISSN 1863-7310e-ISSN 2197-1781

+

ISBN 978-1-4471-5600-0e-ISBN 978-1-4471-5601-7

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/crap-dates/index.html b/public/reviews/books/crap-dates/index.html new file mode 100644 index 0000000..6a04b49 --- /dev/null +++ b/public/reviews/books/crap-dates/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Crap Dates - Rhodri Marsden

+ +

GoodReads Summary:

+

A good date can be exhilarating: a shared joke, an improbable spark, long +moments of gazing fondly into each other's eyes. Not so for the dating disasters +featured in this collection of laugh-out-loud actual tweets about the most +terrible evenings imaginable. From seriously unwelcome confessions, to dousing +dates in wine, to bringing them back to creepy apartments to meet favorite +stuffed animals, here are the funniest and most alarming reports from dating's +front lines. Along the way, author Rhodri Marsden offers tips on how to identify +and avoid the worst of the bad daters, including married men, blatant liars, +deluded optimists, and more. This harrowing collection of real nightmare dates +will amuse anyone who's suffered through one of cupid's off nights.

+
+ ★★☆☆☆ +
+

Ok, so not much as "offer tips", but mostly "these are things that people +replied to me when I complained about a bad date".

+

Not that the topic doesn't have a merit -- I mean, who doesn't want to know that +they weren't the only ones in a bad date -- but it felt like there was some +lacking of research. And I don't mean field research, but actually talking to +people instead of capturing their tweets and putting them in book form.

+

For example, you have this:

+
+

A 23 yr old girl. “I think for my age I’ve achieved a hell of a lot.” she +said. Then talked for three hours about her internet business.

+
+

Sure, that's a huge presumptuous comment to make in a first date, but "yr"? +Couldn't we edit this so at least it looks correct? Couldn't we do a research on +how the date went, how they met, how they picked a place and so on? Just the +tweet, then?

+

I mean, sure, the tweets tell a lot about how bad things went, but at least more +details would be nicer, specially when you go to a book format.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/creating-interfaces-with-bulma/index.html b/public/reviews/books/creating-interfaces-with-bulma/index.html new file mode 100644 index 0000000..be3f2b0 --- /dev/null +++ b/public/reviews/books/creating-interfaces-with-bulma/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Creating Interfaces with Bulma - Jeremy Thomas, Oleksii Potiekhin, Mikko Lauhakari, Aslam Shah, Dave Berning

+ +

GoodReads Summary: +This book is a step-by-step guide that will teach how to build a web interface +from scratch using Bulma.

+
+ ★★☆☆☆ +
+

Everybody is looking for that most awesome, small CSS framework, that will +solve all your problems. Is Bulma this framework? Well, I'm not sure.

+

It's not that the book doesn't show what the framework can do, it's just that +the examples seem really without any checking: Sometimes fields are surrounded +by one "field" div, sometimes they are surrounded by "column" (a normal grid +component) and sometimes they are surrounded by two "field" divs. Why? Which +one is the right way? It is a problem with the framework or a problem with the +book?

+

Also, there is a weird example of just writing templates with no explanation +on why: Why one should replace "6 books" to "3 customers"? Does that change +anything? (It does not, I do understand the why doing it, but there is no +explanation that you're doing it just to show how things will look like.)

+

Also also, there is some serious problem with the images in the ePub version: +It says something but it shows a copy of a previous image. Surely, you get +what they meant by some template changes in a way that you don't need to see +the results, but still...

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/index.html b/public/reviews/books/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/index.html new file mode 100644 index 0000000..801cb74 --- /dev/null +++ b/public/reviews/books/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems - Martin Kleppmann

+ +

GoodReads Summary: +Data is at the center of many challenges in system design today. Difficult +issues need to be figured out, such as scalability, consistency, reliability, +efficiency, and maintainability. In addition, we have an overwhelming variety +of tools, including relational databases, NoSQL datastores, stream or batch +processors, and message brokers. What are the right choices for your +application? How do you make sense of all these buzzwords?

+

In this practical and comprehensive guide, author Martin Kleppmann helps you +navigate this diverse landscape by examining the pros and cons of various +technologies for processing and storing data. Software keeps changing, but the +fundamental principles remain the same. With this book, software engineers and +architects will learn how to apply those ideas in practice, and how to make +full use of data in modern applications.

+
+ ★★★☆☆ +
+

First off, right out of the bat: If you want to design Data Intensive +Applications, this is not the book you're looking for. This book goes greats +lengths to explain how already existing Data Intensive Applications work -- +say, how Zookeeper works when synching data, how Cassandra works without a +leader, how PostgreSQL do transactions and so on.

+

While informative, the biggest problem is that most of the text is very +loaded: there are layers and layers on each paragraph and you'll take a long +time putting it all together.

+

Personaly, I felt it lacked examples. Sure, it's interesting how many ways you +can do leader election, but which databases use this or that way? I can see +that one way is the way I want to build my applications on top, but without a +really good example, where should I look?

+

Also, there is a slight tendency to describe the "market winners" in way more +detail than everything else. There are long discussions about the ways +Cassandra solves its problems than Voldermort (obviously, there is a reason +why Cassandra is the market winner, but this "over-focus" on certain +applications is tiring and just do a job on keeping those on top -- because +that's the ones the book talks and who will look at a database called +Voldermort when you mention it just in passing?)

+

Overall, it felt like reading my old "Operating Systems 101" books again -- in +a theorical way, not productive way.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/django-design-patterns-and-best-practices/index.html b/public/reviews/books/django-design-patterns-and-best-practices/index.html new file mode 100644 index 0000000..703c679 --- /dev/null +++ b/public/reviews/books/django-design-patterns-and-best-practices/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Django Design Patterns and Best Practices - Arun Ravindran

+ +

GoodReads Summary: +Learning how to write better Django code to build more maintainable websites +either takes a lot of experience or familiarity with various design patterns. +Filled with several idiomatic Django patterns, Django Design Patterns and +Best Practices accelerates your journey into the world of web development.

+
+ ★★★☆☆ +
+

Although I'm not a fan of design patterns (you know, the GoF one) because +people tend replace it to proper thinking. But I do like design patterns for +languages and frameworks, because you can use something for a very long time +and still not doing it in the right way.

+

The book has an interesting premise: Explain a bit something, point a problem, +a solution, expand the problem and expand the solution. The problem is that +some problems seem really shoe horned to certain solutions. Also, some common +problems are not talked at all, like using CSRF with Ajax -- something the +author mentions people shouldn't do (disable CSRF) on Ajax requests.

+

On the other hand, the book focus on the the most recent versions (well, +almost). Instead of going in the safe road of Python 2, the book focus on +Python 3 -- and, to be honest, there isn't much difference between Django with +Python 3 and Django with Python 2.

+

Is not a bad book, but the really interesting things seem to be left out.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/dogfight-how-apple-and-google-went-to-war-and-started-a-revolution/index.html b/public/reviews/books/dogfight-how-apple-and-google-went-to-war-and-started-a-revolution/index.html new file mode 100644 index 0000000..79174b0 --- /dev/null +++ b/public/reviews/books/dogfight-how-apple-and-google-went-to-war-and-started-a-revolution/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Dogfight: How Apple and Google Went to War and Started a Revolution - Fred Vogelstein

+ +

GoodReads Summary: +The rise of smartphones and tablets has altered the business of making +computers. At the center of this change are Apple and Google, two companies +whose philosophies, leaders, and commercial acumen have steamrolled the +competition. In the age of the Android and the iPad, these corporations are +locked in a feud that will play out not just in the marketplace but in the +courts and on screens around the world.

+
+ ★★☆☆☆ +
+

It starts as a very interesting story, telling the behind the scenes stories +about the first iPhone and the creation of Android. Then it derails and do two +stupid things: starts brown nosing one side and focus on a single region.

+

Mid book you'll see how Jobs was aggressive, how Apple was nasty and how Page, +Brin and Schmidt were open and Google was an innovative company. The author +doesn't deny the effect of iPhones and iPads, but focus solely on what others +were doing instead of giving at least some acknowledgement too the company +that created such devices. And yes, I know I sound like a fanboy, but when the +author talks about Android it is never about its effects, only how cool and +innovative and customisable it is. This very much makes the whole book look +one sided, in a non funny way.

+

The other point is the effects of mobile ecosystem. Everything focus solely in +the USA. It's really weird for someone read about Google Music and its dent on +Apple music stronghold when your country have no access to Google Music since +its inception 3 or so years ago.

+

If the whole book focused on the behind the scenes stories and how they +intertwine, it would be a really interesting book. But a narrowed vision and +the author personal opinion leaking through the story really ruins everything.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/dragons-of-dorcastle/index.html b/public/reviews/books/dragons-of-dorcastle/index.html new file mode 100644 index 0000000..76b6929 --- /dev/null +++ b/public/reviews/books/dragons-of-dorcastle/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Dragons of Dorcastle - Jack Campbell

+ +

GoodReads Summary: +For centuries, the two Great Guilds have controlled the world of Dematr. The +Mechanics and the Mages have been bitter rivals, agreeing only on the need to +keep the world they rule from changing. But now a Storm approaches, one that +could sweep away everything that humans have built. Only one person has any +chance of uniting enough of the world behind her to stop the Storm, but the +Great Guilds and many others will stop at nothing to defeat her.

+
+ ★★★★☆ +
+

Before anything else, let me say that I really enjoyed the way the book was +written: It is accessible, easy to read, easy to digest and, well, fun.

+

I also enjoyed the setting: A place where magic exists, but in which technology +wasn't ignored due this. So you have pistols, rifles, even cell phones, but +people that can make things burn and go through walls with the power of their +minds.

+

What I didn't like, though, was the way the relationship between the two main +characters evolve. It feels a bit forced and not something that develops +naturally. Also, one of the characters seem only to mirror the other (there are +reasons for this in the story, which I'm trying really hard not to spoil), so +it's not like they are really feeling that, they are more like mirror the +feelings of the other -- which, again, feels forced.

+

Also, I have some trouble with the pacing. You're reading a tense discussion, +with blatant disregard of one of the character's opinion, and then it cuts to +some memory or internal thought for 3 or 4 paragraphs, and then you return to +the same discussion. I see no problem in things like when the plot is just slow, +so you can give some character building at that point, but in the middle of a +heated discussion? The whole tension just breaks and it feels like the +discussion is not that tense anyway -- so, no repercussions, which isn't what +actually happens.

+

But is isn't a bad book, and it sets a whole universe for exploration in the +next books.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/dragons-winter/index.html b/public/reviews/books/dragons-winter/index.html new file mode 100644 index 0000000..aa38006 --- /dev/null +++ b/public/reviews/books/dragons-winter/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Dragon's Winter - Elizabeth A. Lynn

+ +

Goodreads Summary: +Karadur and Tenjiro are twin sons of Kojiro Antani, the dragon lord of Ippa. +But only Karadur, whose name means "fire-bringer," bears the blood of the +dragon in his veins. His younger brother, Tenjiro or "Heaven's hope," was +second out of the womb and is the weakest and smallest of the two. As the +twins grow to maturity, Karadur is anxious to attain the promise of his blood +and transform into the dragon he is capable of becoming. But Tenjiro, who +bears the scars of Karadur's claws, resents his older brother and, on the eve +of Karadur's transformation, steals the talisman that makes the change +possible. That same night he disappears, fleeing to a distant, icy realm where +he will reemerge as a powerful wizard bent on destroying his older brother. +But Karadur, lord of Dragon Keep, is prepared to go to war against Tenjiro, +and it's likely only one will survive. --Craig Engler (less)

+
+ ★★★☆☆ +
+

A fantasy book with changelings, a feud between brothers and a medieval +setting.

+

The problem? It is too cliché.

+

Sure it's a simple read, but the amount of clichés, like the big baddie, the +corruption of a character by some supernatural power, the character with an +immense power that he needs to learn how to control, even the freaking "let me +build a character you'll cheer for and I'll kill them" is there.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/emotions-revealed-understanding-faces-and-feelings/index.html b/public/reviews/books/emotions-revealed-understanding-faces-and-feelings/index.html new file mode 100644 index 0000000..0b48b4e --- /dev/null +++ b/public/reviews/books/emotions-revealed-understanding-faces-and-feelings/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Emotions Revealed: Understanding Faces and Feelings - Paul Ekman

+ +

GoodReads Summary: +A renowned expert in nonverbal communication, Paul Ekman led a revolution in +our scientific understanding of emotions. In Emotions Revealed, he assembles +his research and theories to provide a comprehensive look at the evolutionary +roots of human emotions, including anger, sadness, fear, disgust, and +happiness.

+
+ ★★★☆☆ +
+

Emotions: Learning, therapy and socialization

+

There is one thing weird about this book: although it explores the expressions +on people's faces, going through lenghty explanations about what they mean and +which context they may happen, there are also parts explaining why you would +feel something like that and how to react when you notice people doing them. +It's part explanation about emotions, part teaching you about your own +emotions (like in a therapy session) and part how to react when people show +them (socialization). In a full package.

+

The problem I found is not about the book, but about the Kindle edition: +Because we are exploring expressions in people's faces, we need images. But +images on Kindle is terrible and in very low quality. It makes kinda hard to +see that little muscle that you move only when you're feeling some emotion +when the image showing it have almost no details due quality.

+

There is a test in the end of the book, explaining exactly what you should be +looking for. The problem is, again, the photo quality in the book.

+

It's an interesting book, specially when it shows that our reactions (face +reactions) to some emotions happen in every society, every culture, but hard +to follow due those bad images.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/employees-gone-wild/index.html b/public/reviews/books/employees-gone-wild/index.html new file mode 100644 index 0000000..8713149 --- /dev/null +++ b/public/reviews/books/employees-gone-wild/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Employees Gone Wild: Crazy (and True!) Stories of Office Misbehavior, and What You Can Learn From the Mistakes of Others - Richard Burton

+ +

GoodReads Summary: +Richard Burton has tales you won’t believe actually happened over his decades +spent as the attorney hired by companies to protect them when their employees +act out. Employees Gone Wild collects some of the most outrageous and +absolutely-true stories (names changed to protect the guilty of course) from +Burton’s years on the job, along with his indispensable practical advice on +how companies and the people that work for them can avoid the same pitfalls.

+
+ ★★★☆☆ +
+

Strange office stories happen everywhere, being passed along from generation +to generation of new employees by old sages.

+

And this book captures the stories of one of those sages.

+

Some of the stories are funny, some are really weird, but all of them have +some points in case you get caught in a similar situation, by someone who has +some ideas about labor law and works for HR (the author mentions that he is, +actually, a labor lawyer, but since there is a disclaimer that you shouldn't +take the suggestions as facts, I'm downplaying the position a bit). This means +that every freaky story have some pointers on what one shouldn't do and what +management should do in case something like that should happen.

+

The last chapter is a downer, though. Instead of funny/freaky, the stories are +mostly discrimination and the tone gets really serious -- with reason.

+

Still, it's kinda interesting seeing that your office is not the only weird +one

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/eon-the-way-1/index.html b/public/reviews/books/eon-the-way-1/index.html new file mode 100644 index 0000000..0baf4cb --- /dev/null +++ b/public/reviews/books/eon-the-way-1/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Eon (The Way, #1) - Greg Bear

+ +

GoodReads Summary: +The 21st century was on the brink of nuclear confrontation when the 300 +kilometer-long stone flashed out of nothingness and into Earth's orbit. NASA, +NATO, and the UN sent explorers to the asteroid's surface...and discovered +marvels and mysteries to drive researchers mad.

+
+ ★★☆☆☆ +
+

Rendezvous with Rama. It's all I could think while reading this book. I +mean, it's a very large, strange object, which humans from Earth get inside +and, while the story progresses, suddenly there are some kind of benevolent +aliens, but the real monsters are the humans, in the end. And, as Rendezvous, +there is a lot of over-describing stuff that is not actually important for the +plot.

+

Sure, there are some twists, like who the aliens really are (while later in +the Rama series you get why the aliens built the spaceship in the first +place) and while the over-descriptions of how the aliens (in this book) look +like, even if they are curious, show a lot of creativity from the author, they +still are over-descriptions that add absolutely nothing to the plot.

+

In the end, curious, but boring.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/films-from-the-future/index.html b/public/reviews/books/films-from-the-future/index.html new file mode 100644 index 0000000..6a98421 --- /dev/null +++ b/public/reviews/books/films-from-the-future/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Films from the Future: The Technology and Morality of Sci-Fi Movies - Andrew Maynard

+ +

GoodReads summary: +Science, technology, and society: In Films from the Future, former physicist +Andrew Maynard threads together his love of science fiction movies with his +expertise on emerging technologies to engage, entertain and make you think +about the relationship between technology, and society as they discover +astounding, transformative advances in science. Through the imagination and +creativity of science fiction movies, Maynard introduces readers to the +profound capabilities presented by new and emerging technologies, and the +complex personal and societal challenges they present.

+
+ ★★★★☆ +
+

Writing a review of this book is hard, 'cause all I have are some disconnected +options about it -- and, in a way, these opinions may only reflect the +disconnected points in the book.

+

So, first point: I find it weird to read a book about movies +which, in most part, are based on books>. One of the points, about Dan +Brown's "Inferno" even mentions that, as a ethics discussion, the book takes a +step further than the movie. Although the point of using movies was more of +"opening discussions using art", it seems weird not to use the books, which are +more rich and more intricate, to raise moral and ethical points.

+

Second point: Some movies seem just an excuse to discuss other things. For +example, "Transcendence" (which, against the first point, it is not based on a +book). Instead of giving real focus to nanotechnology -- and its ethical and +moral uses -- and focuses way too much on the Luddite part it, talking about +some real life counterparts and explaining their point of view and how it +affects science in general.

+

Third point: It is way too long. I mean, most of the subjects the author just +keeps dancing around the topic and don't move forward. "Transcendence" is, +again, a typical case: Yes, Luddites have some points, yes, maybe we shouldn't +listen to all the point, but the fact is, all the time, those two points keep +coming and going, for pages, without reaching a conclusion. At some point, I +was just reading the first half of the paragraphs 'cause I noticed the second +half would be repeated either in the first part of the next paragraph or just +the one following it.

+

But, on top of that, I guess the "Morality" part of the title may lead to some +confusion. It's not "you, random person reading this book, here are some +morality discussions about things you do"; it's way more as "we, scientists, +must have some moral discussions about what we are doing". It could clear the +air for "random persons reading the book" about how science -- and scientists +-- work, but still it is a discussion about morality with scientists.

+

And, in a way, it may also throw people into sciences, because it shows that +scientists are not just "let's find out what's here", but they are worried (or, +at least, as the book tries, should) about the moral repercussions of what they +are working on.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/fledgling/index.html b/public/reviews/books/fledgling/index.html new file mode 100644 index 0000000..0d9d37b --- /dev/null +++ b/public/reviews/books/fledgling/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Fledgling - Sharon Lee, Steve Miller

+ +

GoodReads Summary: +Theo Waitley has lived all her young life on Delgado, a Safe World that is +home to one of the galaxy's premier institutions of higher learning. Both +Theo's mother, Kamele, and Kamele's onagrata Jen Sar Kiladi, are professors at +the university, and they all live comfortably together, just like they have +for all of Theo's life, in Jen Sar's house at the outskirts of town.

+
+ ★★☆☆☆ +
+

First things first: I did enjoy the fact that the universe has gender roles +inverted -- with women being considered "strong" and "intellectual" and men +being the ones that want to look pretty -- and this is not throw at your face +at every moment, although it gets explicit by the end of the book, but by +then, you're already good with it.

+

On the other hand, some things feel... weird. Not about the genders, but in +the story itself. There is some great secret, something the main characters +want to hide, doing a lot of schemes to conceal it and when it is said what it +is... it feels dumb. Ok, someone is clumsy, but that's natural in someone's +family and WHY THE HECK IS THAT A SECRET?!?

+

Also weird are some dialogues. At some point, there is one character asking a +question and getting annoyed at it at the same time, like he didn't like to +hear the question he just asked. Some discussions just jump into conclusions +-- in the right conclusions -- which, again, feels weird. And there is a short +arc in the middle of it that leads absolutely nowhere. It is throw in the +story, affects absolutely nothing and goes away without a trace.

+

Maybe it's because I got the book from Humble Bundle and jumped straight into +the 12 book of the series (the "Liaden Universe", although this is the first +book about a sub-series of one of the characters, or so it seems), but I +didn't feel compelled by any of the characters.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/fulgrim/index.html b/public/reviews/books/fulgrim/index.html new file mode 100644 index 0000000..ea6e442 --- /dev/null +++ b/public/reviews/books/fulgrim/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Fulgrim - Graham McNeill

+ +

GoodReads Summary +It is the 31st millennium, and humanity is at the peak of its powers. As the +Great Crusade, led by Warmaster Horus, continues to conquer the galaxy, +Fulgrim, Primarch of the Emperor’s Children, leads his warriors into battle +against a vile alien foe. From the blood of this campaign are sown the seeds +that will lead this proud Legion to treachery, taking them down the darkest of +paths of corruption. Leading up to the carnage of the Dropsite Massacre on +Isstvan V, this is the tale of Fulgrim's tragic fall from grace.

+
+ ☆☆☆☆☆ +
+

Yes, I know I said I wouldn't read those books anymore. But I tagged them on +my storage in "to be read" and, bored I decided to pick another one.

+

And, this time, I'm not reading any more books of the series.

+

Once again, the story moves backwards -- without telling you this -- to tell +you a story behind some other character... well characters actually, 'cause, +once again, a bunch of characters are introduced and them relegated to +disappear in the background, like previous books.

+

Maybe the author was trying to -- and yes, I know I said this of the previous +book -- make some "Shadow of the Giant" type of connection between the +stories. But, once again, it focus on things you already know, adding +absolutely nothing to the main story. It is just noise around the original +one. Besides, deep, complicated points are still unresolved: How the fuck did +Erebus got into contact with the chaos? What the fuck is the chaos? This is +open for three books (counting this one) and still no answer at all.

+

The first book of the series introduced a character that had to live under the +control of more powerful characters, which could give the reader some idea of +the intricacies of the politics without ever talking about the politicians... +And then suddenly everything was dropped and forgotten and now you have even a +battle between two powerful entities -- the primarchs -- happening, like +everyone else was just background.

+

And boy, the general description of those primarchs is that they are a bunch +of assholes. All of them. To the point that you start to believe that even the +emperor, which command the primarchs, is also an asshole. They are so +asshole-ly than, at this point of the series, I want the whole universe to +burn, starting with the fucking damn Astares.

+

Oh, and the great plot twist in the end can be seen from a mile, as long as +you're paying half attention to the story.

+

So... fuck it, the series is dead and buried for real at this point for me. +I can't even recommend any of the book in the series at this point, so rubbish +the story has become.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/functional-python-programming/index.html b/public/reviews/books/functional-python-programming/index.html new file mode 100644 index 0000000..7e22508 --- /dev/null +++ b/public/reviews/books/functional-python-programming/index.html @@ -0,0 +1,155 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Functional Python Programming - Create Succinct and Expressive Implementations with Python - Steven F. Lott

+ +

GoodReads Summary: +With Functional Python Programming by your side you’ll understand the core +concepts of function Python, its impact on the programming workflow, and how +to implement it in Python, giving you the ability to take your applications to +an even higher level.

+
+ ★☆☆☆☆ +
+

Another book the proves my theory that the quality of a book is inversely +proportional to the amount of "as follows".

+

But functional programming in Python is generators.

+

That's it: Generators. Oh, generators and tuples.

+

There is a lot in this book, but mostly seems... wrong. For example, talking +about "tail call optimization", when Python does not have them. And then +talking how to optimize those -- which, again, it is plain "replace with a +generator".

+

Also, the case for tuples is that namedtuples is mentioned, but rarely used. +This makes code hard to read, except the author decided to create lambdas to +extract them, so you end up with a bunch of xy_g = lambda p: p[0][1][0]. +What the fuck is 0, 1 and 0 again in this? Why not use name tuples and, +instead of this atrocity, go with p.position.x?

+

Other examples of wrong things:

+ +

Besides all that, there is a bunch of explanations that are very much akin to

+
+

a = a + 1

+

Adds 1 to a

+
+

Also, there are chapters for multiprocessing, which has absolutely nothing +functional about it and WSGI, which, again, has nothing functional about it.

+

The whole book feels rushed and badly reviewed -- if reviewed before +publishing at all.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/functional-reactive-programming/index.html b/public/reviews/books/functional-reactive-programming/index.html new file mode 100644 index 0000000..6246c5e --- /dev/null +++ b/public/reviews/books/functional-reactive-programming/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Functional Reactive Programming - Stephen Blackheath, Anthony Jones

+ +

GoodReads Summary +Functional Reactive Programming teaches the concepts and applications of FRP. +It begins with a careful walk-through of the FRP core operations and +introduces the concepts and techniques you'll need to use FRP in any language. +Following easy-to-understand examples, you'll learn both how to use FRP in +greenfield applications and how to refactor existing applications. Along the +way, the book introduces the basics of functional programming in a +just-in-time style, so you never learn anything before you need to use it. +When you're finished, you'll be able to use FRP to spend more time adding +features and less time fixing problems.

+
+ ☆☆☆☆☆ +
+ +

Honestly, I read the book and I still don't understand FRP; all I got was some +concepts for a Sodium framework.

+
+
1 +

... which may appear as no surprise, with the amount of grammar mistakes +in this post. :p +2: That's surprise. +3: That's confusion.

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/future-shock-future-shock-1/index.html b/public/reviews/books/future-shock-future-shock-1/index.html new file mode 100644 index 0000000..f7e58de --- /dev/null +++ b/public/reviews/books/future-shock-future-shock-1/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Future Shock (Future Shock, #1) - Elizabeth Briggs

+ +

GoodReads Summary: +Elena Martinez has street smarts, the ability for perfect recall, and a +deadline: if she doesn’t find a job before she turns eighteen, she’ll be +homeless. But then she gets an unexpected offer from Aether Corporation, the +powerful Los Angeles tech giant. Along with four other recruits—Adam, Chris, +Trent, and Zoe—Elena is being sent on a secret mission to bring back data from +the future. All they have to do is get Aether the information they need, and +the five of them will be set for life. It’s an offer Elena can’t refuse.

+
+ ★★★☆☆ +
+

The basic plot is: A group of teens with special talents is chosen to go to +the future but something something and then they are happily ever after.

+

So... Yes, it's a time travel story, but it goes to the future instead of the +past, which is something new for me. And there is a plot twist in the end, but +it's not big. And the protagonists are teens and, even if it's explained why +(with a bunch of technobabble, that is)... meh. And their "talents" are not +that so important to the plot -- if they were some very clever adults, the +plot would still work the same.

+

But the writing is pretty damn good, even when it lags in the end and you feel +you can jump whole paragraphs without missing the story. But it's not +crumpled, and it's not full of useless descriptions.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/galaxy-in-flames/index.html b/public/reviews/books/galaxy-in-flames/index.html new file mode 100644 index 0000000..a03d7f2 --- /dev/null +++ b/public/reviews/books/galaxy-in-flames/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Galaxy in Flames, Ben Counter

+ +

GoodReads Summary: +Having recovered from his grievous injuries, Warmaster Horus leads the +triumphant Imperial forces against the rebel world of Isstvan III. Though the +rebels are swiftly crushed, Horus's treachery is finally revealed when the +planet is razed by virus bombs and Space Marines turn on their battle-brothers +in the most bitter struggle imaginable.

+
+ ★★☆☆☆ +
+

Not much an improvement from the previous books.

+

The plot could be seen from several books ago, so there is no big plot twist +-- although one could say that there is one, a la George R. R. Martin +("oooohhhh, so edgy!"). But the general plot could be seen from the very start +of the book, so there was no big surprise.

+

Also, some of very old clichés of every story are so used and abused that, +when there is something "out of order" happening, you feel a bit like "yeah +yeah, go on". There are no surprises, no twist that you can't predict pages +ago.

+

And yet, there is one glaring plot hole that started in the previous book and +still isn't explained: Why it happened? When did it happen?

+

Two books and no answer.

+

Also, the idea of ending blocks of text (think as subchapters inside the real +chapters) all end in cliff-hangers, to the point that, when the story gets +faster -- and the blocks smaller -- the amount of cliff-hangering is simply +annoying.

+

On top of that, there is some weird character personalities changing from +white to black -- which also happened in the previous book, but not with the +intensity of what happened in this one -- that it feels more like a previous +character just died and they put a new one with the same name.

+

The book got to the point that I almost relish on spoilers -- which I did look +-- 'cause, honestly, I'm not sure I can stand so much of this thing.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/geek-wisdom/index.html b/public/reviews/books/geek-wisdom/index.html new file mode 100644 index 0000000..247a77c --- /dev/null +++ b/public/reviews/books/geek-wisdom/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Geek Wisdom: The Sacred Teachings of Nerd Culture - Stephen H. Segal, N.K. Jemisin, Eric San Juan, Genevieve Valentine, Zaki Hasan

+ +

GoodReads Summary: +Computer nerds are our titans of industry; comic-book superheroes are our +Hollywood idols; the Internet is our night on the town. Clearly, geeks know +something about life in the 21st century that other folks don’t—something we +all can learn from. Geek Wisdom takes as gospel some 200 of the most powerful +and oft-cited quotes from movies (“Where we’re going, we don’t need roads”), +television (“Now we know—and knowing is half the battle”), literature (“All +that is gold does not glitter”), games, science, the Internet, and more. Now +these beloved pearls of modern-day culture have been painstakingly interpreted +by a diverse team of hardcore nerds with their imaginations turned up to 11. +Yes, this collection of mini-essays is by, for, and about geeks—but it’s just +so surprisingly profound, the rest of us would have to be dorks not to read +it. So say we all.

+
+ ★☆☆☆☆ +
+

Although it is getting common in my reviews, I have to say this again: I have +no idea what's the target of this book.

+

Everything starts with a quote: A scientist, a meme, a movie quote, a game +character, take your "geek" pick". Then, it is followed by a commentary about +the quote. And, finally, some piece of trivia/explanation about the quote +itself.

+

The content of the book, then, is the commentary about the quotes.

+

And that's where my confusion comes.

+

Some explanations seem targeted to other geeks: "You see, So-And-So says this, +so we geek should be careful about that". Some others seem targeted to +non-geeks: "Geeks love So-And-So, because they said that and geeks related to +it". So, it's a book to geeks or to non-geeks?

+

No only that, but some explanations are really dense, like the author (one of +them) is trying to push a point in a short form and throwing jumping stones +really fast, to the point that when you reach the end of the paragraph, you +have no idea how it started.

+

And some are borderline insane: "Transformers! Transform and roll out!" is +related to Martin Luther King "Change does not roll in on the wheels of +inevitability, but comes through continuous struggle." And with that all I can +think is "Really? Like, really really?!?"

+

In the end, it is just a book about geeky quotes and a lot of filler.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/genius-the-life-and-science-of-richard-feynman/index.html b/public/reviews/books/genius-the-life-and-science-of-richard-feynman/index.html new file mode 100644 index 0000000..0d5af58 --- /dev/null +++ b/public/reviews/books/genius-the-life-and-science-of-richard-feynman/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Genius: The Life and Science of Richard Feynman - James Gleick

+ +

GoodReads Summary: +An illuminating portrayal of Richard Feynman—a giant of twentieth century +physics—from his childhood tinkering with radios, to his vital work on the +Manhattan Project and beyond.

+
+ ★★☆☆☆ +
+

Biographies (even auto-biographies) are not without problems. But it takes a +lot of effort to lose the mark.

+

Imagine that you're drawing the life time of someone; you can't use a pen with +a thin point, otherwise you'll end up with simple "they did this, they did +that" with dates, which doesn't give the proper understanding and context of +why the subject did this and that. In the same vein, you can't use a pen +larger than a marker, otherwise you'll spend too much time on things that are +not related to the subject.

+

And this book draw the life of Feynman with a brush.

+

There is a whole chapter about absolutely nothing but a discussion about what +"genius" mean, which seems more targeted to explain the book title than what +happened to Feynman -- or even if his colleagues and family though he was a +genius, for whatever meaning of the word.

+

There are other chapters than, instead of focusing of Feynman, focus on other +subjects, in points that do not related to Feynman directly. The last chapter, +focused on the Challenger explosion, in which Feynman was part of the +commission to explain the explosion, talks a lot more about NASA politics than +Feynman.

+

And, on top of that, the author is very lose with poetic prose instead of +being direct to the point. Also, the lack of a continuous timeline, with the +points moving back and forth through time, makes it hard to understand when +things happen.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/getting-started-with-meteorjs-javascript-framework-second-edition/index.html b/public/reviews/books/getting-started-with-meteorjs-javascript-framework-second-edition/index.html new file mode 100644 index 0000000..6e8e2fd --- /dev/null +++ b/public/reviews/books/getting-started-with-meteorjs-javascript-framework-second-edition/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Getting Started with Meteor.js JavaScript Framework - Second Edition - Isaac Strack

+ +

GoodReads Summary: +Learn one of the most up-to-date JavaScript platforms, with easy to follow, +step-by-step instructions Familiarize yourself with Meteor’s new and improved +features Create dynamic, multi-user applications in JavaScript.

+
+ ★★★★☆ +
+

I must say, I'm confused about something: Either the book is really shallow or +there are no "gotchas" with Meteor. 'Cause the book goes all the way from +creating a single application from start to end, keep it straight, doesn't add +any bullshit, add external dependencies, packages it and then deploys either +on the meteor structure or in custom server.

+

So, again, either Meteor is so simple that everything is already packaged or +the book is shallow and doesn't go deep into problems you may find. I can't +really know, after reading it, which one (although I'd bet my money on the +first).

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/getting-things-done-the-art-of-stress-free-productivity/index.html b/public/reviews/books/getting-things-done-the-art-of-stress-free-productivity/index.html new file mode 100644 index 0000000..5ac0e2f --- /dev/null +++ b/public/reviews/books/getting-things-done-the-art-of-stress-free-productivity/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Getting Things Done: The Art of Stress-Free Productivity - David Allen

+ +

GoodReads Summary: +In today's world, yesterday's methods just don't work. In Getting Things Done, +veteran coach and management consultant David Allen shares the breakthrough +methods for stress-free performance that he has introduced to tens of +thousands of people across the country. Allen's premise is simple: our +productivity is directly proportional to our ability to relax. Only when our +minds are clear and our thoughts are organized can we achieve effective +productivity and unleash our creative potential.

+
+ ★★★☆☆ +
+

As a method, GTD is damn obvious to follow: Write things down so you don't +need to keep thinking that you need to remember something, which would just +lead into a constant need of keeping parts of your brain working on +remembering instead of producing stuff; focus on what you should do next to +complete said things you wrote down; and so on.

+

Part of the whole I was already following, so learning a few more tricks was +really welcomed.

+

The problem here is the telling itself.

+

There are references to PDAs, like it was something not so common. Right now, +almost everyone has a PDA in their pocket, although we call them "smartphones" +instead of PDAs; there are references to "common" binders and rolodexes and +that kind of furniture that, in today's world, is a pretty rare thing and most +of the stuff we deal each day is digital.

+

There are some topics which are largely just propaganda for the method itself +instead of going straight into it to give people an general idea of how things +work and then going deeper (he does it later, but the very start is boring as +hell).

+

Also, some final topics are mostly "One of my clients said she couldn't +understand how she lived till this day doing things not GTD" or "I do this +'cause I like it", which although good to know, it's not representative of the +method itself.

+

So while GTD is a pretty damn good method to keep things organized, the book +that describes this is not well written, IMHO.

+

Get it for the methodology, and be ready to skip a lot of useless stuff.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/greek-mythology-explained/index.html b/public/reviews/books/greek-mythology-explained/index.html new file mode 100644 index 0000000..1f70986 --- /dev/null +++ b/public/reviews/books/greek-mythology-explained/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Greek Mythology Explained: A Deeper Look at Classical Greek Lore and Myth - Marios Christou, David Ramenah

+ +

GoodReads Summary: +Greek mythology explored like never before.

+

Fans of George R.R Martin’s A Song of Ice & Fire series and the Game of Thrones +TV series will love Greek Mythology Explained, a unique retelling of Greek +mythological tales featuring love, betrayal, murder and ruthless ambitions.

+
+ ★★★★☆ +
+

When I saw "Explained" in the title, I thought the explanations would point +things in the stories that reflected things in the Greek society at the time.

+

But no, explanations are way more simpler than that.

+

For example, the mith of Odysseus and his voyage back home, starting when he +has to choose between facing Scylla or Chyrabdis, one a monster of 6 heads and +another a huge whirlpool. The explanation: "between a rock and hard place". I +mean, it doesn't take much to realize that either option is terrible. You don't +need explanation for that.

+

On the other hand, some explanations are, actually, explanations about the +chosen story. Some characters in Greek mythology have different narrations for +the same story -- for example, there are, according to the book, 6 different +tales of Artemis and Orion, all with the same start, the same ending, but +different content "in between". This is nice.

+

And, even if the explanations aren't a huge thing, the select stories are +pretty good.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/hadoop-in-practice-manning/index.html b/public/reviews/books/hadoop-in-practice-manning/index.html new file mode 100644 index 0000000..64308b7 --- /dev/null +++ b/public/reviews/books/hadoop-in-practice-manning/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Hadoop in Practice - Alex Holmes

+ +

GoodReads Summary: +Hadoop in Practice collects nearly 100 Hadoop examples and presents them in a +problem/solution format. Each technique addresses a specific task you'll face, +like querying big data using Pig or writing a log file loader. You'll explore +each problem step by step, learning both how to build and deploy that specific +solution along with the thinking that went into its design. As you work +through the tasks, you'll find yourself growing more comfortable with Hadoop +and at home in the world of big data.

+
+ ★☆☆☆☆ +
+

First thing: This is not about how to deal with Hadoop in a real environment; +this a cookbook of recipes for working with Hadoop, some of them that you +won't ever use.

+

Second: The book uses a structure of +"Explanation/Problem/Solution/Discussion". While the formula usually works, +here is simply to add more words, because "Problem" is tailored exclusively to +pair with the "Explanation". Not only that but "Solution" is basically a +rehearsal of the "Explanation". Something like "Hadoop comes with it's own +class for dealing with X file format; Problem: You have files in the X format +and want to process them in Hadoop; Solution: Use the classes in Hadoop". This +basically throw the whole structure under a bus.

+

Third: There is plenty of code examples, and most are terrible. I don't mean +"The code doesn't compile" or "It doesn't follow any good practices". I mean +it uses some cutesy arrows to point to some pieces of code, which means it's +an image instead of a real code, which means you can't copy'n'paste if needed. +Also, those arrows could be easily be converted to comments, except most +comments would fall into the "i = i + 1; // increments i" category -- useless +comments pointing to obvious things. If it would tell you why you're +incrementing "i" instead of what it's doing, it would at least be interesting.

+

There may be something useful there if you have a specific problem with +Hadoop. But if you have a single, specific problem, you'd Google it instead of +buying a book with a bunch of other solutions that doesn't affect you.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/handson-microservices-with-rust/index.html b/public/reviews/books/handson-microservices-with-rust/index.html new file mode 100644 index 0000000..f527f75 --- /dev/null +++ b/public/reviews/books/handson-microservices-with-rust/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Hands-On Microservices with Rust - Denis Kolodin

+ +

GoodReads Summary: +A comprehensive guide in developing and deploying high performance +microservices with Rust.

+
+ ★★☆☆☆ +
+

The shortest and simpler way to describe this book is this:

+
let mut a = 1;
+a = a + 1;
+// increase a
+
+

Sure, increasing a may seem interesting, but where the heck is the +explanation on why you're increasing a?

+

The long version is this: this is an exact representation of what a Packt book +is. There are a bunch of grammatical errors from the half of the book to the +end, which should've picked by the editor; there are a bunch of weird +explanations and the incredible tendency of use a different package on each +project (one project uses Hyper, the other Rocket, the other Actix-Web) which +should've been picked by the reviewer; the whole book have a bunch of text +saying what the code is doing, but not why it was designed that way.

+

So the whole thing feels rushed and without thought.

+

The "change package on each discussion" is also damming: you never really got +deep into a package, understanding its ins and outs, because it keeps changing +all the time (logs is another thing that keeps changing all the time in the +code, which seems really weird when you want to have a fleet of microservices +-- why would you use different packages on all of them; yes, you can do this +due the nature of microservices, but does it make sense?).

+

Also, no code is shown in completion. The book uses snippets all around instead +of showing everything. The full code is available on Github, but that means you +need to keep two sources open at the same time: one in the book, to follow +whatever the author is showing and the source code to understand where each +thing fall in the big picture.

+

Those two last points could be easily solved by starting with a simple code +(say, the Hyper that says "Hello world") and then, slowly, refactor it to reach +a fully asynchronous code, showing the full code with each refactor +highlighted.

+

Maybe this will be a good book in the 3rd edition.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/hap-and-leonard-blood-and-lemonade/index.html b/public/reviews/books/hap-and-leonard-blood-and-lemonade/index.html new file mode 100644 index 0000000..5f8ad3d --- /dev/null +++ b/public/reviews/books/hap-and-leonard-blood-and-lemonade/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Hap and Leonard: Blood and Lemonade - Joe R. Lansdale

+ +

GoodReads Summary: +Hap Collins is a complicated man. He looks like a good ‘ol boy, but his +politics don’t match. After way too many jobs, Hap has discovered what he’s +best at: kicking ass. Vietnam veteran Leonard Pine is even more complicated: +black, Republican, gay—and an occasional arsonist. As childhood friends and +business associates, Hap and Leonard have a gift for the worst kind of +trouble: East Texan trouble.

+
+ ★★★☆☆ +
+

Another book that came from a Humble Bundle.

+

It's weird that a book about a couple of disfunctional investigators have +absolutely nothing about investigating stuff. I mean, sure, it's a solo book +and may fit in the general sense of the series, but for someone coming from +outside, it's weird that they try to capture readers by something the series +is not.

+

On the other hand, the stories are well formed and easy to read and paint a +long story of the old days in America (which I suppose it's true, 'cause I +never lived in the United States, much less in that time).

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/horus-rising/index.html b/public/reviews/books/horus-rising/index.html new file mode 100644 index 0000000..c8f70e2 --- /dev/null +++ b/public/reviews/books/horus-rising/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Horus Rising - Dan Abnett

+ +

Goodreads Summary: +After thousands of years of expansion and conquest, the imperium of man is at +its height. His dream for humanity nearly accomplished, the emperor hands over +the reins of power to his warmaster, Horus, and heads back to Terra. But is +Horus strong enough to control his fellow commanders and continue the +emperor's grand design?

+
+ ★★☆☆☆ +
+

I hate to say something like this, but you know that messed up fan made story +with Gordon Freeman, in which there is mostly no punctuation and it’s really +absurd?

+

That’s what I felt when I read the intro of the book. And that feeling stuck +with me for the whole book.

+

This book came from a Humble Bundle pack and that’s why I didn’t have any +previous experience with the Warhammer 40,000 universe. But jumping into this +book (which is part of a larger series, as far as I know) is not a great way +to get into it. The fact that the intro is really into the absurd (even if the +book universe is absurd) just makes it a worse experience all over. Whoever +came with this decision was not someone smart.

+

The story is more about Loken, a captain that raises from the lower castes +into a well known captain (or so I get by the excerpts we get from the past) +and more much about Horus himself. It feels so weird that it seems more like +someone calling “Shadow of the Giant”, which is a book focused on Bean, +“Ender’s Game”. Although there is some overlap between the stories, in which +Bean finds and fights along Ender, the book is in no way about Ender. The same +thing goes here. More focus on the titular character would be better, or call +this book “Loken’s Vision” or whatever. It not “Horus Rising” when it is just +a sideline character.

+

Also, the long descriptions of Horus, pointing how beautiful and with a great +body and some mystical aura around it, doesn't help liking the character. How +can you like someone that everybody thinks is the perfect example of humanity?

+

It also feels like too many ideas where cobbled together for the book. There +isn’t an spinal story that keeps the book together, they are simply different +moments in Loken’s life — which, again, gives me the feeling that using “Horus +Rising” as a name was a bad choice.

+

So you have a book about a character that should be the main character but +it’s a secondary one, in a universe poorly presented and with some bad pacing. +I wouldn’t blame any fellow Humble Bundle purchasers if they decided to drop +the series altogether after this.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/how-to-make-mistakes-in-python/index.html b/public/reviews/books/how-to-make-mistakes-in-python/index.html new file mode 100644 index 0000000..7535906 --- /dev/null +++ b/public/reviews/books/how-to-make-mistakes-in-python/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

How to Make Mistakes in Python - Mike Pirnat

+ +

GoodReads Summary: +Even the best programmers make mistakes, and experienced programmer Mike +Pirnat has made his share during 15+ years with Python. Some have been simple +and silly; others were embarrassing and downright costly. In this O’Reilly +report, he dissects some of his most memorable blunders, peeling them back +layer-by-layer to reveal just what went wrong.

+
+ ★★★☆☆ +
+

For anyone that works with Python for some time, most of the content of this +book is "Hahaha, yeah, I did that too. The good old bad times." And, surely +enough, you can't hold yourself nodding when the author mentions that you +shouldn't do that.

+

I felt it lacked a bit of "this is the right way of doing it", like Uncle Bob +did with Clean Code: A Handbook of Agile Software Craftsmanship, where he +picks a code and starts refactoring till it gets "correct". Most of the time, +it's a bunch of code (sometimes, invalid code, but that's minor) and then a +simple "don't do that".

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/how-to-survive-a-horror-movie/index.html b/public/reviews/books/how-to-survive-a-horror-movie/index.html new file mode 100644 index 0000000..c135865 --- /dev/null +++ b/public/reviews/books/how-to-survive-a-horror-movie/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

How To Survive A Horror Movie - Seth Grahame-Smith

+ +

GoodReads Summary: +From ghosts, vampires, and zombies to serial killers, cannibalistic +hillbillies, and haunted Japanese videocassettes, How to Survive a Horror +Movie shows how to defeat every obstacle found in scary films.

+
+ ★★☆☆☆ +
+

Honestly, I'm not sure who this book is targeted at.

+

At first, I thought it would examine all the clichés on horror movies that +made the hero survive everything till the end. But the narration style +sometimes puts you as just someone living in the same world, sometimes it puts +you as the protagonist, sometimes you can engineer your way around every +problem, sometimes you have to force the screenwriter to do something (so you +don't actually do whatever you need to do, you force someone else to make +you do something), sometimes you force the "movie" to move faster without the +screenwriter support... It is a huge hodgepodge of ways, and no consistency +between them.

+

To be fair, I'm not a fan of horror movies (the book came from a Humble Bundle +pack) so I may appear a bit hard on the author, but still...

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/i-am-legend/index.html b/public/reviews/books/i-am-legend/index.html new file mode 100644 index 0000000..995e3bc --- /dev/null +++ b/public/reviews/books/i-am-legend/index.html @@ -0,0 +1,102 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

I Am Legend - Richard Matheson

+ +

GoodReads Summary: +Robert Neville is the last living man on Earth... but he is not alone. Every +other man, woman and child on the planet has become a vampire, and they are +hungry for Neville's blood.

+

By day he is the hunter, stalking the undead through the ruins of +civilisation. By night, he barricades himself in his home and prays for the +dawn.

+
+ ★★★★☆ +
+

Sadly, a lot of people may be driven away from the book due the movie -- which +follows a very simple plot line.

+

But the book does not have a simple plot line. It is complex, twisting and its +purpose only shows in the very last line. In that line, the whole story +finally clicks; all plots and twists, all descriptions and names, everything +clicks. And you stay there, suddenly hit by its plot like a brick hitting you +in the side of your face.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/i-have-no-mouth-and-i-must-scream/index.html b/public/reviews/books/i-have-no-mouth-and-i-must-scream/index.html new file mode 100644 index 0000000..eada5c4 --- /dev/null +++ b/public/reviews/books/i-have-no-mouth-and-i-must-scream/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

I Have No Mouth and I Must Scream - Harlan Ellison

+ +

GoodReads Summary: +First published in 1967 and re-issued in 1983, I Have No Mouth and I Must +Scream contains seven stories with copyrights ranging from 1958 through 1967. +This edition contains the original introduction by Theodore Sturgeon and the +original foreword by Harlan Ellison, along with a brief update comment by +Ellison that was added in the 1983 edition. Among Ellison's more famous +stories, two consistently noted as among his very best ever are the title +story and the volume's concluding one, Pretty Maggie Moneyeyes.

+
+ ★★★★☆ +
+

For a long time, I've only heard about "Have No Mouth", but never actually +read it -- and, to be completely honest, didn't even know it was a story.

+

And then I got a fiction humble bundle and there it was.

+

I must say I'm impressed with Harlan writing style. It's easy to read, not too +messy and straight -- a thing that reminds me of the way Asimov writes, which +allowed me to read whole books in a couple of days.

+

The stories are all over the place, though: One is scifi, another is +hallucinogenic, another is modern fiction... So all tastes should be satiated +in the end.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/imperative-to-functional-programming-succinctly/index.html b/public/reviews/books/imperative-to-functional-programming-succinctly/index.html new file mode 100644 index 0000000..a924fc2 --- /dev/null +++ b/public/reviews/books/imperative-to-functional-programming-succinctly/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Imperative to Functional Programming Succinctly - Marc Clifton

+ +

GoodReads Summary: +Functional programming is fundamentally different from imperative programming. +As such, it provides a unique approach to solving problems—one that requires +developers to transform how they think about software design and +implementation. With Imperative to Functional Programming Succinctly by Marc +Clifton, you will learn many of the basic concepts involved with functional +programming, such as currying, partial application, function pipelines, +recursion, and continuations. By book's end, you will learn how to combine +functional and imperative programming to get the most out of your solutions.

+
+ ★☆☆☆☆ +
+

I know the "Succinctly" series doesn't go deep into a topic, but this book +takes a step further by not even respecting its own title.

+

The correct title would be "C# to F# Succinctly".

+

The reason is that there isn't many explanations about "functional +programming", in the general sense, in this book. Here, most things are +explained in the F# context, which, as the author points, isn't a pure +functional language.

+

Also, it goes great lengths to make code unreadable by avoiding proper +variable names and using things like "hd" and "tl" (instead of, say, "user" +and "remaining_users") and "racc" and "lacc" instead of "sum_right" and +"sum_left" (although I could point that this seems like a functional +programming thing).

+

So, again: Want to use your knowledge of imperative programming to learn +functional programming? Sorry, not this book. Know C# and want to learn F#? +Then you have something to read.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/in-calabria/index.html b/public/reviews/books/in-calabria/index.html new file mode 100644 index 0000000..170b78d --- /dev/null +++ b/public/reviews/books/in-calabria/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

In Calabria - Peter S. Beagle

+ +

OpenLibrary Summary: +"Claudio Bianchi has lived alone for many years on a hillside in Southern +Italy's scenic Calabria. Set in his ways and suspicious of outsiders, Claudio +has always resisted change, preferring farming and writing poetry. But one +chilly morning, as though from a dream, an impossible visitor appears at the +farm. When Claudio comes to her aid, an act of kindness throws his world into +chaos. Suddenly he must stave off inquisitive onlookers, invasive media, and +even more sinister influences" -- provided by publisher.

+
+ ★★★★☆ +
+

So, this is not really a book, but a novella. And that's no shame.

+

For all that's worth, the writing is pretty good and makes the things really +flow, although it gets a bit messy in the end, in the climatic scene. Also, I'm +pretty sure there the author messed with some of main character cats at some +point.

+

The story is quite simple and, for someone from an Italian family, feels quite +at home. But, for all that's worth, it is kinda weird that Italians, in Italy, +speak in English, but use Italian for emotional effect.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/in-fury-born/index.html b/public/reviews/books/in-fury-born/index.html new file mode 100644 index 0000000..f57edf3 --- /dev/null +++ b/public/reviews/books/in-fury-born/index.html @@ -0,0 +1,126 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

In Fury Born - David Weber

+ +

GoodReads Summary: +Imperial Intelligence couldn't find them, the Imperial Fleet couldn't catch +them, and local defenses couldn't stop them. It seemed the planet-wrecking +pirates were invincible. But they made a big mistake when they raided +ex-commando leader Alicia DeVries' quiet home work, tortured and murdered her +family, and then left her for dead. Alicia decided to turn "pirate" herself, +and stole a cutting-edge AI ship from the Empire to start her vendetta. Her +fellow veterans think she's gone crazy, the Imperial Fleet has shoot-on-sight +orders. And of course the pirates want her dead, too. But Alicia DeVries has +two allies nobody knows about, allies as implacable as she is: a self-aware +computer, and a creature from the mists of Old Earth's most ancient legends. +And this trio of furies won't rest until vengeance is served.

+
+ ★☆☆☆☆ +
+ +

Honestly, it could be a good story, if the spirit was removed, the backstories +cleaned out, some stuff that doesn't affect anything in the long run (pointing +that they happened, with short summary would suffice) and make it shorter +would be a real improvement.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/in-the-beginning-science-faces-god-in-the-book-of-genesis/index.html b/public/reviews/books/in-the-beginning-science-faces-god-in-the-book-of-genesis/index.html new file mode 100644 index 0000000..472d31f --- /dev/null +++ b/public/reviews/books/in-the-beginning-science-faces-god-in-the-book-of-genesis/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

In the Beginning...: Science Faces God in the Book of Genesis - Isaac Asimov

+ +

GoodReads Summary: +In the Beginning: Science Faces God in the Book of Genesis. The beginning of +time. The origin of life. In our Western civilization, there are two +influential accounts of beginnings. One is the biblical account, compiled more +than two thousand years ago by Judean writers who based much of their thinking +on the Babylonian astronomical lore of the day. The other is the account of +modern science, which, in the last century, has slowly built up a coherent +picture of how it all began. Both represent the best thinking of their times, +and in this line-by-line annotation of the first eleven chapters of Genesis, +Isaac Asimov carefully and evenhandedly compares the two accounts, pointing +out where they are similar and where they are different.

+
+ ★★★☆☆ +
+

I'm really a fan of Asimov books and I was really eager to read some of his +non-fiction books.

+

On this book, he discusses the Genesis, the first book of the bible. The weird +thing is that the introduction makes it seem like he will use the bible as a +starting point for science -- the introduction mentions that the people who +wrote the bible were not stupid, and they were the most smart people at the +time -- so I was expecting it to be more like "they thought this, but now we +know this". It wasn't like this; but it was really interesting for pointing +what was in the bible and what know at the time.

+

So although it is not a journey to the science, its a really interesting +journey to history in the region were the bible was written.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/index.html b/public/reviews/books/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/reviews/books/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/reviews/books/instant-backbonejs-application-development/index.html b/public/reviews/books/instant-backbonejs-application-development/index.html new file mode 100644 index 0000000..c4392fd --- /dev/null +++ b/public/reviews/books/instant-backbonejs-application-development/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Instant Backbone.js Application Development - Thomas Hunter II

+ +

GoodReads Summary: +Learn something new in an Instant! A short, fast, focused guide delivering +immediate results.

+
+ ★☆☆☆☆ +
+

Got this in a promotion, expecting to understand why I should learn backbone.

+

And the problem is, although the book goes into building a SPA and tells every +single step, it severely lacks the "why" you should do such things. Why you +should create a "Routes" property on your app; why you have collections AND +models, why Backbone can't infer the collections by the models and so on.

+

In the end, I think I learnt more about LoDash than Backbone.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/introducing-elixir/index.html b/public/reviews/books/introducing-elixir/index.html new file mode 100644 index 0000000..722ec5b --- /dev/null +++ b/public/reviews/books/introducing-elixir/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Introducing Elixir: Getting Started in Functional Programming - Simon St.Laurent, J. David Eisenberg

+ +

GoodReads Summary: +Authors Simon St. Laurent and J. David Eisenberg show you how to write simple +Elixir programs by teaching you one skill at a time. You'll learn about +pattern matching, recursion, message passing, process-oriented programming, +and establishing pathways for data rather than telling it where to go. By the +end of your journey, you'll understand why Elixir is ideal for concurrency and +resilience.

+
+ ★★★★☆ +
+

In a way, this is an "Introducing" book, so one shouldn't expect some deep +knowledge about the language after reading it. But also, sometimes it feels a +bit too "shallow" to gather some proper understanding of the language.

+

One thing that kept bugging me was the fact that code kept changing: Not in +the "going forward" kind of change, which is good, explain the basic, then +start adding more complex/shorter solutions, but "let me bend this to another +direction and completely ignore that direction later".

+

But to get a "feeling" of the language, it is a good book.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/introducing-erlang/index.html b/public/reviews/books/introducing-erlang/index.html new file mode 100644 index 0000000..275c4dc --- /dev/null +++ b/public/reviews/books/introducing-erlang/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Introducing Erlang: Getting Started in Functional Programming - Simon St. Laurent

+ +

GoodReads Summary: +If you’re new to Erlang, its functional style can seem difficult, but with +help from this hands-on introduction, you’ll scale the learning curve and +discover how enjoyable, powerful, and fun this language can be.

+
+ ★★☆☆☆ +
+

Again, an "Introducing" book that one shouldn't expect some deep explanations, +but heck, this felt shallower than Introducing +Elixir.

+

It follows the same path of the "Introducing Elixir" (or maybe it is the other +way around, but hey, that's the order I read both), by creating a "what speed +will something crash if dropped in different planets" library and exploring +changes.

+

But the biggest drawback is that the book sticks too much into the Erlang +Shell and absolutely nothing (besides "here is one thing you can search for") +outside it. I mean, sure, the language may be nice and fun and all that, but +what's the point if the build tool is a pain and dependency resolution is +inexistent -- and I'm not saying Erlang suffers from that, 'cause as a +learning path, the book says nothing about those things.

+

For seeing how the language looks like, it's a good book. For something more +real... far away from it.

+

Highlights

+
+

go to the command line and type erl

+
+

Note: erl is the Erlang Shell.

+
+

3> 2#1010111.

+
+

Note: Binary notation.

+
+

4> 16#cafe

+
+

Note: Hex notation.

+
+

FallVelocity = fun(Distance) -> math:sqrt(2 * 9.8 * Distance) end.

+
+

Note: fun creates an anonymous function; it is then associated with the +name FallVelocity (all variables need to start with an upcase letter).

+
+

-module(drop).
+-export([fall_velocity/1, mps_to_mph/1, mps_to_kph/1]).

+fall_velocity(Distance) -> math:sqrt(2 * 9.8 * Distance).
+mps_to_mph(Mps) -> 2.23693629 * Mps.
+mps_to_kph(Mps) -> 3.6 * Mps.

+
+
+

-module(combined).
+-export([height_to_mph/1]).
+-import(drop, [fall_velocity/1]).
+-import(convert, [mps_to_mph/1]).
+height_to_mph(Meters) -> mps_to_mph(fall_velocity(Meters)).

+
+
+

In Erlang, greater-than-or-equal-to is written as >=, and +less-than-or-equal-to as =<. Don’t make them look like arrows.

+
+
+

try
+math:sqrt(2 * Gravity * Distance)
+catch
+error:Error -> {error, Error} end.

+
+
+

Creating a map requires a different syntax presenting keys and values:
+1> Planemos = #{ earth => 9.8, moon => 1.6, mars => 3.71 }.
+#{earth => 9.8,mars => 3.71,moon => 1.6}

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/ipad-productivity-essentials-the-definitive-guide-to-getting-more-productive-with-your-ipad/index.html b/public/reviews/books/ipad-productivity-essentials-the-definitive-guide-to-getting-more-productive-with-your-ipad/index.html new file mode 100644 index 0000000..445825b --- /dev/null +++ b/public/reviews/books/ipad-productivity-essentials-the-definitive-guide-to-getting-more-productive-with-your-ipad/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

iPad Productivity Essentials: The Definitive Guide to Getting More Productive with your iPad - Christopher J. Lee

+ +

GoodReads Summary: +You have your iPad, now what? You could continue to use your tablet as an +excellent web surfing tool. You could also use it to play one of the many, +many games out on the App Store. Or, you could simply turn it over to your +spouse or your kid(s) for their enjoyment. I suggest a different path, a path +that will keep your iPad in your hands, at work…a path that will put you on +the road towards increased productivity!

+
+ ★☆☆☆☆ +
+

Easy way to describe this: lazy

+

You know, for a book with a subtitle of "Get efficient with your iPad, +Evernote and GTD" (or, at least, that's what my edition says in the cover), I +really expect something more around the lines of "Here is GTD and here is how +you do this GTD thing with your iPad, and here is how you do this GTD thing +inside Evernote". Instead, the book goes talking about apps that two months +from now will not make sense, which are completely unrelated to each other (so +good look trying to mix them together and get something meaningful), and +which, most of the time, have nothing to do GTD or Evernote.

+

Also, there are a few quirks in the edition that really annoyed me: there some +marks around the text that seems there was some editor marking down +corrections to be made, but instead of checking those, the author decided to +publish the book with the marks instead of the final product.

+

In the end, it feels like a bunch of blog posts tied together instead of +something really targeted towards GTD and Evernote.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/javascript-testing-beginners-guide/index.html b/public/reviews/books/javascript-testing-beginners-guide/index.html new file mode 100644 index 0000000..6cde054 --- /dev/null +++ b/public/reviews/books/javascript-testing-beginners-guide/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

JavaScript Testing Beginner's Guide - Liang Yuxian Eugene

+ +

GoodReads Summary: +This book is organized such that only the most essential information is +provided to you in each chapter so as to maximize your learning. Examples and +tutorials are given in an easy to follow, step-by-step manner so that you can +see how the testing process is being carried out and how the code is being +written. The source code also contains detailed explanation so that you know +what the code is doing. Multiple screenshots are used in places that matter so +that you have a visual sense of what is happening. Beginner JavaScript +developers looking for essential ways to write, test, and debug JavaScript for +different purposes and situations.

+
+ ★☆☆☆☆ +
+

Let me start this by saying that I really liked the structure of the book. For +each chapter, there is an explanation of what will be covered; a "call for +action" which shows the code and then describes, step by step, what is going +on; a further explanation on when running said code; and, finally, some +pointers on where to go forward.

+

That being said, this is a mess of a book. The kindle version is completely +mangled on the source code. Indentation is completely wrong, which makes the +code hard to read; the code is full of stupid mistakes (like having an object +and trying to get it again with getElementById(element.id)); and, generally, +it's pure bad code (like raising an exception inside a try/catch just to catch +it afterwards). Not only that, but the book goes incredible lengths to explain +JavaScript, what are unit tests and such and, just in the last chapter, it +finally explains JavaScript Testing.

+

That wouldn't be so bad if it was a recent book. But it's a book from 2010, +with no further editions, and a lot has changed in the JavaScript landscape in +those last 5 years. New frameworks appeared, new tools are here, JavaScript is +not client side only anymore... The list goes on and on. Heck, the author goes +lengths to explain how to test in IE because it's the most used browser at the +time!

+

Honestly, stay away from this book. Get a book about JavaScript. Get a book +about testing. Pick one of the JavaScript testing frameworks around (I know at +least 5), read its documentation and you'll be in a better place than reading +this.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/just-a-geek-unflinchingly-honest-tales-of-the-search-for-life-love-and-fulfillment-beyond-the-starship-enterprise/index.html b/public/reviews/books/just-a-geek-unflinchingly-honest-tales-of-the-search-for-life-love-and-fulfillment-beyond-the-starship-enterprise/index.html new file mode 100644 index 0000000..b4198c4 --- /dev/null +++ b/public/reviews/books/just-a-geek-unflinchingly-honest-tales-of-the-search-for-life-love-and-fulfillment-beyond-the-starship-enterprise/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Just a Geek: Unflinchingly honest tales of the search for life, love, and fulfillment beyond the Starship Enterprise - Wil Wheaton

+ +

GoodReads Summary: +Wil Wheaton has never been one to take the conventional path to success. +Despite early stardom through his childhood role in the motion picture "Stand +By Me," and growing up on television as Wesley Crusher on "Star Trek: The +Next Generation," Wil left Hollywood in pursuit of happiness, purpose, and a +viable means of paying the bills. In the oddest of places, Topeka, Kansas, +Wil discovered that despite his claims to fame, he was at heart "Just a +Geek." In this bestselling book, Wil shares his deeply personal and difficult +journey to find himself. You'll understand the rigors, and joys, of Wil's +rediscovering of himself, as he comes to terms with what it means to be +famous, or, ironically, famous for once having been famous. Writing with +honesty and disarming humanity, Wil touches on the frustrations associated +with his acting career, his inability to distance himself from Ensign Crusher +in the public's eyes, the launch of his incredibly successful web site, +wilwheaton.net, and the joy he's found in writing. Through all of this, Wil +shares the ups and downs he encountered along the journey, along with the +support and love he discovered from his friends and family. The stories in +"Just a Geek" include: Wil's plunge from teen star to struggling actor, +discovering the joys of HTML, blogging, Linux, and web design, the struggle +between Wesley Crusher, Starfleet ensign, and Wil Wheaton, author and +blogger, gut-wrenching reactions to the 9-11 disaster, moving tales of Wil's +relationships with his wife, step-children, and extended family, and the +transition from a B-list actor to an A-list author.

+
+ ★★★★☆ +
+

Wil Wheaton is a weird character. Some of this acting I find bad, but some are +incredible natural (compare his early Wesley Crusher acting with his late The +Guild acting. Also, assorted Big Bang Theory episodes).

+

On the other hand, writing seems to be his strongest point -- something that +we reckons himself in this book.

+

In "Just a Geek", Wheaton collects some of his blog posts from wilwheaton.net +and tells the story behind them. In a way, it's the reverse of Ghost Rider: +Travels on the Healing Road: Instead of telling what was happening with +hidden emotions and then telling the truth in other media (in "Ghost Rider", +it's Neil letters), here Wheaton sounds like everything is going fine in the +blog posts -- at least, in the first ones -- and tells what was wrong in the +book itself.

+

I feel like an idiot describing this, because it sounds too much like some +marketing/paid content, but the book goes from the child actor in Star Trek: +The Next Generation era to his internet celebrity point (although it doesn't +go into the internet-video era, with The Guild) and Wheaton admits all his +errors and how he "found himself" (anyone who had to go through this road can +related to his story).

+

It's nice to read, even to get some idea behind TNG. It's direct, with Wheaton +telling every time he got pissed with himself. And, in the end, it's a very +well written book, although there is a lot of content coming from other +sources.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/k-is-for-knifeball/index.html b/public/reviews/books/k-is-for-knifeball/index.html new file mode 100644 index 0000000..4c800c0 --- /dev/null +++ b/public/reviews/books/k-is-for-knifeball/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

K is for Knifeball: An Alphabet of Terrible Advice - Avery Monsen, Jory John

+ +

GoodReads Summary: +From the authors of the breakout bestseller All my friends are dead. (more +than 175,000 copies sold) and in the humorous vein of Go the F**k to Sleep +comes a laugh-out-loud collection of bad advice that turns the children's +alphabet book on its head. Adorable illustrated characters lead readers down a +path of poor decision-making, and alphabetical, rhyming couplets offer +terrible life lessons in which O is for opening things with your teeth, F is +for setting Daddy's wallet on fire, and R is for Raccoon (but definitely not +for rabies). With plenty of playfully disastrous choices lurking around every +corner, this compendium of black humor may be terrible for actual children, +but it's perfect for the common-senseless child in all adults.

+
+ ★★★☆☆ +
+

What would happen if you mix "Please Go To Fucking Sleep" with an ABC book? "K +is for Knifeball".

+

It's a "for-kids-but-not-kids" kinda of book: For example, "D is for Drifter, +which you should call to get in when your parents aren't at home" and "F is +Food, which you should give for the drifter living under your bed" (or +something around those lines)... Pretty much what "Go To Fucking Sleep" does.

+

Surely one wouldn't recite the book to a kid anyway, and being really short, +I'm not sure about the re-readability of it. Still, it is somewhat amusing.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/land-of-lisp-learn-to-program-in-lisp-one-game-at-a-time/index.html b/public/reviews/books/land-of-lisp-learn-to-program-in-lisp-one-game-at-a-time/index.html new file mode 100644 index 0000000..8532c3b --- /dev/null +++ b/public/reviews/books/land-of-lisp-learn-to-program-in-lisp-one-game-at-a-time/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Land of Lisp: Learn to Program in Lisp, One Game at a Time! - Conrad Barski

+ +

GoodReads Summary: +Lisp is a uniquely powerful programming language that, despite its academic reputation, is actually very practical. Land of Lisp brings the language into the real world, teaching Lisp by showing readers how to write several complete Lisp-based games, including a text adventure, an evolution simulation, and a robot battle. While building these games, readers learn the core concepts of Lisp programming, such as data types, recursion, input/output, object-oriented programming, and macros. And thanks to the power of Lisp, the code is short. Rather than bogging things down with reference information that is easily found online, Land of Lisp focuses on using Lisp for real programming. The book is filled with the author Conrad Barski's famous Lisp cartoons, featuring the Lisp alien and other zany characters.

+
+ ★★★☆☆ +
+

(Once again, ignoring the language itself to focus on the book).

+

Lisp is one hell of a language. Lots of things that are getting traction today +already exist in Lisp for a long time. And, still, Lisp is not a common +language. And this book shows why.

+

Just before reaching 1/4 of the book, there was a little piece of code that +had nothing less than six "close parenthesis" in it. Just to have an idea of +how bad it is, one of my friends that know Lisp inside and out rewrote the +same piece of code using two new functions and hell, it was a lot easier to +read -- simple because Lisp must be read from right to left, which most +written languages use the other way around and reducing the closing +parenthesis by moving pieces of code to other functions really does help.

+

The book also fails in a lot of places: There is the constant abuse of global +variables, which breaks the idea of functional programming, one of the pillars +of the language; the whole code focus on the REPL and nowhere it talks about +using an external editor and running the code, although in the very end a +magical "load" appears, out of the blue; there is some serious lack of +contextualization about concepts: things are simply thrown out and then +explained (there is a piece about minimax which the author simply explains the +code after showing it and, in the next chapter, he finally explains the +minimax concept, only to tell that the code could be "fixed" to follow it in +only 23 lines -- no shit, Sherlock, you wrote half of it without ever +explaining why you were writing it).

+

In the end, it's not a "oh so terrible" book, but it could really use some +editing help.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learn-amazon-web-services-in-a-month-of-lunches/index.html b/public/reviews/books/learn-amazon-web-services-in-a-month-of-lunches/index.html new file mode 100644 index 0000000..118d317 --- /dev/null +++ b/public/reviews/books/learn-amazon-web-services-in-a-month-of-lunches/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learn Amazon Web Services In A Month Of Lunches

+ +

GoodReads Summary:

+

AWS gives users the networking, compute, and security services they need without +making them pay for anything they're not actually using. With almost a hundred +individual AWS services, putting all the pieces together is not a simple +thing. That's where this book can help.

+
+ ★★☆☆☆ +
+

Some points here:

+ +

(As a side note, the WordPress install could be completely moved to an appendix +and keep going with just the concepts.)

+ +

The small bits of concepts that are scattered around the images are somewhat +interesting, but because they are so tied to the screenshots, a lot of +information could be just missed. Or worse, turn people into simple clickers +that don't understand why they are clicking this or that button, 'cause all they +learnt was that they should click that button.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learn-you-a-haskell-for-great-good/index.html b/public/reviews/books/learn-you-a-haskell-for-great-good/index.html new file mode 100644 index 0000000..4de152d --- /dev/null +++ b/public/reviews/books/learn-you-a-haskell-for-great-good/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learn You a Haskell for Great Good! - Miran Lipovača

+ +

GoodReads Summary: +Learn You a Haskell for Great Good! is a fun, illustrated guide to learning +Haskell, a functional programming language that's growing in popularity. Learn +You a Haskell for Great Good! introduces programmers familiar with imperative +languages (such as C++, Java, or Python) to the unique aspects of functional +programming. Packed with jokes, pop culture references, and the author's own +hilarious artwork, Learn You a Haskell for Great Good! eases the learning +curve of this complex language, and is a perfect starting point for any +programmer looking to expand his or her horizons. The well-known web tutorial +on which this book is based is widely regarded as the best way for beginners +to learn Haskell, and receives over 30,000 unique visitors monthly.

+
+ ★★☆☆☆ +
+

I have mixed feelings about this book.

+

It starts really really well, explaining how the language works. And then it +falls on the trap of "functional programming" that, instead of focusing on what +you can do with the language, it goes lengths talking about monads, monoids, +functors and nondeterminism that you keep wondering why it is taking so long +explaining function programming instead of focusing on what you can do and when +you should use one.

+

There is even a bad description of "don't do this because it will look horrible +when you convert to this other form". Wondering if something will look horrible +if you write the same thing in a different form should never be a deterrent for +something.

+

Also, there is the language. Surely, Haskell adds a missing point in Lisp, +which are the types, but them it goes off the rails trying to remove +parenthesis and the result is a mass of weird symbols, all representing the +same thing. And you have, as I mentioned before, different forms to write the +same code, which makes the language highly irregular, one trait that really +pisses me off in programming languages.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learn-you-some-erlang-for-great-good/index.html b/public/reviews/books/learn-you-some-erlang-for-great-good/index.html new file mode 100644 index 0000000..e6b0c23 --- /dev/null +++ b/public/reviews/books/learn-you-some-erlang-for-great-good/index.html @@ -0,0 +1,226 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learn you some Erlang for great good! - Fred Hebert

+ +

GoodReads Summary: +(No Summary)

+
+ ★★★★☆ +
+

Another Erlang book for my collection.

+

This one takes its time to explain every point. So if you like to go fast and +furious, that's not it. Also, because I read some other books (ok, "book") +about Erlang, some topics felt a little bit boring, 'cause I did get the point +already.

+

Also, it seems this books also suffer from the "let me use the shell to explain +this point". It's not that bad when you want to show a point in the very +beginning and then just drop it ('cause, you know, you won't use the shell as +part of your application -- you may use as a helper to figure out when things +go haywire, but not as a default tool) but not when you're near the middle of +the book explaining some important topic, like supervisors.

+

But, at the same time, some topics that the other books (ok, "book") completely +ignored, like "how do you build, package and deploy an Erlang application".

+

But yeah, the "using shell for important stuff" really annoyed me.

+

Highlights

+
+

The correct ordering of each element in a comparison is the following: +number < atom < reference < fun < port < pid < tuple < list < bit string.

+
+
+

A tuple that contains an atom with one element following it is called a +tagged tuple.

+
+

Note: Example: (tag, value, value), (other_tag, value, value).

+
+

port Erlang to the JVM, giving the Erjang.

+
+
+

To compile to native code, you need to use the hipe module and call it the +following way: hipe:c(Module,OptionsList). You could also use +c(Module,[native])

+
+
+

There are also a few predefined macros, such as the following:

+
    +
  • ?MODULE, which is replaced by the current module name as an atom
  • +
  • ?FILE, which is replaced by the filename as a string
  • +
  • ?LINE, which returns the line number of wherever the macro is placed
  • +
+
+
+

-ifdef(DEBUGMODE).
+-define(DEBUG(S), io:format("dbg: "++S)).
+-else.
+-define(DEBUG(S), ok).
+-endif.

+
+

Note: This is how you define a function that exists only if the atom is +defined.

+
+

right_age(X) when X >= 16, X =< 104 -> true; +right_age(_) -> false.

+
+

Note: The function for right_age returns true only when the guardian +matches. Basically, we don't need ifs in this kind of function.

+
+

wrong_age(X) when X < 16; X > 104 -> true;
+wrong_age(_) -> false

+
+

Note: Same thing.

+
+

1> {ok, Binary} = file:read_file("road.txt").
+{ok,<<"50\r\n10\r\n30\r\n5\r\n90\r\n20\r\n40\r\n2\r\n25\r\n10\r\n8\r\n0\r\n">>}
+2> S = string:tokens(binary_to_list(Binary), "\r\n\t ").
+["50","10","30","5","90","20","40","2","25","10","8","0"]

+
+

Note: the <<>> format denotes binary content (like bytes in Python, maybe?).

+
+

main([FileName]) ->
+{ok, Bin} = file:read_file(FileName),
+Map = parse_map(Bin),
+io:format("˜p˜n",[optimal_path(Map)]),
+erlang:halt().

+

The main function now has an arity of 1, needed to receive parameters from +the command line. We’ve also added the function erlang:halt/0, which will +shut down the Erlang VM after being called

+
+
+

erlc road.erl
+$ erl -noshell -run road main road.txt

+
+

Note: erlc, the Erlang Compiler. Still needs erl to run the thing, +though.

+
+

The Erlang escript command provides a simple way to run Erlang programs +without starting the erl application directly.

+
+
+

% This is a .hrl (header) file.
+-record(included, {some_field, some_default = "yeah!", unimaginative_name}).

+
+

Note: Records are just tuples with added syntactic sugar.

+
+

Because a single list doesn't allow efficiently adding and removing elements +from both ends at once (it's only fast to add and remove the head), the idea +behind the queue module is that if you have two lists, then you can use one +to add elements and one to remove elements. One of the lists then behaves as +one end of the queue, where you push values, and the other list acts as the +other end, where you pop them. When the latter is empty, you take the former +and reverse it

+
+
+

Erlang directory structure, which looks like this:

+
    +
  • ebin/
  • +
  • include/
  • +
  • priv/
  • +
  • src/
  • +
+
+
+

Open a file named Emakefile.

+
+

Note: Emakefiles make file file.

+
+

{'src/*', [debug_info, {i, "src"}, {i, "include"}, {outdir, "ebin"}]}.

+
+

Note: format of said Emakefile.

+
+

erl -make

+
+

Note: How to build a project using the Emakefile.

+
+

Start a shell to be a TCP server:

+
+

Note: This is the kind of stuff that drove me crazy: Why would I turn my +shell into a TCP server? It makes no sense! Sure, it is simpler, but who the +heck would do that in a normal way?

+
+

Promises and futures are a bit like remote procedure calls

+
+

Note: WHAAAATTTTT?!?!?

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learning-concurrency-in-python/index.html b/public/reviews/books/learning-concurrency-in-python/index.html new file mode 100644 index 0000000..0221ca4 --- /dev/null +++ b/public/reviews/books/learning-concurrency-in-python/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learning Concurrency in Python - Elliot Forbes

+ +

GoodReads Summary: +Practically and deeply understand concurrency in Python to write efficient +programs.

+
+ ★☆☆☆☆ +
+

A good book if you want examples of code in some concurrency topics -- and some +that don't -- but nothing that could actually teach you how to use this.

+

For example, there are consecutive examples of things that only change one +option. It tells what the option says it does but doesn't example what it +actually does and when you should use it. The whole when is missing from the +book: Here is the options, here are examples for each option, have fun.

+

Also, as usual for Packt books, editing would require some work. For example, +you're following with examples using .join() but it is not initially explained +why you need to do that -- only a few sections later that you find out it "waits +for the completion of threads/processes", with no mention that the call blocks +the current thread.

+

And, on top of that, none of the examples (ok, maybe two) actually follow +PEP8. It is a pet peeve of mine, I reckon, but when you're explaining some +language feature, I'd expect the examples to follow the code style of the +language (although it is not that bad 'cause at least there is a consistent +style through the book, even if it is not PEP8).

+

Suddenly, I have a feeling that the book is actually the notes of the author +while learning something, not something that they want to help you learn...

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learning-ecmascript-6/index.html b/public/reviews/books/learning-ecmascript-6/index.html new file mode 100644 index 0000000..f47c9e7 --- /dev/null +++ b/public/reviews/books/learning-ecmascript-6/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learning ECMAScript 6 - Narayan Prusty

+ +

GoodReads Summary: +About This Book Learn a powerful approach to writing object-oriented +JavaScript code using ES6 Create and use ES6 modules to learn to write smart, +modularized JavaScript code The book will take you step-by-step through a wide +array of examples, giving you tips on how to make the best use of the latest +ES6 features Who This Book Is For

+
+ ★★☆☆☆ +
+

ECMAScript 6 is the new JavaScript, and I'm just saying this in case you're +wondering why one would read this book.

+

There are a few niceties in JavaScript 6 that would make lives easier. I read +the book looking for those niceties. And it does its job. Poorly.

+

Thing is, the first examples are good (not great, good), and then it seems +there are some components the author didn't really quite grasped -- like +proxies -- and threw examples of things without them. In the case of proxies, +the author created proxies that replicate the normal behaviour of objects and +after reading it, you'll keep wondering why you should use them, as they do +nothing different from the default.

+

Also, broken English. I'll be the first saying that I'm not the most +impressive writer in the English language, but hell, some sentences really +hurt. "we will be comparing" is one of those cases. And you'll find plenty of +them. Plenty of "that is", plenty "therefore" and things like that just make +the text tiring to read -- and it's not even a long read, just about 200 +pages.

+

It's a book that may give you some insights about what's new in JavaScript, +but falls short delivering its message.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learning-ionic-build-real-time-and-hybrid-mobile-applications-with-ionic/index.html b/public/reviews/books/learning-ionic-build-real-time-and-hybrid-mobile-applications-with-ionic/index.html new file mode 100644 index 0000000..3a471d6 --- /dev/null +++ b/public/reviews/books/learning-ionic-build-real-time-and-hybrid-mobile-applications-with-ionic/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learning Ionic - Build real-time and hybrid mobile applications with Ionic - Arvind Ravulavaru

+ +

GoodReads Summary: +Key Features Create hybrid mobile applications by combining the capabilities +of Ionic, Cordova, and AngularJS Reduce the time to market your application +using Ionic, that helps in rapid application development Detailed code +examples and explanations, helping you get up and running with Ionic quickly +and easily Book Description

+
+ ★★★★☆ +
+

I must say, I was really surprised by this book. Not only it goes a great +length to explain things about Angular (the base for Ionic), but builds +two applications from start to end, connects to other services and also +explains how to publish your application.

+

But (and there is always a "but") I felt some things lacking. For example, the +author says that he prefers to use grunt instead of the default ionic tool, +but after that, he only uses the ionic tool; there are some things wrong +with the book (why I already submitted as an errata for it); there is very +little mention on how to deal with different rotations; and the gravest +problem of all, in my opinion: There are absolutely no tests. At all. Not even +a mention on how to test your Ionic app.

+

Other that those problems (which are really minor, related to the amount of +information), it is really a good book to start working with Ionic apps.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/learning-java/index.html b/public/reviews/books/learning-java/index.html new file mode 100644 index 0000000..c272498 --- /dev/null +++ b/public/reviews/books/learning-java/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Learning Java - Patrick Niemeyer

+ +

GoodReads Summary: +Version 5.0 of the Java 2 Standard Edition SDK is the most important upgrade +since Java first appeared a decade ago. With Java 5.0, you'll not only find +substantial changes in the platform, but to the language itself-something that +developers of Java took five years to complete. The main goal of Java 5.0 is +to make it easier for you to develop safe, powerful code, but none of these +improvements makes Java any easier to learn, even if you've programmed with +Java for years. And that means our bestselling hands-on tutorial takes on even +greater significance."Learning Java" is the most widely sought introduction to +the programming language that's changed the way we think about computing. Our +updated third edition takes an objective, no-nonsense approach to the new +features in Java 5.0, some of which are drastically different from the way +things were done in any previous versions. The most essential change is the +addition of "generics," a feature that allows developers to write, test, and +deploy code once, and then reuse the code again and again for different data +types. The beauty of generics is that more problems will be caught during +development, and "Learning Java" will show you exactly how it's done.Java 5.0 +also adds more than 1,000 new classes to the Java library. That means 1,000 +new things you can do without having to program it in yourself. That's a huge +change. With our book's practical examples, you'll come up to speed quickly on +this and other new features such as loops and threads. The new edition also +includes an introduction to Eclipse, the open source IDE that is growing in +popularity. "Learning Java," 3rd Edition addresses all of the important uses +of Java, such as web applications, servlets, and XML that are increasingly +driving enterprise applications.

+
+ ★★☆☆☆ +
+

I once said that it's not just the matter of wanting to learn something, there +is also the matter of wanting to teach.

+

The problem here is that the book doesn't seem interested in the second.

+

I mean, sure, it's nice that you go through all the classes, but... is it +necessary? Is this teaching? Not to me.

+

Either focus on how things work and how to pick things, but going over and +over and over over everything is tiring and not helpful. Not to mention +there is a lot of things said twice (or even more), which seems focused on +making the book bigger, instead of making things clearer.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/less-web-development-essentials/index.html b/public/reviews/books/less-web-development-essentials/index.html new file mode 100644 index 0000000..953cec0 --- /dev/null +++ b/public/reviews/books/less-web-development-essentials/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Less Web Development Essentials - Bass Jobsen

+ +

GoodReads Summary: +Written in a practical and concise manner, this book is a crash-course in +teaching you the fundamental concepts of Less with real-life examples and +problems. If you use CSS(3) in your web development tasks and would love to +learn how to create maintainable and reusable code with Less, this book is +ideal for you. Although you need to have some experience in web development, +even beginners will find that this book is useful.

+
+ ★★☆☆☆ +
+

Less is a compiler for CSS. Why do I feel I need to start a review with that? +Because this book focuses a lot more on CSS than Less. Actually, I may have +learnt more about CSS than what it was expected to learn. There is nothing +wrong talking more about the base technology when the piece you're talking +about is built on it, but when you talk a lot more about the first and not the +second, you have to seriously reconsider your book title.

+

Another thing that annoys me is when the author keeps talking about the +examples outside the book. "Check the examples which you can download in the +previous URL" is lazy explanation. Instead of building knowledge blocks and +then expand over them, the book uses the lazy escape of not telling you +anything and expecting yo to read things somewhere else.

+

In the end, it's a nice book to learn a thing or two about modern CSS, but +barely something good about Less.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/linux-shell-scripting-cookbook/index.html b/public/reviews/books/linux-shell-scripting-cookbook/index.html new file mode 100644 index 0000000..d82d3dd --- /dev/null +++ b/public/reviews/books/linux-shell-scripting-cookbook/index.html @@ -0,0 +1,136 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Linux Shell Scripting Cookbook - Shantanu Tushar

+ +

GoodReads Summary: +This cookbook is for beginners or intermediate Linux users who want to master +writing Bash shell scripts. Intermediate/advanced users, system +administrators, developers, and programmers can use it as a reference when +they face problems while coding. Each recipe contains step-by-step +instructions about everything necessary to execute a particular task. The book +is designed so that beginners can read it from start to end while advanced +users can just open it at any chapter and start following the recipes as a +reference. It covers most of the commands on Linux with a variety of use cases +accompanied by plenty of examples and guides you on implementing some of the +commonest Linux commands with recipes that handle operations or properties +related to files like searching and mining inside a file with grep. It also +shows how utilities like sed, awk, grep, and cut can be combined to solve text +processing problems. The focus is on saving time by automating activities with +a few lines of script.

+
+ ★★☆☆☆ +
+

I don't know why, but when I saw the title, I expected to be a book only about +bash. Bash is a shell for *nix based systems and, as VIM, is one of the apps +you can use for 10 years and, after reading something about it, you find +something completely new.

+

Thing is, this is not just about bash. This book is about tools in the GNU +system that can help write shell scripts. And even if you're pissed about +Stallman asking to call the system GNU/Linux, this is about GNU tools: tr, +expect, find... All GNU tools.

+

So "GNU Shell Scripting Cookbook" would be a more appropriate title.

+

About the content itself... It's mostly a miss than a hit. Some things are +some wrong it hurts (Git does not add a .git directory inside every +directory, it creates one at the base directory of the project) and some are +so utterly stupid to the point of being dangerous (you don't need root to +chown a file!). Some points are so strange, they seem like the authors used a +GNU/Linux for only two months and decided to write a book about it.

+

The book have two authors and it shows. Lots of repeated information, some +things not building on things already said (really guys? Not matching pipe +with stdin/stdout redirection?) will give you the impression that they never +spoke about the book or had a roadmap for it. And there is a shitton of "as +follows" (seriously, you'll get sick of reading "as follows" over the book). +It says in the cover that, besides the two authors, there were at least 5 +reviewers. But it seems none of them actually read the book -- and I'm not +talking about easy things to find in a 1 minute Google search (like the git +thing), but things like "this 'as follows' is getting through my nerves, +you're using it every-fucking-where".

+

The content gets better in the end, when it gets over the "teaching phase", +but you'll still have the bad taste of things wrong from the previous +chapters.

+

So, basically, the book tries to cater to two different audiences -- the +beginner and the master -- and doesn't seem to be able to provide a good +content for any.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/live-free-or-die/index.html b/public/reviews/books/live-free-or-die/index.html new file mode 100644 index 0000000..f23feeb --- /dev/null +++ b/public/reviews/books/live-free-or-die/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Live Free or Die - John Ringo

+ +

GoodReads +Summary: When +aliens trundled a gate to other worlds into the solar system, the world reacted +with awe, hope and fear. But the first aliens to come through, the Glatun, were +peaceful traders and the world breathed a sigh of relief. When the Horvath came +through, they announced their ownership by dropping rocks on three cities and +gutting them. Since then, they've held Terra as their own personal fiefdom. With +their control of the orbitals, there's no way to win and earth's governments +have accepted the status quo.

+
+ ★☆☆☆☆ +
+

You can say there is something wrong with a book when you have two parts in the +title, one positive and another negative, and you start wishing the protagonist +would get the later.

+

For a story, it starts really well: It's not "humans conquer space", it is "the +first contact with another species happens on Earth". So, it is interesting how +human dynamics change when this happens at our door.

+

But the thing focus on a single guy, who suddenly discovers something a merchant +species gets highly interested and that's when the story goes downhill. First, +the guy gets a bunch of money. Then it corners the something he figures out, +practically creating a monopoly -- most of the stuff belongs to him, and the few +others that have that something are really his friends. It gets to the point +that he starts complaining that nobody else is doing what he is doing. He bought +everything, left just a few scraps to others and then complains that nobody is +trying to do what he did. Genius.

+

Also, the story age pretty damn bad, specially since, right now, we are facing a +virus that is killing a lot of people. In the story, there is something like +that, which can be cured with some care -- basically, people have to use +disinfectants to kill some parasite, which can be somewhat painful. And then our +"hero" proposes that the parasite is actually a good thing, 'cause it would +solve the problems with government pensions and most people that will die are +those that do not care or are too weak or not smart enough. The fact that he +says all this with a "Sadly" in front of it makes nothing to save his +reputation.

+

And that's basically why, not even by half of the book, I was choosing that the +hero would take the later part of the title, even if that meant that all +humanity would be lost. 'Cause that guy doesn't deserve to be a "hero".

+

I see that the book is part of a series, and even if I still have hopes that +later books will paint him as the villain, I have high doubts that that would +happen.

+

Even if the writing style is good to read and you can churn chunks of the story +in fast pace, the whole is enough to make you want to punch a fictional person +in the face. Hard.

+

PS: Oh, there is another point to the hate for the protagonist: After a few +cities were completely obliterated by said Horvath, the protagonist starts +building a space force along with NASA but requires pilots to get augmentations +and he comes with "I hope the government will pay for the augmentations after +all the taxes I'm paying". Sure, asshole, the government has to make the thing +that will make him more money (he's basically building a space station, which he +plans to sell to the government); fuck the build of hospitals and roads and +schools and what not what were destroyed when three cities turned to dust. Fuck +the population, all you want is the government to work for you. That attitude +just adds to the general sense of privilege this guy feels toward everything +else. So yeah, sad he didn't die.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/managers-answer-book/index.html b/public/reviews/books/managers-answer-book/index.html new file mode 100644 index 0000000..08b7325 --- /dev/null +++ b/public/reviews/books/managers-answer-book/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Manager's Answer Book - Barbara Mitchell, Cornelia Gamlem

+ +

OpenLibrary +Summary: +Powerful Tools to Maximize Your Impact and Influence, Build Trust and Teams, and +Respond to Challenges

+
+ ★★☆☆☆ +
+

Honestly, I didn't finish reading the book.

+

First, the style of showing content by the way of questions doesn't quite fit +the way I read, specially when the questions are specially designed to provide +an answer -- and not the other way around.

+

Second, most of the answers are quite obvious, in the style "How can I manage +X?" with the answer "Ask the people who were doing it in the first". Well, duh.

+

Third, the question style is somewhat confusing. It uses the pattern of "I +read/saw/heard about X. What can I do about it?", with different styles of +X. There are even questions which one could almost say are non-sequiturs, like +(paraphrasing) "I'm a highly hands-on person, how can I write the reports the +financial team is asking me?". You can be both, and none of those two are +actually related.

+

Fourth, there are a bunch of useless comments in the middle, which gives the +impression of filler, like "As a manager, you have to do several things." No +shit, Sherlock.

+

And fifth, by 75% of the book, there was a question about what one should report +and I quote "Evidence of union activity should be reported to your human +resources or legal support as soon as possible. Early detection of and rapid +response to union activity has long been key to union avoidance." So, if I get +this right, it means that me, as a manager, should be a union busting asshole? +Fuck. Off.

+

That's when I gave up. I was already tired of the style and then, instead of +suggesting speaking to people invested in it to check why they believe an union +is necessary or what could be done to avoid the creation of the union in the +first place. But no, you must report to legal so they can burst the whole thing +down. Great, what a great person you've become.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/mastering-docker/index.html b/public/reviews/books/mastering-docker/index.html new file mode 100644 index 0000000..2e08a03 --- /dev/null +++ b/public/reviews/books/mastering-docker/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mastering Docker - Russ McKendrick

+ +

GoodReads Summary: +Experience first- and third-party tools such as Docker Compose, Docker +Machine, Portainer, and Rancher Learn how to leverage Kubernetes, Amazon ECS, +and Docker Swarm and know when each solution is appropriate Discover how +Docker can be integrated into your daily workflows.

+
+ ★☆☆☆☆ +
+

How does one "master" docker when there is not a single word about layers?

+

How does one "master" docker when you have "sudo apt update && sudo apt +install -y git" with a description of "so it doesn't have to wait for one +process to end to start the other"?

+

This is another book coming from a book farm where people write about things +they don't know properly. This is another book coming from a book farm where +reviewers seem picked in the basis of "does not know enough about the subject +to not make a fuss so we can publish it as soon as possible".

+

If you want to learn about docker, stay away from this book. It will do more +harm than good.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/mastering-emacs/index.html b/public/reviews/books/mastering-emacs/index.html new file mode 100644 index 0000000..0f7595c --- /dev/null +++ b/public/reviews/books/mastering-emacs/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mastering Emacs, Mickey Petersen

+ +

GoodReads summary: +Learn Emacs from the ground up. In the Mastering Emacs ebook you will learn +the answers to all the concepts that take weeks, months or even years to truly +learn, all in one place.

+
+ ★★★★☆ +
+

Why is an avid VIM user -- to the point that I usually do some gatekeeping in +which is the true editor for real programmers 1 -- reading a book about +Emacs?

+

Well, for one, I wanted to learn how to use Org-Mode better, but with my usual +EVIL bindings, its keybinds feel alien and did not make a lot of sense.

+

And, thus, I decided to read a book about Emacs, to gear me up for using Emacs +without EVIL and make a more smooth passage to Org-Mode.

+

In that, I guess I can say that the book helped me, although I'm pretty +confident that I'm going to use VIM/EVIL bindings from time to time -- muscle +memory is not that easy to change.

+

One thing that stuck with me after reading the book is the concept of "flow", +in which you start a sequence of commands all with the same modifiers (or, at +least, with a bigger set and then with a reduced set). For example, how you +can keep Ctrl+Alt pressed and execute a bunch of changes without ever removing +your hand from Ctrl+Alt, or maybe just dropping one of those two keys, but you +keep the modifiers up all the time through the transformation. And while this +sounds awesome, it also shows that some Emacs commands do not follow the flow +and make a big mess of "Ctrl+Alt+key, key, Alt+key" in sequence -- thus, +removing you from the "flow".

+

Even with that, I feel not everything was perfect:

+ +

I could point that I'd like to have an EVIL topic, but the book starts saying +that it wouldn't touch that, so far point -- although I'd still prefer to have +some chapter about EVIL.

+

Also, I'd like to have a chapter about Org-Mode, but we can argue if that +makes sense to put along a "Mastering Emacs" topic or it should belong to some +other "Advanced" Emacs concepts.

+

In general, it's a good book about Emacs, specially pushing the concept of the +flow.

+
1 +

Again, this is me playing with gatekeeping, a real programmer uses +whatever editor fits their workflow better -- and that includes editors +which do not fit my workflow.

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/mastering-javascript-design-patterns-essential-solutions-for-effective-javascript-web-design/index.html b/public/reviews/books/mastering-javascript-design-patterns-essential-solutions-for-effective-javascript-web-design/index.html new file mode 100644 index 0000000..20f869b --- /dev/null +++ b/public/reviews/books/mastering-javascript-design-patterns-essential-solutions-for-effective-javascript-web-design/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mastering JavaScript Design Patterns - Essential Solutions for Effective JavaScript Web Design - Simon Timms

+ +

GoodReads Summary: +Enhance your JavaScript code with this essential collection of design +patterns. Discover an extensive range of techniques and strategies to +successfully tackle complex JavaScript development problems and put them into +practice by following detailed examples that demonstrate each design pattern +at its most effective. Dive deeper into JavaScript and master these powerful +design patterns for an innovative and cutting-edge approach to JavaScript that +meets the demands of modern web development.

+
+ ★★☆☆☆ +
+

With a book named "Master JavaScript Design Patterns", I was expecting +something about some JavaScript common patterns, like subscribing and +generating events, proper way of transversing structures and such.

+

But nope.

+

The book starts with the classical design patterns from the Gang of Four, +which doesn't seem so bad if the book was named "Learning Design Patterns with +JavaScript", in a way to make learning the design patterns more streamlined +for people who already know JavaScript. But, then again, things fall apart, +with the Observer pattern being designed with a list of callbacks in a +structured, instead of creating a real event -- something, again, really +common in JavaScript.

+

Not only that, but some stuff seems really off. Like explaining lazy +evaluation -- something only ES6 has -- with... lists. Yup, lazy evaluation, +for the book, means adding things in a list only when you need to remove +things from the list. It would make so much more sense if the author jumped +into the ES6 bandwagon for this and explained the "yield" command... but no, +he had to write some lazy text.

+

The fact that all examples are based on Game of Thrones -- with all being +based on things that happen in Westeros -- don't make it funny or interesting. +Worse, none of the examples are related, so the author just keeps jumping +between weird scenarios to explain the "patterns".

+

Even when you throw the JavaScript away and decide to read it to learn some +design patterns, you waste your time. Some designs, mostly the MV*, are +hastily described and just superficially analyzed.

+

It really starts a bit off -- again, if it was "Learning Design Patterns with +JavaScript", it would be almost perfect -- and then goes downhill by some lazy +writing and wrong assumptions.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/microservice-patterns/index.html b/public/reviews/books/microservice-patterns/index.html new file mode 100644 index 0000000..016b09c --- /dev/null +++ b/public/reviews/books/microservice-patterns/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservice Patterns - Chris Richardson

+ +

GoodReads summary: +Microservice Patterns teaches enterprise developers and architects how to +build applications with the microservice architecture. Rather than simply +advocating for the use the microservice architecture, this clearly-written +guide takes a balanced, pragmatic approach. You'll discover that the +microservice architecture is not a silver bullet and has both benefits and +drawbacks. Along the way, you'll learn a pattern language that will enable you +to solve the issues that arise when using the microservice architecture. This +book also teaches you how to refactor a monolithic application to a +microservice architecture.

+
+ ★☆☆☆☆ +
+

I have a rule: The "badness" of a book is directly proportional to the number +of "as follows" the author uses in it.

+

And, oh boy, do they use "as follows" in this book (no, seriously).

+

The first 1/4 of the book is pretty good, showing patterns and giving +explanations about it. The rest of the book is strongly focused on external +frameworks and libraries and has almost no patterns discussion at all -- for +example, the second 1/4 is, basically, focused on the author's framework -- a +Java framework. Also, the author seems strongly focused on Java code, even +after explaining that a microservice fleet can be written in lots of different +languages -- even listing some languages.

+

There is a strong preference for Java and Spring on the book, to the point +that, when discussing a point, it shows a Spring module with a huge +explanation on what it does and another saying, simply, "another Java +framework".

+

The code examples are also bad. It seems the author decided to use IntelliJ as +IDE and use its variable-name-generator (based on the class name) to create +the variable names. Classes names are really long on Java and, using the IDE, +the variables names also get really long, which by itself is not bad, +but in a book, it means the code will get formatted like any text and, thus, +get completely broken, and really hard to read.

+

There are lots of images. And, as usual with a lot of images, 90% of +them are completely irrelevant, adding absolutely nothing of whatever was +described already.

+

Those failures are extremely upsetting. You're getting a book about patterns +and end up with lots of pages of discussion and code -- badly formatted code +-- and very little pattern. Instead of explaining each pattern in depth, the +author decided to skip the whole thing and just show you how to use some +framework that already implements the pattern. That, by itself, isn't bad, but +without understanding what the pattern is, and what it is good for, you won't +know if it is a good idea to use it or not -- because patterns are ways to +describe your solution, not "ready made" solutions.

+

Honestly, I can't recommend this book for anyone that is starting their way +into microservices.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/microservices-antipatterns-and-pitfalls/index.html b/public/reviews/books/microservices-antipatterns-and-pitfalls/index.html new file mode 100644 index 0000000..29a1a3c --- /dev/null +++ b/public/reviews/books/microservices-antipatterns-and-pitfalls/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices AntiPatterns and Pitfalls - Mark Richards

+ +

GoodReads Summary: +Remember when service-oriented architecture (SOA) was all the rage? Companies +jumped in before fully understanding SOA’s advantages and disadvantages, and +struggled to make this complex architecture work. Today, we’re poised to +repeat this same experience with microservices—only this time we’re prepared. +With this concise ebook, author Mark Richards walks you through the ten most +common microservice anti-patterns and pitfalls, and provides solutions for +avoiding them.

+
+ ★★★★☆ +
+

Not a book per se, but a paper about the tendencies that lead to microservices +to fail. If this was a book, I think I'd give it less stars, but since it is +just a short paper, it feels alright -- for a book, longer content and how to +implement the corrects would be nicer.

+

In the end, for people starting with microservices, it is a good pointer for +"do not do that"; for people working with microservices for awhile, it's quite +a "I did that already" checklist.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/microservices-in-action/index.html b/public/reviews/books/microservices-in-action/index.html new file mode 100644 index 0000000..82bce5b --- /dev/null +++ b/public/reviews/books/microservices-in-action/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Microservices In Action - Morgan Bruce

+ +

GoodReads summary: +Microservices in Action is a practical book about building and deploying +microservice-based applications. Written for developers and architects with a +solid grasp of service-oriented development, it tackles the challenge of +putting microservices into production. You'll begin with an in-depth overview +of microservice design principles, building on your knowledge of traditional +systems. Then, you'll start creating a reliable road to production. You'll +explore examples using Kubernetes, Docker, and Google Container Engine as you +learn to build clusters and maintain them after deployment. Throughout this +rich, experience-driven book, you'll move through real-world use cases +including a continuous delivery pipeline, production monitoring, and practical +techniques for scaling and maintaining a healthy system.

+
+ ★★☆☆☆ +
+

For an "In Action" title, there is very little "Action" going on. Not that the +book lacks information: There is plenty of theoretical information, although a +lot is hidden in "cohesive" adjectives: "If you do this, the service will not +be cohesive", "doing so will make it more cohesive"... and what the author +means by "cohesive" is never explained -- I'd ask the author to replace every +reference to cohesive with a proper explanation.

+

Also, there are a lot of images. Not that images by themselves is bad, but when +they are used for the obvious, it really irks me -- specially 'cause I read +those books on a "black background with white letters" and images do not fit +that properly, using a white background that usually just hurts my eyes. And by +"used for the obvious", there are images follow the description of "A and B +communicate with C" and a large image showing A --> C <-- B; was that really +necessary?

+

The intro says the code is in Python, and that was something that I'd really +like to see. There is very little code in this book and the parts shown are +basically "look at this library" instead of focusing on what it really does; a +library for retrying is nice and all, but would it be so hard to write the +code, even if that code would be somewhat longer, to show the point you're +trying to make instead of being just an example of a library?

+

Speaking of code, there is also a long discussion about deploying +microservices, which is a good thing, but the author decided that it would use +Google Cloud Platform and every single explanation focuses more on how to +deploy on GCP instead of actually discussing deployment.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/modern-java-in-action/index.html b/public/reviews/books/modern-java-in-action/index.html new file mode 100644 index 0000000..f6a069a --- /dev/null +++ b/public/reviews/books/modern-java-in-action/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Modern Java in Action - Raoul-Gabriel Urma

+ +

GoodReads Summary: +Java 8 Lambdas in Action is a clearly-written guide to Java 8 lambdas and +functional programming in Java. It begins with a practical introduction to the +structure and benefits of lambda expressions in real-world Java code. The book +then introduces the Stream API and shows how it can make collections-related +code radically easier to understand and maintain. Along the way, you'll +discover new FP-oriented design patterns with Java 8 for code reuse, code +readability, exception handling, data manipulation, and concurrency. For +developers also exploring other functional languages on the JVM, the book +concludes with a quick survey of useful functional features in Scala and +Clojure.

+
+ ★★☆☆☆ +
+

To be short: It's a good book, but it is extremely (and unnecessary) verbose.

+

It covers the new stuff on Java 8 (like streams and lambdas) and some of Java 9 +(like the Flow/reactive interface). It does a good job on Streams and Lambdas, +but seems to fall a bit short on the reactive interface, maybe 'cause it's just +an interface, although I found the examples a little bit missing in some +points, like showing the Three interfaces, Subscriber, Subscription and +Publisher, but showing examples without the Publisher. A bit worse (IMHO), is +that, in order to produce an example, instead of publishing some data, it shows +a generic publisher of sequential numbers, in which it calls the real +publisher.

+

Also, the authors seem a bit too enthusiastic about lambdas. Even when the code +becomes less readable -- specially in the Flow examples -- they still use +lambdas. They are so into it that the example of a for being converted to a +stream is shown at least 4 times.

+

There are too many "as follows"; there are too many "in the next section" just +before the next section; there is too much repetition that shouldn't be there.

+

Again, the content is good, but the text is terrible.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/modern-vim-craft-your-development-environment-with-vim8-and-neovim/index.html b/public/reviews/books/modern-vim-craft-your-development-environment-with-vim8-and-neovim/index.html new file mode 100644 index 0000000..09bb946 --- /dev/null +++ b/public/reviews/books/modern-vim-craft-your-development-environment-with-vim8-and-neovim/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Modern Vim: Craft Your Development Environment with Vim 8 and Neovim - Drew Neil

+ +

GoodReads Summary: +Turn Vim into a full-blown development environment using Vim 8’s new features +and this sequel to the beloved bestseller Practical Vim. Integrate your editor +with tools for building, testing, linting, indexing, and searching your +codebase. Discover the future of Vim with Neovim: a fork of Vim that includes +a built-in terminal emulator that will transform your workflow. Whether you +choose to switch to Neovim or stick with Vim 8, you’ll be a better developer.

+
+ ★★★★☆ +
+

I'll be honest and say that I did expect a bit more about this book.

+

It is not a book talking about changes in the last few years in the VIM +workflow; it's more about the changes in the ecosystem of VIM. So instead of +focusing on new features (say, from last version and current version), it +focuses a lot more on plugins.

+

Not that focusing on (recent) plugins is a bad thing: There were changes in the +infrastructure of VIM that allowed the creation of more modern and flexible +plugins and talking about them is a good thing. But, again, I expected a more +focused book on VIM than plugins. If the title were "Craft your VIM environment +on VIM 8 and Neovim", it would fit perfectly on what the book presents, for +example.

+

In all, it's not a bad book, although it requires that you know VIM beforehand.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/moon-shot-the-inside-story-of-americas-race-to-the-moon/index.html b/public/reviews/books/moon-shot-the-inside-story-of-americas-race-to-the-moon/index.html new file mode 100644 index 0000000..1ab086b --- /dev/null +++ b/public/reviews/books/moon-shot-the-inside-story-of-americas-race-to-the-moon/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Moon Shot: The Inside Story of America's Race to the Moon - Alan Shepard

+ +

GoodReads summary: +The never-before-told story of the courage, dedication, and teamwork that made +the journey to the moon possible--an intense human drama of the sacrifices and +risks asked of a remarkable group of astronauts. Shepard and Slayton, part of +the pioneering space program from the beginning, tell this fascinating inside +story. 32 pages of photos.

+
+ ☆☆☆☆☆ +
+

I'm giving this book no stars because it deserves none.

+

First of all, the writing style is terrible. At the very start, the way the +author writes makes you wonder if this is really a book about history or if it +is plain fiction. There are ways to write about historic events -- and I don't +mean you can't go a little overboard while writing about it -- but the way the +story is told is more akin to fiction than actual reporting of events.

+

Second, this is as "MURRICA!" as a book can get. All American events are +described as passionate as possible, while Russian events -- you know, the guys +who put a man in space before the US and who did a spacewalk before the US -- +as described as plain as possible. This gets to the point that, at the first +half of the book, events are timed after American successes and Russian +failures; it gets to the incredible insensitive point when talking about Apollo +15 and the moonbuggy and how it was easier to carry stuff on the moon compared +to the Apollo 14 mission (which is probably the longest part of the book, even +supplanting the Apollo 11, the first mission to reach the moon) and, oh, 3 +Russians died a bit before -- mentioned as a simple "matter of fact" than an +actual accident and something that shouldn't happen.

+

I'm not saying "Yeah, Russians are part of the Apollo mission" 'cause that +would be stupid, but JFK said the space missions were a mission to humanity and +even Neil Armstrong said reaching the moon was a giant leap for mankind, but +this book takes "humanity" and throws out of the window. 'Cause the important +stuff is that American win and Russians lose and fuck Russians, amirite? (That +was sarcastic, in case you didn't noticed.)

+

And the last chapter is purely political instead of focusing on history.

+

If the whole book was Alan Shepard telling his side of the history -- and +focusing on that instead of going all the way to the points where +Shepard had no interaction with -- then yeah, it could be a reasonably good +book. But the way it is told, it's Alan Shepard story hidden in a bunch of +other stuff.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/mothers-and-other-monsters/index.html b/public/reviews/books/mothers-and-other-monsters/index.html new file mode 100644 index 0000000..780207a --- /dev/null +++ b/public/reviews/books/mothers-and-other-monsters/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Mothers & Other Monsters: Stories - Maureen F. McHugh

+ +

GoodReads Summary: +In her debut collection, Maureen F. McHugh examines the impacts of social and +technological shifts on families. Using deceptively simple prose, she +illuminates the relationship between parents and children and the expected and +unexpected chasms that open between generations.

+
+ ★☆☆☆☆ +
+

I now there are stories with a hidden subject, like "Arrival", in which the +fact that understanding how the alien language works allow humans to break the +barriers of time, and one could expect that stories with no eminent subject +actually have a hidden one.

+

But I feel that doesn't happen here.

+

There are just... stories. And, sad to say, they are not even good.

+

There are points that never lead to anywhere, and doesn't seem related to the +main history; most of them end with no conclusion at all (will the clone die? +What will happen to the daredevil? Do the husband got cured from Alzheimer and +would he still be in love with his wife?)

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/nginx-from-beginner-to-pro/index.html b/public/reviews/books/nginx-from-beginner-to-pro/index.html new file mode 100644 index 0000000..35c2131 --- /dev/null +++ b/public/reviews/books/nginx-from-beginner-to-pro/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Nginx: From Beginner to Pro - Rahul Soni

+ +

GoodReads Summary: +Teaches you to start up Nginx and quickly take your expertise to a level where +you can comfortably work with various aspects of the web server and make +informed design decisions for your web farm. Nginx powers more than 40% of the +top 1000 websites and is among the handful of web servers that can handle more +than 10K simultaneous connections. It has some features which are simply +unparalleled.

+
+ ★☆☆☆☆ +
+

Seriously, I had to read this with a lot of self control, because there was so +much bullshit. I mean, you don't need to know Nginx to understand that the PID +file is used to know if the process is running (in the most simple case) but +the book tries to sell it as a way to check process uptime. I mean, seriously? +Of all the things, Nginx will create a PID file simply for you to check its +uptime?

+

This kind of thing keeps going on and on. It feels like the author didn't know +Nginx at all and was figuring out as the book was being written; when they had +no idea what one thing meant, bullshit was used to fill the blanks.

+

This means two things: One, there is so much bullshit it is painful. Second, +the book only gets reasonably good at the end. But still hardly anything near +the "Pro" as used in the title.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/night-of-the-living-trekkies/index.html b/public/reviews/books/night-of-the-living-trekkies/index.html new file mode 100644 index 0000000..073ad53 --- /dev/null +++ b/public/reviews/books/night-of-the-living-trekkies/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Night of the Living Trekkies - Kevin David Anderson

+ +

GoodReads Summary: +Jim Pike, the disillusioned manager of a hotel that is hosting a Star Trek +convention, finds himself leading a ragtag crew of survivors as a strange +virus turns the convention-goers into zombies...

+
+ ★★★★★ +
+

I'm not a fan of zombie movies/books. But I'm a Star Trek fan. And oh boy, +this is a fun book.

+

While some events in the story may be too cliché (specially in the zombie +genre), the way the author interweaves with Star Trek philosophy and Trek +fandom is brilliant. And also gets bonus points for not doing "A red shirt on +the Enterprise gets infected with a virus and starts zombifying everyone"; +instead, it takes the fandom and infects its.

+

And while the cliché parts, although cliché, fit the story, the fact that the +author also goes into deep in what Star Trek is and what it represents to its +fans, it's pretty damn amazing.

+

I really really liked it.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/object-oriented-javascript-second-edition/index.html b/public/reviews/books/object-oriented-javascript-second-edition/index.html new file mode 100644 index 0000000..8b9476d --- /dev/null +++ b/public/reviews/books/object-oriented-javascript-second-edition/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Object-oriented JavaScript - Second Edition - Stoyan Stefanov

+ +

GoodReads Summary: +Create scalable and reusable high-quality JavaScript applications and +libraries using the concepts of object-oriented programming. This book is for +the beginning to intermediate web developer who wants to solve web development +problems with smart JavaScript. It does not assume any prior knowledge of +JavaScript programming; however even if you already know some JavaScript, +there will be plenty for you to learn here.

+
+ ★★★☆☆ +
+

Javascript is a weird language. Good practices make a weird language easier to +understand and read. That's why I was interested in writing OO JS code.

+

Thing is, this book is not just about OO. There is a bunch of "hey, if you +never heard about JS, here is how it works", which I believe is kinda +pointless (there are plenty "Starting with JS" books these days), there is a +bunch of browser objects (which, although "objects", I don't believe they are +necessary to write OO JS code) and there is plenty about reserved words and +what they mean (which although nice, is also unnecessary).

+

There is also a bunch of mentions of things some "Douglas Crockford" which +made me wonder why I was reading this book instead of looking for stuff +Crockford wrote.

+

But the book explores all possibilities of writing OO code in a non-OO +language, have some design patterns in JS and some JS patterns which are +interesting.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/oh-myyy-there-goes-the-internet-life-the-internet-and-everything/index.html b/public/reviews/books/oh-myyy-there-goes-the-internet-life-the-internet-and-everything/index.html new file mode 100644 index 0000000..d136dd7 --- /dev/null +++ b/public/reviews/books/oh-myyy-there-goes-the-internet-life-the-internet-and-everything/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Oh Myyy! (There Goes the Internet): Life, the Internet and Everything - George Takei

+ +

GoodReads Summary: +How did a 75-year old actor from Star Trek become a social media juggernaut? +Why does everything he posts spread like wildfire across the ether, with tens +or even hundreds of thousands of likes and shares? And what can other sites, +celebrities and companies do to attain his stratospheric engagement levels, +which hover or top 100 percent while theirs languish in the single digits?

+
+ ★★☆☆☆ +
+

Ok, totally my fault, but I bought the book expecting a bit about Takei +history, but all I got was "how to be successful on Facebook".

+

Don't get me wrong, it's not a bad book. It's easy to read and have its fun +moments, but there is nothing about Takei himself -- again, my fault, I was +expecting a biography when I didn't read the summary.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/old-mans-war-old-mans-war-1/index.html b/public/reviews/books/old-mans-war-old-mans-war-1/index.html new file mode 100644 index 0000000..b9c7c41 --- /dev/null +++ b/public/reviews/books/old-mans-war-old-mans-war-1/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Old Man's War (Old Man's War, #1) - John Scalzi

+ +

GoodReads Summary: +Earth itself is a backwater. The bulk of humanity's resources are in the hands +of the Colonial Defense Force. Everybody knows that when you reach retirement +age, you can join the CDF. They don't want young people; they want people who +carry the knowledge and skills of decades of living. You'll be taken off Earth +and never allowed to return. You'll serve two years at the front. And if you +survive, you'll be given a generous homestead stake of your own, on one of our +hard-won colony planets.

+
+ ★★★★☆ +
+

"Old Man's War" was a long time in my "to read" list. Today I finally finished +reading it.

+

I've been following Scalzi for some time on Twitter and he always post +intelligent comments. I read Subterranean Scalzi Super Bundle and really +enjoyed his writing style. The very first book of his was, then, an obvious +choice.

+

"Old Man's War" is part The Forever War. It's war on space. You have +spaceships and soldiers with special training and special weapons.

+

But while you read about the military life like in "Starship Troopers", it +also has no qualms in killing interesting characters to show that not all +things in war are easy and the bad guys always lose, like in "All Quiet".

+

The story starts really strong, gets more cerebral in the middle and then +slows a bit in the end. Still pretty enjoyable, specially if you liked the +books I mentioned before. The fact that they way Scalzi writes makes it easy +to read is also a plus.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/one-day-on-mars/index.html b/public/reviews/books/one-day-on-mars/index.html new file mode 100644 index 0000000..e18b195 --- /dev/null +++ b/public/reviews/books/one-day-on-mars/index.html @@ -0,0 +1,146 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

One Day On Mars - Travis S. Taylor

+ +

GoodReads Summary: +A nonstop futuristic thrill-ride, through the critical events which were the +breaking point for the underclass of Martian citizens and precipitated a +revolution to break the Martian colonists free from the formidable Sol System +government. The formerly red planet—now in danger of again becoming red, blood +red—would never be the same, nor would the human race.

+
+ ★★☆☆☆ +
+

Ok, let's try something different here:

+ +

Mars, under the influence of the huge "UNITED STATES OF FUCKING AMERICA" (not +actual title, but actual feeling given by the author), is being terraformed. +But rebels, which think America diverted from the forefathers ideals, think +it's better to move to somewhere else and make the "REAL AMERICA" (again, not +actual description in the book, but feeling given by the rebel characters).

+

What happens is a clusterfuck of information and lack of information at the +same time: It starts with one event, in which the backstory is giving in long, +incredible tiring paragraphs of text, and then some action happens and the +initial event is mostly ignored. What did happen? Oh, a glimpse! And then... +nothing.

+

"Incredible, tiring paragraphs" is a nice way to put "wall of text". Instead +of focusing in some point, the paragraph starts and then derails on into some +backstory, character development or some stupid description of something +instead of focusing on what it started. So the next paragraph -- which is, +again, another wall of text -- picks up and then derails again.

+

In those walls of text, there is some Macross, and by that I mean there are +actual descriptions of the Valkyries robots, which turn from plane to robot +and an "in between" mode. But they are never called Valkyries, the world of +Macross is never acknowledged or mentioned. Simply, the design for the massive +weapons are "borrowed" from the series, without ever making any connection +with it.

+

And, while we are talking about the weapons, the descriptions put a massive +army of robots against another huge army of robots. Now, think with me: You have +an army. A well funded army. By a country that loves the army. And then you +have some rebels, that don't have the proper tech or research for creating +such weapons. Which side do you think would amass a larger numerical +advantage? THE REBELS, OBVIOUSLY! /facepalm Sure, they found a way to +interrupt the well-funded, well-researched army communication at the start, +but even with that, the well-funded, well-researched army would simply be too +large for that to even be a problem. But, then again, the well-funded, +well-researched army gets almost completely obliterated in the end. Suuuure.

+

There is a series for this book -- in which it is the very first one -- but +considering how tiring it is to read, how bullshittery the "MURRICA, FUCK +YEAH" feeling it passes around, the absurdity of rebels amassing a force +stronger than the whole "MURRICA, FUCK YEAH" army and navy, I'm not sure I +actually want to read the next chapter.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/powers-annals-of-the-western-shore-3/index.html b/public/reviews/books/powers-annals-of-the-western-shore-3/index.html new file mode 100644 index 0000000..920de69 --- /dev/null +++ b/public/reviews/books/powers-annals-of-the-western-shore-3/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Powers (Annals of the Western Shore, #3) - Ursula K. Le Guin

+ +

GoodReads Summary: +Young Gav can remember the page of a book after seeing it once, and, +inexplicably, he sometimes "remembers" things that are going to happen in the +future. As a loyal slave, he must keep these powers secret, but when a +terrible tragedy occurs, Gav, blinded by grief, flees the only world he has +ever known.

+
+ ★★★★★ +
+

"The story of a boy becoming a man."

+

Or "The story of a slave becoming a freeman."

+

Or "The story of a man traveling across its country."

+

All those could serve as a quick description of the story. And all of them +would be, at least, a bit wrong.

+

Because it's not just one of those. It's all of those. And a bit more.

+

At first, I was quite disappointed 'cause the "Powers" at the title are +mentioned very early and then... nothing. There is a lot of going back and +forth (a few transitions are a bit weird, like suddenly the story being a +letter to the protagonist's wife) and you keep thinking "Were the heck is this +going on?" And then, suddenly, you keep reading a bit more because you want to +see a thread closed, and then read more, and more, and more... It's quite the +same feeling I got from Changing Planes, although the story here is way more +complex (not quite hard, as Changing Planes is a bunch of separate stories +instead of the continuous story of a slave who runs away, make friends, finds +his people, in a span of 10 or so years).

+

One of the things that Le Guin impresses me is how the way she describes +things approaches the way Isaac Asimov does: Describes the very minimum +necessary for the reader to understand why the characters are doing something, +and let their imagination soar with the rest. It's quite different from +Arthur C Clarke, which likes to over describe stuff.

+

In the end, it was a story that I was mostly uninterested at first but that +deeply moved me in the very end.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/princesses-behaving-badly-real-stories-from-history-without-the-fairy-tale-endings/index.html b/public/reviews/books/princesses-behaving-badly-real-stories-from-history-without-the-fairy-tale-endings/index.html new file mode 100644 index 0000000..79818b7 --- /dev/null +++ b/public/reviews/books/princesses-behaving-badly-real-stories-from-history-without-the-fairy-tale-endings/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Princesses Behaving Badly: Real Stories from History Without the Fairy-Tale Endings - Linda Rodríguez McRobbie

+ +

GoodReads Summary: +(No summary.)

+
+ ★★★★☆ +
+

One book that came with a Humble Bundle.

+

Although the title may sound a bit of feminist, the book has nothing about it. +Surely, it breaks the mold of “princesses are nice and quiet and beautiful and +a man saves them in the end”, but some of the examples are not role models.

+

Princesses that were crazy. Princesses that were princesses just because they +lied about it. Princesses that acted more like men. Sadly, there are were few +Princess (later queen) Victoria, a princess that proved her worth.

+

Still, is a curious history book.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/pro-vim/index.html b/public/reviews/books/pro-vim/index.html new file mode 100644 index 0000000..a8d5d1a --- /dev/null +++ b/public/reviews/books/pro-vim/index.html @@ -0,0 +1,140 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pro Vim - Mark McDonnell

+ +

GoodReads link: (No +summary exists).

+
+ ★★☆☆☆ +
+

First, the disclaimers: I'm a VIM user since early 2000; I wrote a "Using VIM" +book-of-sorts (in Portuguese); this book is, at the time of this review, 5 +years old.

+

The book intro said it was called "Pro" 'cause there was no middle ground for +VIM: when you start learning VIM, you have to go all the way to pro.

+

So, is it a book aimed for beginners? Maybe. VIM has a very steep learning +curve, but things can be smoothed out by explaining things in steps; because +VIM uses composable commands, you can explain movement -- say, "w" moves the +cursor to "next Word", "e" moves the cursor to the end of the word and so on +-- and then explain that you can modify the text using a verb and a movement +-- "d" is delete and "dw" means "delete word". But the book decides to jump +around and, while explaining movement, jumps into the modification verbs +without explaining verbs before: There you are, leisurely reading about moving +the cursor around and suddenly a "c2w" appears, with no explanation of what +the "c" or "2" does. It works, but I have the feeling that it more confusing +to dump things straight away than explaining step by step and how things +connect.

+

Is it a book aimed for people who already know VIM? Maybe not. Surely there +are a few things one can still learn about VIM years after using it, but after +20 years, I guess I read everything VIM can do at this point. But, again, +maybe you don't have 20 years of VIM and there are things you still don't +know.

+

Does it show ways to make you more productive in VIM? I'm not sure. I mean, +the whole book is based on the author's workflow -- a workflow that is only +slightly exposed -- and if you don't have the same workflow... Maybe it won't +fit at all on yours, 'cause it focus on the workflow and not on how certain +movements/commands can improve yours.

+

Is this book up-to-date? In the VIM commands part, yes. In the plug-ins... not +so much. VIM got a bunch of new releases recently (say, last year) and, thus, +a lot has changed in the plug-in area. Surely Fugitive (which the author +decided it should be called "fugative", for some reason) is still the most +feature-complete Git plugin, but everything else was already replaced (and +yes, that book-of-sorts I wrote also suffers from this problem).

+

Why Tmux is there? Well, VIM mixes well with Tmux, but I have to ask +why it is there. Why there isn't a section for rxvt, for example? Or +Gnome-Terminal? Doesn't VIM mixes well with those too? (My guess is, again, +that the book focus a lot on the author's workflow and not how things in the +workflow improved things, so because the author feels Tmux improved his +workflow, we must talk about Tmux). There is also the problem that the author +recommends using his configuration, so a lot of keybinds are not the default +ones, and one starting from scratch may not understand why things aren't +working.

+

Again, the book didn't age well. Plugins are out of date, there should be a +serious editorial work on it -- one chapter has paragraphs with garbled +content, which is completely unintelligible -- there is no "Style Conventions" +for things, so keystrokes will appear in one style in one chapter and in a +different style in the next. And some things are shown in one chapter and only +explained in the next, which makes me think the order was changed after the +chapters were written.

+

In general, it may be OK if you are starting with VIM, but that's that.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/programming-rust-fast-safe-systems-development/index.html b/public/reviews/books/programming-rust-fast-safe-systems-development/index.html new file mode 100644 index 0000000..539d230 --- /dev/null +++ b/public/reviews/books/programming-rust-fast-safe-systems-development/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Programming Rust: Fast, Safe Systems Development - Jim Blandy

+ +

GoodReads Summary: +Rust is a new systems programming language that combines the performance and +low-level control of C and C++ with memory safety and thread safety. Rust's +modern, flexible types ensure your program is free of null pointer +dereferences, double frees, dangling pointers, and similar bugs, all at +compile time, without runtime overhead. In multi-threaded code, Rust catches +data races at compile time, making concurrency much easier to use.

+
+ ★★★★☆ +
+

First off, this is not a book for learning Rust: This is a Reference Book. A +good one at it, but not for learning.

+

My inclination to learn Rust is how it deals with errors (it's Result enum), +something that most languages seem to drop out of context or accept some +"catch all" which let developers ignore such errors. Rust doesn't; you +have to deal with errors.

+

And, in such small thing, which I thought it was very simple and +straightforward... is not. The Err part can be very complex, specially if +you want to keep in line with the rest of the system. Which is good.

+

Although a good book, it's not great. The explanation for generics is very +convoluted and complex and doesn't help grasping the whole context -- maybe +it's easier if you're already working with a language that has generics. And +then, when you are almost getting how they work, they throw lifetimes in it +and the confusion grows.

+

Several topics are started and then become "beyond the scope of this book". So +it just brushes some pointers at it and then completely forget about it. I, +personally, would drop some of those -- it could mention that they exist -- +and expanding for not being "beyond the scope of this book".

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/python-3-object-oriented-programming/index.html b/public/reviews/books/python-3-object-oriented-programming/index.html new file mode 100644 index 0000000..5071a0c --- /dev/null +++ b/public/reviews/books/python-3-object-oriented-programming/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python 3 Object Oriented Programming - Dusty Phillips

+ +

GoodReads Summary: +The book begins with the very foundations of OOP and then uses practical +examples to show how to correctly implement Object Oriented Programming in +Python. Many examples are taken from real-world projects. The book focuses on +high-level design as well as the gritty details of the Python syntax. The +provided exercises inspire the reader to think about his or her own code, +rather than providing solved problems. If you're new to Object Oriented +Programming techniques, or if you have basic Python skills and wish to learn +in depth how and when to correctly apply Object Oriented Programming in +Python, this is the book for you. If you are an object-oriented programmer for +other languages, you too will find this book a useful introduction to Python, +as it uses terminology you are already familiar with. Python 2 programmers +seeking a leg up in the new world of Python 3 will also find the book +beneficial, and you need not necessarily know Python 2.

+
+ ★★★★★ +
+

After a bunch of titles from Packt, I expected something that would be half +OO, half Python 3. But I got a very happy surprise reading the book because it +does really go intro OO, explaining from analysis to design to code and then +slowly dwelving into Python around those topics.

+

Not only that, but instead of simply assuming his position is right, the +author explores other possibilites and than moves back when something doesn't +work -- kinda like Robert C. Martin does in Clean Code: A Handbook of Agile +Software Craftsmanship.

+

In the end, even after I work with Python for 5+ years, I still learnt a few +more things about using Python for OO development (and really got in agreement +with the author when OO isn't necessary!)

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/python-data-science-essentials-learn-the-fundamentals-of-data-science-with-python/index.html b/public/reviews/books/python-data-science-essentials-learn-the-fundamentals-of-data-science-with-python/index.html new file mode 100644 index 0000000..43a7204 --- /dev/null +++ b/public/reviews/books/python-data-science-essentials-learn-the-fundamentals-of-data-science-with-python/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python Data Science Essentials - Learn the fundamentals of Data Science with Python - Alberto Boschetti

+ +

GoodReads Summary: +Key Features Quickly get familiar with data science using Python Save time - +and effort - with all the essential tools explained Create effective data +science projects and avoid common pitfalls with the help of examples and hints +dictated by experience Book Description

+
+ ★★☆☆☆ +
+

It's hard to explain this book, mostly because it's hard to get to whom it is +targeted.

+

Is it targeted to people that already know Machine Learning and want to learn +Python? No, the book goes into lengths into some algorithms and has "easy to +write, but not quite right" code to do so.

+

Is it targeted to people that know Python but want to learn Machine Learning? +No; even if some algorithms are explained in length, some aren't and there is +very little "you use this when you have data like that" explanations. +Actually, there is very little explanation on where an algorithm should be +used.

+

Is it targeted to people that don't know Python and don't know Machine +Learning and want to learn but? This is the gray area of the book: Again, the +code is pretty simple and does not follow Python coding standards and the ML +part is really shallow on the "when" and "why" sections.

+

In the end, the book is simply an extended version of Scikit-Learn manual -- +and I even have doubts if the manual isn't better because it explains when an +algorithm should be used.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/python-playground-geeky-projects-for-the-curious-programmer/index.html b/public/reviews/books/python-playground-geeky-projects-for-the-curious-programmer/index.html new file mode 100644 index 0000000..77e5220 --- /dev/null +++ b/public/reviews/books/python-playground-geeky-projects-for-the-curious-programmer/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python Playground: Geeky Projects for the Curious Programmer - Mahesh Venkitachalam

+ +

GoodReads Summary: +Python is a powerful programming language that's easy to learn and fun to play +with. But once you've gotten a handle on the basics, what do you do next?

+
+ ★★☆☆☆ +
+

When I start to not get a book, one thing I ask myself is: Am I the target +audience for this book? 'Cause, you know, I may need to reflect if the book is +actually good for beginners instead of people who already know the topic.

+

And here is the problem with this book: it does a bad job finding its target.

+

The reason is simple: the code is full of violations of PEP8, something Python +beginners should not be exposed to and something expert developers get pissed.

+

Now, there is nothing wrong with your weekend projects to not follow standards +-- that's perfectly acceptable. But when you have your code published in a +book, you must, at least, follow the general guidelines that the community +follows.

+

But let's throw this out of the window: is the book "good"? The answer is +mostly "well...". It's not bad, but it isn't really interesting. It is merely +ok.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/reactive-microservices-architecture/index.html b/public/reviews/books/reactive-microservices-architecture/index.html new file mode 100644 index 0000000..f7db897 --- /dev/null +++ b/public/reviews/books/reactive-microservices-architecture/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Reactive Microservices Architecture - Jonas Bonér

+ +

GoodReads Summary: +Still chugging along with a monolithic enterprise system that’s difficult to +scale and maintain, and even harder to understand? In this concise report, +Lightbend CTO Jonas Bonér explains why microservice-based architecture that +consists of small, independent services is far more flexible than the +traditional all-in-one systems that continue to dominate today’s enterprise +landscape.

+
+ ★☆☆☆☆ +
+

Not actually a "book" per se, but more like a paper -- the author even +mentions it is a paper.

+

Now, is it a good paper? Well... Thing is, easy-to-explain concepts, like +"Sagas", take a long discussion about them, but hard-to-explain, like the CAP +theorem, make just some short explanations. And this is bad; things that +really need more explanation do not and are just glossed over; things that you +can get right out of the bad, do not. Also, some parts put a lot of footnotes +and assume the reader will read the footnote, which is bad, 'cause if you let +it to read later, you won't totally grasp what it means.

+

Also, there is one serious problem: Although it does a good discussion about +microservices, there is is very little explanation on what the reactive +microservice differs from normal microservices.

+

It's more interesting for the footnotes, which have links to the real content, +than the content of the paper.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/reactive-programming-with-javascript/index.html b/public/reviews/books/reactive-programming-with-javascript/index.html new file mode 100644 index 0000000..ece6a31 --- /dev/null +++ b/public/reviews/books/reactive-programming-with-javascript/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Reactive Programming with JavaScript - Jonathan Hayward

+ +

GoodReads Summary: +Learn the hot new front-end web framework from Facebook: ReactJS, an easy way +of developing the V in MVC and a better approach to software engineering in +JavaScript.

+
+ ★☆☆☆☆ +
+

If I had to define this book in a single word, I'd had to go with "unfocused".

+

Now, with that title, you'd expect to learn about the principles that drove +the design of things like "ReactJS". But it doesn't. This is not about +Reactive Programming. It's about ReactJS. And it's not about Reactive +Programming, it's about Reactive Funcional Programming.

+

Well, you'd still expect it to come with some conclusions about ReactJS, +right? Wrong again.

+

Most of the time you'll spend reading things that have absolutely no relation +with reactive programming, functional reactive programming or even ReactJS. +There is a long rant about C++ which ends with no conclusion at all and gives +no pointers on how it connects to the whole. There is another discussion about +INTERCAL which leads to nowhere -- maybe, except, the author's bank account +for the number of words.

+

At some point, the author finally discusses a bit of functional programming +talking about map, filter and reduce, but it goes nowhere from there and +a whole chapter with 10+ pages have a single paragraph about real, focused +talk about functional programming; the rest is just more rambling going to +nowhere.

+

If it was possible to run tests over the content of the book, the amount of +content out of a coverage on a BDD about Reactive Programming would point that +about 90% of it is never tested. It's content that talks absolutely nothing +about reactive programming, with large portions being repeated over and over +again (which makes me, once again, wonder why Packt pays for reviewers when +this kind of bullshit happens).

+

"This book is about ReactJS", the author says in the introduction, but there +are only 4 chapters about ReactJS, with terrible JavaScript and absolutely no +explanation on why things are being designed that way.

+

You want a review in a single phrase? Ok, that phrase would be "stay away from +this book".

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/ready-player-one/index.html b/public/reviews/books/ready-player-one/index.html new file mode 100644 index 0000000..af85078 --- /dev/null +++ b/public/reviews/books/ready-player-one/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Ready Player One - Ernest Cline

+ +

GoodReads Summary: +IN THE YEAR 2044, reality is an ugly place. The only time teenage Wade Watts +really feels alive is when he's jacked into the virtual utopia known as the +OASIS. Wade's devoted his life to studying the puzzles hidden within this +world's digital confines, puzzles that are based on their creator's obsession +with the pop culture of decades past and that promise massive power and +fortune to whoever can unlock them.

+
+ ★★★★★ +
+

80s, Back to Back

+

First, small spoiler: imagine a world were Second Life won and reached its +wildest dream. A world created by an 80s aficionado. Imagine there is a prize +hidden somewhere. Imagine the locks are all based on 80s stuff. That's the +book.

+

Now, if you're a children of the 80s, this will be a great ride. You'll find a +bunch of stuff you remember appearing everywhere. And you'll remember what it +was and it will be fun.

+

All this you can read in all other reviews.

+

The story suddenly drops mid book before returning to the old 80s memorabilia +trip. A couple of pages could remove one hundred and the book would be a lot +more fun (and that's why I'm not giving it 5 starts).

+

Some things will piss you off: the "evil" guys are one dimensional. The +romance is dull. The hero never gets in a corner he doesn't find a way out. +The fights are too colorful. It may not sound so, but it is annoying.... Till +you realize 80s movies were just like that.

+

It's really a fun book and I never knew I could read that fast.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/realm-of-racket/index.html b/public/reviews/books/realm-of-racket/index.html new file mode 100644 index 0000000..60af5b0 --- /dev/null +++ b/public/reviews/books/realm-of-racket/index.html @@ -0,0 +1,260 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Realm of Racket: Lean to Program, One Game at a Time!

+ +

GoodReads Summary: +Racket is a descendant of Lisp, a programming +language renowned for its elegance, power, and challenging learning +curve. But while Racket retains the functional goodness of Lisp, it +was designed with beginning programmers in mind. Realm of Racket is +your introduction to the Racket language.

+
+ ★★☆☆☆ +
+

This is a weird book. Not because its content, or the topic at hand, +but the path chosen to explain things. For example, even after reading +the whole book, I don't have any idea why I should pick Racket over +any other Lisp variant.

+

So, laundry list of things that put me off:

+ +

So... yeah, I think I learn a bit of Racket, but I still don't know +why I should pick it over anything else. Is it just the game building +library? Should one pick a language exclusively because of some built +in library? Doesn't anything else affects this decision? (All +questions are rhetorical, it is obvious that you shouldn't pick a +language just because one library).

+
+

Highlights:

+
+

(foo)*g++.baz(!&qux::zip->ding());

+
+

"Let me write a very contrived example, just to make my favourite +language look better compared to this one."

+
+

(sqrt (+ (sqr 3) (sqr 4)))

+
+

This is nowhere near the example in C++. If you want to compare +languages, at least write the same thing.

+
+

If you’re on a *nix box, you are already a hero and don’t need instructions.

+
+

What a load of bull. It sounds more like you don't have an idea on how +to do it in Linux.

+
+

(the compiler) DrRacket reads this expression, evaluates it, +prints the result, and then displays its prompt again.

+
+

You just described an interpreter, not a compiler. For all purposes +and intents, sure, it compiles the code to make sure it is not +invalid, but the concept of "compiler" is used mostly for things that +take a source and produce a stand-alone executable. Otherwise, even +Python have a compiler.

+
+

the function uses a set! expression to change the value of a +variable.

+
+

Why set!? Why not just set? What the ! means? Nothing? Is it +just a convention?

+
+

Racket has three kinds of comments

+
+

And absolutely no example of those kinds.

+
+
(/ 4 6)
+2/3```
+
+
+

This is one cool thing: Racket keeps the values in their fractional +format.

+
+
(struct student (name id# dorm))
+(student-name freshman1)
+'Joe
+(student-id# freshman1)
+1234
+
+
+

Creating structs and extracting values from them.

+
+
(define x 7)
+  (cond [(= x 7) 5]
+        [(odd? x) 'odd-number]
+        [else 'even-number])
+
+
+

Multiple tests. Also, there is this use of brackets ("[") and +parenthesis ("(") which is never properly explained, though.

+
+
(when (and file-modified (ask-user-about-saving)) (save-file))
+
+
+

Because and and or return the value if it's not the boolean false +(#f), you can use tests to simplify the code.

+
+
(define filename "my-first-program.rkt")
+(unless (ask-user-whether-to-keep-file filename) (delete-file filename))
+
+
+

unless is a form of if that performs an action only if the value +is #f (false).

+
+
(struct orc monster (club))
+(struct hydra monster ())
+(struct slime monster (sliminess))
+(struct brigand monster ())
+
+
+

Examples of deriving structs from other structs.

+
+

In summary, mutators make programming complex

+
+

Just a few paragraphs better, you used a mutator saying that this +would make the code better.

+
+

raco exe -l hello-world.rkt

+
+

Generating a standalone executable from Racket source code.

+
+
(define snake%
+  (class object%
+    (super-new)
+    (init-field dir head tail)
+    (define/public (slither)
+      (set! tail (cons head (all-but-last tail)))
+      (set! head (next-head)))
+
+
+

Classes in Racket.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/redshirts/index.html b/public/reviews/books/redshirts/index.html new file mode 100644 index 0000000..8d77313 --- /dev/null +++ b/public/reviews/books/redshirts/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Redshirts - John Scalzi

+ +

GoodReads Summary: +Ensign Andrew Dahl has just been assigned to the Universal Union Capital Ship +Intrepid, flagship of the Universal Union since the year 2456. It’s a prestige +posting, and Andrew is thrilled all the more to be assigned to the ship’s +Xenobiology laboratory.

+
+ ★★★★★ +
+

There are two simple words to describe this book: Galaxy Quest.

+

And then, they aren't.

+

"It's complicated", are some characters in the book say over and over again.

+

But the first part is. And it's too damn hilarious -- if you're a Star Trek +fan, that is. Or some of the lesser sci-fi series.

+

But the story picks up every absurd psedo-science and plot twist from the +series and extrapolates to the silliest level possible. I can't remember the +last time a book made me laugh.

+

It's silly. It's funny. It's the Galaxy Quest for every sci-fi series in the +planet.

+

And, then, after the curtains close... It goes into a deep, touching story +about... life, basically. You think you're done, but then it gets deeper and +serious and... touching, basically.

+

I thoroughly enjoyed reading it. And my reading statuses for this book proves +it.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/repent-harlequin/index.html b/public/reviews/books/repent-harlequin/index.html new file mode 100644 index 0000000..c5a55f7 --- /dev/null +++ b/public/reviews/books/repent-harlequin/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

"Repent, Harlequin!" Said the Ticktockman - Harlan Ellison

+ +

Wikipedia Summary: +The story is a satirical look at a dystopian future in which time is strictly +regulated and everyone must do everything according to an extremely precise +time schedule.

+
+ ★★★★☆ +
+

For a short story, with the content coming out of order -- on purpose: the +author points "I'll first tell you the middle, then the start, and +the end. Here is the middle" and then "Here is how this begins" -- there are +some pretty good points here. For example, the fact that we run so much worried +about being late, and having a time for everything, that the government makes a +department to make sure things work in precise time for maximal efficiency.

+

Out of that, it is a pretty crazy story. Good, making sense, but crazy, +nonetheless.Good, making sense, but crazy, nonetheless.Good, making sense, but +crazy, nonetheless.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/rust-essentials/index.html b/public/reviews/books/rust-essentials/index.html new file mode 100644 index 0000000..eaaaf2c --- /dev/null +++ b/public/reviews/books/rust-essentials/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust Essentials - Ivo Balbaert

+ +

GoodReads Summary: +Discover how to use Rust to write fast, secure, and concurrent systems and +applications About This Book Learn how to create secure and blazingly fast +programs in Rust Start working with Rust in a multicore and distributed +environment Explore the core characteristics of Rust - safety, performance, +and concurrency - to build error free and robust code Who This Book Is For

+
+ ★★★☆☆ +
+

Rust is a language that intrigues me. It seems it has a good deal of +protections and clever structures to prevent problems that other languages +have. And it usually outperforms C (at least, in the Euler tests).

+

But I really never really "got" the language just reading Rust By Example and +The Rust Programming Language. So I bought this book.

+

Sure, it goes slowly to teach you the light intricacies of the language, but +it never, in any point, goes deep into it, which is really annoying. It tries +to pick a subject to tell how to code in Rust (using a theoretical game), but +it never completes it. You never see the final product of all the stuff it was +just explained. And some examples have nothing to do with it.

+

The problem with shallowness of the book gets exponentially worse when talking +to complex subjects, like threading and unsafe blocks. Because it never goes +too deep, you end up handing with simple threads the basically just add +numbers, nothing something so complex that would actually require threads in +the first place.

+

Also, it seems the book was not reviewed. There is one paragraph saying one +thing (traits can't have implementations), just to, a few paragraphs later, +showing exactly the opposite (like a trait with an implementation). There are +two "We'll see X in the next section" with said next section just below it.

+

It's an ok introduction to Rust, but it goes short in several places.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/rust-in-action/index.html b/public/reviews/books/rust-in-action/index.html new file mode 100644 index 0000000..d94b0b8 --- /dev/null +++ b/public/reviews/books/rust-in-action/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust In Action - T.S. McNamara

+ +

GoodReads Summary: +Rust in Action introduces the Rust programming language by exploring numerous +systems programming concepts and techniques. You'll be learning Rust by delving +into how computers work under the hood. You'll find yourself playing with +persistent storage, memory, networking and even tinkering with CPU +instructions. The book takes you through using Rust to extend other +applications and teaches you tricks to write blindingly fast code. You'll also +discover parallel and concurrent programming. Filled to the brim with +real-life use-cases and scenarios, you'll go beyond the Rust syntax and see +what Rust has to offer in real-world use cases.

+
+ ★★★★☆ +
+
+

The version of this book I got is not the final version, it's part of +Manning Early Access Program, which allows people to read and participate in +"constructing" a book. A lot of things may change in the final version, so be +aware of this.

+ +
+

I have to say, I don't buy the "introduces the Rust programming language" part +of the description. A few points seem related to people that already have some +knowledge about the language, and jumping straight to some non-trivial problem +appears to skip a few "introduction" points, in my opinion.

+

One have to ask what "in Action" means. Sure, you'll write your one RFC +754 for dealing with floating points, so you can understand why some floating +values get to 6.000000000001, and while you won't ever write your own floating +point processor, you have to ask yourself: What is being explained about Rust +here? Sometimes, the problems feel more like "I want to solve this" than "I +want to explain this feature of the language", while it should be the other +way around.

+

Another confusing point: The output of a program appears before its code. +While not that weird, you end up with some sections showing the output, +explaining a bit and then, way later, you get the code what actually produces +that output. I remember reading a bit about the output and some discussion +about it and I got really confused about what was producing that output.

+

The Rust part seems a bit out-of-date, too. There are some extern crate, +which is optional at this point. Updating the code to reflect the latest +version of the language (the syntax, that is) would be better.

+

On the other hand, I have to give the author the props for managing to explain +things really well. Why you should use something, how can you apply +different things to the same data and so on. That's the book greatest +strength.

+

So, is it a bad book? Not at all. It has some quirks, but overall is well +explained and, if you keep an eye on the language from outside, it answers a +lot of stuff that you won't figure out anywhere else.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/safe-enough-to-soar/index.html b/public/reviews/books/safe-enough-to-soar/index.html new file mode 100644 index 0000000..642edd1 --- /dev/null +++ b/public/reviews/books/safe-enough-to-soar/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Safe Enough to Soar - Fred Miller, Judith Kat

+ +

GoodReads Summary: +Some organizations pay a great deal of attention to ensuring the physical +safety of their team members, but do the team members feel safe enough to speak +up and raise tough concerns or share bold and still-in-formation ideas? In this +book, bestselling authors and inclusion experts Frederick A. Miller and Judith +H. Katz introduce the concept of "interaction safety" and demonstrate how it +can help create a work environment of trust, inclusion, and collaboration.

+
+ ★☆☆☆☆ +
+

Don't get me wrong, I do understand where the book is aiming for -- giving +people a voice, no matter what -- but I believe it aged badly, mostly due the +way culture changed. Also, the analogies/anecdotes are a bit too far fetched, +which actually hide the real purpose of "interaction safety".

+

So, what it is this about: This is, basically, "give everyone a voice, and let +them exercise it". All good, I totally agree with this, and a good leadership +should always worry about it.

+

But what isn't specified -- and what I meant by the way the culture change -- +is that it misses the point that people will talk to each other more things +that just work. How do you give a voice to someone that denies the holocaust? +Should you give a chance to someone that keeps bringing "election fraud" in +every possible instance? Those are part of a culture shift, in which we started +to being more stuff into work. Sure, it makes totally sense to get new input on +work subjects, but that would require a good culture inside the company to +leave controversial statements outside work outside, and the book doesn't +cover that (and I'm all in for controversial statements about work itself).

+

Also, it lacks some conflict resolution: What if I give a voice to someone, +explain the problem with their idea, but they can't concede that it doesn't +make sense? Would that person feel fine with it? How do you disarm the possible +bomb when constant suggestions are dropped for one reason or the other?

+

The analogies are also a bad point of the book. Since the authors describe four +levels of "interaction safety" in the book, they put a little story for the +level. And, obviously, the first level is pretty bad, while the fourth one is +all marvelous and people love their work for that. And it gets tiring very +early seeing "interaction safety" instead of "conversations" or something like +it.

+

Another problem: The lack of concrete points on how to act. Sure, there are +lists like "A company in X level would have this" which you can infer some +actions, but a list of "start writing X down", "when you realize comments that +sound racist, call the person to explain why they shouldn't say it, instead of +calling them out in public" -- which is a real thing people should do +to provide safety to the group -- would be a lot more helpful than anything.

+

Again, I'm not against the aim of the book, I just dislike the way it is +presented.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/seven-languages-in-seven-weeks/index.html b/public/reviews/books/seven-languages-in-seven-weeks/index.html new file mode 100644 index 0000000..7921063 --- /dev/null +++ b/public/reviews/books/seven-languages-in-seven-weeks/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Seven Languages in Seven Weeks

+ +

GoodReads summary: +You should learn a programming language every year, as recommended by The +Pragmatic Programmer. But if one per year is good, how about Seven Languages +in Seven Weeks? In this book you'll get a hands-on tour of Clojure, Haskell, +Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is +on that list, you'll broaden your perspective of programming by examining +these languages side-by-side. You'll learn something new from each, and best +of all, you'll learn how to learn a language quickly.

+
+ ★☆☆☆☆ +
+

A couple of random thoughts about this book:

+

First off, you have the idea that, for each language the author would spend +one week (I'll not get into the fact that each "week" has 3 days only). This +is a great idea: How much of the concepts of a programming language can you +capture in just one week. Are the interfaces good? Are they simple and easy to +understand? The fact is, the author did not spend one week on each language. +In the Clojure chapter, he mentions that he got the idea after a month. So +instead of trying to capture the good and bad points in one week -- which, +again, it's a good thing, so one can understand how "ergonomic" a language is +-- the author decided the reader should only take one week per language.

+

Second, there is a huge about of "obvious", "obviously" and "simple". Sure, it +may seem obvious for the author, but most of the time, things are not obvious +for people who never saw anything related.

+

Not only there is an abuse of "obvious" things, sometimes the author seems to +either not understand some concepts of the language or tries to simplify an +explanation to the point it sounds wrong -- and I just realized that 'cause +I've read books about some of the languages.

+

And there are times when the author shows a piece of code, with something +completely new, and forgets to explain what that new thing means. I'm glad +I've read books about Clojure and Haskell before, otherwise I'd never +understand what the thing really was.

+

On the general, it's a book about seven languages. Instead of reading this +book, I'd suggest getting the list of languages and going after them in other +ways instead of reading this.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/silence-on-the-wire-a-field-guide-to-passive-reconnaissance-and-indirect-attacks/index.html b/public/reviews/books/silence-on-the-wire-a-field-guide-to-passive-reconnaissance-and-indirect-attacks/index.html new file mode 100644 index 0000000..b9444ec --- /dev/null +++ b/public/reviews/books/silence-on-the-wire-a-field-guide-to-passive-reconnaissance-and-indirect-attacks/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Silence on the Wire: A Field Guide to Passive Reconnaissance and Indirect Attacks - Michal Zalewski

+ +

GoodReads Summary: +There are many ways that a potential attacker can intercept information, or +learn more about the sender, as the information travels over a network. +Silence on the Wire uncovers these silent attacks so that system +administrators can defend against them, as well as better understand and +monitor their systems.

+
+ ★★☆☆☆ +
+

This is a book about passive detection. Or active detection. Or attacks. I +really don't know, because the subject keeps jumping around so much you have +no idea the point the author wants to make.

+

There are plenty explanations for stuff, but mostly is dumbed down to the +point it doesn't even make sense. Besides that, you have explanations for +attacks that sounds really scary/cool (depending on your point of view) but +after you think a bit about it, it is really hard to execute and, with the +necessary access to do so, you wouldn't really need this kind of stuff.

+

Also, there is plenty of "this author research" or "a research that yours +truly did" that sounds more like "Hey, look how awesome I am" than "you should +really worry about this thing".

+

About the edition, there are original articles in their original form, but +they are presented in mono spaced font in a weird indentation that doesn't fit +any layout you chose (landscape, two columns landscape, portrait). Also, there +are chapter footnotes and book footnotes and both follow the same format, +which means you will find a "[1]", followed by a "[100]", followed by a "[2]". +And the author uses "Too," instead of "Also," which, for a non-native English +speaking person like me, sounds strange as hell.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/soulminder/index.html b/public/reviews/books/soulminder/index.html new file mode 100644 index 0000000..bad59d4 --- /dev/null +++ b/public/reviews/books/soulminder/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Soulminder - Timothy Zahn

+ +

GoodReads summary: +For Dr. Adrian Sommers, a split second of driving while distracted leads to +tragedy-and obsession. His family destroyed, he devotes his entire being to +developing Soulminder, a technology that might have saved his son as he wavered +on the edge of death. Sommers's vision is to capture a dying person's life +essence and hold it safely in stasis while physicians heal the body from injury +or disease. Years of experimentation finally end in success—but those who +recognize Soulminder's possibilities almost immediately corrupt its original +concept to pursue dangerous new frontiers: body-swapping, obstruction of +justice, extortion, and perhaps even immortality.

+
+ ★★☆☆☆ +
+

What if souls really exist and we could capture them, store them, and then +return them to the body? That's what this book is about (in a way, it's pretty +close to "The Discovery" by Netflix).

+

In one hand, the book is not about the fact that we have souls (or where they +go after we die, and things like that), but how one tool, dreamed by someone, +could be explored and turned into something completely different, and how that +dreamer would feel about the misuse of his tool. This is a really interesting +way to build characters in a story.

+

On the other hand, I have this feeling that the author used the word "soul" +just to create a fake controversy over the stories. If it was called "Brain +tracer" or "Memory storage" -- which is what the device does, in the end --, +half of the book would fall apart, because there would be no direct association +with something it is mostly used by religions -- which, again, is used as a +plot device to create controversies inside the book.

+

As a side note, I got the feeling that either the author had ulcers while +writing the story or was hungry while writing, 'cause most of the characters +suffer, in a way or another, with stomach problems: "felt a knot in his +stomach", "made her stomach churn" and things like that.

+

Also, chapters are too episodic, and it gave me the feeling that the story +wasn't wrote for a book, but for some TV series.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/storm-real-time-processing-cookbook/index.html b/public/reviews/books/storm-real-time-processing-cookbook/index.html new file mode 100644 index 0000000..792656f --- /dev/null +++ b/public/reviews/books/storm-real-time-processing-cookbook/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Storm Real-Time Processing Cookbook - Quinton Anderson

+ +

GoodReads Summary: +A Cookbook with plenty of practical recipes for different uses of Storm.If you +are a Java developer with basic knowledge of real-time processing and would +like to learn Storm to process unbounded streams of data in real time, then +this book is for you.

+
+ ★★☆☆☆ +
+

The book presents a couple of problems and how to solve them in Storm. Or, at +least, that's the premise.

+

The whole problem is that the problem is described in very high level, like +"process the logs". While this sounds alright, the book never goes to explain +how the logs are store, they format and so on. So you have a solution for a +very high level which you have no idea how good the solution could be because +you have no idea how the data exists. It simply does and the Storm topology +process it and that's it.

+

Another problem is that, because all solutions are written in Java and Java is +too damn verbose, instead of showing the whole code, the book goes into "Go to +the file X, use the IDE to automatically add the imports and add this +function." You never get a clear picture of how a complete bolt looks like.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/subterranean-scalzi-super-bundle/index.html b/public/reviews/books/subterranean-scalzi-super-bundle/index.html new file mode 100644 index 0000000..b7b6e1a --- /dev/null +++ b/public/reviews/books/subterranean-scalzi-super-bundle/index.html @@ -0,0 +1,119 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Subterranean Scalzi Super Bundle - John Scalzi

+ +

GoodReads Summary:

+

Subterranean Press bundles together all of their John Scalzi titles into one easy-to-buy special this November:

+

How I Proposed To My Wife: An Alien Sex Story

+

An Election

+

Judge Sn Goes Golfing

+

Questions for a Soldier

+

The Sagan Diary

+

The Tale of the Wicked

+

The God Engines

+

You're Not fooling Anyone When You Take Your Laptop to the Coffee Shop

+
+ ★★★☆☆ +
+

the stories are good, the blog posts, not so much

+

This is a book on five acts.

+

The first act you have the stories. In this act, "The Diary of Jane Sagan" and +"God Machines" are going to get stuck in your head, 'cause they are pretty +excellent stories.

+

The second act are blog posts, which are meh.

+

The third act is a single story, which is ok.

+

The fourth act are more blog posts, which manages to be more Boeing than the +ones in the second act.

+

The fifth act are unused chapters from "Lock In". They are probably good, if +you read the published story.

+

Now, while the stories are good, the fact that 70% of the book are blog posts +is a real let down, mostly because I think blog posts are boring. Sure, there +are exceptions to this rule, like Wil Weathon's book, in which he just don't +put the posts, but actually put some background about them. For Scalzi, there +is no such reflections and most of the posts are not even interesting, 'cause +they are temporal or regional (like elections and things related to the USA). +After a while, I just skipped most of them.

+

Is it a worth book? Hard to answer. If I had only the stories and no blog +posts, that would be awesome, but the posts just make the book longer without +the need for such.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/swan-song/index.html b/public/reviews/books/swan-song/index.html new file mode 100644 index 0000000..46b1eb3 --- /dev/null +++ b/public/reviews/books/swan-song/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Swan Song - Robert R. McCammon

+ +

GoodReads Summary: +Swan is a nine-year-old Idaho girl following her struggling mother from one +trailer park to the next when she receives visions of doom—something far wider +than the narrow scope of her own beleaguered life. In a blinding flash, nuclear +bombs annihilate civilization, leaving only a few buried survivors to crawl +onto a scorched landscape that was once America.

+
+ ★★★☆☆ +
+

I'm a sucker for disaster movies, so it could be that a disaster book (would +also pick my attention. And it did, in a way.

+

There is this huge disaster of nuclear bombs falling over US and Russia, and a +few survivors have to take care of themselves. All set for a good story, but +things get in the way of it.

+

For example, the girl in the title (and summary): It could be interesting to +explore how someone so young would be a survivor in a place completely +destroyed, but she shows some special powers that are never explained -- and +no, it was not the radiation from the bombs, a là Marvel super-heroes.

+

There is the bag lady in a quest that may be the only story that really fits +the context: A survivor of the streets, now trying to survive in the rumble of +civilization.

+

And there is the plot from the people who got shelter in a made-up bunker, +which should be used only for recreation purposes ("This is how you'd live if +this was a real bunker and there was a nuclear strike outside") that got caught +in the middle, which should be a good exploration, but end up being the story +that could be ripped out of the whole with very little loss. And sadly, that's +not just this plot that gets unnecessary stuff: Fights that lead to nowhere, +longs explanation of clothing people are wearing that affect absolutely nothing +in the whole and on and on.

+

On top of that, there is a MacGuffin +device floating around that is never +explained how it works, how it came to be, it's used once, in a test, providing +a complete game changer which is never used again after that.

+

So you end up with an unexplained phenomena (actually, more than one, as the +story progressed), something interesting and a bunch of completely unnecessary +stuff. I read somewhere that there were talks to make the book a movie, which +would be hard for a 900+ book, but if you consider the amount of stuff that +doesn't add anything, sure, it fits fine in an around-two-hours movie.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-big-bad-book-of-bill-murray-a-critical-appreciation-of-the-worlds-finest-actor/index.html b/public/reviews/books/the-big-bad-book-of-bill-murray-a-critical-appreciation-of-the-worlds-finest-actor/index.html new file mode 100644 index 0000000..e68d9f9 --- /dev/null +++ b/public/reviews/books/the-big-bad-book-of-bill-murray-a-critical-appreciation-of-the-worlds-finest-actor/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Big Bad Book of Bill Murray: A Critical Appreciation of the World's Finest Actor - Robert Schnakenberg

+ +

GoodReads Summary: +The man. The movies. The life. The legend. He’s played a deranged +groundskeeper, a bellowing lounge singer, a paranormal exterminator, and a +grouchy weatherman. He is William James “Bill” Murray, America’s greatest +national treasure. From his childhood lugging golf bags at a country club to +his first taste of success on Saturday Night Live, from his starring roles in +Hollywood blockbusters to his reinvention as a hipster icon for the +twenty-first century, The Big Bad Book of Bill Murray chronicles every aspect +of his extraordinary life and career.

+
+ ★★☆☆☆ +
+

There are real biographies and biographies written by fans. This falls in the +second, which means it's not a good biography.

+

Here is the thing: biographies should focus on which kind of person the +subject really is: Are they a good person or a bad person? Are they nice or +are they assholes? And there is no exact answer for this, 'cause people can be +nice sometimes and assholes sometimes. And you have to focus on those two; if +you don't, you give a half-piece of who the person really is.

+

And here is the problem with the book: Because it was written by a Murray fan, +everything he does is written in a way to give him a good light. He fights on +the backstage? The other actors had an issue with him, not that he had a +problem.

+

One such example is when the book discusses his divorces. On the second, it's +not that Murray spent too much time away from home or wasn't lovingly; it was +his wife asking divorce for "abandonment and physical assault". So the author +didn't say Murray left his wife and, when together, used to beat her; she +said he abandoned her and she said he beat her. By removing him, it turned +a bad pair of actions into a passive description of Murray.

+

The same goes with everything "bad" that could be said about him (like the +cited fights with other actors/actresses). And, in the end, it puts such +quotes like "I never had a fight with someone that didn't deserve", just to +clean up his slate.

+

Another example of fandom: There is only one movie in which Murray is a bad +actor -- a movie with a completely disagree with the author of the book, +"Scrooged". Everything else is cited as "a mess of a movie, but Murray gives a +much needed appearance" as if Murray appearance was the only redeeming fact of +every movie he appeared which bombed.

+

And this is just my tip for you, new reader: Read it with a gain of salt, as +this is written by a fan who don't want to see Murray in a bad light.

+

Apart from all of this, it's a curious book 'cause, instead of going in +chronological order, it goes in alphabetical order. Yeah, you read that right: +Instead of going through the life events of Bill Murray, the book focus on +things and people and movies in Bill's life: So every person who worked with +him (maybe a few missing here), every movie made and declined, every sketch +character, every family member, everything is there, in alphabetical order.

+

But even with this nonsensical ordering -- which is a good match for the portrait of Murray the book wants to give -- it is, still, in the very deep, a fan book which tries to make the subject seem much better than they actually are.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-book-of-kells/index.html b/public/reviews/books/the-book-of-kells/index.html new file mode 100644 index 0000000..017e062 --- /dev/null +++ b/public/reviews/books/the-book-of-kells/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Book of Kells - R.A. MacAvoy

+ +

GoodReads Summary: +An unusual and original work of fantasy from the acclaimed author of Tea with +the Black Dragon. A contemporary man, John Thornburn (a meek, non-violent and +unpredictable artist) and woman, Derval (his tough, confrontational, strong +and warrior-like lover) time travel to ancient Ireland to avenge a Viking +attack. Packed with fascinating details of historical time and place in Irish +history and delicately balanced on the border between realism and fantasy, the +story centers around one of the most famous and beautiful illuminated +manuscripts in history, the legendary but entirely real Book of Kells. Celtic +history blends with magical fantasy for a strange and immersive tale of +adventure.

+
+ ★★☆☆☆ +
+

I really don't know how to categorize this book.

+

I mean, for a while, I thought it was a serious fantasy book. Then things got +way crazy and I thought it was a comedy. Exactly at that point, craziness went +out and things were not funny anymore.

+

Maybe the guy just read too much Irish tales and decided to write about it, +since there are very few books in which the story happens in Ireland.

+

In the end, sure, it's a story around some Irish tales, based on Irish history +and, basically, that. It's crazy, it's hard to follow and jumps around too +much.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-book-of-skulls/index.html b/public/reviews/books/the-book-of-skulls/index.html new file mode 100644 index 0000000..dd5680b --- /dev/null +++ b/public/reviews/books/the-book-of-skulls/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Book of Skulls - Robert Silverberg

+ +

GoodReads Summary: +Seeking the immortality promised in an ancient manuscript, The Book of Skulls, +four friends, college roommates, go on a spring break trip to Arizona: Eli, +the scholar, who found and translated the book; Timothy, scion of an American +dynasty, born and bred to lead; Ned, poet and cynic; and Oliver, the brilliant +farm boy obsessed with death.

+
+ ★☆☆☆☆ +
+

The story of four friends that go after some mysterious book -- said "Book of +Skulls" -- which tells about the secret for eternal life, but it requires four +people, one which must be "removed" by the group and another that must "remove" +themselves.

+

But that's not the horror of it.

+

The horror is a full paragraph of 5 pages.

+

The horror is each chapter being in the view of each of the four friends, but +they all think exactly the same way.

+

The horror is the idea of one removed by the group and another by themselves +is never actually explored.

+

The horror is that the resolution is predicable for miles.

+

The horror is a bunch of text copy'n'pasted over and over, like the author was +being paid by the word.

+

The horror is the amount of inane stories of some of the friends' past, which +add absolutely nothing to the story or for building the character +personalities.

+

The horror is the talks about sex like a horny teenage.

+

The whole book is the horror, not the story it contains.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-complete-collection/index.html b/public/reviews/books/the-complete-collection/index.html new file mode 100644 index 0000000..4e7fadf --- /dev/null +++ b/public/reviews/books/the-complete-collection/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Complete Collection - H.P. Lovecraft

+ +

GoodReads Summary: +The weird fiction short stories of H.P. Lovecraft from 1917-1935. Excludes +collaborations.

+

The eBook’s table of contents is listed below. It includes the year each story +was written.

+
+ ★☆☆☆☆ +
+

I'll spoil my impressions of this book with two phrases, which will surely +make some Lovecraft fans really angry:

+
    +
  1. +

    Lovecraft loved to write, but not tell stories.

    +
  2. +
  3. +

    Lovecraft got paid by the word, and he really liked the money.

    +
  4. +
+

But before you come with pitchforks and torches to get me, let me explain the +whole affair.

+

First off, the first story of the book is "At the Mountains of Madness" +(because all stories are in their alphabetical order) and it really rubbed me +in the wrong way: It does a good job setting the ambient for the story but +when it reaches its crux, it starts to dragging down and the story pace goes +really really slow, because at this point, Lovecraft decides that almost all +-- if not all -- substantives must have a proper adjective. This doesn't help +the pace at all. It's like a murder scene, when the murderer appears behind +the poor girl and slowly walks towards her, except he's on the other side of +the house and the whole thing is in slow motion. At the end, you start to hope +that the murderer runs and kills the girl already, because the suspense is +already over and the thing is already dragging itself out.

+

"But that's just ONE story!" you may cry. I agree with you in that, except the +pattern appears everywhere. "Nameless sound", "sinister with latent horror", +"clock's abnormal ticking". It goes on and on and on, apparently trying to +scare you with adjectives instead of the story itself. There are so many of +those dragging the pace down that I felt asleep more than once reading the +book. Yes, you read it right: A book about horror stories put me to sleep. +Also, it was the first time in my whole life that I got tired of reading; no, +I didn't got mentally exhausted, I didn't get physically tired; I got tired +of reading. It was the opposite of what I felt when I finished reading "Lord +of the Rings": When the story ended, I wanted to read more; with Lovecraft, I +wanted to read less.

+

Also, in general, Lovecraft managed to create his own little universe where +his stories float around. Most authors would get this universe and expand it +further and further, but Lovecraft manages to make the incredible feature of +never expanding the universe, to the point that more stories actually +diminish the universe instead of expanding it.

+

Not only the stories are not superb, but the editing leaves a lot to be +desired. There are two or three stories written by Lovecraft in his +childhood/early teens, which seem to be added to tell that Lovecraft loved to +write since the early ages, but they are put without any editing or even +grammatical checking, which does more harm to the author than help him.

+

Not that all stories are bad, some are good. But they are drowned in the world +of stories that go nowhere that they are the exception instead of the rule.

+

In the end, you can think of this: You have heard about "Necronomicon", you +probably heard about "Cthulu", you may have heard about the "Old Ones" -- and +that's probably it. Of about 2000 pages of stories and a lot more words, only +4 got beyond Lovecraft stories.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-cyberiad/index.html b/public/reviews/books/the-cyberiad/index.html new file mode 100644 index 0000000..25dbc2d --- /dev/null +++ b/public/reviews/books/the-cyberiad/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Cyberiad - Stanisław Lem

+ +

GoodReads Summary: +A brilliantly funny collection of stories for the next age, from the +celebrated author of Solaris. Ranging from the prophetic to the surreal, these +stories demonstrate Stanislaw Lem's vast talent and remarkable ability to +blend meaning and magic into a wholly entertaining and captivating work.

+
+ ★★★☆☆ +
+

What would happen if Isaac Asimov and Douglas Adams had a child? Stanislaw +Lem.

+

Ok, maybe I'm pushing the story a bit too far, 'cause that's the only book +I've read from Lem so far, but the stories in this book really do seem a mix +between what Asimov wrote with the nonsensical humour of Adams.

+

The book revolves around stories of two "constructors", Trurl and Klaupacius +and their adventures. And I put "constructores" with quotes 'cause, only by +reading the synopsis is that I got that they were robots -- a thing the book +never transpires, in a way that I thought, till now, that they were humans in +a world were robots and humans live along. Good, bad? I can't say it.

+

While the humour is there -- and I truly appreciate Adams style and reckon the +hard work of the translators -- some pieces get too long and too nonsensical +to be actually funny. It becomes a chore, sometimes, to read very long +paragraphs, with a bunch of weird words (cause there is a bunch of made up +words, like mixing "sarcastic" and "transistor" into a single word).

+

It's fun overall, but not Adams fun.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-drawing-of-the-three-the-dark-tower-2/index.html b/public/reviews/books/the-drawing-of-the-three-the-dark-tower-2/index.html new file mode 100644 index 0000000..db13310 --- /dev/null +++ b/public/reviews/books/the-drawing-of-the-three-the-dark-tower-2/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Drawing of the Three (The Dark Tower, #2) - Stephen King

+ +

GoodReads Summary: +While pursuing his quest for the Dark Tower through a world that is a +nightmarishly distorted mirror image of our own, Roland, the last gunslinger, +encounters three mysterious doorways on the beach. Each one enters into the +life of a different person living in contemporary New York.

+
+ ★★★★★ +
+

While The Gunslinger where more of "the movie that started the series" (as I +put in the previous book review), this feels more like a complete book.

+

Way less backstories, a lot more straight stories.

+

The series is still in the build up: Instead of talking directly about the +tower, the book is more about the companions Roland get in the way to the +tower (kinda like Jake in the previous book).

+

Still, compared to the previous book in the series, this one feel a lot more +"complete" and centered around itself.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-drift-wars/index.html b/public/reviews/books/the-drift-wars/index.html new file mode 100644 index 0000000..4d21ef8 --- /dev/null +++ b/public/reviews/books/the-drift-wars/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Drift Wars - Brett James

+ +

GoodReads Summary: +Peter Garvey was just a kid when the warships emerged from the Drift and +devastated his homeworld. He enlisted immediately, leaving behind his +small-town life to fight in distant space.

+

Barely surviving basic training, he is thrust to the front line to battle the +Riel, an army of creatures beyond his darkest nightmares.

+
+ ★★★☆☆ +
+

There are very few books that I've read that made my head spin by being so +terrible describing action scenes. There is Neuromancer has pretty damn good +action sequences. This one, no.

+

Maybe it's because you can't really get the pace of the sequence. Maybe it's +because it's badly described. Maybe it's because things sound so cartoonish +you can't really go. I mean, how can I imagine an action sequence when the big +bad guy seems to be a Spidermon from Doom on steroids, the middle guys felt +like Carnage from Spiderman and the mind-guys seemed copies of Mordin from +Mass Effect.

+

And let's not forget the main plot machine, which makes absolutely no sense at +all -- even if it's a pretty damn concept to keep the story flowing.

+

Speaking of flowing, if you take the heavy packed sequences and the enemies +description, it's a pretty damn good book. Almost like "All You Need Is Kill" +in structure and plot advancement.

+

So it's not a bad book at all, and may feel like a really good read if you +managed to follow Neuromancer sequences.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-emperors-soul/index.html b/public/reviews/books/the-emperors-soul/index.html new file mode 100644 index 0000000..22bfb0c --- /dev/null +++ b/public/reviews/books/the-emperors-soul/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Emperor's Soul - Brandon Sanderson

+ +

GoodReads Summary: +A heretic thief is the empire’s only hope in this fascinating tale that +inhabits the same world as the popular novel, Elantris.

+
+ ★★☆☆☆ +
+

I got this book from a Humble Bundle of Scifi/Fantasy. It fits in the later +than in the former.

+

The biggest problem I found was that the story starts midway. Surely, this is +not something new, as other books take the same approach and then, slowly, +expand the reader knowledge about the story universe. But the problem here is +"slowly". Part of what is going on (and why is going on) is told very late +in the story.

+

Also, the end, although manages to capture your attention, is cliche at best.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-end-of-all-things-old-mans-war-6/index.html b/public/reviews/books/the-end-of-all-things-old-mans-war-6/index.html new file mode 100644 index 0000000..0da4a30 --- /dev/null +++ b/public/reviews/books/the-end-of-all-things-old-mans-war-6/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The End of All Things (Old Man's War, #6) - John Scalzi

+ +

GoodReads Summary: +Humans expanded into space... only to find a universe populated with multiple +alien species bent on their destruction. Thus was the Colonial Union formed, +to help protect us from a hostile universe. The Colonial Union used the Earth +and its excess population for colonists and soldiers. It was a good +arrangement... for the Colonial Union. Then the Earth said: no more.

+
+ ★★★★☆ +
+

While all the other books in the series are more about "fight" and "tactics", +this is way more political.

+

After all the events in the series, the story finally reached a point where a +cold war is present and the "action" is more about talk and creating pacts +than exploding stuff. Which, to be honest, felt like the natural way the story +should go.

+

If you like the explosions and stuff, you may feel a bit down by this, but you +have to give a change for the exploration of all other aspects of the universe +created.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-flight-of-the-eisenstein/index.html b/public/reviews/books/the-flight-of-the-eisenstein/index.html new file mode 100644 index 0000000..46adab5 --- /dev/null +++ b/public/reviews/books/the-flight-of-the-eisenstein/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Flight of the Eisenstein - James Swallow

+ +

GoodReads Summary: +Having witnessed the events on Istvaan III, Deathguard Captain Garro seizes a +ship and heads to Terra to warn the Emperor of Horus's treachery. But the +fleeing Eisenstein is damaged by enemy fire, and becomes stranded in the warp. +Can Garro and his men survive the depredations of Chaos and get his warning to +Terra in time?

+
+ ★☆☆☆☆ +
+

How do you tell a following story that takes over from another one, one that +feels somewhat complete, one that, even when discussing several events, have +at least one that goes to conclusion? One solution is to continue the story +from the point the previous one completed, but one could try to push the +story further by picking one of those events and showing another point of +view of something readers already know how it will end, being careful to not +build any suspense on what will happen, 'cause the reader knows what it will +end and you end up with just a bunch of text that it is just boring as heck +to read.

+

Another thing one should take care is to not build long sentences that just +keeps going on and on that add very little except burn the reader time, like +pointing out that long sentences burn the reader time, instead of going +straight to the point, avoiding running around the point, with no care about +that amount of information per sentence you're adding.

+

And, still, you get all those here.

+

Indeed, from one of the several events that happened in "Galaxy in Flames", +the author picked on of the things that happens in the sidelines (which get +some spotlight, in the end) and try to build a whole story out of it, kind +like "Shadow of the Giant" is built on the side-story of Ender's Game. But +while Shadow of the Giant, while still entangled with Ender's Game, have very +small touching points, about 60% is exactly what happened in "Galaxy in +Flames". Worse, with so much touching surface, the author decided to create on +suspense on what will happen to the nominal ship: Will it survive the attack +from Horus forces? Will they manage to get away? OF COURSE IT WILL, Galaxy in +Flames told us that they escape, so why are you making a huge fuss about the +amount of damage they are taking, like they won't be able to take away?

+

And there is also the long sentences that provide very little information with +a huge amount of words, which completely break the speed of the story. Think +about the longest, most boring line, with the most duplicate information, in +the middle of a battle. How would you feel about the battle speed?

+

Honestly, it's not that "Horus Heresy" is a masterpiece of literature, but the +series could surely survive without this book.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-forever-war/index.html b/public/reviews/books/the-forever-war/index.html new file mode 100644 index 0000000..e0436ec --- /dev/null +++ b/public/reviews/books/the-forever-war/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Forever War - Joe Haldeman

+ +

GoodReads Summary: +The Earth's leaders have drawn a line in the interstellar sand—despite the +fact that the fierce alien enemy that they would oppose is inscrutable, +unconquerable, and very far away. A reluctant conscript drafted into an elite +Military unit, Private William Mandella has been propelled through space and +time to fight in the distant thousand-year conflict; to perform his duties +without rancor and even rise up through military ranks. Pvt. Mandella is +willing to do whatever it takes to survive the ordeal and return home. But +"home" may be even more terrifying than battle, because, thanks to the time +dilation caused by space travel, Mandella is aging months while the Earth he +left behind is aging centuries.

+
+ ★★★★★ +
+

After I finished this book I had to ask myself why I never read anything else +by Haldeman.

+

In a way, this book seems to be the counterpart of Heinlen's "Starship +Troopers": While Heinlein shows how smart the army can be, Haldeman seems to +show how the army can be pretty stupid sometimes.

+

It follows the story of William Mandella, who gets in the very first war +against an alien race that suddenly destroyed a colonizing ship. Due the way +humanity uses to travel the unverse, what happens in just a few days/weeks to +soldiers in-route, the everyone on Earth it takes years if not decades. So, in +the end, although Mandella gets into only 3 battles, his time on the +battlefield (well, on the way to the battlefield and back) goes around 900 +years.

+

Also, there are some very clever things Haldeman did. At the very start, I +thought the story was a bit sexist. It turns out it was a very well thought +point Haldeman did to make a very long arc -- more like a criticism of the +sexism in the 70s than some hidden agenda towards sexism.

+

If I didn't had just read yet another book about wars, I'd probably keep going +through the series. But I guess I deserve a break after going through two +different wars.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-geeks-guide-to-dating/index.html b/public/reviews/books/the-geeks-guide-to-dating/index.html new file mode 100644 index 0000000..23bc314 --- /dev/null +++ b/public/reviews/books/the-geeks-guide-to-dating/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Geek's Guide to Dating - Eric Smith

+ +

GoodReads Summary: +You keep your action figures in their original packaging. Your bedsheets are +officially licensed Star Wars merchandise. You're hooked on Elder Scrolls and +Metal Gear but now you've discovered an even bigger obsession: the new girl who +just moved in down the hall. What's a geek to do? Take some tips from Eric Smith +in The Geek's Guide to Dating. This hilarious primer leads geeks of all ages +through the perils and pitfalls of meeting women, going on dates, getting +serious, breaking up, and establishing a successful lifelong relationship (hint: +it's time to invest in new bedsheets). Full of whimsical 8-bit illustrations, +The Geek's Guide to Dating will teach fanboys everywhere to love long and +prosper.

+
+ ★★★☆☆ +
+

I have to be honest: The first 1/3 of the book was quite boring. If you ever +read any other dating-advice book, there is a lot of same tips: Listen to her, +find some common ground, etc, etc, etc. All that with heavy drops of geek/nerd +culture: game references, movie references, book references and the continuous +use of referring to the reader as "Player One" (ok, I get it: People are trying +to get their "Player Two", but heck, calm the freaking down).

+

The later parts are a bit better, going off the common ground: casual dating, +second date, how to dress, how to make things work when things get serious, what +you should be looking for a long term relationship and how to act when things +fall down -- either by your own decision or theirs.

+

But there is something off here: Sure, it is somewhat fun getting ideas using +analogies based on nerd stuff (again, games, movies and books), but the whole +thing seems focused on geek guys, and I feel it would be really interesting, as +a guy, to understand the female perspective of this all. The book tries +(tries) to make things a bit less biased by adding a disclaimer that geek +girls can also read the book, and should just replace the "she/her" to +"he/him" -- which absolutely does not work on some chapters, like the "How to +Dress" part.

+

And yes, the heavy use of drop/nerd references in the first half does not help +the lighter use in the second half: You're already tired of reading about Mario +or Sonic or whatever.

+

I'm going to give a 3 star just because it does the extra mile of going to +different ideas of dating (serious vs casual), dealing with things going serious +and breakups.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-ghost-brigades-old-mans-war-2/index.html b/public/reviews/books/the-ghost-brigades-old-mans-war-2/index.html new file mode 100644 index 0000000..30d273d --- /dev/null +++ b/public/reviews/books/the-ghost-brigades-old-mans-war-2/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Ghost Brigades (Old Man's War, #2) - John Scalzi

+ +

GoodReads Summary: +The Ghost Brigades are the Special Forces of the Colonial Defense Forces, +elite troops created from the DNA of the dead and turned into the perfect +soldiers for the CDF's toughest operations. They’re young, they’re fast and +strong, and they’re totally without normal human qualms.

+

The universe is a dangerous place for humanity—and it's about to become far +more dangerous. Three races that humans have clashed with before have allied +to halt our expansion into space. Their linchpin: the turncoat military +scientist Charles Boutin, who knows the CDF’s biggest military secrets. To +prevail, the CDF must find out why Boutin did what he did.

+
+ ★★★★★ +
+

Reading another "Old Man's War" after a long time since the very first is a +weird experience. Mostly because you forgot half of the stuff, and the other +half is buried somewhere in a fuzzy old memory.

+

And then the names appear in the story. And then you remember most of the +stuff.

+

Thing is, this book does very little connection with the first one. While +"Old Man's War" explored the life of a man in a new body in a very long +battle, this book focuses on the other half of the book, Jane Sagan, the +soldier built with the DNA of the man in the new body.

+

So now we have the battles of Jane Sagan as a CDF soldier. But the book is +really what people are: The bodies? Their personality? Their memories?

+

Unfortunately, it doesn't go as deep as it could in this topic but, on the +other hand, the story is mostly solid, the writing is easy to read and the +story itself have a good pacing.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-gunslinger-the-dark-tower-1/index.html b/public/reviews/books/the-gunslinger-the-dark-tower-1/index.html new file mode 100644 index 0000000..c1e6b0b --- /dev/null +++ b/public/reviews/books/the-gunslinger-the-dark-tower-1/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Gunslinger (The Dark Tower, #1) - Stephen King

+ +

GoodReads Summary: +In the first book of this brilliant series, Stephen King introduces readers to +one of his most enigmatic heroes, Roland of Gilead, The Last Gunslinger. He is +a haunting figure, a loner on a spellbinding journey into good and evil. In +his desolate world, which frighteningly mirrors our own, Roland pursues The +Man in Black, encounters an alluring woman named Alice, and begins a +friendship with the Kid from Earth called Jake. Both grippingly realistic and +eerily dreamlike, The Gunslinger leaves readers eagerly awaiting the next +chapter.

+
+ ★★★☆☆ +
+

It pretty much felt like "the movie that started the series" from the 80s.

+

A lot of the stuff is basically the Gunslinger telling his story or thinking +about the past. Sure it gives a nice explanation about the current status of +the characters, but it also drains the amount of "current status".

+

Also, some descriptions felt hard to follow. Sure it's easy to explain how a +train station looks like and what's in it, but a cave... Good luck following +what's happening there.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-human-division-old-mans-war-5/index.html b/public/reviews/books/the-human-division-old-mans-war-5/index.html new file mode 100644 index 0000000..3568311 --- /dev/null +++ b/public/reviews/books/the-human-division-old-mans-war-5/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Human Division (Old Man's War, #5) - John Scalzi

+ +

GoodReads Summary: +Following the events of The Last Colony, John Scalzi tells the story of the +fight to maintain the unity of the human race.

+
+ ★★★☆☆ +
+

In "Zoe's Tale", Scalzi mentions that he wanted to get away from John Perry +and Jane, so the book is the same as The Last Colony, but from Zoe's point of +view.

+

This tendency keeps going on here, as it focus on Harry Wilson, one of John +Perry mates in the first book -- and heck if I could remember that if the book +haven't told me.

+

The book is full of action, but its ending is kinda deceptive: It doesn't +close the ties it opened, it just leaves a huge plot without explanation -- +and one can assume it just something to bridge to the next book, [book:The End +of All Things|23168809].

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-island-of-doctor-moreau-unabridged/index.html b/public/reviews/books/the-island-of-doctor-moreau-unabridged/index.html new file mode 100644 index 0000000..31ec0f2 --- /dev/null +++ b/public/reviews/books/the-island-of-doctor-moreau-unabridged/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Island of Doctor Moreau (Unabridged) - H.G. Wells

+ +

GoodReads Summary: +While this riveting tale was intended to be a commentary on evolution, divine +creation, and the tension between human nature and culture, modern readers +familiar with genetic engineering will marvel at Wells’s prediction of the +ethical issues raised by producing “smarter” human beings or bringing back +extinct species. These levels of interpretation add a richness to Prendick’s +adventures on Dr. Moreau’s island of lost souls without distracting from what +is still a rip-roaring good read.

+
+ ★★★★☆ +
+

What brought me to "The Island of Doctor Moreau" was the movie with Marlon +Brando. Yup, you read that right: It was the catastrophic (by IMDB comments) +movie that made me read the book.

+

For all that I can remember, the movie goes to explore the fact that some +people want to be Gods of others. It explores much of our egocentrism, how we +find outselves better than anyone else and such (but my memory could be fading +after all this time).

+

The book, on the other hand, goes in a way more simpler and way more +interesting concept: our intellect vs our instincts.

+

Moreau turns animals into anthropomorphic beings, including changes in the +brain to allow them talk and understand most basic stuff. But something keeps +bringing their instincts back, to the point that they lose their "humanity" +and revert to... animals. From that point, from that basic premise, Wells +explores what it is to be a human and what it is to be a beast.

+

The best way to surmise the whole thing is this little gem in the very end of +the book:

+
+

I, Moreau (by his passion for research), Montgomery (by his passion for +drink), the Beast People with their instincts and mental restrictions, were +torn and crushed, ruthlessly, inevitably, amid the infinite complexity of +its incessant wheels.

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-last-colony-old-mans-war-3/index.html b/public/reviews/books/the-last-colony-old-mans-war-3/index.html new file mode 100644 index 0000000..fab30a8 --- /dev/null +++ b/public/reviews/books/the-last-colony-old-mans-war-3/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Last Colony (Old Man's War #3) - John Scalzi

+ +

GoodReads Summary: +Retired from his fighting days, John Perry is now village ombudsman for a +human colony on distant Huckleberry. With his wife, former Special Forces +warrior Jane Sagan, he farms several acres, adjudicates local disputes, and +enjoys watching his adopted daughter grow up.

+
+ ★★★★★ +
+

What would happen if genetic soldiers, after returning to their normal selves, +had to fight a different fight?

+

John Perry and Jane Sagan, now being the parents of Zoë Boutin, have to manage +and save a colony in a time when every other race in the universe decided to +fight the human expansion.

+

In some ways, it felt like the boring parts of Children of the Mind, with +annoying descriptions of a different planet, with its different fauna and +flora and whatnot. I mean, for something more thoughtful, it gets boring +pretty quick.

+

Also, there is this weird "let me show how John is smart, because he has +almost 100 years" thingy. Every time the colony gets into trouble, John comes +with a solution. It's not Jane, the intelligence soldier that solves this, +'cause she's only 10 or so years old. Actually, Jane logistics is rarely +brought into play, so she mostly sits on the background like a deus ex machina +due her past. And John never gets into a corner he can't escape.

+

Although these things are annoying, it doesn't bring the whole story to the +ground: yup, the flora and fauna are boring, but they are a couple of pages; +yup, Jane logistics is mostly through under the rug, but we have John; John +never gets into a corner he can't escape or doesn't have a solution, either by +intelligence or politics, but at least the story doesn't stall in those +situations (well, because the situations don't exists, anyway).

+

As usual, a good, fast paced sci-fi book, like the others from Scalzi.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-league-of-regrettable-superheroes/index.html b/public/reviews/books/the-league-of-regrettable-superheroes/index.html new file mode 100644 index 0000000..e020bba --- /dev/null +++ b/public/reviews/books/the-league-of-regrettable-superheroes/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The League of Regrettable Superheroes: Half-Baked Heroes from Comic Book History - Jon Morris

+ +

GoodReads Summary: +You know about Batman, Superman, and Spiderman, but have you heard of Doll +Man, Doctor Hormone, or Spider Queen? In The League of Regrettable +Superheroes, you’ll meet one hundred of the strangest superheroes ever to see +print, complete with backstories, vintage art, and colorful commentary. So +prepare yourself for such not-ready-for-prime-time heroes as Bee Man (Batman, +but with bees), the Clown (circus-themed crimebuster), the Eye (a giant, +floating eyeball; just accept it), and many other oddballs and oddities. +Drawing on the entire history of the medium, The League of Regrettable +Superheroes will appeal to die-hard comics fans, casual comics readers, and +anyone who enjoys peering into the stranger corners of pop culture.

+
+ ★★★★☆ +
+

An encyclopedia of failed super-heroes.

+

The intro for the book is really good in the point that, today, super-heroes +are all in rage in the movies. But there are those who failed to get some +attention and died in the darkness of the comic book world.

+

So, here they are.

+

I just felt it could have a bit more about the background of the heroes. Sure, +some were promotional heroes (like NFL hero, the trucker hero, and so on) but +still, what was the catalyst for the creation of such hero: Was it the times, +the culture change, some requirement from higher ups, drugs...? Also, powers: +Some have a short list of super powers they got, but they are not complete -- +surely, it's mentioned that some heroes go through several revisions, so their +powers change, but one could consider a revision another hero and just keep +the powers with the heroes+revision. I'm saying this 'cause, as an +encyclopedia, it would be nice to have an index by powers, so when one is +looking for that hero that have, say, the power to create bubbles, one could +just check the index for "bubbles" and there you go.

+

The book also need some more careful work by the editors. There are a couple +of misspellings around, like a "thsoe" in the middle of the sentence. It's not +that hard to figure out what was meant in these cases, but still... annoying.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-little-book-of-htmlcss-coding-guidelines/index.html b/public/reviews/books/the-little-book-of-htmlcss-coding-guidelines/index.html new file mode 100644 index 0000000..e614ecd --- /dev/null +++ b/public/reviews/books/the-little-book-of-htmlcss-coding-guidelines/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Little Book of HTML/CSS Coding Guidelines - Jens Oliver Meiert

+ +

GoodReads Summary: +A proper plan can improve your code, including your HTML documents and CSS +style sheets. Jens Oliver Meiert explores the theory and practice of coding +guidelines and shows, using Google’s HTML and CSS standards as a particular +example, how consistency and care can make the code base you create today much +easier to deal with when you—or someone else—work on it later.

+
+ ★★★☆☆ +
+

There isn't much to say about this book, because this book doesn't say much.

+

Actually, you could say it says half of what it should, since half of the book +is not about the guidelines, but about how great guidelines are. Not that +useless, but a simply "they are good, Mkay?" would suffice.

+

About the guidelines themselves, they are heavily based on Google guidelines, +mostly because those guidelines and this book have the same author. There is +no amazing things or suggestions, mostly of them are guidelines that everybody +follows and others are mostly harmless in the sense that they don't affect +reading, like double quotes instead of single quotes.

+

So, nothing really ground breaking, but not bad either.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-martian/index.html b/public/reviews/books/the-martian/index.html new file mode 100644 index 0000000..2d14e20 --- /dev/null +++ b/public/reviews/books/the-martian/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Martian - Andy Weir

+ +

GoodReads Summary: +Six days ago, astronaut Mark Watney became one of the first people to walk on +Mars.

+

Now, he’s sure he’ll be the first person to die there.

+
+ ★★★★★ +
+

Initial warning: I'm a science nerd. Not that I'm good at science, but I +really enjoy reading about science: Tell me how to split an atom and I get a +boner; show me a path around the space with two slingshots effect and I jizz +in my pants.

+

That's why I liked this book this much. It is kinda like the movie "The Core", +but without the bullshit plot and materials and whatnot.

+

So it seemed, at first, that the book was only about one guy lost in Mars and +his attempts to survive. But the book encompasses a lot more than that. +Without giving too much spoilers here, it explores a bit of science, how the +space companies work, how much work it takes to launch a single rocket and so +on.

+

As I mentioned, there is a lot of science in the book: How create water, how +to create hydrogen, chemical reactions...

+

In the end, it is a really good book if you're a nerd.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-origin-of-names-words-and-everything-in-between/index.html b/public/reviews/books/the-origin-of-names-words-and-everything-in-between/index.html new file mode 100644 index 0000000..aa7888c --- /dev/null +++ b/public/reviews/books/the-origin-of-names-words-and-everything-in-between/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Origin of Names, Words and Everything in Between - Patrick Foote

+ +

GoodReads summary: +Explore the world of names: What is something that literally everything in +existence has in common? It all has a name! With The Origin of Names, Words and +Everything in Between, you can learn the origins of these names. From countries +and cities to toys and animals to even planets, learn the etymology of +interesting words in a fun and entertaining way.

+
+ ★★★☆☆ +
+

Etymology is a fun -- or, at least, interesting -- area: The origin of words.

+

And yes, that's what this book is about: words and their meanings. Five (or +six) sections, each with 10 words and their origins. Kinda.

+

There is one glaring problem with the book: Because etymology is somewhat +boring ("hey, this word, came from this source, which is based on this word, +which means this"), the author decided to put some fun in it, which is ok in a +certain dose, but gets annoying when it is too much. And it is too much.

+

Also, there are some problems with the editing of the book. Wrong punctuation, +words disconnected from the rest of the phrase... There is even an "there" +which should be "their".

+

It is not a bad book per se, it's just the the colorful notes put too much +color in it and it surely needs a very good revision.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-phoenix-project/index.html b/public/reviews/books/the-phoenix-project/index.html new file mode 100644 index 0000000..644c496 --- /dev/null +++ b/public/reviews/books/the-phoenix-project/index.html @@ -0,0 +1,146 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win - Gene Kim, Kevin Behr, George Spafford

+ +

GoodReads Summary: +In a fast-paced and entertaining style, three luminaries of the DevOps +movement deliver a story that anyone who works in IT will recognize. Readers +will not only learn how to improve their own IT organizations, they'll never +view IT the same way again.

+
+ ★☆☆☆☆ +
+

Let me take something out of the way from the start: This is a book with a +fictional story, which try to explain the DevOps movement. And it age poorly.

+

If we start with the fictional part, you have some guy which is promoted to VP +of Technology and suddenly have to deal with the integration of all the IT +parts of the company (infrastructure, development, security, business).

+

Just to prove the point that any company needs DevOps 'cause every company is +an IT company now, the story is about an auto-parts company.

+

And heck if the characters are not as cliché as possible, with a few +absurdities: The infrastructure manager is a fat guy that doesn't care about +his appearance; there is the "evil" manager that tries to put the blame on +everyone else but herself; the paranoid security guy (although every security +person should be paranoid, nonetheless), which surprisingly turns into a monk +in the middle of the book. And then you have the magical "future board member" +that knows absolutely everything about IT, but it is never asked if he +wants to manage the IT department in the first place -- and trains the new VP +even before becoming a board member, maybe out of purity of his heart, 'cause +he's a "down to earth" kind of guy, but since he's filthy rich, he can do that +('cause, you know, rich people are really willing to take their time to help +others).

+

The story is planned exactly to prove a point: Crisis emerge and are solved +exactly in order to prove there is an order things are in the authors head -- +which becomes clear in the "Handbook", a non-fictional part in the end of the +book. There are three ways in the way an IT department accepts DevOps and +surely all the events happen in the same exact order.

+

Another point: instead of the VP being the catalyst of the DevOps changes in +the company, people around him start to move into DevOps without knowing: The +manager lady simply brings kanban out of the blue, for example. And that +"security guy turned monk", out of the blue, decided to bring the stakeholders +into the discussion -- again, without the VP being the catalyst for it.

+

In the end, everything ends fine: The VP is about to become COO, the evil lady +gets fired, everyone is happy, everything is going, the company is making huge +trucks of money... And nothing bad every happened: All ideas worked +flawlessly, there were not side effects, everything is happy, with rainbows +and candies and balloons...

+

After the story, there is the "DevOps Handbook", which could be something +usable, if it wasn't for what seems an attempt to produce more words with +little content. There is a bunch of replicated stuff, like "a downward spiral" +which keeps being repeated two or three paragraphs apart. You know that scene +in "Up!", in the newsreel, which the news person says "Lutz promised he'll not +return till he proves he's right", cutting to Lutz saying "I promise I'll not +return till I prove I'm right"? That feels exactly like this.

+

Again, the book didn't age well. There is a lot of space for pointing out +side-effects, removing the "THIS NEW THING WILL SAVE EVERYTHING!" tone of the +story. But, for someone who's into DevOps since 2017, the story and handbook +seems really outdated.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-planets-photographs-from-the-archives-of-nasa/index.html b/public/reviews/books/the-planets-photographs-from-the-archives-of-nasa/index.html new file mode 100644 index 0000000..e7e12a1 --- /dev/null +++ b/public/reviews/books/the-planets-photographs-from-the-archives-of-nasa/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Planets: Photographs from the Archives of NASA - Nirmala Nataraj, Bill Nye, U.S. Goverment

+ +

GoodReads Summary: +This magnificent volume offers a rich visual tour of the planets in our solar +system. More than 200 breathtaking photographs from the archives of NASA are +paired with extended captions detailing the science behind some of our cosmic +neighborhood's most extraordinary phenomena. Images of newly discovered areas +of Jupiter, fiery volcanoes on Venus, and many more reveal the astronomical +marvels of space in engrossing detail. Anyone with an interest in science, +astronomy, and the mysteries of the universe will delight in this +awe-inspiring guide to the wonders of the solar system.

+
+ ★★★★★ +
+

If I said this book was only about pictures of the several rocks in our solar +system, I'd seriously not right -- although the book is (mostly) it.

+

Besides gorgeous images of the planets in the solar system, including, Ceres, +Pluto, the Sun and even comet 67P, it also has information about what you're +seeing: The icy plains of Pluto (you know, the heart shaped thing), the size +and speed of Jupiter huge storm and everything else you can think of.

+

This is the kind of book you should buy in large sheets and put on your coffee +table, not only to impress your guests, but also to remind you of how big the +space is.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-story-behind-the-extraordinary-history-behind-ordinary-objects/index.html b/public/reviews/books/the-story-behind-the-extraordinary-history-behind-ordinary-objects/index.html new file mode 100644 index 0000000..a7771c2 --- /dev/null +++ b/public/reviews/books/the-story-behind-the-extraordinary-history-behind-ordinary-objects/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Story Behind: The Extraordinary History Behind Ordinary Objects - Emily Prokop

+ +

GoodReads Summary: +Learn the fascinating history and trivia you never knew about things we use +daily from the host of The Story Behind podcast.

+
+ ★★★★☆ +
+

One of the books from the "Trivia Champion" Humble Bundle. And yes, it belongs +to a "Trivia Champion" bundle.

+

The whole book consists on small stories about random objects: The smiley face, +the revolver, the hydrant, the wiper, all consist in a small story behind it +or some anecdote, like a campus on war due a water gun.

+

The stories are small and funny.

+

The only problem I had (and, again, personal problem) is that it is too +American-centric. I mean, the whole war on a water gun mentions an American +university; Dr Pepper is mostly unknown in Brazil; 90% of the people mentioned +are American -- and, by the way, the little anecdote about the water gun has +absolutely no relation to the creation of the product.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-swift-programming-language/index.html b/public/reviews/books/the-swift-programming-language/index.html new file mode 100644 index 0000000..c0e2aa7 --- /dev/null +++ b/public/reviews/books/the-swift-programming-language/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Swift Programming Language - Apple Inc.

+ +

GoodReads Summary: +Swift is a new programming language for creating iOS and OS X apps. Swift +builds on the best of C and Objective-C, without the constraints of C +compatibility. Swift adopts safe programming patterns and adds modern features +to make programming easier, more flexible, and more fun. Swift’s clean slate, +backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an +opportunity to reimagine how software development works.

+
+ ★★★★★ +
+

Let's skip the language itself for a moment and focus on the writing of the +book.

+

The interesting bit is the first 20-or-so pages. It starts with a very simple, +very succinct explanation of the language, so if you any programming language, +you can just start writing Swift code picking the pointers in those pages.

+

Then, the real content starts: It goes very deep, explaining every point in +great detail, with expanding examples that start very simple at the start of +the chapter and then go increasingly going complex to explain each point.

+

Really interesting way to explain a language.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-waste-lands-the-dark-tower-3/index.html b/public/reviews/books/the-waste-lands-the-dark-tower-3/index.html new file mode 100644 index 0000000..07f2807 --- /dev/null +++ b/public/reviews/books/the-waste-lands-the-dark-tower-3/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Waste Lands (The Dark Tower #3) - Stephen King

+ +

GoodReads Summary: +Several months have passed, and Roland’s two new tet-mates have become +proficient gunslingers. Eddie Dean has given up heroin, and Odetta’s two +selves have joined, becoming the stronger and more balanced personality of +Susannah Dean. But while battling The Pusher in 1977 New York, Roland altered +ka by saving the life of Jake Chambers, a boy who—in Roland’s where and +when—has already died. Now Roland and Jake exist in different worlds, but they +are joined by the same madness: the paradox of double memories. Roland, +Susannah, and Eddie must draw Jake into Mid-World then follow the Path of the +Beam all the way to the Dark Tower. But nothing is easy in Mid-World. Along +the way our tet stumbles into the ruined city of Lud, and are caught between +the warring gangs of the Pubes and the Grays. The only way out of Lud is to +wake Blaine the Mono, an insane train that has a passion for riddling, and for +suicidal journeys.

+
+ ★★★★☆ +
+

The very first book was mostly a backstory to the series.

+

The second book was the first "in the story" of the series.

+

This, the third, is mostly King going "Well, now I'm writer, I can write +whatever I can". And so he does.

+

The story flows nicely and a lot of things that you could feel King was +holding back in the second story are not here. Whatever he things he can do, +he does. So the story goes into larger arcs, deeper content and so on.

+

The only downside is the ending. About 10% of book you feel like that "Oh +shit, he's not going to defuse the bomb" or whatever happened in the old TV +series and you can feel the "To be continued." coming.

+

And "To be continued" comes.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-where-the-why-the-how/index.html b/public/reviews/books/the-where-the-why-the-how/index.html new file mode 100644 index 0000000..8b1cbf7 --- /dev/null +++ b/public/reviews/books/the-where-the-why-the-how/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Where, the Why, and the How: 75 Artists Illustrate Wondrous Mysteries of Science - Matt LaMothe, Julia Rothman, Jenny Volvovski, David Macaulay

+ +

GoodReads Summary: +A science book like no other, The Where, the Why, and the How turns loose 75 of +today's hottest artists onto life's vast questions, from how we got here to +where we are going. Inside these pages some of the biggest (and smallest) +mysteries of the natural world are explained in essays by real working +scientists, which are then illustrated by artists given free rein to be as +literal or as imaginative as they like. The result is a celebration of the +wonder that inspires every new discovery. Featuring work by such contemporary +luminaries as Lisa Congdon, Jen Corace, Neil Farber, Susie Ghahremani, +Jeremyville, and many more, this is a work of scientific and artistic +exploration to pique the interest of both the intellectually and imaginatively +curious.

+
+ ★★★☆☆ +
+

(This is getting quite common on my reviews but) This is a weird book.

+

Now, don't get me wrong: The idea the title gives is that they are going to +give you the where, the why and the how, but they actually mean the questions +"where", "why" and "how". A lot of the answers is, basically, "we don't know +yet" -- which, by the way, is completely fine, specially when dealing with +proper science.

+

Also, the questions are not really "trivia"-like: they go more deep than simply +"Why are plants green?" and the like. And, because you have no certain +questions, it gets even more nerd-like -- which, again, is completely fine.

+

(Also, the illustrations: meh)

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/the-wolfs-hour/index.html b/public/reviews/books/the-wolfs-hour/index.html new file mode 100644 index 0000000..f6835e0 --- /dev/null +++ b/public/reviews/books/the-wolfs-hour/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Wolf's Hour - Robert R. McCammon

+ +

GoodReads Summary: +Michael Gallatin is a British spy with a peculiar talent: the ability to +transform himself into a wolf. Although his work in North Africa helped the +Allies win the continent in the early days of World War II, he quit the service +when a German spy shot his lover in her bed. Now, three years later, the army +asks him to end his retirement and parachute into occupied Paris. A mysterious +German plan called the Iron Fist threatens the D-Day invasion, and the Nazi in +charge is the spy who betrayed Michael’s lover. The werewolf goes to France for +king and country, hoping for a chance at bloody vengeance.

+
+ ★★★☆☆ +
+

This is truly a weird book.

+

So you take the idea of mythical creatures like werewolfs. And you take great +events in history, like World War II. And then you mix both.

+

In one hand, the book is almost silly in its premise. And, as if it was a 60s +spy movie, it makes the hero always get the girl -- which is narrated almost as +a horny teenage vision of what sex could be.

+

On the other hand, there is a bunch of what seems real information: Locations, +dates, aircrafts, guns you name it. It's almost as the author really did some +research on geography and history about WWII events.

+

This dichotomy permeates the book in every place. The very beginning of the +book reminded of a site that gathered the most absurd adverbs: "like a ghost in +the night" and the like. So, at the very start, it feels like it is a bad book, +but then you get what seems like real events happening (with a touch of what +was done in Assassin's Creed series of games) and then it seems like a real +book. And then you get the horny parts and it goes back to silly.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/typescript-succinctly/index.html b/public/reviews/books/typescript-succinctly/index.html new file mode 100644 index 0000000..c773ad2 --- /dev/null +++ b/public/reviews/books/typescript-succinctly/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

TypeScript Succinctly - Steve Fenton

+ +

GoodReads Summary: +The extensive adoption of JavaScript for application development, and the +ability to use HTML and JavaScript to create Windows Store apps, has made +JavaScript a vital part of the Windows development ecosystem. Microsoft has +done extensive work to make JavaScript easier to use. Microsoft's TypeScript +extends many familiar features of .NET programming to JavaScript. With +TypeScript Succinctly by Steve Fenton, you will learn how TypeScript provides +optional static typing and classes to JavaScript development, how to create +and load modules, and how to work with existing JavaScript libraries through +ambient declarations. TypeScript is even significantly integrated with Visual +Studio to provide the autocompletion and type checking you are most +comfortable with.

+
+ ★★★★☆ +
+

Without jumping into too much detail, the book gives a little introduction to +TypeScript, without the whole bullshit other books like to add. So it is that +I probably highlighted the whole thing.

+

Don't expect to go deep into TypeScript and all its nuances, though.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/undercity/index.html b/public/reviews/books/undercity/index.html new file mode 100644 index 0000000..0e06eb9 --- /dev/null +++ b/public/reviews/books/undercity/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Undercity - Catherine Asaro

+ +

GoodReads Summary: +Major Bhaajan, a former military officer with Imperial Space Command, is now a +hard-bitten P.I. with a load of baggage to deal with, and clients with woes +sometimes personal, sometimes galaxy-shattering, and sometimes both. Bhaajan +must sift through the shadows of dark and dangerous Undercity—the enormous +capital of a vast star empire—to find answers.

+
+ ★★★☆☆ +
+

There are some cool elements in this book, but I felt like it tried to stretch +too long and lost its pacing after the middle.

+

For example, a city built by humans teleported billions on kilometres across the +space, getting in another planet, having to learn the technology present to +survive. That's cool.

+

On the other hand, the fact that the current story is 5.000 years after that +make things a bit hard to swallow. I mean, look how much we changed in 100 years +here, imagine how much things would change in 50 times that. But it feels like +the current state is pretty much the same as 5.000 years before, so it feels the +whole thing was managed by incompetents (we learn magical technology and then +nothing).

+

Another interesting factor: The whole vision of a world controlled by women. It +really twists the current state of a male society around, when men being +"pretty" and women being the strong ones. The start of the book this is a bit +too much -- I mean, men are really shown as being just pretty pieces of meat, +and I'm not saying this 'cause I'm a man and I can clearly see that society +today treats women like that, but heck, let's kill it. 5.000 years, remember? +5.000 years and we still treat people like pretty things to shown around? +Fortunately, later this distinction mellows a bit, with the "pretty men" getting +out of the story.

+

Unfortunately, by the end of the book, things get so confusing to follow around +that I really didn't care anymore. Dialogues are well constructed, but +descriptions of sewers and such got way over me. The destruction of said sewers? +It was so confusing to me that I couldn't follow the story anymore -- and I +simply let it flow and waited for the dialogues.

+

Speaking of dialogues, the whole bunch is told in first person and there seems to +be a lot of "internal talking" just to expose things. Some are nice and really +contribute to the story, some are lengthy and add mostly nothing, and some +are... shallow.

+

Since this is a first book, I can understand that the following books may be +more involving (to me, at least).

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/web-development-with-clojure-build-bulletproof-web-apps-with-less-code/index.html b/public/reviews/books/web-development-with-clojure-build-bulletproof-web-apps-with-less-code/index.html new file mode 100644 index 0000000..4185167 --- /dev/null +++ b/public/reviews/books/web-development-with-clojure-build-bulletproof-web-apps-with-less-code/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Web Development with Clojure: Build Bulletproof Web Apps with Less Code - Dmitri Sotnikov

+ +

GoodReads Summary: +Modern web development needs modern tools. Web Development With Clojure shows +you how to apply Clojure programming fundamentals to build real-world +solutions. You'll develop all the pieces of a full web application in this +powerful language. If you already have some familiarity with Clojure, you'll +learn how to put it to serious practical use. If you're new to the language, +the book provides just enough Clojure to get down to business.

+
+ ★★☆☆☆ +
+

First of all, this book suffers from the same mistakes every single Lisp-like +language book I've read: They throw a truck at you, then slowly, while you're +being crushed by it, explain each part that creates a truck -- In other words, +they throw a large piece of code at you and then slowly explain each part of +it.

+

Even worst, in the last parts, it's basically "here is truck, take it" -- very +little explanation about the code itself, just "we'll do this" and code. What +the pieces of code mean, that's entirely to you.

+

Another problem: no tests. The author prefers the REPL approach, which is okay +for little projects, but for projects that should last longer than a weekend +project. No only that, but even the tests are wrong, because it mocks the +database -- Database is part of your project so it should be tested along +all the other tests.

+

And, on top of that, there is a REST server with sessions, and a lot of code +just to keep the frontend session in sync with the server session. That's +actually not how a REST server works.

+

And while I usually don't comment the technology behind the book (because it's +not the author's creation), I really have to ask if Clojure is the right tool +for web servers. I mean, a lot about Clojure is about immutability and a lot +about the shown code is forcing mutability -- one function even is composed +with nothing but functions that force mutability.

+

So, not only the book itself doesn't give a clear picture about web +development in Clojure, the language itself doesn't appear appropriate for +such task.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/web-development-with-django-cookbook/index.html b/public/reviews/books/web-development-with-django-cookbook/index.html new file mode 100644 index 0000000..c61f171 --- /dev/null +++ b/public/reviews/books/web-development-with-django-cookbook/index.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Web Development with Django Cookbook - Aidas Bendoraitis

+ +

GoodReads Summary: +Over 70 practical recipes to create multilingual, responsive, and scalable +websites with Django About This Book Improve your skills by developing models, +forms, views, and templates Create a rich user experience using Ajax and other +JavaScript techniques A practical guide to writing and using APIs to import or +export data Who This Book Is For.

+
+ ★☆☆☆☆ +
+

First point: This book is terribly outdated. It focus on Django 1.6, which is +at least 3 versions behind the current one (at the time of this review). 1.6 +is so old that you can't find its documentation on the Django Project page +anymore.

+

Second point: This book is terrible. I mean, one of the very first examples it +talks about a mixin with creation date and modified date, which is pretty damn +easy with Django, but instead of using "auto_now=True" and/or +"auto_now_add=True", it overrides save() on the model. Now terrible enough? +Later in the book, it creates a templatetag to access model directly, which +completely obliterates the MVT (model-view-template) model of Django. Still +not terrible enough? Again in the very first part of the book, to prevent +browser caching issues, it gives a recipe for using the SVN revision in the +static path; the wrong part of it is: a) it means you'll have to have SVN in +your server instead of using proper setup.py to deliver your apps, b) it does +a system() call, which is slow, c) there is a prop in SVN which allows you to +use "$Id$" to automatically save the revision on commit (pretty much like CSV) +and d) If you're having caching issues, that's a problem with your webserver, +not Django.

+

(I won't even talk about long chapters talking about MPTT with examples either +don't show the tool properly or MPTT is so useless one could replace it with a +single ForeignKey.)

+

The whole book feels like someone searched for "django" on StackOverflow and +dropped the first answers.

+

In the end, the book is only good for giving you some ideas of what is +available with Django, not how to properly develop a Django app.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/wikileaks-inside-julian-assanges-war-on-secrecy/index.html b/public/reviews/books/wikileaks-inside-julian-assanges-war-on-secrecy/index.html new file mode 100644 index 0000000..3083c64 --- /dev/null +++ b/public/reviews/books/wikileaks-inside-julian-assanges-war-on-secrecy/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

WikiLeaks: Inside Julian Assange's War on Secrecy - David Leigh

+ +

GoodReads Summary: +A team of journalists with unparalleled inside access provides the first full, +in-depth account of WikiLeaks, its founder Julian Assange, and the ethical, +legal, and political controversies it has both uncovered and provoked.

+
+ ★★★☆☆ +
+

Almost a Cablegate novelization

+

The first comment I did on my updates about this book is "Words, words, words. +This doesn't look good." This is my warning that there are some things the +writer did that are completely unnecessary and could be thrown out without +losing any context. There are a lot more of those "words, words, words" +moments all over the content, so much that the book feels more like a +novelization of the Cablegate events than a proper recounting of the events.

+

It doesn't make the story itself bad, it is a good story with a lot of cruft.

+

But the story itself it's about Wikileaks, from its inception to the release +of the so called Cablegate -- the release of several diplomatic cables. +Actually, Wikileaks is just the background story here; the whole action is +more about how The Guardian dealt with Assange and the other publishing +partners than Wikileaks itself.

+

It's not a bad story, even with the abundance of words. There are a lot of +forgotten elements -- like the story behind Manning and his leaking -- which +tend to be completely ignored at this point. But, again, there are too many +unnecessary words that go nowhere. Prepare to get annoyed about the continuous +mention of the some cable over and over again -- and see the said cable in its +complete form in the end.

+

(Why I'm mentioning this? 'Cause the book makes a huge deal of how several +cables affected international politics, but keep mentioning the same three +cables over and over again. I mean, if several where that important, why are +the same three mentioned so many times?)

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/will-eisners-the-spirit-who-killed-the-spirit/index.html b/public/reviews/books/will-eisners-the-spirit-who-killed-the-spirit/index.html new file mode 100644 index 0000000..296caef --- /dev/null +++ b/public/reviews/books/will-eisners-the-spirit-who-killed-the-spirit/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Will Eisner's the Spirit: Who Killed the Spirit? - Matt Wagner

+ +

GoodReads Summary: +To celebrate the 75th anniversary of Will Eisner's most iconic character, +Dynamite Entertainment proudly assembled the creative dream team of Eisner +Award-winning author Matt Wagner, artist Dan Schkade, and colorist Brennan +Wagner to honor the legend with an all-new adventure!

+
+ ★★☆☆☆ +
+

In my teens, I got two Spirit books on a sale.

+

I absolutely loved the story and the lines. It was my first experience with +adult comics: Color only when really needed, deep story without a good vs evil +(well, it was, but it was not all black and white), excellent drawing...

+

This is not it.

+

This is nothing like the original Spirit.

+

This is a sad rip off.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/write-great-code-volume-i-understanding-the-machine/index.html b/public/reviews/books/write-great-code-volume-i-understanding-the-machine/index.html new file mode 100644 index 0000000..6a651b8 --- /dev/null +++ b/public/reviews/books/write-great-code-volume-i-understanding-the-machine/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Write Great Code: Volume I: Understanding the Machine - Randall Hyde

+ +

GoodReads Summary: +Write Great Code, Volume 1 teaches machine organization, including numeric +representation; binary arithmetic and bit operations; floating point +representation; system and memory organization; character representation; +constants and types; digital design; CPU, instruction set, and memory +architecture; input and output; and how compilers work.

+
+ ★☆☆☆☆ +
+

"Great code" is machine dependent and written in assembly. Or, at least, +that's what this book makes you believe till the very last chapter, when it +starts backtracking about writing code directly into CPU code.

+

Now, don't get me wrong, it's not a terrible book -- it's a damn complete book +about computer architecture, even being so out-of-date that there is no word +about SSDs (when talking about storage), no mention about MP3s (when +discussing about audio hardware), the top CPU discussed is Pentium, there is +no word about UTF-8 (and mentions ASCII is used all around) and recommending +search things on AltaVista.

+

The problem is discussing all this when the topic is "great code": Great code +is not machine dependent; great code is not highly optimized code that runs +extremely fast and uses very little memory; there are trade offs that you have +to take in account when coding: Sure, you don't write something that uses all +the available memory, but you write in a language that allows you to easily +extend the code later and which your code reads exactly what you meant it to +say. That's great code, not code that uses some multimedia extensions that is +available since a very specific generation of CPUs.

+

The book also goes into great lengths to explain stuff that is hardly useful. +For example, there is a whole implementation of the floating point standard +(IEEE 754), which is not optimized -- so, no great code -- and that's +absolutely unnecessary, since this is done directly into the CPU (and, if it +isn't, you have libraries ready for that).

+

It could be that the "Great Code" will come in the later volumes, but ignoring +what is great code (I mean, real great code) and just building a base for +later is plainly greedy.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/books/zoes-tale-old-mans-war-4/index.html b/public/reviews/books/zoes-tale-old-mans-war-4/index.html new file mode 100644 index 0000000..3f5a3eb --- /dev/null +++ b/public/reviews/books/zoes-tale-old-mans-war-4/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Zoe's Tale (Old Man's War, #4) - John Scalzi

+ +

GoodReads Summary: +Everyone on Earth knows the tale I am part of. But you don't know my tale: How +I did what I did — how I did what I had to do — not just to stay alive but to +keep you alive, too. All of you. I'm going to tell it to you now, the only way +I know how: not straight but true, the whole thing, to try make you feel what +I felt: the joy and terror and uncertainty, panic and wonder, despair and +hope. Everything that happened, bringing us to Earth, and Earth out of its +captivity. All through my eyes.

+
+ ★★★★☆ +
+

It's been awhile since I've read The Last Colony and, when I started reading +this book, I thought "I've already read this, but since I don't remember +everything, no damage in reading it again". And somethings were different, so +I thought "Well, my memory is not the same anymore, it seems." And when I +finally finished the book and read the author's commentary about it, I finally +realized I didn't read "Zoe's Tale". At all.

+

Instead of going forward with the tale of Old Man's War main protagonists, +Scalzi starts at the very start of "Last Colony" and tells the same story by +the eyes of another character, this time (wanna guess?) Zoe. Kinda like +[book:Shadow of the Giant|8647 (and its series), which follows Bean instead of +Ender.

+

It's a fun book -- I still love the way Scalzi writes -- but if you try to +read after reading Last Colony, you may think you're reading the same thing +again.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/index.html b/public/reviews/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/reviews/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/reviews/movies/13-hours/index.html b/public/reviews/movies/13-hours/index.html new file mode 100644 index 0000000..0a3f679 --- /dev/null +++ b/public/reviews/movies/13-hours/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

13 Hours (2016)

+ +

Wikipedia Summary: +The film follows six members of Annex Security Team who fought to defend the +American diplomatic compound in Benghazi, Libya after waves of attacks by +militants on September 11, 2012.

+
+ ★☆☆☆☆ +
+

For some weird reason, I thought the movie was directed by Scorcese: Long +explanations, long dialogues, almost like some chess match in which players just +keep moving one peon at the time...

+

... and then the explosions started.

+

"Scorcese went full Michael Bay", I though. Lo and behold, this is a Michael Bay +movie.

+

And, as any Michael Bay movie, you can't expect that it was two actual players +just moving peons in a board. No no, it was just two pigeons pecking the peons +thinking it was food.

+

As any war movie of this kind, there is the obvious camaraderie between +soldiers, in which you actually know one of them will die; as any war movie of +this kind, one of the soldiers is about to become a parent; as any war movie of +this kind, the enemy is just bad and have no reason besides "kill the +protagonists".

+

But it is based on real facts, but the movie seems to have ignored the why it +reached that situation. History tells us that Gaddafi was taken out of power and +that created a power vacuum, which led to extremists taking control. That's +bad. And that is portrayed as the only reason everyone hates the American +ambassador.

+

Actually, no. That isn't portrayed. The Libyans simply hate Americans and +want to kill Americans. No, it is not because everybody drives their beaten up +cars while the Americans have brand new -- and, weirdly enough, never truly +covered in dust -- cars. No, it is not because everywhere is a desert, except in +the ambassador house and the annex compound. No, it is not because it seems +Americans have turned their life pretty comfortable and doesn't seem any bit +interested in helping the country they are in. Nope, it is pure hate for +Americans.

+

Again, as any war movie of this kind, there is the obvious "6 guys can hold up a +horde of 300". No, it is fine, really. You see, Americans are way superior than +any other country, so they can easily hold against that many. Bullets? Oh, no +worries, bullets materialize up in thin air to keep the blood of the enemies of +the greatest nation flowing.

+

In the end, the movie is only worth for the Michael Bay +Explosions.

+

(Actually, fun fact: There is a scene when a bus coming with a large bomb and +the Americans manage to hit it while it is inside the bus, which explodes like +some sort of fire works factory going nuts.)

+

PS: Heck, I understand that I tried to stay away from showing any signs of +taking sides, but I guess I'm still pissed with +Greenland.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/ad-astra/index.html b/public/reviews/movies/ad-astra/index.html new file mode 100644 index 0000000..41a0a44 --- /dev/null +++ b/public/reviews/movies/ad-astra/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Ad Astra (2019)

+ +

IMDB Summary: +Astronaut Roy McBride undertakes a mission across an unforgiving solar system +to uncover the truth about his missing father and his doomed expedition that +now, 30 years later, threatens the universe.

+
+ ★★☆☆☆ +
+

I remember some friends saying that "The movie looks like sci-fi, but it +isn't", but I have to say, it is sci-fi. It's not classic sci-fi, in which +they use some futuristic/scientific-based upgrades to explore some other topics +-- Star Trek is a classic in doing this. But this movie does a whole metaphor +using sci-fi.

+

One of the curious aspects is that they managed to make old actors look like +old people. Tommy Lee looks old. Donald Sutherland looks old. Even Brad Pitt +looks somewhat older than me (well, almost older than me). Gone are the days +of 51-year-old Tom Cruise looked like 30-something in "Oblivion". No, Brad Pitt +character looks 40-almost-50, Tommy Lee looks like the father or someone +40-almost-50 and Donald Sutherland looks like the colleague of that father. It +is a nice change, though.

+

The visuals are impressive, almost "Gravity" quality. The space elevator/power +generator looks like a real thing. I almost got pissed in that intro 'cause it +seemed they forgot something, but then things happen and I wasn't that pissed +anymore.

+

The movie pacing is weird. There are not speed ups and no speed downs, but the +whole thing moves like a crawl, to the point of boredom. I could watch +something on my phone during the movie (I watched at home, not in the cinema, +don't worry) and I didn't lose anything, in the end.

+

And, speaking of the end, that's when the whole metaphor downs to you. But +then, you're tired of the crawling pacing and it feels really "meh".

+

I may watch again for the visuals, but would probably switch channels in some +less visually appealing scene and get lost in some other movie.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/greenland/index.html b/public/reviews/movies/greenland/index.html new file mode 100644 index 0000000..b7df3f5 --- /dev/null +++ b/public/reviews/movies/greenland/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Greenland (2020)

+ +

Wikipedia Summary: +The film follows a family who must fight for survival as a planet-destroying +comet races to Earth.

+
+ ★☆☆☆☆ +
+

If you have some American friend that keeps asking "Why the world doesn't like +America?", you can ask them to watch this movie and learn.

+

The movie is, basically, "2012" +upside-down: Instead of destruction coming from the centre of the Earth itself, +it's coming from space. But, for some reason, governments built some sort of arc +to save people -- selected people. And our hero was selected, even when his +family have health issues -- his kid has diabetes and, thus, shouldn't be +selected, as only healthy families can join the "arc". In a way, it makes sense, +you don't want to spend energy and food with people that could die any moment if +you want to save the human race, right?

+

So far, no reason to dislike the United States, right?

+

But then, you have this amazing line, told by a newscaster: "Meteors are falling +all over the planet! This could be the end of this great nation."

+

HOLD YOUR FREAKING HORSES! Meteors are falling everywhere, all around the +planet but they are worried about the great nation? Fuck your entitlement.

+

But that's not enough. Surely Gerard Butler does nothing to hide his accent and, +while hitchhiking on a truck on the way to his father-in-law house, marked as +the reunion place after he got separated from his wife and kid, he mentions he +was called to another fellow hitchhiker, but couldn't board. And then, another +guy in the same truck notices this and asks "But should the government give +space for people like you?" (or something around those lines). "America is for +Americans!" Fight insures and some friendly black guy is killed, 'cause of +course the black person has to die. All for the good of the great nation.

+

Not enough? Ok, let me give you the kicker: The arc is actually a subterranean +base built on... GREENLAND! It's not even in freaking United States, the great +nation had to build their safe somewhere else!

+

Also, being the hero and such, Gerard Butler and his family finally reach +Greenland and find the base and they are took without a peep. Why would you +accept people coming from everywhere, with no checks, if you were refusing sick +people in the first place?

+

I'm pretty sure the general plot is pretty awesome idea -- even if it feels a +bit like Deep Impact -- but +it seems if focused too much into one piece of the planet. Heck, even The +Core managed to show the whole world +being destroyed.

+

PS: By the words here, it may seem that I want to destroy MURRICA or +whatever. That's not the point; thing is, sometimes the way USA is presented +around the world may give this feeling of "they feel superior", but I'm pretty +sure only Fox News would report the "dead of our great nation", but everyone +else would report the global problem as a global problem and the heckneck that +hates anyone not-American is part of a very small portion of the Americans. And +to light the mood: "I don't hate Americans, I have friends that are!"

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/index.html b/public/reviews/movies/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/reviews/movies/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/reviews/movies/kill-switch/index.html b/public/reviews/movies/kill-switch/index.html new file mode 100644 index 0000000..4660d80 --- /dev/null +++ b/public/reviews/movies/kill-switch/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Kill Switch (2008)

+ +

IMDB Summary: +A troubled detective travels to Memphis in order to track down a pair of serial +killers.

+
+ ★☆☆☆☆ +
+

A movie for and by Steven Seagal. That should say a lot about it.

+

The script is, basically, a mess. It shouldn't be, if it focused on a single +story, but it actually tries to follow up to three different plots: There is a +serial killer that uses zodiac signs on women; there is a murdered that, for +some reason, falls from a 3 store tall building, survives and gets out of jail +(completely healed and with no scars) 3 weeks or so later; and there is this +FBI agent that wants to figure out the real killer.

+

All that in 1h and half.

+

But... is it bad? The problem is the lack of focus: Now you're following the +zodiac killer, now you're seeing the murderer, now you're following the FBI +agent and some procedural content, now back to the zodiac killer, now to the +FBI, now some intermission, now the zodiac, now the FBI, now the murdered... +And there is some serious lack of connection between them -- except the +detective (the protagonist, Seagal himself), which was the responsible for the +murderer to fall that 3 store high building and it is going after the zodiac +killer while dismissing the FBI agent.

+

The plots "join" in the very end, by pure force of script, but while the story +makes all the moves to frame the protagonist, miraculously the serial killer is +captured -- after being both arms and legs broken by the protagonist, with no +reprimand -- and admits he was trying to frame the detective. But no worries, +he managed to disappear completely after killing the murderer, just after +beating the serial killer, so it is all good.

+

Also, it seems he's living with a female cop -- who, for some reason, likes to +run around the house in silk robes and that's it -- but, when he disappear, he +goes back to his family -- wife and two kids -- which is never mentioned +everywhere. This last scene seems really forced, not only 'cause there was no +mention of said wife and kids while living with another woman, but as soon as +he gets home, the kids are dismissed and the wife leads him to the bedroom, +where we can see boobies. I mean, why?

+

There are also some dubbing by Seagal over the fights, in a "loud whisper" type +of talk, like he's beating someone with no effort at all. Speaking of the +beatings, there is one scene when Seagal is beating a thug and punches over and +over the thug chest area, but you hear something like someone smashing a bag of +nuts. "Holy cow, he's breaking all the guy ribs!", you think; but no, 2 seconds +of no beating and the guy is up and throwing -- missing, actually -- punches at +the detective again. Also, it seems some of those beatings they though "Let's +put some cameras around the scene, so we can pick different angles and later +pick the best one", but decided that all the angles were the best ones, so +you get free three-punches-on-different-angles for the price of one.

+

(That angle thing went so far that, when Seagal throws the murderer out of the +window, you see the throw 4 times, all in the different angles, all in +succession.)

+

None of the plots are new, the plots seem put together just to fill movie time, +there is some bad editing and, well, Seagal acting. Make your own conclusion.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/king-kong/index.html b/public/reviews/movies/king-kong/index.html new file mode 100644 index 0000000..135e325 --- /dev/null +++ b/public/reviews/movies/king-kong/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

King Kong (2005)

+ +

IMDB Summary: A greedy film +producer assembles a team of moviemakers and sets out for the infamous +Skull Island, where they find more than just cannibalistic natives.

+
+ ★★☆☆☆ +
+

If I could summarize it, I'd simply put "weird".

+

Sure, the special effects are a lot better than the original version, +done in claymation. But the whole of the story is simple... nothing +new. I mean, there are movies that took the original story and update +it to the current times, like "The Day the Earth Stood Still"; others, +are timeless, like "Twelve Angry Men" (which shouldn't make sense at +this time), but the only update from the original is that they put +Jack Black saying catchphrases from time to time -- not that his +acting is bad, the character just seems out of place, like someone +acting the way they acted in the 20s with the rest of the cast in the +90s.

+

Again, the special effects are pretty damn good, with Andy Serkis +leading the titular monkey. But, again, it's hard to put an excuse for +a remake only for that.

+

In the end, if they just coloured the original version and updated the +visuals, the result may be actually better.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/meet-the-censors/index.html b/public/reviews/movies/meet-the-censors/index.html new file mode 100644 index 0000000..f3467c9 --- /dev/null +++ b/public/reviews/movies/meet-the-censors/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Meet the Censors (2020)

+ +

IMDB Summary: +From a Kafkaesque office for social media in Germany into South Sudan military +headquarters, to conversations with an Iranian Ayatollah, Indian film censors +and Chinese news editors. Norwegian filmmaker Håvard Fossum has traveled the +world to understand what censorship is, allowing the censors themselves to +state their case.

+
+ ★★★★★ +
+

With no pretense whatsoever, I decided to watch this documentary. Its start is +a bit wobbly, making you feel like you just jumped in the middle of something +else. But also, in the very start, lies the kernel of the movie.

+

It all start with some Neo-nazi march. And there, it lies the question: +Shouldn't those people be censored for spewing their hate? And thus start a +quest to see how some countries do their censorship: What is censored? What are +their rules? Do they have rules?

+

The only downside is the ending: Sure, after going to China, Iran, India and +such, you'd expect the filmmakers to go some where more "free". And, obviously, +the "free" place is not as "free" as it seems.

+

It's a curious documentary, with some expected results and some expected (no) +answer.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/nekrotronic/index.html b/public/reviews/movies/nekrotronic/index.html new file mode 100644 index 0000000..bafb37a --- /dev/null +++ b/public/reviews/movies/nekrotronic/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Nekrotronic (2018)

+ +

IMDB Summary: +A man who discovers that he is part of a secret sect of magical beings who hunt +down and destroy demons in the internet.

+
+ ★★★☆☆ +
+

Someone is trying to be the next "Yahoo Serious", but not getting there.

+

Don't get fooled by the summary: It's not that the secret sect hunt demons in +the internet; the original plot do a flip that is actually pretty smart: demons +always took the bodies of humans and, in modern days, decided to live in the +internet. Why I think it is smart? 'Cause they make a pretty good case for +seeing so much hate online these days.

+

But while the initial setting seems pretty good, you can see that it is an +independent movie when things get shorted in some places. The movie tries to +make some technobabble of demon hunting, special gear and such, with the lack +of funding it just looks like some silly costumes.

+

Still, it is quite fun in some parts, and the goofy style -- which the actors +also seem to grasp and act on it -- make a somewhat nice comedy.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/spy-game/index.html b/public/reviews/movies/spy-game/index.html new file mode 100644 index 0000000..7597711 --- /dev/null +++ b/public/reviews/movies/spy-game/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Spy Game (2001)

+ +

IMDB Summary: +Retiring CIA agent Nathan Muir recalls his training of Tom Bishop while working +against agency politics to free him from his Chinese captors.

+
+ ★★☆☆☆ +
+

In this episode of Spy Game:... Wait, I mean... In this movie, Robert Redford +plays a retiring spy that, in his last day in the office, finds out his +protégé, played by Brad Pitt was captured. While trying to save him, each +episode... I mean...

+

Ok, fuck it, ok? The movie feels like someone wrote three-to-four episodes of a +TV series and, when he couldn't sell it, turned into a movie. This makes the +movie feel like a bunch of unconnected stories instead of one single story. +While trying to explain why Redford character would care about Pitt character, +they throw a bunch of stories about the way they met, how they worked together, +their quarrels, and so on.

+

Sure, you can explain the very last thing through a series of events, and some +movies did this pretty fine (including showing things out of order, like "Pulp +Fiction" and "Memento"), but here, again, it feels like someone wrote a series +about spies in the CIA, with a mentor and his replacement and tried to make a +movie out of.

+

It even feels like Redford and Pitt tried their best to portrait a grizzly spy +veteran who-have-seen-it-all and new trained spy who-still-cares-about-people, +the stories doesn't help. And some stuff is just plain bad, like the uncanny +ability of Redford character to read titles of papers showing in window +reflections, to the surprise of everyone in the room.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/survive-the-night/index.html b/public/reviews/movies/survive-the-night/index.html new file mode 100644 index 0000000..e542d17 --- /dev/null +++ b/public/reviews/movies/survive-the-night/index.html @@ -0,0 +1,102 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Survive the Night (2020)

+ +

IMDB Summary: +A disgraced doctor and his family are held hostage at their home by criminals +on the run, when a robbery-gone-awry requires them to seek immediate medical +attention.

+
+ ★☆☆☆☆ +
+

A robbery gone wrong. A dead innocent. A wounded criminal. And some doctor that +miraculously lives in the middle of nowhere and that can't see he's been +followed.

+

And that's basically it. Everything else you can already guess: criminals would +force him to save the wounded one, he'll fight, there will be some tense +moments but, in the end, everything will end up fine. It's weird that this kind +of absolutely bland stuff still gets made. It's even weirder that someone with +a big name, like Willis, would be part of it. And, yet, there it is.

+

It seems nobody actually expected much of this, specially Willis. I mean, sure, +the plot is bland and all, but Willis does a recap of his work in "Unbreakable" +-- minus the power up thingy -- which feels lazy.

+

In the end, one hour and half waster.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/the-colony/index.html b/public/reviews/movies/the-colony/index.html new file mode 100644 index 0000000..82b93c6 --- /dev/null +++ b/public/reviews/movies/the-colony/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Colony (2013)

+ +

IMDB Summary: +Forced underground by the next ice age, a struggling outpost of survivors must +fight to preserve humanity against a threat even more savage than nature.

+
+ ★★★★☆ +
+

The cinematic version of "Fallout".

+

Ok, not as clear as Fallout, but close enough: Instead of nuclear blast, the +world is destroyed by some ice age due climate change and groups of people now +live inside bunkers. Thing is, the bunkers can talk to each other, but they are +running low on supplies -- meds and food -- so anyone sick is "removed".

+

Now, that the kind of scifi I do like, even with the low budget and just a few +scenes from the big names (Lawrence Fishburne and Bill Paxton) and not-no-great +acting from the new comers.

+

Sure, the "threat" is never truly explained -- or, even being in my ballpark, +never caught my attention -- and never solved -- that part I'm sure -- but +still, it is another movie exploring the way people act upon survival +situations.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/the-escort/index.html b/public/reviews/movies/the-escort/index.html new file mode 100644 index 0000000..23e4ad7 --- /dev/null +++ b/public/reviews/movies/the-escort/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Escort (2015)

+ +

Wikipedia Summary:

+

Journalist Mitch is a sex addict. When he is fired, he applies for a job with a +magazine. The editor promises to hire him if he writes a more interesting +article than his competitors. He decides to write about Natalie, a +Stanford-educated escort he met by chance.

+
+ ★★☆☆☆ +
+

Honestly, I'm not even sure this should be a 2-star movie. I mean, look at the +plot: It's some guy and a escort and they start going together. Do you have a +feeling this would end up like Pretty +Woman? Heck, this is even mentioned +in the movie, by Natalie/Victoria, asking if Mitch thinks this would end up like +the (other) movie.

+

Well, it does, and the quip in the movie doesn't do anything to soften the +slouch of clichés in the movie: Surely the guy who doesn't get attached to +anyone will get attached to the girl; surely the girl will rethink her +profession and only then will consider going into a relationship; surely +something will change in the girls life to make her get out of her job; surely +the attraction between them would make the guy rethink his addiction; surely +after that his relationship to those around him will get a 180 degree turn to +the best.

+

But the thing is... I have a crush on Lyndsy Fonseca. Not just she's pretty, her +acting doesn't look like acting. OK, it's not Donald Sutherland level of acting +but heck, the way she speaks feels like some real person, in whatever situation +she's in, speaking. It's not from this movie, but even in Kick-Ass it was pretty +damn good. There is a scene when Mitch tells, among other things, that Natalie +is pretty and she quips back "Oh, you think I'm pretty?" in a juvenile/childish +way that feels incredible natural. And that's why it is not just a single star.

+

Michael Doneger, Fonseca's pair, on the other hand, it is pretty hard +case. Personally -- and I'm saying this as a movie-watcher, not a movie-critic, +something that I'm not -- I can't see his acting being that good, but also the +lines feed to him -- which, apparently, were also written by him -- seem forced +and not that much natural. Sure the chemistry with Fonseca work, but the +character itself is not that good.

+

In the end, I guess the movie could distance itself from "Pretty Woman" by +simply not going that road: Make Mitch still be a sex addict; make Natalie still +be an escort; let their friendship/relationship not get into what the characters +are. I mean, there is something in a scene where the two are discussing clinics +for STDs and their posters. Let it continue from there. They could even keep the +relationship while keeping their problems/jobs. Make +something... different. Challenge the status quo that a relationship can't work +if one side is a sex addict and the other a hooker.

+

It's not a boring movie, it's just... bland.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/unhinged/index.html b/public/reviews/movies/unhinged/index.html new file mode 100644 index 0000000..579d1c4 --- /dev/null +++ b/public/reviews/movies/unhinged/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Unhinged (2020)

+ +

IMDB Summary: +After a confrontation with an unstable man at an intersection, a woman becomes +the target of his rage.

+
+ ★★☆☆☆ +
+

The movie starts with a Crowe of the size of a Goodman attacking a couple with +a hammer and then burning a house. After that, we switch for a family of a +disorganized mother (Caren Pistorius), who just got fired and it is late to +take her kid to school. In a traffic light, a truck -- later shown as being +driven by Crowe -- doesn't move when the lights turn green, she presses the car +horn too strongly, the guy on the truck gets pissed, gets no "I'm sorry" and +decides to show what a "bad day" is. Then the chase starts.

+

... and that's basically it, and you can already figure out the end by the +simple fact of how they shown Crowe as a bad guy and Pistorius as a +bad-luck-mother.

+

What would be the main points of the movie, the chases in the streets, actually +are very few and not that bad, accept that Crowe manages to create the worst +case scenarios -- like a cop truck being smashed by a concrete truck -- out of +pure luck -- or lack of luck for Pistorius, I don't know.

+

So you have the killings, which also seem like Crowe managed to think and plan +all of them in advance, instead of being a spur of the moment. How? No idea.

+

Actually, the whole thing is weird. I mean, ok, there is the road rage, but +what broke Crowe in such way that he would kill people to torment a woman +because a honk? Why he burned the house in the very beginning of the movie? +Nothing is said about this and he's shown simply as "bad guy".

+

While Crowe is still Crowe and delivers, the plot is too magical to actually +make sense.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/movies/youve-been-trumped-too/index.html b/public/reviews/movies/youve-been-trumped-too/index.html new file mode 100644 index 0000000..d4981c0 --- /dev/null +++ b/public/reviews/movies/youve-been-trumped-too/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

You've Been Trumped Too (2016)

+ +

IMDB Summary: +A chronicle of the confrontation between billionaire Donald Trump and feisty +92-year-old Scottish widow, Molly Forbes.

+
+ ★★★☆☆ +
+

On the eve of 2016 election, a filmmaker decides to make a point about the +republican candidate for the USA presidency, Donald Trump, focusing on the +struggles of an old lady in Scotland, whose water have been cut with the +constructor of Trump gold course.

+

For the plot, you can imagine how it would go: focusing on the "don't care +about others" from Donald, which failed to recognize he (and his business) +harmed some other folk. Also, you can imagine that his whole family -- +specially Donald Trump Jr -- would also not give a shit about their actions +affecting someone else. And you can expect that there is a lot of speculation +that the Trump family is actually using politics to force people out of their +homes so they can built a bigger golf course.

+

Where the movie falls short, though, is the feeling that the filmmakers thought +they could actually make a dent on Trump's campaign for presidency using just +one story. Sure, a 92-year-old lady that gets cut from her water supply, have +to have her children bring bottled water so she can have water to drink and +only wishes to have a real shower, all that while Trump Corporation (and his +son) keep saying that they will fix the problem, do absolutely nothing and, +when a neighbor takes the matter in his own hand and gets sue for it, it is +infuriating, but you don't expect that voters in the USA -- voters that would +(and did) vote for Trump -- would care about some old lady in Scotland, do you?

+

In this line of "trying to make you furious", there are some selected quotes +from voters, like "Maybe she shouldn't have water anyway" from a man, and two +Trump supporters saying they they understand the neighbor going after a power +"bigger than him", 'cause they are also going after a power bigger than them, +which is Hillary Clinton. Oh, sure you understand, but you're supporting the +power bigger than him, you dumb fucks!

+

(See, it works, sometimes.)

+

If they have picked up more stories, shown more people affected by the lack of +sympathy of the Trump Corporation and such, maybe it would feel more like a +real contender, as sad as it is a 92-year-old woman having no water to shower +or even drink.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/american-playboy/index.html b/public/reviews/series/american-playboy/index.html new file mode 100644 index 0000000..3a0c756 --- /dev/null +++ b/public/reviews/series/american-playboy/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

American Playboy: The Hugh Hefner Story

+ +

IMDB Summary: +The Amazon Original Series draws from unprecedented access to more than 17,000 +hours of footage and over 2,600 scrapbooks from Hefner's personal archives, +chronicling the life of an American icon and the history of the brand he +created.

+
+ ★☆☆☆☆ +
+

A series about Hugh Hefner, creator of the "Playboy" magazine. And, more than +than, a series for Hugh Hefner.

+

One sided documentary/docuseries is not something new, but I can remember +something so blatantly for the subject like this before.

+

Oh sure, Hefner came with an idea for a entering-adulthood-male magazine and +managed to interview some important personalities, give tips on wines and music +and clothing. And have naked women on them.

+

But, oh look, Playboy interviews Malcolm X, look like progressive they are! Oh, +look, they are showing a black woman naked on their pages! Oh, look, Penthouse +shows up, showing more risqué content, but Playboy won't do that with their +women, 'cause they are not about this. Oh no, poor Hefner is being attacked by +feminists for showing women as objects, and he can't understand, 'cause he +feels he's liberating and empowering them!

+

(Although I reckon feminists are right on this one, one can't stop thinking how +Playboy also treated men as objects: buy this, drink that, listen to this; +otherwise, you're not cool. Not in the same proportion, I understand, but +still...)

+

Oh, and Hefner? Focused on his business and not his (first) family, but that's +a problem with the way he was raised, not his. Oh, bad things, Hefner divorce, +but they are still friends. But fret not, one model caught his eyes and BLAM! +Love at the first sight! But it didn't last. Poor Hefner. But oh look, another +model! Another love at first sight! They are really meant to be together. +Except they don't 'cause she turned singer and he went to have afairs. How can +Hefner be happy if there isn't a woman near him? But don't be sad, they are +still friends. ANOTHER model caught his eye! They immediately fall in love. And +it lasts till they divorce, but hey, there are still friends! Another model! +(Rinse, repeat).

+

The love life of Hefner is one of the things that made me really pissed. He +openly admits he can't be alone, his affairs are sidelined, ex-wifes always say +he's so loving, just one admits she didn't like that he wanted an open +marriage for him and not for her and one you can clearly see that she does not +want to have Hef around, looks annoyed in the filming, but the narration said +they divorced and are "friends".

+

This is the kind of thing that push a documentary down. There are no downsides +of Hefner: He's loving, he's successful and he got ideas. Things he did wrong? +No, no things wrong, he's perfect!

+

The series is interesting around the initial episodes, showing the steps in the +creation of the Playboy magazine. But then it gets into this "social aspect" of +the magazine, and doesn't pip a thing about Hefner affairs, and it gets +annoying as fuck.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/good-omens/index.html b/public/reviews/series/good-omens/index.html new file mode 100644 index 0000000..26ab48c --- /dev/null +++ b/public/reviews/series/good-omens/index.html @@ -0,0 +1,107 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Good Omens (2019)

+ +

Wikipedia Summary: +Set in 2018, the series follows the demon Crowley (David Tennant) and the angel +Aziraphale (Michael Sheen), longtime acquaintances who, having grown accustomed +to life on Earth as representatives of Heaven and Hell, seek to prevent the +coming of the Antichrist and with it Armageddon, the final battle between +Heaven and Hell.

+
+ ★★★★★ +
+

There is a certain "Douglas-Adams-ian" style on the series that really made my +day (I bet it was all Pratchett fault here, but I haven't read Pratchett yet, +so YMMV). And by that I mean the narration throwing you into confusion, text +snippets that show up to throw you into confusion and the general "Oh, nuns. +But they are SATANIC nuns" out of nowhere. All those misdirections just +make the whole thing funnier.

+

Also, you can see that the whole cast was having a blast doing it -- and I bet +Tennant was the one having the best time of all. Jon Hamm, playing Gabriel as a +"I don't fucking care about being good" angel is hilarious. Miranda Richardson, +whose character later in the series have to share the body with another spirit +does an amazing job with the actor playing the other spirit (not going to +spoilt everything here) with the mouth motions and personality. Michael +McKean making a very strong Scottish accent was also impressive, to the point +that it really took me awhile to realize who he was.

+

So, great plot, lots of fun, actors having fun and doing an amazing job in +their roles... Even if the end is a bit obvious, it is a great series. Too bad +it is just one season.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/grand-prix-driver/index.html b/public/reviews/series/grand-prix-driver/index.html new file mode 100644 index 0000000..71c2dd9 --- /dev/null +++ b/public/reviews/series/grand-prix-driver/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Grand Prix Driver

+ +

IMDB Summary: +Grand Prix Driver goes inside the secretive world of Formula 1 by offering +never-before-granted access to the inner workings of McLaren. Narrated by +Michael Douglas.

+
+ ★★★☆☆ +
+

A series about Formula, pretty close to Drive to +Survive, although the +later focuses more on the pilots and this one focuses more on the team, the +tech and the car -- and a bit on the driver.

+

While more interesting than "Drive To Survive" by showing the whole aspect of a +Formula 1 Team like a living organism, it falls short by looking at only one +team: McLaren. There was a great potential to make more seasons, each season +focusing on a different team and their fight in the year -- and the only team I +can think of that would have a problem with someone showing what they do is +Ferrari; all others would welcome some exposure.

+

So, while interesting, it was killed too soon and not explored fully.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/index.html b/public/reviews/series/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/reviews/series/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/reviews/series/loki/index.html b/public/reviews/series/loki/index.html new file mode 100644 index 0000000..87146cb --- /dev/null +++ b/public/reviews/series/loki/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Loki (2021)

+ +

Wikipdia Summary: The series +takes place after the events of the film Avengers: Endgame (2019), in which an +alternate version of Loki created a new timeline.

+
+ ★★★☆☆ +
+

What do you make when a villain actually gets popular and the person in the part +is actually liked? You turn it into a hero!

+

Sure, it worked wonders for Catwoman.

+

But yeah, this time is Loki.

+

For the action of taking the tesseract in "Endgame", Loki is now under arrest by +some time agency, which you never heard before, for "breaking the timeline". Of +course, the Avengers, when they broke the timeline, it was expected, so they are +Ok, but Loki is not. So, what happens? The agency hires Loki to take the other +representations of Loki, so now Loki is in to save the universe.

+

So, while "Falcon and the Winter Soldier" tracked the problem with the way USA +deals with black people (including black soldiers) and "Wandavision" tracked the +problem of dealing with loss, "Loki" deals with... the idea of turning a villain +into a hero for money.

+

Not that Tom Hiddleston let his acting down, or even Owen Wilson, but the fact +that the series was created purely to take on the popularity of Hiddleston +character is a major let down.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/the-falcon-and-the-winter-soldier/index.html b/public/reviews/series/the-falcon-and-the-winter-soldier/index.html new file mode 100644 index 0000000..c0da0ec --- /dev/null +++ b/public/reviews/series/the-falcon-and-the-winter-soldier/index.html @@ -0,0 +1,127 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Falcon and the Winter Soldier (2021)

+ +

Wikipedia +Summary: The +Falcon and the Winter Soldier[a] is an American television miniseries created by +Malcolm Spellman for the streaming service Disney+, based on Marvel Comics +featuring the characters Sam Wilson / Falcon and Bucky Barnes / Winter +Soldier. It is the second television series in the Marvel Cinematic Universe +(MCU) produced by Marvel Studios, sharing continuity with the films of the +franchise and taking place after the events of the film Avengers: Endgame +(2019). Spellman served as head writer with Kari Skogland directing.

+ +

After Avengers: Endgame, +there was the expectation that we would see Falcon wielding Captain America's +shield, maybe in a future movie. But they did a series instead.

+

And instead of picking the shield, the first thing Falcon does is give it +away. And the constant complaining of Winter Soldier about it. And a dickhead +that wield the shield -- just for the money, I guess.

+

Ok, sorry, lots of spoilers there, but...

+

Sure, Falcon gives the shield away, but he gives a compelling reason: He worked +alongside Captain and knows what he does and what he represents and just don't +want to step into his friend shoes, out of respect. It's not that he doesn't see +Captain as a symbol, but he sees Steve instead. So you get what he means.

+

And yeah, Winter Soldier keeps complaining about Falcon giving the shield away, +but he's actually worried that, as Steve basically ruined his Captain America +image to save him, if giving the shield to Falcon was an error, then saving him +was also an error. But, instead of focusing on helping Falcon to actually assume +the shield and take the mantle of Captain America, he just spends the time +complaining about it.

+

And sure, the government decide to make another Captain America and take some +guy and... heck, didn't they do any psychological check if the person won't +break under pressure -- or wasn't a dick beforehand?

+

And I didn't mention, but there was a black man that was also a super soldier +and, for some reason, was never mentioned?

+

But the whole series is not just about this.

+

Falcon's fear is, underneath it, the fear of what people would think of a black +man being America's symbol. And the fact that the black super soldier refuses to +help due the way he was treated (and hidden from everyone) represents the way +black soldiers were treated after returning from World War II. And all that is +hidden in the guise of an adventure and a symbol till, suddenly, in the last +episode, the drop the gloves and all full direct, with Falcon saying things like +"Yeah, I'm here, with the shield, and being Captain America and people will +still rant 'cause I'm black".

+

The problem is reaching that point. Things move slowly 'cause hey, you need to +make 8 episodes for a thing that could be directly said in 2. And you can't have +a series based on action heroes without the action.

+

It doesn't mean the series is bad, it carries a powerful message for these days, +it just have too much filler.

+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/treadstone/index.html b/public/reviews/series/treadstone/index.html new file mode 100644 index 0000000..f65a9df --- /dev/null +++ b/public/reviews/series/treadstone/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Treadstone (2019)

+ +

IMDB Summary: +The Treadstone project, having created super spy Jason Bourne, turns its +attention on a new protocol to develop unstoppable superhuman assassins.

+
+ ★☆☆☆☆ +
+

I have no idea who the hell watched The Bourne +Identity and thought the cool part +wasn't Bourne/Matt Damon lightning reflexes or his uncanny ability to find an +escape, but actually the bureaucracy that created him. Probably Barney +Stinson1.

+

In a way, the series was doomed by its own format: While in a movie the actors +can film the "easy" scenes first while they train to do the most action heavy +scenes, in a series they don't have that luxury: This is the episode, and this +is what it will happen. There is no time for practicing some martial art or +take time training the movements in a scene over and over; there is very little +time between episodes and even littler time for this kind of stuff.

+

That's not to say that there isn't any action; there is. But is far away from +Damon's character kicking ass with a magazine.

+

So, the only remaining thing is the bureau and its problem. And that is a +complete drag, not even making it interesting in a mystery kind of way. +Unexpected things are happening, but the bureau moves in the pace of, well, +bureaucracy.

+

There is a cliffhanger in the end of the only season, and it is not even good.

+
+
1 +

For those who haven't seen "How I Met Your +Mother", there was a +running gag in which the character played by Neil Patrick Harris named +"Barney" would say that the real "Karate Kid" was the blonde kid played by +William Zabka, and that the character played by Ralph Macchio was, actually, +the bad guy.

+
+ +
+ + + + +
+ + + + diff --git a/public/reviews/series/wandavision/index.html b/public/reviews/series/wandavision/index.html new file mode 100644 index 0000000..bc71bea --- /dev/null +++ b/public/reviews/series/wandavision/index.html @@ -0,0 +1,106 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Wandavision

+ +

Wikipedia Summary: WandaVision is +an American television miniseries created by Jac Schaeffer for the streaming +service Disney+, based on Marvel Comics featuring the characters Wanda Maximoff +/ Scarlet Witch and Vision.

+ +

This is (I believe) the first forray of Disney into the Marvel after buying it +-- or, at least, the first outside the movies which Marvel had planned all +along.

+

In a way, it is a fun series, mostly 'cause you may have seen a TV series that +Wandavision is replicating. But not everything is copycating some series, there +is a story going on the side, which tries to explain why you're watching Wanda +and Vision in, say, "I Love Lucy" style, although the real reason is actually +shown in the very last episodes.

+

And the real reason for the multiple series is actually a pretty good reason, +but someone decided that it was time to introduce another villain, just in case +Disney decided to make a Wanda movie in the future.

+

In case you didn't spoil yourself yet, here it goes: Wanda is using her full +power to create an illusion in the same style of the series she watched as a +kid, after losing Vision and her brother in the movies. So the whole thing is +actually a way to deal with loss and how people search escape from the sad +feelings they feel and that affects people around -- which is a pretty large +affect part when you have magical powers.

+

Acting is top notch, with Elizabeth Olsen and Paul Bettany still doing the +quality they did in the movies. The rest of the cast just follows along.

+

In the end, it is fun series, even when the message is pretty dark.

+ +
+ + + + +
+ + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..19e2924 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://blog.juliobiason.me/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..9163064 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,5690 @@ + + + + https://blog.juliobiason.me/ + + + https://blog.juliobiason.me/announcements/ + + + https://blog.juliobiason.me/announcements/about-me/ + 2018-11-28 + + + https://blog.juliobiason.me/announcements/juliobiasonnet-40/ + 2018-11-28 + + + https://blog.juliobiason.me/books/ + + + https://blog.juliobiason.me/books/things-i-learnt/ + + + https://blog.juliobiason.me/books/things-i-learnt/add-then-remove/ + 2019-07-30 + + + https://blog.juliobiason.me/books/things-i-learnt/always-vcs/ + 2019-07-08 + + + https://blog.juliobiason.me/books/things-i-learnt/app-composition-stupid/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/application-composition/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/bad-code-defense/ + 2019-07-31 + + + https://blog.juliobiason.me/books/things-i-learnt/blogging/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/boolean-parameters/ + 2019-06-23 + + + https://blog.juliobiason.me/books/things-i-learnt/cargo-cult/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/coc/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/code-formatters/ + 2019-07-16 + + + https://blog.juliobiason.me/books/things-i-learnt/code-reviews-style/ + 2019-07-16 + + + https://blog.juliobiason.me/books/things-i-learnt/code-style/ + 2019-07-16 + + + https://blog.juliobiason.me/books/things-i-learnt/cognitive-cost/ + 2019-06-26 + + + https://blog.juliobiason.me/books/things-i-learnt/command-line-options/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/config-file/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/crash-it/ + 2019-06-24 + + + https://blog.juliobiason.me/books/things-i-learnt/data-flow/ + 2019-06-26 + + + https://blog.juliobiason.me/books/things-i-learnt/data-types/ + 2019-06-24 + + + https://blog.juliobiason.me/books/things-i-learnt/debuggers/ + 2019-07-08 + + + https://blog.juliobiason.me/books/things-i-learnt/disclaimer/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/document-and/ + 2019-06-23 + + + https://blog.juliobiason.me/books/things-i-learnt/document-is-contract/ + 2019-06-21 + + + https://blog.juliobiason.me/books/things-i-learnt/document-it/ + 2019-06-21 + + + https://blog.juliobiason.me/books/things-i-learnt/fixable/ + 2019-07-23 + + + https://blog.juliobiason.me/books/things-i-learnt/functional-programming/ + 2019-06-26 + + + https://blog.juliobiason.me/books/things-i-learnt/future-trashing/ + 2019-06-21 + + + https://blog.juliobiason.me/books/things-i-learnt/gerrit/ + 2019-07-29 + + + https://blog.juliobiason.me/books/things-i-learnt/gherkin/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/git-flow/ + 2019-07-30 + + + https://blog.juliobiason.me/books/things-i-learnt/google-code-style/ + 2019-07-16 + + + https://blog.juliobiason.me/books/things-i-learnt/handle-it/ + 2019-06-24 + + + https://blog.juliobiason.me/books/things-i-learnt/hero-projects/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/hero-syndrome/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/integration-tests/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/interface-changes/ + 2019-06-23 + + + https://blog.juliobiason.me/books/things-i-learnt/intro/ + 2019-06-18 + + + https://blog.juliobiason.me/books/things-i-learnt/languages-are-more/ + 2019-06-24 + + + https://blog.juliobiason.me/books/things-i-learnt/languages-docs/ + 2019-06-23 + + + https://blog.juliobiason.me/books/things-i-learnt/languages-tests/ + 2019-06-20 + + + https://blog.juliobiason.me/books/things-i-learnt/learn-about-yourself/ + 2019-07-19 + + + https://blog.juliobiason.me/books/things-i-learnt/libraries/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/log-events/ + 2019-07-01 + + + https://blog.juliobiason.me/books/things-i-learnt/magical-number-seven/ + 2019-06-26 + + + https://blog.juliobiason.me/books/things-i-learnt/microaggressions/ + 2019-07-23 + + + https://blog.juliobiason.me/books/things-i-learnt/monitoring/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/not-done/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/one-change-commit/ + 2019-07-09 + + + https://blog.juliobiason.me/books/things-i-learnt/optimization/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/outside-project/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/own-your-shit/ + 2019-07-30 + + + https://blog.juliobiason.me/books/things-i-learnt/paper-notes/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/patterns-not-solutions/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/people-care/ + 2019-07-19 + + + https://blog.juliobiason.me/books/things-i-learnt/permanent-solution/ + 2019-07-29 + + + https://blog.juliobiason.me/books/things-i-learnt/post-solution/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/project-organization/ + 2019-07-15 + + + https://blog.juliobiason.me/books/things-i-learnt/quit/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/resist-easy/ + 2019-07-01 + + + https://blog.juliobiason.me/books/things-i-learnt/responsible-code/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/right-tool-agenda/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/right-tool-obvious/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/run-locally/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/say-no/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/small-world/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/spec-first/ + 2019-06-18 + + + https://blog.juliobiason.me/books/things-i-learnt/specialists/ + 2019-07-17 + + + https://blog.juliobiason.me/books/things-i-learnt/start-stupid/ + 2019-07-01 + + + https://blog.juliobiason.me/books/things-i-learnt/steps-as-comments/ + 2019-06-18 + + + https://blog.juliobiason.me/books/things-i-learnt/stupid-bugs-list/ + 2019-07-17 + + + https://blog.juliobiason.me/books/things-i-learnt/team-discussion/ + 2019-07-31 + + + https://blog.juliobiason.me/books/things-i-learnt/tests-apis/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/tests-dead-code/ + 2019-06-21 + + + https://blog.juliobiason.me/books/things-i-learnt/tests-in-the-command-line/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/things-i-dont-know/ + 2019-07-25 + + + https://blog.juliobiason.me/books/things-i-learnt/throw-away/ + 2019-06-19 + + + https://blog.juliobiason.me/books/things-i-learnt/time-to-stop/ + 2019-07-18 + + + https://blog.juliobiason.me/books/things-i-learnt/time/ + 2019-07-29 + + + https://blog.juliobiason.me/books/things-i-learnt/toxic-people/ + 2019-07-23 + + + https://blog.juliobiason.me/books/things-i-learnt/transparent/ + 2019-07-31 + + + https://blog.juliobiason.me/books/things-i-learnt/understand-shortcuts/ + 2019-07-08 + + + https://blog.juliobiason.me/books/things-i-learnt/units/ + 2019-07-17 + + + https://blog.juliobiason.me/books/things-i-learnt/use-structures/ + 2019-06-25 + + + https://blog.juliobiason.me/books/things-i-learnt/use-timezones/ + 2019-07-01 + + + https://blog.juliobiason.me/books/things-i-learnt/use-utf8/ + 2019-07-01 + + + https://blog.juliobiason.me/books/things-i-learnt/users/ + 2019-07-17 + + + https://blog.juliobiason.me/books/things-i-learnt/watch-reactions/ + 2019-07-19 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/ + + + https://blog.juliobiason.me/books/uma-licao-de-vim/00-intro/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-01-modo-normal/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-02-entendendo-o-cursor/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-03-modo-de-insercao/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-04-modo-visual/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-05-modo-de-comando/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/01-modos/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/02-outros-comandos/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/03-recortar-copiar-colar/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/04-registradores/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/05-marcadores/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/06-macros-de-teclado/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/07-procurar-varios-arquivos/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/08-localizar-substituir/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/09-splits/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/10-abas/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/11-01-vimrc/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/11-02-gvimrc/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/11-config/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/12-modelines/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/13-tags/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-01-vundle/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-02-airline/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-03-fugitive/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-04-commentary/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-05-tabular/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-06-autopairs/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-07-syntastic/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-08-snipmate/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-09-ctrlp/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/14-10-multiple-cursors/ + 2015-12-22 + + + https://blog.juliobiason.me/books/uma-licao-de-vim/15-conclusao/ + 2015-12-22 + + + https://blog.juliobiason.me/categories/ + + + https://blog.juliobiason.me/code/ + + + https://blog.juliobiason.me/code/agile-vs-culture/ + 2015-12-18 + + + https://blog.juliobiason.me/code/command-pattern-rust/ + 2021-07-22 + + + https://blog.juliobiason.me/code/command-test/ + 2023-09-01 + + + https://blog.juliobiason.me/code/couchbase-example-and-rest/ + 2016-01-12 + + + https://blog.juliobiason.me/code/dear-github-maintainers/ + 2016-01-15 + + + https://blog.juliobiason.me/code/dont-diminish-types/ + 2019-06-03 + + + https://blog.juliobiason.me/code/lets-not-call-it-unittests-anymore/ + 2018-05-09 + + + https://blog.juliobiason.me/code/microservices-artifact-ejection/ + 2019-12-30 + + + https://blog.juliobiason.me/code/microservices-artifact-input-state/ + 2019-12-26 + + + https://blog.juliobiason.me/code/microservices-chassis/ + 2020-04-17 + + + https://blog.juliobiason.me/code/microservices-self-healing/ + 2020-01-03 + + + https://blog.juliobiason.me/code/microservices-source-of-truth/ + 2020-02-17 + + + https://blog.juliobiason.me/code/mocking-a-mock/ + 2016-07-21 + + + https://blog.juliobiason.me/code/multiple-distros-with-toolbox/ + 2022-06-24 + + + https://blog.juliobiason.me/code/on-unittests-and-layers-2/ + 2017-09-15 + + + https://blog.juliobiason.me/code/on-unittests-and-layers/ + 2017-09-11 + + + https://blog.juliobiason.me/code/overthinking-rust-iterators/ + 2023-07-06 + + + https://blog.juliobiason.me/code/publishing-books-on-zola/ + 2019-01-20 + + + https://blog.juliobiason.me/code/redid-my-nvim-config/ + 2022-01-19 + + + https://blog.juliobiason.me/code/seek-test/ + 2023-08-07 + + + https://blog.juliobiason.me/code/the-day-i-found-my-old-code/ + 2015-12-18 + + + https://blog.juliobiason.me/code/thinking-about-rust-actors/ + 2023-08-11 + + + https://blog.juliobiason.me/code/tokio-command-timeout-test/ + 2023-08-31 + + + https://blog.juliobiason.me/code/using-alternatives/ + 2021-06-21 + + + https://blog.juliobiason.me/code/when-i-used-pep8-to-fuck-up-code/ + 2016-07-19 + + + https://blog.juliobiason.me/code/why-mixing-tabs-and-spaces-is-a-big-deal/ + 2016-12-15 + + + https://blog.juliobiason.me/code/you-dont-need-range/ + 2020-04-16 + + + https://blog.juliobiason.me/links/ + + + https://blog.juliobiason.me/links/1password-linux-beta/ + 2020-10-23 + + + https://blog.juliobiason.me/links/20200303/ + 2020-03-03 + + + https://blog.juliobiason.me/links/20200304/ + 2020-03-04 + + + https://blog.juliobiason.me/links/20200305/ + 2020-03-05 + + + https://blog.juliobiason.me/links/20200306/ + 2020-03-06 + + + https://blog.juliobiason.me/links/20200309/ + 2020-03-09 + + + https://blog.juliobiason.me/links/20200311/ + 2020-03-11 + + + https://blog.juliobiason.me/links/20200312/ + 2020-03-12 + + + https://blog.juliobiason.me/links/20200313/ + 2020-03-13 + + + https://blog.juliobiason.me/links/20200316/ + 2020-03-16 + + + https://blog.juliobiason.me/links/20200419/ + 2020-04-19 + + + https://blog.juliobiason.me/links/20200420/ + 2020-04-20 + + + https://blog.juliobiason.me/links/20200421/ + 2020-04-21 + + + https://blog.juliobiason.me/links/20200422/ + 2020-04-22 + + + https://blog.juliobiason.me/links/20200423/ + 2020-04-23 + + + https://blog.juliobiason.me/links/20200424/ + 2020-04-24 + + + https://blog.juliobiason.me/links/20200425/ + 2020-04-25 + + + https://blog.juliobiason.me/links/20200426/ + 2020-04-26 + + + https://blog.juliobiason.me/links/20200427/ + 2020-04-27 + + + https://blog.juliobiason.me/links/20200429/ + 2020-04-29 + + + https://blog.juliobiason.me/links/20200430/ + 2020-04-30 + + + https://blog.juliobiason.me/links/20200502/ + 2020-05-02 + + + https://blog.juliobiason.me/links/20200503/ + 2020-05-03 + + + https://blog.juliobiason.me/links/20200507/ + 2020-05-07 + + + https://blog.juliobiason.me/links/20200511/ + 2020-05-11 + + + https://blog.juliobiason.me/links/20200516/ + 2020-05-16 + + + https://blog.juliobiason.me/links/20200524/ + 2020-05-24 + + + https://blog.juliobiason.me/links/20200525/ + 2020-05-25 + + + https://blog.juliobiason.me/links/20200526/ + 2020-05-26 + + + https://blog.juliobiason.me/links/20200529/ + 2020-05-29 + + + https://blog.juliobiason.me/links/20200531/ + 2020-05-31 + + + https://blog.juliobiason.me/links/20200601/ + 2020-06-01 + + + https://blog.juliobiason.me/links/20200604/ + 2020-06-03 + + + https://blog.juliobiason.me/links/20200611/ + 2020-06-11 + + + https://blog.juliobiason.me/links/20200618/ + 2020-06-18 + + + https://blog.juliobiason.me/links/20200620/ + 2020-06-20 + + + https://blog.juliobiason.me/links/20200621/ + 2020-06-21 + + + https://blog.juliobiason.me/links/20200703/ + 2020-07-03 + + + https://blog.juliobiason.me/links/20200706/ + 2020-07-06 + + + https://blog.juliobiason.me/links/20200712/ + 2020-07-12 + + + https://blog.juliobiason.me/links/20200719/ + 2020-07-19 + + + https://blog.juliobiason.me/links/20200726/ + 2020-07-26 + + + https://blog.juliobiason.me/links/20200802/ + 2020-08-02 + + + https://blog.juliobiason.me/links/20200809/ + 2020-08-09 + + + https://blog.juliobiason.me/links/20200815/ + 2020-08-15 + + + https://blog.juliobiason.me/links/20200829/ + 2020-08-29 + + + https://blog.juliobiason.me/links/20210318/ + 2021-03-18 + + + https://blog.juliobiason.me/links/expanding-fuchsia-open-source-model/ + 2020-12-14 + + + https://blog.juliobiason.me/links/fsf-statement-about-rms/ + 2021-04-13 + + + https://blog.juliobiason.me/links/go-xml-vulnerability/ + 2020-12-14 + + + https://blog.juliobiason.me/links/google-illegaly-spying-workers/ + 2020-12-13 + + + https://blog.juliobiason.me/links/google-slams-microsoft/ + 2021-03-24 + + + https://blog.juliobiason.me/links/mitigating-memory-safety-issues-in-oss/ + 2021-02-18 + + + https://blog.juliobiason.me/links/plausible-agpl/ + 2020-10-23 + + + https://blog.juliobiason.me/links/programming-sucks/ + 2020-10-30 + + + https://blog.juliobiason.me/links/whatsapp-giving-more-time-for-our-recent-update/ + 2021-01-19 + + + https://blog.juliobiason.me/page/1/ + + + https://blog.juliobiason.me/page/10/ + + + https://blog.juliobiason.me/page/11/ + + + https://blog.juliobiason.me/page/12/ + + + https://blog.juliobiason.me/page/13/ + + + https://blog.juliobiason.me/page/14/ + + + https://blog.juliobiason.me/page/15/ + + + https://blog.juliobiason.me/page/16/ + + + https://blog.juliobiason.me/page/17/ + + + https://blog.juliobiason.me/page/18/ + + + https://blog.juliobiason.me/page/19/ + + + https://blog.juliobiason.me/page/2/ + + + https://blog.juliobiason.me/page/20/ + + + https://blog.juliobiason.me/page/21/ + + + https://blog.juliobiason.me/page/22/ + + + https://blog.juliobiason.me/page/23/ + + + https://blog.juliobiason.me/page/24/ + + + https://blog.juliobiason.me/page/25/ + + + https://blog.juliobiason.me/page/26/ + + + https://blog.juliobiason.me/page/27/ + + + https://blog.juliobiason.me/page/28/ + + + https://blog.juliobiason.me/page/29/ + + + https://blog.juliobiason.me/page/3/ + + + https://blog.juliobiason.me/page/30/ + + + https://blog.juliobiason.me/page/31/ + + + https://blog.juliobiason.me/page/32/ + + + https://blog.juliobiason.me/page/33/ + + + https://blog.juliobiason.me/page/34/ + + + https://blog.juliobiason.me/page/35/ + + + https://blog.juliobiason.me/page/36/ + + + https://blog.juliobiason.me/page/37/ + + + https://blog.juliobiason.me/page/38/ + + + https://blog.juliobiason.me/page/39/ + + + https://blog.juliobiason.me/page/4/ + + + https://blog.juliobiason.me/page/40/ + + + https://blog.juliobiason.me/page/5/ + + + https://blog.juliobiason.me/page/6/ + + + https://blog.juliobiason.me/page/7/ + + + https://blog.juliobiason.me/page/8/ + + + https://blog.juliobiason.me/page/9/ + + + https://blog.juliobiason.me/presentations/ + + + https://blog.juliobiason.me/projects/ + + + https://blog.juliobiason.me/projects/astatine/ + 2022-08-03 + + + https://blog.juliobiason.me/projects/beryllium/ + 2020-10-22 + + + https://blog.juliobiason.me/projects/copper/ + 2021-01-04 + + + https://blog.juliobiason.me/projects/duralim/ + 2020-10-22 + + + https://blog.juliobiason.me/projects/fernico/ + 2022-08-03 + + + https://blog.juliobiason.me/projects/francium/ + 2021-01-27 + + + https://blog.juliobiason.me/projects/germanium/ + 2020-11-17 + + + https://blog.juliobiason.me/projects/iridium/ + 2021-02-17 + + + https://blog.juliobiason.me/projects/kovar/ + 2020-11-19 + + + https://blog.juliobiason.me/projects/lawrencium/ + 2021-02-24 + + + https://blog.juliobiason.me/projects/mercury/ + 2021-02-24 + + + https://blog.juliobiason.me/projects/palladium/ + 2022-08-03 + + + https://blog.juliobiason.me/projects/platinum/ + 2020-10-22 + + + https://blog.juliobiason.me/projects/rubidium/ + 2022-06-14 + + + https://blog.juliobiason.me/projects/sodium/ + 2020-12-10 + + + https://blog.juliobiason.me/projects/tin/ + 2023-01-04 + + + https://blog.juliobiason.me/projects/uranium/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/ + + + https://blog.juliobiason.me/pt/announcements/ + + + https://blog.juliobiason.me/pt/announcements/going-live/ + 2020-05-13 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/ + + + https://blog.juliobiason.me/pt/books/shell-por-dia/comandos-obscuros/ + 2021-09-23 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/entradas-e-saidas/ + 2021-09-13 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/error-chain/ + 2021-09-22 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/introducao/ + 2021-09-13 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/jobs/ + 2021-10-04 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/pipes/ + 2021-09-14 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/redirecionamento/ + 2021-09-14 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/shells/ + 2021-09-16 + + + https://blog.juliobiason.me/pt/books/shell-por-dia/subcomandos/ + 2021-09-21 + + + https://blog.juliobiason.me/pt/code/ + + + https://blog.juliobiason.me/pt/code/cargo-cult/ + 2018-11-30 + + + https://blog.juliobiason.me/pt/code/command-pattern-rust/ + 2021-07-22 + + + https://blog.juliobiason.me/pt/code/flask-em-40-minutos-ou-menos-1/ + 2017-09-25 + + + https://blog.juliobiason.me/pt/code/fugindo-para-as-colinas-com-python/ + 2017-09-18 + + + https://blog.juliobiason.me/pt/code/microservices-artifact-ejection/ + 2019-12-30 + + + https://blog.juliobiason.me/pt/code/microservices-artifact-input-state/ + 2019-12-26 + + + https://blog.juliobiason.me/pt/code/microservices-chassis/ + 2020-04-17 + + + https://blog.juliobiason.me/pt/code/microservices-self-healing/ + 2020-01-03 + + + https://blog.juliobiason.me/pt/code/microservices-source-of-truth/ + 2020-02-17 + + + https://blog.juliobiason.me/pt/code/multiple-distros-with-toolbox/ + 2022-06-24 + + + https://blog.juliobiason.me/pt/code/pyngos-de-python-1/ + 2023-03-27 + + + https://blog.juliobiason.me/pt/code/python-2-3-six/ + 2016-11-21 + + + https://blog.juliobiason.me/pt/code/redid-my-nvim-config/ + 2022-01-19 + + + https://blog.juliobiason.me/pt/code/thinking-about-rust-actors/ + 2023-08-17 + + + https://blog.juliobiason.me/pt/code/unit-in-unittests/ + 2016-11-23 + + + https://blog.juliobiason.me/pt/code/you-dont-need-range/ + 2020-04-16 + + + https://blog.juliobiason.me/pt/links/ + + + https://blog.juliobiason.me/pt/links/1password-linux-beta/ + 2020-10-23 + + + https://blog.juliobiason.me/pt/links/20200529/ + 2020-05-29 + + + https://blog.juliobiason.me/pt/links/20200531/ + 2020-05-31 + + + https://blog.juliobiason.me/pt/links/20200601/ + 2020-06-01 + + + https://blog.juliobiason.me/pt/links/20200604/ + 2020-06-03 + + + https://blog.juliobiason.me/pt/links/20200611/ + 2020-06-11 + + + https://blog.juliobiason.me/pt/links/20200618/ + 2020-06-18 + + + https://blog.juliobiason.me/pt/links/20200620/ + 2020-06-20 + + + https://blog.juliobiason.me/pt/links/20200621/ + 2020-06-21 + + + https://blog.juliobiason.me/pt/links/20200703/ + 2020-07-03 + + + https://blog.juliobiason.me/pt/links/20200706/ + 2020-07-06 + + + https://blog.juliobiason.me/pt/links/20200712/ + 2020-07-12 + + + https://blog.juliobiason.me/pt/links/20200719/ + 2020-07-19 + + + https://blog.juliobiason.me/pt/links/20200726/ + 2020-07-26 + + + https://blog.juliobiason.me/pt/links/20200802/ + 2020-08-02 + + + https://blog.juliobiason.me/pt/links/20200809/ + 2020-08-09 + + + https://blog.juliobiason.me/pt/links/20200815/ + 2020-08-15 + + + https://blog.juliobiason.me/pt/links/20200829/ + 2020-08-29 + + + https://blog.juliobiason.me/pt/links/expanding-fuchsia-open-source-model/ + 2020-12-13 + + + https://blog.juliobiason.me/pt/links/fsf-statement-about-rms/ + 2021-04-13 + + + https://blog.juliobiason.me/pt/links/go-xml-vulnerability/ + 2020-12-14 + + + https://blog.juliobiason.me/pt/links/google-illegaly-spying-workers/ + 2020-12-13 + + + https://blog.juliobiason.me/pt/links/google-slams-microsoft/ + 2021-03-24 + + + https://blog.juliobiason.me/pt/links/mitigating-memory-safety-issues-in-oss/ + 2021-02-18 + + + https://blog.juliobiason.me/pt/links/plausible-agpl/ + 2020-10-23 + + + https://blog.juliobiason.me/pt/links/programming-sucks/ + 2020-10-30 + + + https://blog.juliobiason.me/pt/links/whatsapp-giving-more-time-for-our-recent-update/ + 2021-01-19 + + + https://blog.juliobiason.me/pt/page/1/ + + + https://blog.juliobiason.me/pt/page/10/ + + + https://blog.juliobiason.me/pt/page/2/ + + + https://blog.juliobiason.me/pt/page/3/ + + + https://blog.juliobiason.me/pt/page/4/ + + + https://blog.juliobiason.me/pt/page/5/ + + + https://blog.juliobiason.me/pt/page/6/ + + + https://blog.juliobiason.me/pt/page/7/ + + + https://blog.juliobiason.me/pt/page/8/ + + + https://blog.juliobiason.me/pt/page/9/ + + + https://blog.juliobiason.me/pt/presentations/ + + + https://blog.juliobiason.me/pt/presentations/porque-voce-deve-aprender-rust/ + 2019-09-25 + + + https://blog.juliobiason.me/pt/projects/ + + + https://blog.juliobiason.me/pt/projects/beryllium/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/projects/duralim/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/projects/fernico/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/projects/francium/ + 2021-01-27 + + + https://blog.juliobiason.me/pt/projects/germanium/ + 2020-11-17 + + + https://blog.juliobiason.me/pt/projects/iridium/ + 2021-02-17 + + + https://blog.juliobiason.me/pt/projects/kovar/ + 2020-11-19 + + + https://blog.juliobiason.me/pt/projects/palladium/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/projects/platinum/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/projects/sodium/ + 2020-12-10 + + + https://blog.juliobiason.me/pt/projects/uranium/ + 2020-10-22 + + + https://blog.juliobiason.me/pt/research/ + + + https://blog.juliobiason.me/pt/research/decoding-fast-examples/ + 2022-01-12 + + + https://blog.juliobiason.me/pt/research/decoding-fast/ + 2022-01-13 + + + https://blog.juliobiason.me/pt/reviews/ + + + https://blog.juliobiason.me/pt/reviews/books/ + + + https://blog.juliobiason.me/pt/reviews/books/21-erros-classicos-da-gestao-de-projetos/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/23-habitos-anti-procrastinacao-como-deixar-de-ser-preguicoso-e-ter-resultados-em-sua-vida/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/a-colher-que-desaparece-e-outras-historias-reais-de-loucura-amor-e-morte-a-partir-dos-elementos-quimicos/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/a-filosofia-explica-as-grandes-questoes-da-humanidade/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/a-garota-no-trem/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/a-historia-do-mundo-para-quem-tem-pressa/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/antologia-da-maldade-um-dicionario-de-citacoes-associacoes-ilicitas-e-ligacoes-perigosas/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/argo/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/como-a-musica-ficou-gratis/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/como-convencer-alguem-em-90-segundos/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/direto-ao-ponto-criando-produtos-de-forma-enxuta/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/dossie-jung/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/elon-musk-como-o-ceo-bilionario-da-spacex-e-da-tesla-esta-moldando-o-nosso-futuro/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/guia-politicamente-incorreto-da-historia-do-mundo/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/hegel-em-90-minutos/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/historia-do-futuro-o-horizonte-do-brasil-no-seculo-xxi/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/mujica-a-revolucao-tranquila/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/mussum-forevis-samba-me-e-trapalhoes/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/nos-bastidores-da-coca-cola/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/o-heroi-de-mil-faces/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/o-principe/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/pense-como-um-freak/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/poder-manipulacao-como-entender-o-mundo-em-vinte-licoes-extraidas-de-o-principe-de-maquiavel/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/quatro-herois-e-um-bardo-contra-a-realidade-medieval/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/rin-tin-tin-a-vida-e-a-lenda/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/scrum-a-arte-de-fazer-o-dobro-de-trabalho-na-metade-do-tempo/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/tecnicas-de-memorizacao-para-estudantes-porque-voce-pode-ir-alem/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/books/turing-e-o-computador-em-90-minutos/ + 2021-02-12 + + + https://blog.juliobiason.me/pt/reviews/movies/ + + + https://blog.juliobiason.me/pt/reviews/movies/bacurau/ + 2021-02-22 + + + https://blog.juliobiason.me/pt/thoughts/ + + + https://blog.juliobiason.me/pt/thoughts/code-is-a-book-unittests-are-spell-checkers/ + 2020-02-14 + + + https://blog.juliobiason.me/pt/thoughts/go-problem-is-not-the-xml-vulnerability/ + 2020-12-15 + + + https://blog.juliobiason.me/pt/thoughts/how-to-kill-developer-productivity/ + 2020-07-20 + + + https://blog.juliobiason.me/pt/thoughts/movile/ + 2020-09-12 + + + https://blog.juliobiason.me/pt/thoughts/python-loses-2nd-place-loved-language/ + 2020-06-09 + + + https://blog.juliobiason.me/pt/thoughts/real-life-rust/ + 2022-07-26 + + + https://blog.juliobiason.me/pt/thoughts/reveries-about-testing/ + 2020-01-13 + + + https://blog.juliobiason.me/pt/thoughts/rms-and-fsf-again/ + 2021-03-29 + + + https://blog.juliobiason.me/pt/thoughts/the-hidden-value-of-tiktok/ + 2020-09-15 + + + https://blog.juliobiason.me/pt/thoughts/what-the-hell-is-apple-doing/ + 2020-10-30 + + + https://blog.juliobiason.me/pt/videos/ + + + https://blog.juliobiason.me/pt/videos/com-licenca/ + 2020-05-18 + + + https://blog.juliobiason.me/pt/videos/rust-2020-05-12/ + 2020-05-13 + + + https://blog.juliobiason.me/pt/videos/rust-2020-05-15/ + 2020-05-15 + + + https://blog.juliobiason.me/research/ + + + https://blog.juliobiason.me/research/decoding-fast-examples/ + 2022-01-12 + + + https://blog.juliobiason.me/research/decoding-fast/ + 2022-01-13 + + + https://blog.juliobiason.me/research/emacs/ + 2021-03-04 + + + https://blog.juliobiason.me/research/orgmode/ + 2021-03-04 + + + https://blog.juliobiason.me/research/python/ + 2021-03-05 + + + https://blog.juliobiason.me/reviews/ + + + https://blog.juliobiason.me/reviews/books/ + + + https://blog.juliobiason.me/reviews/books/1001-video-games-you-must-play-before-you-die/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/12-years-a-slave/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/21st-century-robot/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/301-smart-answers-to-though-interview-questions/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/7-secrets-of-exceptional-leadership/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/88-days-to-any-goal/ + 2020-02-20 + + + https://blog.juliobiason.me/reviews/books/97-things-every-programmer-should-know/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/a-bug-hunters-diary-a-guided-tour-through-the-wilds-of-software-security/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/a-devils-chaplain/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/ad-astra/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/adult-stuff/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/all-quiet-on-the-western-front/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/all-you-need-is-kill/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/american-gods/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/an-illustrated-book-of-bad-arguments/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/angularjs/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/ansible-from-beginner-to-pro/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/answers-to-questions-youve-never-asked/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/antifragile-systems-and-teams/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/apache-kafka/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/arrival/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/backbonejs-essentials/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/backbonejs-testing/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/being-there/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/black-hat-python-python-programming-for-hackers-and-pentesters/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/brave-new-world/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/broetry/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/c-succinctly/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/central-station/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/changing-planes-stories/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/christopher-walken-a-to-z/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/chthon/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/clean-code-a-handbook-of-agile-software-craftsmanship/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/clojure-for-machine-learning/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/clojure-for-the-brave-and-true/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/coffeescript-application-development/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/concise-guide-to-databases/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/crap-dates/ + 2021-03-19 + + + https://blog.juliobiason.me/reviews/books/creating-interfaces-with-bulma/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/django-design-patterns-and-best-practices/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/dogfight-how-apple-and-google-went-to-war-and-started-a-revolution/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/dragons-of-dorcastle/ + 2021-04-13 + + + https://blog.juliobiason.me/reviews/books/dragons-winter/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/emotions-revealed-understanding-faces-and-feelings/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/employees-gone-wild/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/eon-the-way-1/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/films-from-the-future/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/fledgling/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/fulgrim/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/functional-python-programming/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/functional-reactive-programming/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/future-shock-future-shock-1/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/galaxy-in-flames/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/geek-wisdom/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/genius-the-life-and-science-of-richard-feynman/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/getting-started-with-meteorjs-javascript-framework-second-edition/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/getting-things-done-the-art-of-stress-free-productivity/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/greek-mythology-explained/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/hadoop-in-practice-manning/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/handson-microservices-with-rust/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/hap-and-leonard-blood-and-lemonade/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/horus-rising/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/how-to-make-mistakes-in-python/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/how-to-survive-a-horror-movie/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/i-am-legend/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/i-have-no-mouth-and-i-must-scream/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/imperative-to-functional-programming-succinctly/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/in-calabria/ + 2021-08-31 + + + https://blog.juliobiason.me/reviews/books/in-fury-born/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/in-the-beginning-science-faces-god-in-the-book-of-genesis/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/instant-backbonejs-application-development/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/introducing-elixir/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/introducing-erlang/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/ipad-productivity-essentials-the-definitive-guide-to-getting-more-productive-with-your-ipad/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/javascript-testing-beginners-guide/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/just-a-geek-unflinchingly-honest-tales-of-the-search-for-life-love-and-fulfillment-beyond-the-starship-enterprise/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/k-is-for-knifeball/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/land-of-lisp-learn-to-program-in-lisp-one-game-at-a-time/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learn-amazon-web-services-in-a-month-of-lunches/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learn-you-a-haskell-for-great-good/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learn-you-some-erlang-for-great-good/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learning-concurrency-in-python/ + 2021-12-13 + + + https://blog.juliobiason.me/reviews/books/learning-ecmascript-6/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learning-ionic-build-real-time-and-hybrid-mobile-applications-with-ionic/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/learning-java/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/less-web-development-essentials/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/linux-shell-scripting-cookbook/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/live-free-or-die/ + 2021-10-22 + + + https://blog.juliobiason.me/reviews/books/managers-answer-book/ + 2021-08-25 + + + https://blog.juliobiason.me/reviews/books/mastering-docker/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/mastering-emacs/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/mastering-javascript-design-patterns-essential-solutions-for-effective-javascript-web-design/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/microservice-patterns/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/microservices-antipatterns-and-pitfalls/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/microservices-in-action/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/modern-java-in-action/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/modern-vim-craft-your-development-environment-with-vim8-and-neovim/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/moon-shot-the-inside-story-of-americas-race-to-the-moon/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/mothers-and-other-monsters/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/nginx-from-beginner-to-pro/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/night-of-the-living-trekkies/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/object-oriented-javascript-second-edition/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/oh-myyy-there-goes-the-internet-life-the-internet-and-everything/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/old-mans-war-old-mans-war-1/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/one-day-on-mars/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/powers-annals-of-the-western-shore-3/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/princesses-behaving-badly-real-stories-from-history-without-the-fairy-tale-endings/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/pro-vim/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/programming-rust-fast-safe-systems-development/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/python-3-object-oriented-programming/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/python-data-science-essentials-learn-the-fundamentals-of-data-science-with-python/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/python-playground-geeky-projects-for-the-curious-programmer/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/reactive-microservices-architecture/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/reactive-programming-with-javascript/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/ready-player-one/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/realm-of-racket/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/redshirts/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/repent-harlequin/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/rust-essentials/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/rust-in-action/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/safe-enough-to-soar/ + 2021-03-29 + + + https://blog.juliobiason.me/reviews/books/seven-languages-in-seven-weeks/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/silence-on-the-wire-a-field-guide-to-passive-reconnaissance-and-indirect-attacks/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/soulminder/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/storm-real-time-processing-cookbook/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/subterranean-scalzi-super-bundle/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/swan-song/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-big-bad-book-of-bill-murray-a-critical-appreciation-of-the-worlds-finest-actor/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-book-of-kells/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-book-of-skulls/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-complete-collection/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-cyberiad/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-drawing-of-the-three-the-dark-tower-2/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-drift-wars/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-emperors-soul/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-end-of-all-things-old-mans-war-6/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-flight-of-the-eisenstein/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-forever-war/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-geeks-guide-to-dating/ + 2021-03-23 + + + https://blog.juliobiason.me/reviews/books/the-ghost-brigades-old-mans-war-2/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-gunslinger-the-dark-tower-1/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-human-division-old-mans-war-5/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-island-of-doctor-moreau-unabridged/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-last-colony-old-mans-war-3/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-league-of-regrettable-superheroes/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-little-book-of-htmlcss-coding-guidelines/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-martian/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-origin-of-names-words-and-everything-in-between/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-phoenix-project/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-planets-photographs-from-the-archives-of-nasa/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-story-behind-the-extraordinary-history-behind-ordinary-objects/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-swift-programming-language/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-waste-lands-the-dark-tower-3/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-where-the-why-the-how/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/the-wolfs-hour/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/typescript-succinctly/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/undercity/ + 2021-03-19 + + + https://blog.juliobiason.me/reviews/books/web-development-with-clojure-build-bulletproof-web-apps-with-less-code/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/web-development-with-django-cookbook/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/wikileaks-inside-julian-assanges-war-on-secrecy/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/will-eisners-the-spirit-who-killed-the-spirit/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/write-great-code-volume-i-understanding-the-machine/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/books/zoes-tale-old-mans-war-4/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/ + + + https://blog.juliobiason.me/reviews/movies/13-hours/ + 2021-03-25 + + + https://blog.juliobiason.me/reviews/movies/ad-astra/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/greenland/ + 2021-03-22 + + + https://blog.juliobiason.me/reviews/movies/kill-switch/ + 2021-03-28 + + + https://blog.juliobiason.me/reviews/movies/king-kong/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/meet-the-censors/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/nekrotronic/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/spy-game/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/survive-the-night/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/the-colony/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/the-escort/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/movies/unhinged/ + 2021-03-28 + + + https://blog.juliobiason.me/reviews/movies/youve-been-trumped-too/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/series/ + + + https://blog.juliobiason.me/reviews/series/american-playboy/ + 2021-03-28 + + + https://blog.juliobiason.me/reviews/series/good-omens/ + 2021-03-28 + + + https://blog.juliobiason.me/reviews/series/grand-prix-driver/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/series/loki/ + 2021-08-26 + + + https://blog.juliobiason.me/reviews/series/the-falcon-and-the-winter-soldier/ + 2021-08-18 + + + https://blog.juliobiason.me/reviews/series/treadstone/ + 2021-02-12 + + + https://blog.juliobiason.me/reviews/series/wandavision/ + 2021-08-25 + + + https://blog.juliobiason.me/tags/ + + + https://blog.juliobiason.me/tags/1password/ + + + https://blog.juliobiason.me/tags/1x-developer/ + + + https://blog.juliobiason.me/tags/2019/ + + + https://blog.juliobiason.me/tags/about-me/ + + + https://blog.juliobiason.me/tags/accessibility/ + + + https://blog.juliobiason.me/tags/acessibilidade/ + + + https://blog.juliobiason.me/tags/activitypub/ + + + https://blog.juliobiason.me/tags/actix/ + + + https://blog.juliobiason.me/tags/actor-model/ + + + https://blog.juliobiason.me/tags/addresses/ + + + https://blog.juliobiason.me/tags/adoption/ + + + https://blog.juliobiason.me/tags/ads/ + + + https://blog.juliobiason.me/tags/adsense/ + + + https://blog.juliobiason.me/tags/advertising/ + + + https://blog.juliobiason.me/tags/advice/ + + + https://blog.juliobiason.me/tags/agct/ + + + https://blog.juliobiason.me/tags/agenda/ + + + https://blog.juliobiason.me/tags/agil/ + + + https://blog.juliobiason.me/tags/agile/ + + + https://blog.juliobiason.me/tags/agpl/ + + + https://blog.juliobiason.me/tags/ai/ + + + https://blog.juliobiason.me/tags/aidas-bendoraitis/ + + + https://blog.juliobiason.me/tags/airflow/ + + + https://blog.juliobiason.me/tags/akhil-wali/ + + + https://blog.juliobiason.me/tags/alan-kay/ + + + https://blog.juliobiason.me/tags/alan-shepard/ + + + https://blog.juliobiason.me/tags/alan-turing/ + + + https://blog.juliobiason.me/tags/alberto-boschetti/ + + + https://blog.juliobiason.me/tags/aldous-huxley/ + + + https://blog.juliobiason.me/tags/alex-holmes/ + + + https://blog.juliobiason.me/tags/algorithm/ + + + https://blog.juliobiason.me/tags/algorithms/ + + + https://blog.juliobiason.me/tags/algoritmos/ + + + https://blog.juliobiason.me/tags/ali-almossawi/ + + + https://blog.juliobiason.me/tags/alternatives/ + + + https://blog.juliobiason.me/tags/amazon/ + + + https://blog.juliobiason.me/tags/american-gods/ + + + https://blog.juliobiason.me/tags/andrew-maynard/ + + + https://blog.juliobiason.me/tags/android/ + + + https://blog.juliobiason.me/tags/andy-weir/ + + + https://blog.juliobiason.me/tags/angularjs/ + + + https://blog.juliobiason.me/tags/annals-of-the-western-shore/ + + + https://blog.juliobiason.me/tags/anonymized-data/ + + + https://blog.juliobiason.me/tags/ansible/ + + + https://blog.juliobiason.me/tags/anthony-jones/ + + + https://blog.juliobiason.me/tags/antipatterns/ + + + https://blog.juliobiason.me/tags/antonio-j-mendez/ + + + https://blog.juliobiason.me/tags/apache/ + + + https://blog.juliobiason.me/tags/apis/ + + + https://blog.juliobiason.me/tags/apollo/ + + + https://blog.juliobiason.me/tags/apple-inc/ + + + https://blog.juliobiason.me/tags/apple/ + + + https://blog.juliobiason.me/tags/applications/ + + + https://blog.juliobiason.me/tags/apprenticeships/ + + + https://blog.juliobiason.me/tags/architecture/ + + + https://blog.juliobiason.me/tags/area-de-transferencia/ + + + https://blog.juliobiason.me/tags/arm/ + + + https://blog.juliobiason.me/tags/armazenamento/ + + + https://blog.juliobiason.me/tags/arquitetura-de-software/ + + + https://blog.juliobiason.me/tags/arquitetura/ + + + https://blog.juliobiason.me/tags/artefatos/ + + + https://blog.juliobiason.me/tags/artifacts/ + + + https://blog.juliobiason.me/tags/arun-ravindran/ + + + https://blog.juliobiason.me/tags/arvind-ravulavaru/ + + + https://blog.juliobiason.me/tags/asciiflow/ + + + https://blog.juliobiason.me/tags/ashlee-vance/ + + + https://blog.juliobiason.me/tags/assignment/ + + + https://blog.juliobiason.me/tags/async-requests/ + + + https://blog.juliobiason.me/tags/async/ + + + https://blog.juliobiason.me/tags/auto-cura/ + + + https://blog.juliobiason.me/tags/automated/ + + + https://blog.juliobiason.me/tags/avery-monsen/ + + + https://blog.juliobiason.me/tags/awk/ + + + https://blog.juliobiason.me/tags/aws/ + + + https://blog.juliobiason.me/tags/azure/ + + + https://blog.juliobiason.me/tags/backbone-js/ + + + https://blog.juliobiason.me/tags/bad-code/ + + + https://blog.juliobiason.me/tags/bash/ + + + https://blog.juliobiason.me/tags/bass-jobsen/ + + + https://blog.juliobiason.me/tags/ben-counter/ + + + https://blog.juliobiason.me/tags/benchmarks/ + + + https://blog.juliobiason.me/tags/benghazi/ + + + https://blog.juliobiason.me/tags/biblioteca/ + + + https://blog.juliobiason.me/tags/big-data/ + + + https://blog.juliobiason.me/tags/bill-murray/ + + + https://blog.juliobiason.me/tags/bill-nye/ + + + https://blog.juliobiason.me/tags/binaries/ + + + https://blog.juliobiason.me/tags/binario/ + + + https://blog.juliobiason.me/tags/binary/ + + + https://blog.juliobiason.me/tags/biografia/ + + + https://blog.juliobiason.me/tags/biography/ + + + https://blog.juliobiason.me/tags/biowaste/ + + + https://blog.juliobiason.me/tags/blog/ + + + https://blog.juliobiason.me/tags/blogging/ + + + https://blog.juliobiason.me/tags/book/ + + + https://blog.juliobiason.me/tags/bookmarks/ + + + https://blog.juliobiason.me/tags/books-2020/ + + + https://blog.juliobiason.me/tags/books-2021/ + + + https://blog.juliobiason.me/tags/books/ + + + https://blog.juliobiason.me/tags/booleans/ + + + https://blog.juliobiason.me/tags/boring-stuff/ + + + https://blog.juliobiason.me/tags/brad-green/ + + + https://blog.juliobiason.me/tags/brad-pitt/ + + + https://blog.juliobiason.me/tags/branches/ + + + https://blog.juliobiason.me/tags/brandon-sanderson/ + + + https://blog.juliobiason.me/tags/brave/ + + + https://blog.juliobiason.me/tags/brett-james/ + + + https://blog.juliobiason.me/tags/brian-mcgackin/ + + + https://blog.juliobiason.me/tags/brian-tracy/ + + + https://blog.juliobiason.me/tags/bruce-a-tate/ + + + https://blog.juliobiason.me/tags/bruce-willis/ + + + https://blog.juliobiason.me/tags/bsd/ + + + https://blog.juliobiason.me/tags/build/ + + + https://blog.juliobiason.me/tags/builder-pattern/ + + + https://blog.juliobiason.me/tags/builder/ + + + https://blog.juliobiason.me/tags/bulma/ + + + https://blog.juliobiason.me/tags/burn-out/ + + + https://blog.juliobiason.me/tags/bytecodes/ + + + https://blog.juliobiason.me/tags/c/ + + + https://blog.juliobiason.me/tags/caches/ + + + https://blog.juliobiason.me/tags/california/ + + + https://blog.juliobiason.me/tags/cameras/ + + + https://blog.juliobiason.me/tags/capacitors/ + + + https://blog.juliobiason.me/tags/care/ + + + https://blog.juliobiason.me/tags/cargo-cult/ + + + https://blog.juliobiason.me/tags/carl-jung/ + + + https://blog.juliobiason.me/tags/carregador/ + + + https://blog.juliobiason.me/tags/case/ + + + https://blog.juliobiason.me/tags/catherine-asaro/ + + + https://blog.juliobiason.me/tags/cc/ + + + https://blog.juliobiason.me/tags/cd/ + + + https://blog.juliobiason.me/tags/censorship/ + + + https://blog.juliobiason.me/tags/ceo/ + + + https://blog.juliobiason.me/tags/changes/ + + + https://blog.juliobiason.me/tags/charger/ + + + https://blog.juliobiason.me/tags/chassi/ + + + https://blog.juliobiason.me/tags/chassis/ + + + https://blog.juliobiason.me/tags/cheatsheet/ + + + https://blog.juliobiason.me/tags/christopher-j-lee/ + + + https://blog.juliobiason.me/tags/christopher-walken/ + + + https://blog.juliobiason.me/tags/chrome/ + + + https://blog.juliobiason.me/tags/ci/ + + + https://blog.juliobiason.me/tags/cidades/ + + + https://blog.juliobiason.me/tags/ciencia/ + + + https://blog.juliobiason.me/tags/cinema/ + + + https://blog.juliobiason.me/tags/citacoes/ + + + https://blog.juliobiason.me/tags/cities/ + + + https://blog.juliobiason.me/tags/clang/ + + + https://blog.juliobiason.me/tags/clean-air/ + + + https://blog.juliobiason.me/tags/clean-code/ + + + https://blog.juliobiason.me/tags/cli/ + + + https://blog.juliobiason.me/tags/client/ + + + https://blog.juliobiason.me/tags/clientes/ + + + https://blog.juliobiason.me/tags/clipboard/ + + + https://blog.juliobiason.me/tags/clojure/ + + + https://blog.juliobiason.me/tags/cloud/ + + + https://blog.juliobiason.me/tags/clovis-de-barros-filho/ + + + https://blog.juliobiason.me/tags/cobol/ + + + https://blog.juliobiason.me/tags/coc/ + + + https://blog.juliobiason.me/tags/coca-cola/ + + + https://blog.juliobiason.me/tags/code-formatting/ + + + https://blog.juliobiason.me/tags/code-reviews/ + + + https://blog.juliobiason.me/tags/code-style/ + + + https://blog.juliobiason.me/tags/code/ + + + https://blog.juliobiason.me/tags/codescanning/ + + + https://blog.juliobiason.me/tags/codespaces/ + + + https://blog.juliobiason.me/tags/codigo/ + + + https://blog.juliobiason.me/tags/coding/ + + + https://blog.juliobiason.me/tags/coffeescript/ + + + https://blog.juliobiason.me/tags/cognitive-cost/ + + + https://blog.juliobiason.me/tags/cognitive-dissonance/ + + + https://blog.juliobiason.me/tags/comandos/ + + + https://blog.juliobiason.me/tags/comedy/ + + + https://blog.juliobiason.me/tags/comics/ + + + https://blog.juliobiason.me/tags/command-line-options/ + + + https://blog.juliobiason.me/tags/command-line/ + + + https://blog.juliobiason.me/tags/command/ + + + https://blog.juliobiason.me/tags/comments/ + + + https://blog.juliobiason.me/tags/commit/ + + + https://blog.juliobiason.me/tags/commits/ + + + https://blog.juliobiason.me/tags/commons-clause/ + + + https://blog.juliobiason.me/tags/communication/ + + + https://blog.juliobiason.me/tags/community/ + + + https://blog.juliobiason.me/tags/companion-post/ + + + https://blog.juliobiason.me/tags/complexity/ + + + https://blog.juliobiason.me/tags/composition/ + + + https://blog.juliobiason.me/tags/computer-architecture/ + + + https://blog.juliobiason.me/tags/concepts/ + + + https://blog.juliobiason.me/tags/concurrency/ + + + https://blog.juliobiason.me/tags/conexoes/ + + + https://blog.juliobiason.me/tags/conference/ + + + https://blog.juliobiason.me/tags/conferencia/ + + + https://blog.juliobiason.me/tags/config-file/ + + + https://blog.juliobiason.me/tags/config-files/ + + + https://blog.juliobiason.me/tags/config/ + + + https://blog.juliobiason.me/tags/configuracao/ + + + https://blog.juliobiason.me/tags/configuration/ + + + https://blog.juliobiason.me/tags/connection/ + + + https://blog.juliobiason.me/tags/conrad-barski/ + + + https://blog.juliobiason.me/tags/contact-tracing/ + + + https://blog.juliobiason.me/tags/containers/ + + + https://blog.juliobiason.me/tags/conteineres/ + + + https://blog.juliobiason.me/tags/context-manager/ + + + https://blog.juliobiason.me/tags/contracts/ + + + https://blog.juliobiason.me/tags/contributing/ + + + https://blog.juliobiason.me/tags/cookies/ + + + https://blog.juliobiason.me/tags/copyleft/ + + + https://blog.juliobiason.me/tags/copyright/ + + + https://blog.juliobiason.me/tags/cornice/ + + + https://blog.juliobiason.me/tags/corotines/ + + + https://blog.juliobiason.me/tags/couchbase/ + + + https://blog.juliobiason.me/tags/count/ + + + https://blog.juliobiason.me/tags/covid-19/ + + + https://blog.juliobiason.me/tags/covid/ + + + https://blog.juliobiason.me/tags/creative-commons/ + + + https://blog.juliobiason.me/tags/csp/ + + + https://blog.juliobiason.me/tags/css/ + + + https://blog.juliobiason.me/tags/culture-tests/ + + + https://blog.juliobiason.me/tags/culture-war/ + + + https://blog.juliobiason.me/tags/dairy/ + + + https://blog.juliobiason.me/tags/dan-abnett/ + + + https://blog.juliobiason.me/tags/daniel-higginbotham/ + + + https://blog.juliobiason.me/tags/dark-patterns/ + + + https://blog.juliobiason.me/tags/data-classes/ + + + https://blog.juliobiason.me/tags/data-flow/ + + + https://blog.juliobiason.me/tags/data-oriented-designs/ + + + https://blog.juliobiason.me/tags/data-science/ + + + https://blog.juliobiason.me/tags/data-structures/ + + + https://blog.juliobiason.me/tags/data/ + + + https://blog.juliobiason.me/tags/databases/ + + + https://blog.juliobiason.me/tags/dataframes/ + + + https://blog.juliobiason.me/tags/dates/ + + + https://blog.juliobiason.me/tags/datetime/ + + + https://blog.juliobiason.me/tags/datomic/ + + + https://blog.juliobiason.me/tags/dave-zwieback/ + + + https://blog.juliobiason.me/tags/david-allen/ + + + https://blog.juliobiason.me/tags/david-johnson/ + + + https://blog.juliobiason.me/tags/david-leigh/ + + + https://blog.juliobiason.me/tags/david-macaulay/ + + + https://blog.juliobiason.me/tags/david-ramenah/ + + + https://blog.juliobiason.me/tags/ddd/ + + + https://blog.juliobiason.me/tags/dead-code/ + + + https://blog.juliobiason.me/tags/debito-tecnico/ + + + https://blog.juliobiason.me/tags/debug/ + + + https://blog.juliobiason.me/tags/debuggers/ + + + https://blog.juliobiason.me/tags/debugging/ + + + https://blog.juliobiason.me/tags/defend/ + + + https://blog.juliobiason.me/tags/deletar/ + + + https://blog.juliobiason.me/tags/delete/ + + + https://blog.juliobiason.me/tags/denis-kolodin/ + + + https://blog.juliobiason.me/tags/dependency-injection/ + + + https://blog.juliobiason.me/tags/desenvolvedores/ + + + https://blog.juliobiason.me/tags/design-patterns/ + + + https://blog.juliobiason.me/tags/design/ + + + https://blog.juliobiason.me/tags/developer/ + + + https://blog.juliobiason.me/tags/developers/ + + + https://blog.juliobiason.me/tags/devops/ + + + https://blog.juliobiason.me/tags/diagrams/ + + + https://blog.juliobiason.me/tags/dicas/ + + + https://blog.juliobiason.me/tags/diesel/ + + + https://blog.juliobiason.me/tags/disability/ + + + https://blog.juliobiason.me/tags/disclaimer/ + + + https://blog.juliobiason.me/tags/disenfranchise/ + + + https://blog.juliobiason.me/tags/distributed/ + + + https://blog.juliobiason.me/tags/distros/ + + + https://blog.juliobiason.me/tags/django/ + + + https://blog.juliobiason.me/tags/dmitri-sotnikov/ + + + https://blog.juliobiason.me/tags/docker-compose/ + + + https://blog.juliobiason.me/tags/docker/ + + + https://blog.juliobiason.me/tags/documentacao/ + + + https://blog.juliobiason.me/tags/documentaries/ + + + https://blog.juliobiason.me/tags/documentary/ + + + https://blog.juliobiason.me/tags/documentation/ + + + https://blog.juliobiason.me/tags/dokuwiki/ + + + https://blog.juliobiason.me/tags/donald-sutherland/ + + + https://blog.juliobiason.me/tags/download/ + + + https://blog.juliobiason.me/tags/drew-neil/ + + + https://blog.juliobiason.me/tags/dusty-phillips/ + + + https://blog.juliobiason.me/tags/dynamic-dispatch/ + + + https://blog.juliobiason.me/tags/dynamic-types/ + + + https://blog.juliobiason.me/tags/earphones/ + + + https://blog.juliobiason.me/tags/ebay/ + + + https://blog.juliobiason.me/tags/eco-sistema/ + + + https://blog.juliobiason.me/tags/economy/ + + + https://blog.juliobiason.me/tags/ecosystem/ + + + https://blog.juliobiason.me/tags/edition-2013/ + + + https://blog.juliobiason.me/tags/editors/ + + + https://blog.juliobiason.me/tags/ejection/ + + + https://blog.juliobiason.me/tags/eli-rodrigues/ + + + https://blog.juliobiason.me/tags/elixir/ + + + https://blog.juliobiason.me/tags/elizabeth-a-lynn/ + + + https://blog.juliobiason.me/tags/elizabeth-briggs/ + + + https://blog.juliobiason.me/tags/elizabeth-mednicoff/ + + + https://blog.juliobiason.me/tags/elm/ + + + https://blog.juliobiason.me/tags/elon-musk/ + + + https://blog.juliobiason.me/tags/emacs/ + + + https://blog.juliobiason.me/tags/embedded/ + + + https://blog.juliobiason.me/tags/emily-prokop/ + + + https://blog.juliobiason.me/tags/emma-marriott/ + + + https://blog.juliobiason.me/tags/empowerment/ + + + https://blog.juliobiason.me/tags/en-us/ + + + https://blog.juliobiason.me/tags/encoding/ + + + https://blog.juliobiason.me/tags/enderecos/ + + + https://blog.juliobiason.me/tags/energy/ + + + https://blog.juliobiason.me/tags/entradas/ + + + https://blog.juliobiason.me/tags/eric-san-juan/ + + + https://blog.juliobiason.me/tags/erich-maria-remarque/ + + + https://blog.juliobiason.me/tags/erland/ + + + https://blog.juliobiason.me/tags/erlang/ + + + https://blog.juliobiason.me/tags/ernest-cline/ + + + https://blog.juliobiason.me/tags/error-handling/ + + + https://blog.juliobiason.me/tags/erros/ + + + https://blog.juliobiason.me/tags/espionagem/ + + + https://blog.juliobiason.me/tags/esquisitices/ + + + https://blog.juliobiason.me/tags/estado/ + + + https://blog.juliobiason.me/tags/estatico/ + + + https://blog.juliobiason.me/tags/estradas/ + + + https://blog.juliobiason.me/tags/estruturas-de-dados/ + + + https://blog.juliobiason.me/tags/etymology/ + + + https://blog.juliobiason.me/tags/europe/ + + + https://blog.juliobiason.me/tags/event-source/ + + + https://blog.juliobiason.me/tags/events/ + + + https://blog.juliobiason.me/tags/example/ + + + https://blog.juliobiason.me/tags/examples/ + + + https://blog.juliobiason.me/tags/excel/ + + + https://blog.juliobiason.me/tags/exceptions/ + + + https://blog.juliobiason.me/tags/exemplos/ + + + https://blog.juliobiason.me/tags/expectations/ + + + https://blog.juliobiason.me/tags/expelir/ + + + https://blog.juliobiason.me/tags/explicit/ + + + https://blog.juliobiason.me/tags/exploit/ + + + https://blog.juliobiason.me/tags/f/ + + + https://blog.juliobiason.me/tags/facebook/ + + + https://blog.juliobiason.me/tags/factory/ + + + https://blog.juliobiason.me/tags/fakes/ + + + https://blog.juliobiason.me/tags/fallacies/ + + + https://blog.juliobiason.me/tags/fantasia/ + + + https://blog.juliobiason.me/tags/fantasy/ + + + https://blog.juliobiason.me/tags/fast/ + + + https://blog.juliobiason.me/tags/feature-flags/ + + + https://blog.juliobiason.me/tags/fediverse/ + + + https://blog.juliobiason.me/tags/fediverso/ + + + https://blog.juliobiason.me/tags/fedora/ + + + https://blog.juliobiason.me/tags/ficcao/ + + + https://blog.juliobiason.me/tags/fiction/ + + + https://blog.juliobiason.me/tags/file/ + + + https://blog.juliobiason.me/tags/filmes-2020/ + + + https://blog.juliobiason.me/tags/filmes/ + + + https://blog.juliobiason.me/tags/filosofia/ + + + https://blog.juliobiason.me/tags/financas/ + + + https://blog.juliobiason.me/tags/finance/ + + + https://blog.juliobiason.me/tags/find/ + + + https://blog.juliobiason.me/tags/fira/ + + + https://blog.juliobiason.me/tags/firebase/ + + + https://blog.juliobiason.me/tags/firefox/ + + + https://blog.juliobiason.me/tags/fix/ + + + https://blog.juliobiason.me/tags/flask/ + + + https://blog.juliobiason.me/tags/flexbox/ + + + https://blog.juliobiason.me/tags/fluxo-de-dados/ + + + https://blog.juliobiason.me/tags/fones-de-ouvido/ + + + https://blog.juliobiason.me/tags/fonte-da-verdade/ + + + https://blog.juliobiason.me/tags/fonts/ + + + https://blog.juliobiason.me/tags/formula-1/ + + + https://blog.juliobiason.me/tags/framework/ + + + https://blog.juliobiason.me/tags/frameworks/ + + + https://blog.juliobiason.me/tags/fred-hebert/ + + + https://blog.juliobiason.me/tags/fred-miller/ + + + https://blog.juliobiason.me/tags/fred-vogelstein/ + + + https://blog.juliobiason.me/tags/free-software-foundation/ + + + https://blog.juliobiason.me/tags/free-software/ + + + https://blog.juliobiason.me/tags/fsf/ + + + https://blog.juliobiason.me/tags/fuchsia/ + + + https://blog.juliobiason.me/tags/fun/ + + + https://blog.juliobiason.me/tags/functional-programming/ + + + https://blog.juliobiason.me/tags/functional/ + + + https://blog.juliobiason.me/tags/functions/ + + + https://blog.juliobiason.me/tags/funny/ + + + https://blog.juliobiason.me/tags/future-shock/ + + + https://blog.juliobiason.me/tags/gact/ + + + https://blog.juliobiason.me/tags/gcp/ + + + https://blog.juliobiason.me/tags/geek/ + + + https://blog.juliobiason.me/tags/gene-kim/ + + + https://blog.juliobiason.me/tags/generalists/ + + + https://blog.juliobiason.me/tags/generators/ + + + https://blog.juliobiason.me/tags/generics/ + + + https://blog.juliobiason.me/tags/genevieve-valentine/ + + + https://blog.juliobiason.me/tags/geography/ + + + https://blog.juliobiason.me/tags/george-spafford/ + + + https://blog.juliobiason.me/tags/george-takei/ + + + https://blog.juliobiason.me/tags/gerente-de-produtos/ + + + https://blog.juliobiason.me/tags/germany/ + + + https://blog.juliobiason.me/tags/gerrit/ + + + https://blog.juliobiason.me/tags/gestao/ + + + https://blog.juliobiason.me/tags/gherkin/ + + + https://blog.juliobiason.me/tags/git-flow/ + + + https://blog.juliobiason.me/tags/git-ignore/ + + + https://blog.juliobiason.me/tags/git/ + + + https://blog.juliobiason.me/tags/github-actions/ + + + https://blog.juliobiason.me/tags/github/ + + + https://blog.juliobiason.me/tags/gleam/ + + + https://blog.juliobiason.me/tags/gnome/ + + + https://blog.juliobiason.me/tags/go/ + + + https://blog.juliobiason.me/tags/golang/ + + + https://blog.juliobiason.me/tags/google-code-style/ + + + https://blog.juliobiason.me/tags/google/ + + + https://blog.juliobiason.me/tags/government/ + + + https://blog.juliobiason.me/tags/gpl/ + + + https://blog.juliobiason.me/tags/graalvm/ + + + https://blog.juliobiason.me/tags/graham-mcneill/ + + + https://blog.juliobiason.me/tags/great-code/ + + + https://blog.juliobiason.me/tags/greek-mythology/ + + + https://blog.juliobiason.me/tags/greg-bear/ + + + https://blog.juliobiason.me/tags/grim-dawn/ + + + https://blog.juliobiason.me/tags/guix/ + + + https://blog.juliobiason.me/tags/gustavo-h-b-franco/ + + + https://blog.juliobiason.me/tags/h-g-wells/ + + + https://blog.juliobiason.me/tags/h-p-lovecraft/ + + + https://blog.juliobiason.me/tags/hadoop/ + + + https://blog.juliobiason.me/tags/hap-and-leonard/ + + + https://blog.juliobiason.me/tags/harlan-ellison/ + + + https://blog.juliobiason.me/tags/haskell/ + + + https://blog.juliobiason.me/tags/healing/ + + + https://blog.juliobiason.me/tags/hegel/ + + + https://blog.juliobiason.me/tags/hero-project/ + + + https://blog.juliobiason.me/tags/hero-syndrome/ + + + https://blog.juliobiason.me/tags/hierarchical-data/ + + + https://blog.juliobiason.me/tags/highlight/ + + + https://blog.juliobiason.me/tags/hiroshi-sakurazaka/ + + + https://blog.juliobiason.me/tags/historia/ + + + https://blog.juliobiason.me/tags/history/ + + + https://blog.juliobiason.me/tags/home-office/ + + + https://blog.juliobiason.me/tags/horror/ + + + https://blog.juliobiason.me/tags/horus-heresy/ + + + https://blog.juliobiason.me/tags/html/ + + + https://blog.juliobiason.me/tags/http/ + + + https://blog.juliobiason.me/tags/httpx/ + + + https://blog.juliobiason.me/tags/hugh-hefner/ + + + https://blog.juliobiason.me/tags/humor/ + + + https://blog.juliobiason.me/tags/ia/ + + + https://blog.juliobiason.me/tags/ian-young/ + + + https://blog.juliobiason.me/tags/ibm/ + + + https://blog.juliobiason.me/tags/ide/ + + + https://blog.juliobiason.me/tags/ides/ + + + https://blog.juliobiason.me/tags/illutations/ + + + https://blog.juliobiason.me/tags/images/ + + + https://blog.juliobiason.me/tags/immutable/ + + + https://blog.juliobiason.me/tags/incognito-mode/ + + + https://blog.juliobiason.me/tags/infrastructure/ + + + https://blog.juliobiason.me/tags/insights/ + + + https://blog.juliobiason.me/tags/integration-tests/ + + + https://blog.juliobiason.me/tags/interfaces/ + + + https://blog.juliobiason.me/tags/interviews/ + + + https://blog.juliobiason.me/tags/intro/ + + + https://blog.juliobiason.me/tags/io-uring/ + + + https://blog.juliobiason.me/tags/io/ + + + https://blog.juliobiason.me/tags/ionic/ + + + https://blog.juliobiason.me/tags/ios-14/ + + + https://blog.juliobiason.me/tags/ios/ + + + https://blog.juliobiason.me/tags/ipad/ + + + https://blog.juliobiason.me/tags/iphone/ + + + https://blog.juliobiason.me/tags/irc/ + + + https://blog.juliobiason.me/tags/isaac-asimov/ + + + https://blog.juliobiason.me/tags/isaac-strack/ + + + https://blog.juliobiason.me/tags/it/ + + + https://blog.juliobiason.me/tags/iterators/ + + + https://blog.juliobiason.me/tags/ivo-balbaert/ + + + https://blog.juliobiason.me/tags/j-david-eisenberg/ + + + https://blog.juliobiason.me/tags/jack-campbell/ + + + https://blog.juliobiason.me/tags/jacob-petry/ + + + https://blog.juliobiason.me/tags/james-gleick/ + + + https://blog.juliobiason.me/tags/james-swallow/ + + + https://blog.juliobiason.me/tags/jason-bourne/ + + + https://blog.juliobiason.me/tags/java-8/ + + + https://blog.juliobiason.me/tags/java-9/ + + + https://blog.juliobiason.me/tags/java/ + + + https://blog.juliobiason.me/tags/javascript/ + + + https://blog.juliobiason.me/tags/jeff-sutherland/ + + + https://blog.juliobiason.me/tags/jenny-volvovski/ + + + https://blog.juliobiason.me/tags/jens-oliver-meiert/ + + + https://blog.juliobiason.me/tags/jeremy-walker/ + + + https://blog.juliobiason.me/tags/jerzy-kosinski/ + + + https://blog.juliobiason.me/tags/jim-blandy/ + + + https://blog.juliobiason.me/tags/jira/ + + + https://blog.juliobiason.me/tags/jobs/ + + + https://blog.juliobiason.me/tags/joe-haldeman/ + + + https://blog.juliobiason.me/tags/joe-mayo/ + + + https://blog.juliobiason.me/tags/joe-r-lansdale/ + + + https://blog.juliobiason.me/tags/joel-spolsky/ + + + https://blog.juliobiason.me/tags/john-ringo/ + + + https://blog.juliobiason.me/tags/john-scalzi/ + + + https://blog.juliobiason.me/tags/jon-morris/ + + + https://blog.juliobiason.me/tags/jonas-boner/ + + + https://blog.juliobiason.me/tags/jonathan-hayward/ + + + https://blog.juliobiason.me/tags/joplin/ + + + https://blog.juliobiason.me/tags/jory-john/ + + + https://blog.juliobiason.me/tags/joseph-campbell/ + + + https://blog.juliobiason.me/tags/joseph-pisenti/ + + + https://blog.juliobiason.me/tags/journal/ + + + https://blog.juliobiason.me/tags/judith-kat/ + + + https://blog.juliobiason.me/tags/julia-rothman/ + + + https://blog.juliobiason.me/tags/julian-assange/ + + + https://blog.juliobiason.me/tags/juliano-barreto/ + + + https://blog.juliobiason.me/tags/juniors/ + + + https://blog.juliobiason.me/tags/justin-seitz/ + + + https://blog.juliobiason.me/tags/k8s/ + + + https://blog.juliobiason.me/tags/kanban/ + + + https://blog.juliobiason.me/tags/kent-beck/ + + + https://blog.juliobiason.me/tags/kernel/ + + + https://blog.juliobiason.me/tags/kevin-behr/ + + + https://blog.juliobiason.me/tags/kevin-david-anderson/ + + + https://blog.juliobiason.me/tags/keybinds/ + + + https://blog.juliobiason.me/tags/kids/ + + + https://blog.juliobiason.me/tags/kiss/ + + + https://blog.juliobiason.me/tags/kubernetes/ + + + https://blog.juliobiason.me/tags/kublets/ + + + https://blog.juliobiason.me/tags/language-server/ + + + https://blog.juliobiason.me/tags/languages/ + + + https://blog.juliobiason.me/tags/laptop/ + + + https://blog.juliobiason.me/tags/last-fm/ + + + https://blog.juliobiason.me/tags/latency/ + + + https://blog.juliobiason.me/tags/lavie-tidhar/ + + + https://blog.juliobiason.me/tags/layers/ + + + https://blog.juliobiason.me/tags/leadership/ + + + https://blog.juliobiason.me/tags/leading/ + + + https://blog.juliobiason.me/tags/leandro-narloch/ + + + https://blog.juliobiason.me/tags/legacy/ + + + https://blog.juliobiason.me/tags/less/ + + + https://blog.juliobiason.me/tags/liaden-universe/ + + + https://blog.juliobiason.me/tags/liang-yuxian-eugene/ + + + https://blog.juliobiason.me/tags/libraries/ + + + https://blog.juliobiason.me/tags/library/ + + + https://blog.juliobiason.me/tags/libre/ + + + https://blog.juliobiason.me/tags/licencas/ + + + https://blog.juliobiason.me/tags/licenses/ + + + https://blog.juliobiason.me/tags/licensing/ + + + https://blog.juliobiason.me/tags/liderando-projetos/ + + + https://blog.juliobiason.me/tags/linda-rodriguez-mcrobbie/ + + + https://blog.juliobiason.me/tags/linguagens/ + + + https://blog.juliobiason.me/tags/linha-de-comando/ + + + https://blog.juliobiason.me/tags/link/ + + + https://blog.juliobiason.me/tags/linkedin/ + + + https://blog.juliobiason.me/tags/links/ + + + https://blog.juliobiason.me/tags/linux/ + + + https://blog.juliobiason.me/tags/lisp/ + + + https://blog.juliobiason.me/tags/lists/ + + + https://blog.juliobiason.me/tags/live/ + + + https://blog.juliobiason.me/tags/local-run/ + + + https://blog.juliobiason.me/tags/lockdown/ + + + https://blog.juliobiason.me/tags/log/ + + + https://blog.juliobiason.me/tags/logging/ + + + https://blog.juliobiason.me/tags/logic/ + + + https://blog.juliobiason.me/tags/logs/ + + + https://blog.juliobiason.me/tags/lsp/ + + + https://blog.juliobiason.me/tags/mac/ + + + https://blog.juliobiason.me/tags/macbooks/ + + + https://blog.juliobiason.me/tags/machine-learning/ + + + https://blog.juliobiason.me/tags/macos/ + + + https://blog.juliobiason.me/tags/macros/ + + + https://blog.juliobiason.me/tags/mahesh-venkitachalam/ + + + https://blog.juliobiason.me/tags/make/ + + + https://blog.juliobiason.me/tags/management/ + + + https://blog.juliobiason.me/tags/managers/ + + + https://blog.juliobiason.me/tags/manifesto/ + + + https://blog.juliobiason.me/tags/marc-clifton/ + + + https://blog.juliobiason.me/tags/marios-christou/ + + + https://blog.juliobiason.me/tags/mark-mcdonnell/ + + + https://blog.juliobiason.me/tags/mark-richards/ + + + https://blog.juliobiason.me/tags/marketing/ + + + https://blog.juliobiason.me/tags/mars/ + + + https://blog.juliobiason.me/tags/martin-kleppmann/ + + + https://blog.juliobiason.me/tags/marvel/ + + + https://blog.juliobiason.me/tags/mastodon/ + + + https://blog.juliobiason.me/tags/material-design/ + + + https://blog.juliobiason.me/tags/matt-lamothe/ + + + https://blog.juliobiason.me/tags/matt-moore/ + + + https://blog.juliobiason.me/tags/matt-wagner/ + + + https://blog.juliobiason.me/tags/maureen-f-mchugh/ + + + https://blog.juliobiason.me/tags/mauricio-rabuffetti/ + + + https://blog.juliobiason.me/tags/medium/ + + + https://blog.juliobiason.me/tags/meds/ + + + https://blog.juliobiason.me/tags/meetings/ + + + https://blog.juliobiason.me/tags/meetup/ + + + https://blog.juliobiason.me/tags/memoria/ + + + https://blog.juliobiason.me/tags/memory/ + + + https://blog.juliobiason.me/tags/mercurial/ + + + https://blog.juliobiason.me/tags/meritocracy/ + + + https://blog.juliobiason.me/tags/messages/ + + + https://blog.juliobiason.me/tags/meta/ + + + https://blog.juliobiason.me/tags/meter-js/ + + + https://blog.juliobiason.me/tags/metrodome/ + + + https://blog.juliobiason.me/tags/michael-bay/ + + + https://blog.juliobiason.me/tags/michael-heap/ + + + https://blog.juliobiason.me/tags/michal-zalewski/ + + + https://blog.juliobiason.me/tags/mickey-petersen/ + + + https://blog.juliobiason.me/tags/microaggressions/ + + + https://blog.juliobiason.me/tags/microblog/ + + + https://blog.juliobiason.me/tags/microservices/ + + + https://blog.juliobiason.me/tags/microservicos/ + + + https://blog.juliobiason.me/tags/microsoft/ + + + https://blog.juliobiason.me/tags/mike-pirnat/ + + + https://blog.juliobiason.me/tags/miran-lipovaca/ + + + https://blog.juliobiason.me/tags/miriam-leitao/ + + + https://blog.juliobiason.me/tags/mobile/ + + + https://blog.juliobiason.me/tags/mock/ + + + https://blog.juliobiason.me/tags/mocking/ + + + https://blog.juliobiason.me/tags/mocks/ + + + https://blog.juliobiason.me/tags/modules/ + + + https://blog.juliobiason.me/tags/modulos/ + + + https://blog.juliobiason.me/tags/mongodb/ + + + https://blog.juliobiason.me/tags/monitoring/ + + + https://blog.juliobiason.me/tags/monologues/ + + + https://blog.juliobiason.me/tags/morgan-bruce/ + + + https://blog.juliobiason.me/tags/mouse/ + + + https://blog.juliobiason.me/tags/movies-2021/ + + + https://blog.juliobiason.me/tags/movies/ + + + https://blog.juliobiason.me/tags/movile/ + + + https://blog.juliobiason.me/tags/mozilla/ + + + https://blog.juliobiason.me/tags/mujica/ + + + https://blog.juliobiason.me/tags/music/ + + + https://blog.juliobiason.me/tags/musica/ + + + https://blog.juliobiason.me/tags/myself/ + + + https://blog.juliobiason.me/tags/mysql/ + + + https://blog.juliobiason.me/tags/n-k-jemisin/ + + + https://blog.juliobiason.me/tags/names/ + + + https://blog.juliobiason.me/tags/naming/ + + + https://blog.juliobiason.me/tags/narayan-prusty/ + + + https://blog.juliobiason.me/tags/nasa/ + + + https://blog.juliobiason.me/tags/neil-gaiman/ + + + https://blog.juliobiason.me/tags/neovim/ + + + https://blog.juliobiason.me/tags/netlify/ + + + https://blog.juliobiason.me/tags/neville-isdell/ + + + https://blog.juliobiason.me/tags/news/ + + + https://blog.juliobiason.me/tags/nginx/ + + + https://blog.juliobiason.me/tags/niccolo-machiavelli/ + + + https://blog.juliobiason.me/tags/nicholas-boothman/ + + + https://blog.juliobiason.me/tags/nirmala-nataraj/ + + + https://blog.juliobiason.me/tags/nishant-garg/ + + + https://blog.juliobiason.me/tags/nitpick/ + + + https://blog.juliobiason.me/tags/no-code/ + + + https://blog.juliobiason.me/tags/no-man-s-sky/ + + + https://blog.juliobiason.me/tags/nomes/ + + + https://blog.juliobiason.me/tags/note-taking/ + + + https://blog.juliobiason.me/tags/notes/ + + + https://blog.juliobiason.me/tags/noticias/ + + + https://blog.juliobiason.me/tags/nroff/ + + + https://blog.juliobiason.me/tags/nvim/ + + + https://blog.juliobiason.me/tags/o-principe/ + + + https://blog.juliobiason.me/tags/oath/ + + + https://blog.juliobiason.me/tags/objects/ + + + https://blog.juliobiason.me/tags/oil-companies/ + + + https://blog.juliobiason.me/tags/old-man-s-war/ + + + https://blog.juliobiason.me/tags/onboarding/ + + + https://blog.juliobiason.me/tags/online/ + + + https://blog.juliobiason.me/tags/open-source/ + + + https://blog.juliobiason.me/tags/open/ + + + https://blog.juliobiason.me/tags/openjdk/ + + + https://blog.juliobiason.me/tags/optimization/ + + + https://blog.juliobiason.me/tags/oracle/ + + + https://blog.juliobiason.me/tags/org-mode/ + + + https://blog.juliobiason.me/tags/organization/ + + + https://blog.juliobiason.me/tags/own-your-shit/ + + + https://blog.juliobiason.me/tags/owning/ + + + https://blog.juliobiason.me/tags/packt/ + + + https://blog.juliobiason.me/tags/padroes/ + + + https://blog.juliobiason.me/tags/pandoc/ + + + https://blog.juliobiason.me/tags/paper-notes/ + + + https://blog.juliobiason.me/tags/paradox/ + + + https://blog.juliobiason.me/tags/parameters/ + + + https://blog.juliobiason.me/tags/pascal/ + + + https://blog.juliobiason.me/tags/password-manager/ + + + https://blog.juliobiason.me/tags/patents/ + + + https://blog.juliobiason.me/tags/patrick-foote/ + + + https://blog.juliobiason.me/tags/patrick-niemeyer/ + + + https://blog.juliobiason.me/tags/pattern/ + + + https://blog.juliobiason.me/tags/patterns/ + + + https://blog.juliobiason.me/tags/paul-crowther/ + + + https://blog.juliobiason.me/tags/paul-ekman/ + + + https://blog.juliobiason.me/tags/paul-strathern/ + + + https://blog.juliobiason.me/tags/paula-hawkins/ + + + https://blog.juliobiason.me/tags/paulo-caroli/ + + + https://blog.juliobiason.me/tags/paying/ + + + https://blog.juliobiason.me/tags/paywalls/ + + + https://blog.juliobiason.me/tags/pc/ + + + https://blog.juliobiason.me/tags/pensamentos/ + + + https://blog.juliobiason.me/tags/pentest/ + + + https://blog.juliobiason.me/tags/pep8/ + + + https://blog.juliobiason.me/tags/personal-time/ + + + https://blog.juliobiason.me/tags/personal/ + + + https://blog.juliobiason.me/tags/pesquisa/ + + + https://blog.juliobiason.me/tags/pessoal/ + + + https://blog.juliobiason.me/tags/peter-lake/ + + + https://blog.juliobiason.me/tags/pharma/ + + + https://blog.juliobiason.me/tags/philosophy/ + + + https://blog.juliobiason.me/tags/phishing/ + + + https://blog.juliobiason.me/tags/phoenix/ + + + https://blog.juliobiason.me/tags/photos/ + + + https://blog.juliobiason.me/tags/pictures/ + + + https://blog.juliobiason.me/tags/piers-anthony/ + + + https://blog.juliobiason.me/tags/pitfalls/ + + + https://blog.juliobiason.me/tags/plausible/ + + + https://blog.juliobiason.me/tags/playbook/ + + + https://blog.juliobiason.me/tags/playboy/ + + + https://blog.juliobiason.me/tags/plugins/ + + + https://blog.juliobiason.me/tags/podman/ + + + https://blog.juliobiason.me/tags/poetry/ + + + https://blog.juliobiason.me/tags/pong/ + + + https://blog.juliobiason.me/tags/por-dia/ + + + https://blog.juliobiason.me/tags/porn-industry/ + + + https://blog.juliobiason.me/tags/post-its/ + + + https://blog.juliobiason.me/tags/post-mortems/ + + + https://blog.juliobiason.me/tags/postgres/ + + + https://blog.juliobiason.me/tags/postgresql/ + + + https://blog.juliobiason.me/tags/pre-order/ + + + https://blog.juliobiason.me/tags/predicable/ + + + https://blog.juliobiason.me/tags/presentation/ + + + https://blog.juliobiason.me/tags/presentations/ + + + https://blog.juliobiason.me/tags/previsivel/ + + + https://blog.juliobiason.me/tags/principles/ + + + https://blog.juliobiason.me/tags/privacidade/ + + + https://blog.juliobiason.me/tags/privacy/ + + + https://blog.juliobiason.me/tags/process/ + + + https://blog.juliobiason.me/tags/producao-2019/ + + + https://blog.juliobiason.me/tags/product-manager/ + + + https://blog.juliobiason.me/tags/productivity/ + + + https://blog.juliobiason.me/tags/produtividade/ + + + https://blog.juliobiason.me/tags/programacao/ + + + https://blog.juliobiason.me/tags/programming-languages/ + + + https://blog.juliobiason.me/tags/programming/ + + + https://blog.juliobiason.me/tags/project-organization/ + + + https://blog.juliobiason.me/tags/project/ + + + https://blog.juliobiason.me/tags/projects/ + + + https://blog.juliobiason.me/tags/projeto/ + + + https://blog.juliobiason.me/tags/projetos/ + + + https://blog.juliobiason.me/tags/prolog/ + + + https://blog.juliobiason.me/tags/prometheus/ + + + https://blog.juliobiason.me/tags/propaganda/ + + + https://blog.juliobiason.me/tags/protection/ + + + https://blog.juliobiason.me/tags/protocol/ + + + https://blog.juliobiason.me/tags/protocolo/ + + + https://blog.juliobiason.me/tags/psicologia/ + + + https://blog.juliobiason.me/tags/psychology/ + + + https://blog.juliobiason.me/tags/public-domain/ + + + https://blog.juliobiason.me/tags/published-1853/ + + + https://blog.juliobiason.me/tags/published-1896/ + + + https://blog.juliobiason.me/tags/published-1929/ + + + https://blog.juliobiason.me/tags/published-1932/ + + + https://blog.juliobiason.me/tags/published-1949/ + + + https://blog.juliobiason.me/tags/published-1954/ + + + https://blog.juliobiason.me/tags/published-1965/ + + + https://blog.juliobiason.me/tags/published-1967/ + + + https://blog.juliobiason.me/tags/published-1970/ + + + https://blog.juliobiason.me/tags/published-1971/ + + + https://blog.juliobiason.me/tags/published-1974/ + + + https://blog.juliobiason.me/tags/published-1982/ + + + https://blog.juliobiason.me/tags/published-1985/ + + + https://blog.juliobiason.me/tags/published-1987/ + + + https://blog.juliobiason.me/tags/published-1989/ + + + https://blog.juliobiason.me/tags/published-1990/ + + + https://blog.juliobiason.me/tags/published-1991/ + + + https://blog.juliobiason.me/tags/published-1992/ + + + https://blog.juliobiason.me/tags/published-1993/ + + + https://blog.juliobiason.me/tags/published-1994/ + + + https://blog.juliobiason.me/tags/published-1997/ + + + https://blog.juliobiason.me/tags/published-2001/ + + + https://blog.juliobiason.me/tags/published-2002/ + + + https://blog.juliobiason.me/tags/published-2003/ + + + https://blog.juliobiason.me/tags/published-2004/ + + + https://blog.juliobiason.me/tags/published-2005/ + + + https://blog.juliobiason.me/tags/published-2006/ + + + https://blog.juliobiason.me/tags/published-2007/ + + + https://blog.juliobiason.me/tags/published-2008/ + + + https://blog.juliobiason.me/tags/published-2009/ + + + https://blog.juliobiason.me/tags/published-2010/ + + + https://blog.juliobiason.me/tags/published-2011/ + + + https://blog.juliobiason.me/tags/published-2012/ + + + https://blog.juliobiason.me/tags/published-2013/ + + + https://blog.juliobiason.me/tags/published-2014/ + + + https://blog.juliobiason.me/tags/published-2015/ + + + https://blog.juliobiason.me/tags/published-2016/ + + + https://blog.juliobiason.me/tags/published-2017/ + + + https://blog.juliobiason.me/tags/published-2018/ + + + https://blog.juliobiason.me/tags/published-2019/ + + + https://blog.juliobiason.me/tags/pull-requests/ + + + https://blog.juliobiason.me/tags/pylint/ + + + https://blog.juliobiason.me/tags/pyramid/ + + + https://blog.juliobiason.me/tags/python-2/ + + + https://blog.juliobiason.me/tags/python-3/ + + + https://blog.juliobiason.me/tags/python/ + + + https://blog.juliobiason.me/tags/quinton-anderson/ + + + https://blog.juliobiason.me/tags/quirks/ + + + https://blog.juliobiason.me/tags/quit/ + + + https://blog.juliobiason.me/tags/r-a-macavoy/ + + + https://blog.juliobiason.me/tags/racism/ + + + https://blog.juliobiason.me/tags/racismo/ + + + https://blog.juliobiason.me/tags/racket/ + + + https://blog.juliobiason.me/tags/rahul-soni/ + + + https://blog.juliobiason.me/tags/randall-hyde/ + + + https://blog.juliobiason.me/tags/random/ + + + https://blog.juliobiason.me/tags/range/ + + + https://blog.juliobiason.me/tags/raoul-gabriel-urma/ + + + https://blog.juliobiason.me/tags/rastreamento/ + + + https://blog.juliobiason.me/tags/re-identifying/ + + + https://blog.juliobiason.me/tags/react-native/ + + + https://blog.juliobiason.me/tags/react/ + + + https://blog.juliobiason.me/tags/reactions/ + + + https://blog.juliobiason.me/tags/reactive/ + + + https://blog.juliobiason.me/tags/readability/ + + + https://blog.juliobiason.me/tags/recutils/ + + + https://blog.juliobiason.me/tags/reddit/ + + + https://blog.juliobiason.me/tags/redirecionamento/ + + + https://blog.juliobiason.me/tags/reescritas/ + + + https://blog.juliobiason.me/tags/refactor/ + + + https://blog.juliobiason.me/tags/released-2020/ + + + https://blog.juliobiason.me/tags/remote/ + + + https://blog.juliobiason.me/tags/reports/ + + + https://blog.juliobiason.me/tags/request/ + + + https://blog.juliobiason.me/tags/requirements/ + + + https://blog.juliobiason.me/tags/requisicoes-async/ + + + https://blog.juliobiason.me/tags/research/ + + + https://blog.juliobiason.me/tags/responsibility/ + + + https://blog.juliobiason.me/tags/rest/ + + + https://blog.juliobiason.me/tags/restful/ + + + https://blog.juliobiason.me/tags/rethink/ + + + https://blog.juliobiason.me/tags/review/ + + + https://blog.juliobiason.me/tags/reviews/ + + + https://blog.juliobiason.me/tags/rewrite/ + + + https://blog.juliobiason.me/tags/rewrites/ + + + https://blog.juliobiason.me/tags/richard-burton/ + + + https://blog.juliobiason.me/tags/richard-dawkins/ + + + https://blog.juliobiason.me/tags/richard-feyman/ + + + https://blog.juliobiason.me/tags/richard-feynman/ + + + https://blog.juliobiason.me/tags/richard-matheson/ + + + https://blog.juliobiason.me/tags/right-tool/ + + + https://blog.juliobiason.me/tags/rin-tin-tin/ + + + https://blog.juliobiason.me/tags/rms/ + + + https://blog.juliobiason.me/tags/roads/ + + + https://blog.juliobiason.me/tags/robert-boesel/ + + + https://blog.juliobiason.me/tags/robert-c-martin/ + + + https://blog.juliobiason.me/tags/robert-r-mccammon/ + + + https://blog.juliobiason.me/tags/robert-redford/ + + + https://blog.juliobiason.me/tags/robert-schnakenberg/ + + + https://blog.juliobiason.me/tags/robert-silverberg/ + + + https://blog.juliobiason.me/tags/robotics/ + + + https://blog.juliobiason.me/tags/rodrigo-assis-mesquita/ + + + https://blog.juliobiason.me/tags/rodrigo-vargas/ + + + https://blog.juliobiason.me/tags/rolland-roberts/ + + + https://blog.juliobiason.me/tags/rss/ + + + https://blog.juliobiason.me/tags/ruby/ + + + https://blog.juliobiason.me/tags/runbook/ + + + https://blog.juliobiason.me/tags/runner/ + + + https://blog.juliobiason.me/tags/russ-mckendrick/ + + + https://blog.juliobiason.me/tags/russell-crowe/ + + + https://blog.juliobiason.me/tags/rust/ + + + https://blog.juliobiason.me/tags/ryan-roemer/ + + + https://blog.juliobiason.me/tags/s-j-scott/ + + + https://blog.juliobiason.me/tags/safety/ + + + https://blog.juliobiason.me/tags/saidas/ + + + https://blog.juliobiason.me/tags/sam-kean/ + + + https://blog.juliobiason.me/tags/say-no/ + + + https://blog.juliobiason.me/tags/scala/ + + + https://blog.juliobiason.me/tags/sci/ + + + https://blog.juliobiason.me/tags/science/ + + + https://blog.juliobiason.me/tags/scifi/ + + + https://blog.juliobiason.me/tags/scotty/ + + + https://blog.juliobiason.me/tags/scp/ + + + https://blog.juliobiason.me/tags/screen-recording/ + + + https://blog.juliobiason.me/tags/scripts/ + + + https://blog.juliobiason.me/tags/scrobble/ + + + https://blog.juliobiason.me/tags/scrobbles/ + + + https://blog.juliobiason.me/tags/scrum/ + + + https://blog.juliobiason.me/tags/search/ + + + https://blog.juliobiason.me/tags/second-order-thinking/ + + + https://blog.juliobiason.me/tags/secrets/ + + + https://blog.juliobiason.me/tags/security/ + + + https://blog.juliobiason.me/tags/seek/ + + + https://blog.juliobiason.me/tags/segmentation-fault/ + + + https://blog.juliobiason.me/tags/seguranca/ + + + https://blog.juliobiason.me/tags/self-help/ + + + https://blog.juliobiason.me/tags/self-hosted/ + + + https://blog.juliobiason.me/tags/senhas/ + + + https://blog.juliobiason.me/tags/seo/ + + + https://blog.juliobiason.me/tags/series-2021/ + + + https://blog.juliobiason.me/tags/series/ + + + https://blog.juliobiason.me/tags/server/ + + + https://blog.juliobiason.me/tags/servidor/ + + + https://blog.juliobiason.me/tags/seth-grahame-smith/ + + + https://blog.juliobiason.me/tags/shantanu-tushar/ + + + https://blog.juliobiason.me/tags/shapes-of-code/ + + + https://blog.juliobiason.me/tags/sharing/ + + + https://blog.juliobiason.me/tags/sharring/ + + + https://blog.juliobiason.me/tags/shell-script/ + + + https://blog.juliobiason.me/tags/shell/ + + + https://blog.juliobiason.me/tags/short/ + + + https://blog.juliobiason.me/tags/sigsegv/ + + + https://blog.juliobiason.me/tags/silverblue/ + + + https://blog.juliobiason.me/tags/simon-st-laurent/ + + + https://blog.juliobiason.me/tags/simon-timms/ + + + https://blog.juliobiason.me/tags/single-responsibility/ + + + https://blog.juliobiason.me/tags/site/ + + + https://blog.juliobiason.me/tags/six/ + + + https://blog.juliobiason.me/tags/size/ + + + https://blog.juliobiason.me/tags/slack/ + + + https://blog.juliobiason.me/tags/slides/ + + + https://blog.juliobiason.me/tags/small-teams/ + + + https://blog.juliobiason.me/tags/software-architecture/ + + + https://blog.juliobiason.me/tags/software-livre/ + + + https://blog.juliobiason.me/tags/solomon-northup/ + + + https://blog.juliobiason.me/tags/solution/ + + + https://blog.juliobiason.me/tags/solutions/ + + + https://blog.juliobiason.me/tags/source-control/ + + + https://blog.juliobiason.me/tags/source-of-truth/ + + + https://blog.juliobiason.me/tags/spa/ + + + https://blog.juliobiason.me/tags/spaces/ + + + https://blog.juliobiason.me/tags/spawn/ + + + https://blog.juliobiason.me/tags/specialists/ + + + https://blog.juliobiason.me/tags/specs/ + + + https://blog.juliobiason.me/tags/spotify/ + + + https://blog.juliobiason.me/tags/spring/ + + + https://blog.juliobiason.me/tags/spying/ + + + https://blog.juliobiason.me/tags/stackoverflow/ + + + https://blog.juliobiason.me/tags/stallman/ + + + https://blog.juliobiason.me/tags/stanislaw-lem/ + + + https://blog.juliobiason.me/tags/star-trek/ + + + https://blog.juliobiason.me/tags/stars-0/ + + + https://blog.juliobiason.me/tags/stars-1/ + + + https://blog.juliobiason.me/tags/stars-2/ + + + https://blog.juliobiason.me/tags/stars-3/ + + + https://blog.juliobiason.me/tags/stars-4/ + + + https://blog.juliobiason.me/tags/stars-5/ + + + https://blog.juliobiason.me/tags/state/ + + + https://blog.juliobiason.me/tags/static/ + + + https://blog.juliobiason.me/tags/status/ + + + https://blog.juliobiason.me/tags/stderr/ + + + https://blog.juliobiason.me/tags/stdin/ + + + https://blog.juliobiason.me/tags/stdlib/ + + + https://blog.juliobiason.me/tags/stdout/ + + + https://blog.juliobiason.me/tags/stephen-blackheath/ + + + https://blog.juliobiason.me/tags/stephen-h-segal/ + + + https://blog.juliobiason.me/tags/stephen-king/ + + + https://blog.juliobiason.me/tags/stephen-witt/ + + + https://blog.juliobiason.me/tags/steps/ + + + https://blog.juliobiason.me/tags/steve-fenton/ + + + https://blog.juliobiason.me/tags/steven-d-levitt/ + + + https://blog.juliobiason.me/tags/steven-f-lott/ + + + https://blog.juliobiason.me/tags/steven-seagal/ + + + https://blog.juliobiason.me/tags/stoicism/ + + + https://blog.juliobiason.me/tags/stop/ + + + https://blog.juliobiason.me/tags/storage/ + + + https://blog.juliobiason.me/tags/storm/ + + + https://blog.juliobiason.me/tags/stoyan-stefanov/ + + + https://blog.juliobiason.me/tags/stream-processing/ + + + https://blog.juliobiason.me/tags/stream/ + + + https://blog.juliobiason.me/tags/streaming/ + + + https://blog.juliobiason.me/tags/structs/ + + + https://blog.juliobiason.me/tags/studio-ghibli/ + + + https://blog.juliobiason.me/tags/stupid-bugs/ + + + https://blog.juliobiason.me/tags/subcomandos/ + + + https://blog.juliobiason.me/tags/superheroes/ + + + https://blog.juliobiason.me/tags/survey/ + + + https://blog.juliobiason.me/tags/susan-orlean/ + + + https://blog.juliobiason.me/tags/swift/ + + + https://blog.juliobiason.me/tags/syntax-highlight/ + + + https://blog.juliobiason.me/tags/systemd/ + + + https://blog.juliobiason.me/tags/t-s-mcnamara/ + + + https://blog.juliobiason.me/tags/tabelas/ + + + https://blog.juliobiason.me/tags/tables/ + + + https://blog.juliobiason.me/tags/tabs/ + + + https://blog.juliobiason.me/tags/task-manager/ + + + https://blog.juliobiason.me/tags/tchelinux/ + + + https://blog.juliobiason.me/tags/team-building/ + + + https://blog.juliobiason.me/tags/team/ + + + https://blog.juliobiason.me/tags/teams/ + + + https://blog.juliobiason.me/tags/technical-debt/ + + + https://blog.juliobiason.me/tags/technical-specs/ + + + https://blog.juliobiason.me/tags/technology/ + + + https://blog.juliobiason.me/tags/ted-chiang/ + + + https://blog.juliobiason.me/tags/telefork/ + + + https://blog.juliobiason.me/tags/telegram/ + + + https://blog.juliobiason.me/tags/temporary-solutions/ + + + https://blog.juliobiason.me/tags/terminal/ + + + https://blog.juliobiason.me/tags/terms-and-conditions/ + + + https://blog.juliobiason.me/tags/testes-de-integracao/ + + + https://blog.juliobiason.me/tags/testes-unitarios/ + + + https://blog.juliobiason.me/tags/testes/ + + + https://blog.juliobiason.me/tags/testing/ + + + https://blog.juliobiason.me/tags/tests/ + + + https://blog.juliobiason.me/tags/text-processing/ + + + https://blog.juliobiason.me/tags/the-dark-tower/ + + + https://blog.juliobiason.me/tags/the-forever-war/ + + + https://blog.juliobiason.me/tags/the-pillars-of-reality/ + + + https://blog.juliobiason.me/tags/the-secret-life-of-walter-mitty/ + + + https://blog.juliobiason.me/tags/the-way/ + + + https://blog.juliobiason.me/tags/the-witcher/ + + + https://blog.juliobiason.me/tags/things-i-don-t-know/ + + + https://blog.juliobiason.me/tags/things-i-learnt/ + + + https://blog.juliobiason.me/tags/thomas-hunter-ii/ + + + https://blog.juliobiason.me/tags/thoughts/ + + + https://blog.juliobiason.me/tags/threadpools/ + + + https://blog.juliobiason.me/tags/thriller/ + + + https://blog.juliobiason.me/tags/ti/ + + + https://blog.juliobiason.me/tags/tide/ + + + https://blog.juliobiason.me/tags/tiktok/ + + + https://blog.juliobiason.me/tags/til/ + + + https://blog.juliobiason.me/tags/tiler/ + + + https://blog.juliobiason.me/tags/tiling/ + + + https://blog.juliobiason.me/tags/time/ + + + https://blog.juliobiason.me/tags/timeout/ + + + https://blog.juliobiason.me/tags/timer/ + + + https://blog.juliobiason.me/tags/timezones/ + + + https://blog.juliobiason.me/tags/timothy-zahn/ + + + https://blog.juliobiason.me/tags/tipos/ + + + https://blog.juliobiason.me/tags/tmux/ + + + https://blog.juliobiason.me/tags/tobias-klein/ + + + https://blog.juliobiason.me/tags/tokio/ + + + https://blog.juliobiason.me/tags/tommy-lee-jones/ + + + https://blog.juliobiason.me/tags/tony-mott/ + + + https://blog.juliobiason.me/tags/toolbox/ + + + https://blog.juliobiason.me/tags/toolbx/ + + + https://blog.juliobiason.me/tags/top/ + + + https://blog.juliobiason.me/tags/torture/ + + + https://blog.juliobiason.me/tags/toxic-people/ + + + https://blog.juliobiason.me/tags/tracking/ + + + https://blog.juliobiason.me/tags/travis-s-taylor/ + + + https://blog.juliobiason.me/tags/treesitter/ + + + https://blog.juliobiason.me/tags/tribes/ + + + https://blog.juliobiason.me/tags/trim/ + + + https://blog.juliobiason.me/tags/trivia/ + + + https://blog.juliobiason.me/tags/troff/ + + + https://blog.juliobiason.me/tags/trump/ + + + https://blog.juliobiason.me/tags/tu/ + + + https://blog.juliobiason.me/tags/tui/ + + + https://blog.juliobiason.me/tags/twitch/ + + + https://blog.juliobiason.me/tags/twitter/ + + + https://blog.juliobiason.me/tags/types/ + + + https://blog.juliobiason.me/tags/typescript/ + + + https://blog.juliobiason.me/tags/typesetting/ + + + https://blog.juliobiason.me/tags/ui/ + + + https://blog.juliobiason.me/tags/ultra-rich/ + + + https://blog.juliobiason.me/tags/unit-tests/ + + + https://blog.juliobiason.me/tags/unit/ + + + https://blog.juliobiason.me/tags/units/ + + + https://blog.juliobiason.me/tags/universities/ + + + https://blog.juliobiason.me/tags/unix/ + + + https://blog.juliobiason.me/tags/upgrades/ + + + https://blog.juliobiason.me/tags/ursula-k-le-guin/ + + + https://blog.juliobiason.me/tags/uruguai/ + + + https://blog.juliobiason.me/tags/user-data/ + + + https://blog.juliobiason.me/tags/utf-8/ + + + https://blog.juliobiason.me/tags/uuid/ + + + https://blog.juliobiason.me/tags/uwsgi/ + + + https://blog.juliobiason.me/tags/ux/ + + + https://blog.juliobiason.me/tags/vcs/ + + + https://blog.juliobiason.me/tags/versions/ + + + https://blog.juliobiason.me/tags/vicky-oliver/ + + + https://blog.juliobiason.me/tags/video-games/ + + + https://blog.juliobiason.me/tags/video/ + + + https://blog.juliobiason.me/tags/videos/ + + + https://blog.juliobiason.me/tags/vim/ + + + https://blog.juliobiason.me/tags/vimconf/ + + + https://blog.juliobiason.me/tags/virtual/ + + + https://blog.juliobiason.me/tags/vscode/ + + + https://blog.juliobiason.me/tags/vulnerabilidade/ + + + https://blog.juliobiason.me/tags/vulnerability/ + + + https://blog.juliobiason.me/tags/wallpapers/ + + + https://blog.juliobiason.me/tags/warhammer-40000/ + + + https://blog.juliobiason.me/tags/wash-your-hands/ + + + https://blog.juliobiason.me/tags/wasm/ + + + https://blog.juliobiason.me/tags/web-apis/ + + + https://blog.juliobiason.me/tags/web-development/ + + + https://blog.juliobiason.me/tags/web/ + + + https://blog.juliobiason.me/tags/webdav/ + + + https://blog.juliobiason.me/tags/webkit/ + + + https://blog.juliobiason.me/tags/website/ + + + https://blog.juliobiason.me/tags/websites/ + + + https://blog.juliobiason.me/tags/werewolves/ + + + https://blog.juliobiason.me/tags/wfh/ + + + https://blog.juliobiason.me/tags/whatsapp/ + + + https://blog.juliobiason.me/tags/wiki/ + + + https://blog.juliobiason.me/tags/wikileaks/ + + + https://blog.juliobiason.me/tags/wil-wheaton/ + + + https://blog.juliobiason.me/tags/windows/ + + + https://blog.juliobiason.me/tags/winrt/ + + + https://blog.juliobiason.me/tags/word-generator/ + + + https://blog.juliobiason.me/tags/work-from-home/ + + + https://blog.juliobiason.me/tags/work/ + + + https://blog.juliobiason.me/tags/writing-code/ + + + https://blog.juliobiason.me/tags/writing/ + + + https://blog.juliobiason.me/tags/xml/ + + + https://blog.juliobiason.me/tags/yaml/ + + + https://blog.juliobiason.me/tags/year/ + + + https://blog.juliobiason.me/tags/yew/ + + + https://blog.juliobiason.me/tags/youtube/ + + + https://blog.juliobiason.me/tags/zaki-hasan/ + + + https://blog.juliobiason.me/tags/zig/ + + + https://blog.juliobiason.me/tags/zola/ + + + https://blog.juliobiason.me/tags/zombies/ + + + https://blog.juliobiason.me/tags/zoom/ + + + https://blog.juliobiason.me/tags/zsh/ + + + https://blog.juliobiason.me/tags/zshell/ + + + https://blog.juliobiason.me/tags/zuckerberg/ + + + https://blog.juliobiason.me/thoughts/ + + + https://blog.juliobiason.me/thoughts/code-is-a-book-unittests-are-spell-checkers/ + 2020-02-14 + + + https://blog.juliobiason.me/thoughts/daily-links/ + 2020-03-03 + + + https://blog.juliobiason.me/thoughts/go-problem-is-not-the-xml-vulnerability/ + 2020-12-15 + + + https://blog.juliobiason.me/thoughts/how-to-kill-developer-productivity/ + 2020-07-20 + + + https://blog.juliobiason.me/thoughts/my-2019-review/ + 2020-01-03 + + + https://blog.juliobiason.me/thoughts/one-week-with-tiler/ + 2019-01-19 + + + https://blog.juliobiason.me/thoughts/pre-order-the-case-of-no-mans-sky/ + 2016-08-25 + + + https://blog.juliobiason.me/thoughts/python-loses-2nd-place-loved-language/ + 2020-06-09 + + + https://blog.juliobiason.me/thoughts/real-life-rust/ + 2022-07-26 + + + https://blog.juliobiason.me/thoughts/reveries-about-testing/ + 2020-01-13 + + + https://blog.juliobiason.me/thoughts/rms-and-fsf-again/ + 2021-03-29 + + + https://blog.juliobiason.me/thoughts/the-hidden-value-of-tiktok/ + 2020-09-15 + + + https://blog.juliobiason.me/thoughts/the-sad-life-of-walter-mitty/ + 2015-03-28 + + + https://blog.juliobiason.me/thoughts/things-i-learnt-the-hard-way-the-book/ + 2019-06-14 + + + https://blog.juliobiason.me/thoughts/things-i-learnt-the-hard-way/ + 2019-06-10 + + + https://blog.juliobiason.me/thoughts/three-weeks-with-silverblue/ + 2021-07-23 + + + https://blog.juliobiason.me/thoughts/what-the-hell-is-apple-doing/ + 2020-10-30 + + + https://blog.juliobiason.me/thoughts/why-rust-and-not-go/ + 2019-09-16 + + + https://blog.juliobiason.me/videos/ + + diff --git a/public/tags/1password/index.html b/public/tags/1password/index.html new file mode 100644 index 0000000..e81d6a2 --- /dev/null +++ b/public/tags/1password/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

1password

+ + + +
+ + + + diff --git a/public/tags/1x-developer/index.html b/public/tags/1x-developer/index.html new file mode 100644 index 0000000..70531a1 --- /dev/null +++ b/public/tags/1x-developer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

1x developer

+ + + +
+ + + + diff --git a/public/tags/2019/index.html b/public/tags/2019/index.html new file mode 100644 index 0000000..04d2258 --- /dev/null +++ b/public/tags/2019/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

2019

+ + + +
+ + + + diff --git a/public/tags/about-me/index.html b/public/tags/about-me/index.html new file mode 100644 index 0000000..6880cdb --- /dev/null +++ b/public/tags/about-me/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

about me

+ + + +
+ + + + diff --git a/public/tags/accessibility/index.html b/public/tags/accessibility/index.html new file mode 100644 index 0000000..a1f2d07 --- /dev/null +++ b/public/tags/accessibility/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

accessibility

+ + + +
+ + + + diff --git a/public/tags/activitypub/index.html b/public/tags/activitypub/index.html new file mode 100644 index 0000000..923acce --- /dev/null +++ b/public/tags/activitypub/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

activitypub

+ + + +
+ + + + diff --git a/public/tags/actix/index.html b/public/tags/actix/index.html new file mode 100644 index 0000000..4dbb4c7 --- /dev/null +++ b/public/tags/actix/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

actix

+ + + +
+ + + + diff --git a/public/tags/actor-model/index.html b/public/tags/actor-model/index.html new file mode 100644 index 0000000..f082cfb --- /dev/null +++ b/public/tags/actor-model/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

actor model

+ + + +
+ + + + diff --git a/public/tags/addresses/index.html b/public/tags/addresses/index.html new file mode 100644 index 0000000..b76d85b --- /dev/null +++ b/public/tags/addresses/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

addresses

+ + + +
+ + + + diff --git a/public/tags/adoption/index.html b/public/tags/adoption/index.html new file mode 100644 index 0000000..31cf776 --- /dev/null +++ b/public/tags/adoption/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

adoption

+ + + +
+ + + + diff --git a/public/tags/ads/index.html b/public/tags/ads/index.html new file mode 100644 index 0000000..b850398 --- /dev/null +++ b/public/tags/ads/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ads

+ + + +
+ + + + diff --git a/public/tags/adsense/index.html b/public/tags/adsense/index.html new file mode 100644 index 0000000..4bf7d85 --- /dev/null +++ b/public/tags/adsense/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

adsense

+ + + +
+ + + + diff --git a/public/tags/advertising/index.html b/public/tags/advertising/index.html new file mode 100644 index 0000000..4b13c01 --- /dev/null +++ b/public/tags/advertising/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

advertising

+ + + +
+ + + + diff --git a/public/tags/advice/index.html b/public/tags/advice/index.html new file mode 100644 index 0000000..d68959e --- /dev/null +++ b/public/tags/advice/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

advice

+ + + +
+ + + + diff --git a/public/tags/agct/index.html b/public/tags/agct/index.html new file mode 100644 index 0000000..2117a90 --- /dev/null +++ b/public/tags/agct/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

agct

+ + + +
+ + + + diff --git a/public/tags/agenda/index.html b/public/tags/agenda/index.html new file mode 100644 index 0000000..aa540f9 --- /dev/null +++ b/public/tags/agenda/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

agenda

+ + + +
+ + + + diff --git a/public/tags/agile/index.html b/public/tags/agile/index.html new file mode 100644 index 0000000..6a0ba9d --- /dev/null +++ b/public/tags/agile/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

agile

+ + + +
+ + + + diff --git a/public/tags/agpl/index.html b/public/tags/agpl/index.html new file mode 100644 index 0000000..86627f5 --- /dev/null +++ b/public/tags/agpl/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

agpl

+ + + +
+ + + + diff --git a/public/tags/ai/index.html b/public/tags/ai/index.html new file mode 100644 index 0000000..13609da --- /dev/null +++ b/public/tags/ai/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ai

+ + + +
+ + + + diff --git a/public/tags/aidas-bendoraitis/index.html b/public/tags/aidas-bendoraitis/index.html new file mode 100644 index 0000000..48fc7a9 --- /dev/null +++ b/public/tags/aidas-bendoraitis/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

aidas bendoraitis

+ + + +
+ + + + diff --git a/public/tags/airflow/index.html b/public/tags/airflow/index.html new file mode 100644 index 0000000..49c2b8d --- /dev/null +++ b/public/tags/airflow/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

airflow

+ + + +
+ + + + diff --git a/public/tags/akhil-wali/index.html b/public/tags/akhil-wali/index.html new file mode 100644 index 0000000..938bce7 --- /dev/null +++ b/public/tags/akhil-wali/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

akhil wali

+ + + +
+ + + + diff --git a/public/tags/alan-kay/index.html b/public/tags/alan-kay/index.html new file mode 100644 index 0000000..cb46526 --- /dev/null +++ b/public/tags/alan-kay/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alan kay

+ + + +
+ + + + diff --git a/public/tags/alan-shepard/index.html b/public/tags/alan-shepard/index.html new file mode 100644 index 0000000..f04b39b --- /dev/null +++ b/public/tags/alan-shepard/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alan shepard

+ + + +
+ + + + diff --git a/public/tags/alberto-boschetti/index.html b/public/tags/alberto-boschetti/index.html new file mode 100644 index 0000000..bf0cb3e --- /dev/null +++ b/public/tags/alberto-boschetti/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alberto boschetti

+ + + +
+ + + + diff --git a/public/tags/aldous-huxley/index.html b/public/tags/aldous-huxley/index.html new file mode 100644 index 0000000..efbf916 --- /dev/null +++ b/public/tags/aldous-huxley/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

aldous huxley

+ + + +
+ + + + diff --git a/public/tags/alex-holmes/index.html b/public/tags/alex-holmes/index.html new file mode 100644 index 0000000..0bf122c --- /dev/null +++ b/public/tags/alex-holmes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alex holmes

+ + + +
+ + + + diff --git a/public/tags/algorithm/index.html b/public/tags/algorithm/index.html new file mode 100644 index 0000000..bcbe87c --- /dev/null +++ b/public/tags/algorithm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

algorithm

+ + + +
+ + + + diff --git a/public/tags/algorithms/index.html b/public/tags/algorithms/index.html new file mode 100644 index 0000000..41003b7 --- /dev/null +++ b/public/tags/algorithms/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

algorithms

+ + + +
+ + + + diff --git a/public/tags/ali-almossawi/index.html b/public/tags/ali-almossawi/index.html new file mode 100644 index 0000000..d0591d9 --- /dev/null +++ b/public/tags/ali-almossawi/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ali almossawi

+ + + +
+ + + + diff --git a/public/tags/alternatives/index.html b/public/tags/alternatives/index.html new file mode 100644 index 0000000..365505e --- /dev/null +++ b/public/tags/alternatives/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

alternatives

+ + + +
+ + + + diff --git a/public/tags/amazon/index.html b/public/tags/amazon/index.html new file mode 100644 index 0000000..e340537 --- /dev/null +++ b/public/tags/amazon/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

amazon

+ + + +
+ + + + diff --git a/public/tags/american-gods/index.html b/public/tags/american-gods/index.html new file mode 100644 index 0000000..12c0ce8 --- /dev/null +++ b/public/tags/american-gods/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

american gods

+ + + +
+ + + + diff --git a/public/tags/andrew-maynard/index.html b/public/tags/andrew-maynard/index.html new file mode 100644 index 0000000..57b142e --- /dev/null +++ b/public/tags/andrew-maynard/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

andrew maynard

+ + + +
+ + + + diff --git a/public/tags/android/index.html b/public/tags/android/index.html new file mode 100644 index 0000000..0d4a138 --- /dev/null +++ b/public/tags/android/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

android

+ + + +
+ + + + diff --git a/public/tags/andy-weir/index.html b/public/tags/andy-weir/index.html new file mode 100644 index 0000000..5df04eb --- /dev/null +++ b/public/tags/andy-weir/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

andy weir

+ + + +
+ + + + diff --git a/public/tags/angularjs/index.html b/public/tags/angularjs/index.html new file mode 100644 index 0000000..be11b78 --- /dev/null +++ b/public/tags/angularjs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

angularjs

+ + + +
+ + + + diff --git a/public/tags/annals-of-the-western-shore/index.html b/public/tags/annals-of-the-western-shore/index.html new file mode 100644 index 0000000..d3ed0cc --- /dev/null +++ b/public/tags/annals-of-the-western-shore/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

annals of the western shore

+ + + +
+ + + + diff --git a/public/tags/anonymized-data/index.html b/public/tags/anonymized-data/index.html new file mode 100644 index 0000000..b3a065f --- /dev/null +++ b/public/tags/anonymized-data/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

anonymized data

+ + + +
+ + + + diff --git a/public/tags/ansible/index.html b/public/tags/ansible/index.html new file mode 100644 index 0000000..999c477 --- /dev/null +++ b/public/tags/ansible/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ansible

+ + + +
+ + + + diff --git a/public/tags/anthony-jones/index.html b/public/tags/anthony-jones/index.html new file mode 100644 index 0000000..50b4948 --- /dev/null +++ b/public/tags/anthony-jones/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

anthony jones

+ + + +
+ + + + diff --git a/public/tags/antipatterns/index.html b/public/tags/antipatterns/index.html new file mode 100644 index 0000000..7655e0f --- /dev/null +++ b/public/tags/antipatterns/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

antipatterns

+ + + +
+ + + + diff --git a/public/tags/apis/index.html b/public/tags/apis/index.html new file mode 100644 index 0000000..d207277 --- /dev/null +++ b/public/tags/apis/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apis

+ + + +
+ + + + diff --git a/public/tags/apollo/index.html b/public/tags/apollo/index.html new file mode 100644 index 0000000..4a47ccb --- /dev/null +++ b/public/tags/apollo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apollo

+ + + +
+ + + + diff --git a/public/tags/apple-inc/index.html b/public/tags/apple-inc/index.html new file mode 100644 index 0000000..1474b3a --- /dev/null +++ b/public/tags/apple-inc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apple inc.

+ + + +
+ + + + diff --git a/public/tags/apple/index.html b/public/tags/apple/index.html new file mode 100644 index 0000000..12aa441 --- /dev/null +++ b/public/tags/apple/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apple

+ + + +
+ + + + diff --git a/public/tags/applications/index.html b/public/tags/applications/index.html new file mode 100644 index 0000000..09aadda --- /dev/null +++ b/public/tags/applications/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

applications

+ + + +
+ + + + diff --git a/public/tags/apprenticeships/index.html b/public/tags/apprenticeships/index.html new file mode 100644 index 0000000..b0934f4 --- /dev/null +++ b/public/tags/apprenticeships/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

apprenticeships

+ + + +
+ + + + diff --git a/public/tags/architecture/index.html b/public/tags/architecture/index.html new file mode 100644 index 0000000..71d2f1d --- /dev/null +++ b/public/tags/architecture/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

architecture

+ + + +
+ + + + diff --git a/public/tags/arm/index.html b/public/tags/arm/index.html new file mode 100644 index 0000000..5ed28fd --- /dev/null +++ b/public/tags/arm/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arm

+ + + +
+ + + + diff --git a/public/tags/artifacts/index.html b/public/tags/artifacts/index.html new file mode 100644 index 0000000..ef89d8b --- /dev/null +++ b/public/tags/artifacts/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

artifacts

+ + + +
+ + + + diff --git a/public/tags/arun-ravindran/index.html b/public/tags/arun-ravindran/index.html new file mode 100644 index 0000000..5889cdb --- /dev/null +++ b/public/tags/arun-ravindran/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arun ravindran

+ + + +
+ + + + diff --git a/public/tags/arvind-ravulavaru/index.html b/public/tags/arvind-ravulavaru/index.html new file mode 100644 index 0000000..1b1985f --- /dev/null +++ b/public/tags/arvind-ravulavaru/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

arvind ravulavaru

+ + + +
+ + + + diff --git a/public/tags/asciiflow/index.html b/public/tags/asciiflow/index.html new file mode 100644 index 0000000..0e0fc81 --- /dev/null +++ b/public/tags/asciiflow/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

asciiflow

+ + + +
+ + + + diff --git a/public/tags/assignment/index.html b/public/tags/assignment/index.html new file mode 100644 index 0000000..c5af7af --- /dev/null +++ b/public/tags/assignment/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

assignment

+ + + +
+ + + + diff --git a/public/tags/async-requests/index.html b/public/tags/async-requests/index.html new file mode 100644 index 0000000..d0d97b3 --- /dev/null +++ b/public/tags/async-requests/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

async requests

+ + + +
+ + + + diff --git a/public/tags/async/index.html b/public/tags/async/index.html new file mode 100644 index 0000000..8772d3d --- /dev/null +++ b/public/tags/async/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

async

+ + + +
+ + + + diff --git a/public/tags/automated/index.html b/public/tags/automated/index.html new file mode 100644 index 0000000..80b847a --- /dev/null +++ b/public/tags/automated/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

automated

+ + + +
+ + + + diff --git a/public/tags/avery-monsen/index.html b/public/tags/avery-monsen/index.html new file mode 100644 index 0000000..970800d --- /dev/null +++ b/public/tags/avery-monsen/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

avery monsen

+ + + +
+ + + + diff --git a/public/tags/awk/index.html b/public/tags/awk/index.html new file mode 100644 index 0000000..85b5395 --- /dev/null +++ b/public/tags/awk/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

awk

+ + + +
+ + + + diff --git a/public/tags/aws/index.html b/public/tags/aws/index.html new file mode 100644 index 0000000..d27ad00 --- /dev/null +++ b/public/tags/aws/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

aws

+ + + +
+ + + + diff --git a/public/tags/azure/index.html b/public/tags/azure/index.html new file mode 100644 index 0000000..70f2fe8 --- /dev/null +++ b/public/tags/azure/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

azure

+ + + +
+ + + + diff --git a/public/tags/backbone-js/index.html b/public/tags/backbone-js/index.html new file mode 100644 index 0000000..c15c698 --- /dev/null +++ b/public/tags/backbone-js/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

backbone.js

+ + + +
+ + + + diff --git a/public/tags/bad-code/index.html b/public/tags/bad-code/index.html new file mode 100644 index 0000000..fbfa777 --- /dev/null +++ b/public/tags/bad-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bad code

+ + + +
+ + + + diff --git a/public/tags/bash/index.html b/public/tags/bash/index.html new file mode 100644 index 0000000..e2b3280 --- /dev/null +++ b/public/tags/bash/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bash

+ + + +
+ + + + diff --git a/public/tags/bass-jobsen/index.html b/public/tags/bass-jobsen/index.html new file mode 100644 index 0000000..040c6e4 --- /dev/null +++ b/public/tags/bass-jobsen/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bass jobsen

+ + + +
+ + + + diff --git a/public/tags/ben-counter/index.html b/public/tags/ben-counter/index.html new file mode 100644 index 0000000..d863ddf --- /dev/null +++ b/public/tags/ben-counter/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ben counter

+ + + +
+ + + + diff --git a/public/tags/benchmarks/index.html b/public/tags/benchmarks/index.html new file mode 100644 index 0000000..a008b10 --- /dev/null +++ b/public/tags/benchmarks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

benchmarks

+ + + +
+ + + + diff --git a/public/tags/benghazi/index.html b/public/tags/benghazi/index.html new file mode 100644 index 0000000..bd03c69 --- /dev/null +++ b/public/tags/benghazi/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

benghazi

+ + + +
+ + + + diff --git a/public/tags/big-data/index.html b/public/tags/big-data/index.html new file mode 100644 index 0000000..2f90d46 --- /dev/null +++ b/public/tags/big-data/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

big data

+ + + +
+ + + + diff --git a/public/tags/bill-murray/index.html b/public/tags/bill-murray/index.html new file mode 100644 index 0000000..de165af --- /dev/null +++ b/public/tags/bill-murray/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bill murray

+ + + +
+ + + + diff --git a/public/tags/bill-nye/index.html b/public/tags/bill-nye/index.html new file mode 100644 index 0000000..ddb6f0e --- /dev/null +++ b/public/tags/bill-nye/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bill nye

+ + + +
+ + + + diff --git a/public/tags/binaries/index.html b/public/tags/binaries/index.html new file mode 100644 index 0000000..8fe41bc --- /dev/null +++ b/public/tags/binaries/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

binaries

+ + + +
+ + + + diff --git a/public/tags/binary/index.html b/public/tags/binary/index.html new file mode 100644 index 0000000..8a29009 --- /dev/null +++ b/public/tags/binary/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

binary

+ + + +
+ + + + diff --git a/public/tags/biography/index.html b/public/tags/biography/index.html new file mode 100644 index 0000000..cdca35c --- /dev/null +++ b/public/tags/biography/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

biography

+ + + +
+ + + + diff --git a/public/tags/biowaste/index.html b/public/tags/biowaste/index.html new file mode 100644 index 0000000..8f52cfb --- /dev/null +++ b/public/tags/biowaste/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

biowaste

+ + + +
+ + + + diff --git a/public/tags/blog/index.html b/public/tags/blog/index.html new file mode 100644 index 0000000..8fd63c0 --- /dev/null +++ b/public/tags/blog/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

blog

+ + + +
+ + + + diff --git a/public/tags/blogging/index.html b/public/tags/blogging/index.html new file mode 100644 index 0000000..cff3283 --- /dev/null +++ b/public/tags/blogging/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

blogging

+ + + +
+ + + + diff --git a/public/tags/book/index.html b/public/tags/book/index.html new file mode 100644 index 0000000..b35bf33 --- /dev/null +++ b/public/tags/book/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

book

+ + + +
+ + + + diff --git a/public/tags/bookmarks/index.html b/public/tags/bookmarks/index.html new file mode 100644 index 0000000..e7b8cd2 --- /dev/null +++ b/public/tags/bookmarks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bookmarks

+ + + +
+ + + + diff --git a/public/tags/books-2020/index.html b/public/tags/books-2020/index.html new file mode 100644 index 0000000..39d54a2 --- /dev/null +++ b/public/tags/books-2020/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

books:2020

+ + + +
+ + + + diff --git a/public/tags/books-2021/index.html b/public/tags/books-2021/index.html new file mode 100644 index 0000000..e78cafc --- /dev/null +++ b/public/tags/books-2021/index.html @@ -0,0 +1,91 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

books:2021

+ + + +
+ + + + diff --git a/public/tags/books/index.html b/public/tags/books/index.html new file mode 100644 index 0000000..ee0bba0 --- /dev/null +++ b/public/tags/books/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

books

+ + + +
+ + + + diff --git a/public/tags/booleans/index.html b/public/tags/booleans/index.html new file mode 100644 index 0000000..7818653 --- /dev/null +++ b/public/tags/booleans/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

booleans

+ + + +
+ + + + diff --git a/public/tags/boring-stuff/index.html b/public/tags/boring-stuff/index.html new file mode 100644 index 0000000..a4789d5 --- /dev/null +++ b/public/tags/boring-stuff/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

boring stuff

+ + + +
+ + + + diff --git a/public/tags/brad-green/index.html b/public/tags/brad-green/index.html new file mode 100644 index 0000000..e1bee7b --- /dev/null +++ b/public/tags/brad-green/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brad green

+ + + +
+ + + + diff --git a/public/tags/brad-pitt/index.html b/public/tags/brad-pitt/index.html new file mode 100644 index 0000000..8042cc6 --- /dev/null +++ b/public/tags/brad-pitt/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brad pitt

+ + + +
+ + + + diff --git a/public/tags/branches/index.html b/public/tags/branches/index.html new file mode 100644 index 0000000..29c3723 --- /dev/null +++ b/public/tags/branches/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

branches

+ + + +
+ + + + diff --git a/public/tags/brandon-sanderson/index.html b/public/tags/brandon-sanderson/index.html new file mode 100644 index 0000000..3568191 --- /dev/null +++ b/public/tags/brandon-sanderson/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brandon sanderson

+ + + +
+ + + + diff --git a/public/tags/brave/index.html b/public/tags/brave/index.html new file mode 100644 index 0000000..b632aa1 --- /dev/null +++ b/public/tags/brave/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brave

+ + + +
+ + + + diff --git a/public/tags/brett-james/index.html b/public/tags/brett-james/index.html new file mode 100644 index 0000000..dced113 --- /dev/null +++ b/public/tags/brett-james/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brett james

+ + + +
+ + + + diff --git a/public/tags/brian-mcgackin/index.html b/public/tags/brian-mcgackin/index.html new file mode 100644 index 0000000..cc3022a --- /dev/null +++ b/public/tags/brian-mcgackin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brian mcgackin

+ + + +
+ + + + diff --git a/public/tags/brian-tracy/index.html b/public/tags/brian-tracy/index.html new file mode 100644 index 0000000..8d734ab --- /dev/null +++ b/public/tags/brian-tracy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

brian tracy

+ + + +
+ + + + diff --git a/public/tags/bruce-a-tate/index.html b/public/tags/bruce-a-tate/index.html new file mode 100644 index 0000000..9a4856b --- /dev/null +++ b/public/tags/bruce-a-tate/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bruce a tate

+ + + +
+ + + + diff --git a/public/tags/bruce-willis/index.html b/public/tags/bruce-willis/index.html new file mode 100644 index 0000000..89d2ffc --- /dev/null +++ b/public/tags/bruce-willis/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bruce willis

+ + + +
+ + + + diff --git a/public/tags/build/index.html b/public/tags/build/index.html new file mode 100644 index 0000000..321f0ad --- /dev/null +++ b/public/tags/build/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

build

+ + + +
+ + + + diff --git a/public/tags/builder-pattern/index.html b/public/tags/builder-pattern/index.html new file mode 100644 index 0000000..4e5e2a9 --- /dev/null +++ b/public/tags/builder-pattern/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

builder pattern

+ + + +
+ + + + diff --git a/public/tags/builder/index.html b/public/tags/builder/index.html new file mode 100644 index 0000000..2af25f1 --- /dev/null +++ b/public/tags/builder/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

builder

+ + + +
+ + + + diff --git a/public/tags/bulma/index.html b/public/tags/bulma/index.html new file mode 100644 index 0000000..560f6e1 --- /dev/null +++ b/public/tags/bulma/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bulma

+ + + +
+ + + + diff --git a/public/tags/burn-out/index.html b/public/tags/burn-out/index.html new file mode 100644 index 0000000..57454df --- /dev/null +++ b/public/tags/burn-out/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

burn out

+ + + +
+ + + + diff --git a/public/tags/bytecodes/index.html b/public/tags/bytecodes/index.html new file mode 100644 index 0000000..c218e3a --- /dev/null +++ b/public/tags/bytecodes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

bytecodes

+ + + +
+ + + + diff --git a/public/tags/c/index.html b/public/tags/c/index.html new file mode 100644 index 0000000..3baa36d --- /dev/null +++ b/public/tags/c/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

c

+ + + +
+ + + + diff --git a/public/tags/caches/index.html b/public/tags/caches/index.html new file mode 100644 index 0000000..3bbab22 --- /dev/null +++ b/public/tags/caches/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

caches

+ + + +
+ + + + diff --git a/public/tags/california/index.html b/public/tags/california/index.html new file mode 100644 index 0000000..079b3ab --- /dev/null +++ b/public/tags/california/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

california

+ + + +
+ + + + diff --git a/public/tags/cameras/index.html b/public/tags/cameras/index.html new file mode 100644 index 0000000..f7c36b1 --- /dev/null +++ b/public/tags/cameras/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cameras

+ + + +
+ + + + diff --git a/public/tags/capacitors/index.html b/public/tags/capacitors/index.html new file mode 100644 index 0000000..612a0c2 --- /dev/null +++ b/public/tags/capacitors/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

capacitors

+ + + +
+ + + + diff --git a/public/tags/care/index.html b/public/tags/care/index.html new file mode 100644 index 0000000..b8ae8fc --- /dev/null +++ b/public/tags/care/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

care

+ + + +
+ + + + diff --git a/public/tags/cargo-cult/index.html b/public/tags/cargo-cult/index.html new file mode 100644 index 0000000..33def96 --- /dev/null +++ b/public/tags/cargo-cult/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cargo cult

+ + + +
+ + + + diff --git a/public/tags/case/index.html b/public/tags/case/index.html new file mode 100644 index 0000000..85b2732 --- /dev/null +++ b/public/tags/case/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

case

+ + + +
+ + + + diff --git a/public/tags/catherine-asaro/index.html b/public/tags/catherine-asaro/index.html new file mode 100644 index 0000000..8e74026 --- /dev/null +++ b/public/tags/catherine-asaro/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

catherine asaro

+ + + +
+ + + + diff --git a/public/tags/cc/index.html b/public/tags/cc/index.html new file mode 100644 index 0000000..38dcce6 --- /dev/null +++ b/public/tags/cc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cc

+ + + +
+ + + + diff --git a/public/tags/cd/index.html b/public/tags/cd/index.html new file mode 100644 index 0000000..9507071 --- /dev/null +++ b/public/tags/cd/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cd

+ + + +
+ + + + diff --git a/public/tags/censorship/index.html b/public/tags/censorship/index.html new file mode 100644 index 0000000..94aac2c --- /dev/null +++ b/public/tags/censorship/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

censorship

+ + + +
+ + + + diff --git a/public/tags/changes/index.html b/public/tags/changes/index.html new file mode 100644 index 0000000..c498c05 --- /dev/null +++ b/public/tags/changes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

changes

+ + + +
+ + + + diff --git a/public/tags/charger/index.html b/public/tags/charger/index.html new file mode 100644 index 0000000..8658a1b --- /dev/null +++ b/public/tags/charger/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

charger

+ + + +
+ + + + diff --git a/public/tags/chassis/index.html b/public/tags/chassis/index.html new file mode 100644 index 0000000..29ab74d --- /dev/null +++ b/public/tags/chassis/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

chassis

+ + + +
+ + + + diff --git a/public/tags/cheatsheet/index.html b/public/tags/cheatsheet/index.html new file mode 100644 index 0000000..961eaa8 --- /dev/null +++ b/public/tags/cheatsheet/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cheatsheet

+ + + +
+ + + + diff --git a/public/tags/christopher-j-lee/index.html b/public/tags/christopher-j-lee/index.html new file mode 100644 index 0000000..4efa7df --- /dev/null +++ b/public/tags/christopher-j-lee/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

christopher j. lee

+ + + +
+ + + + diff --git a/public/tags/christopher-walken/index.html b/public/tags/christopher-walken/index.html new file mode 100644 index 0000000..a9c1eed --- /dev/null +++ b/public/tags/christopher-walken/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

christopher walken

+ + + +
+ + + + diff --git a/public/tags/chrome/index.html b/public/tags/chrome/index.html new file mode 100644 index 0000000..dd516c1 --- /dev/null +++ b/public/tags/chrome/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

chrome

+ + + +
+ + + + diff --git a/public/tags/ci/index.html b/public/tags/ci/index.html new file mode 100644 index 0000000..d4ad35e --- /dev/null +++ b/public/tags/ci/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ci

+ + + +
+ + + + diff --git a/public/tags/cinema/index.html b/public/tags/cinema/index.html new file mode 100644 index 0000000..861eb02 --- /dev/null +++ b/public/tags/cinema/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cinema

+ + + +
+ + + + diff --git a/public/tags/cities/index.html b/public/tags/cities/index.html new file mode 100644 index 0000000..40b5a86 --- /dev/null +++ b/public/tags/cities/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cities

+ + + +
+ + + + diff --git a/public/tags/clang/index.html b/public/tags/clang/index.html new file mode 100644 index 0000000..6997c30 --- /dev/null +++ b/public/tags/clang/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clang

+ + + +
+ + + + diff --git a/public/tags/clean-air/index.html b/public/tags/clean-air/index.html new file mode 100644 index 0000000..61f88eb --- /dev/null +++ b/public/tags/clean-air/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clean air

+ + + +
+ + + + diff --git a/public/tags/clean-code/index.html b/public/tags/clean-code/index.html new file mode 100644 index 0000000..77b1fa1 --- /dev/null +++ b/public/tags/clean-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clean code

+ + + +
+ + + + diff --git a/public/tags/cli/index.html b/public/tags/cli/index.html new file mode 100644 index 0000000..3514e4b --- /dev/null +++ b/public/tags/cli/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cli

+ + + +
+ + + + diff --git a/public/tags/client/index.html b/public/tags/client/index.html new file mode 100644 index 0000000..939b6c8 --- /dev/null +++ b/public/tags/client/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

client

+ + + +
+ + + + diff --git a/public/tags/clipboard/index.html b/public/tags/clipboard/index.html new file mode 100644 index 0000000..bf9d343 --- /dev/null +++ b/public/tags/clipboard/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clipboard

+ + + +
+ + + + diff --git a/public/tags/clojure/index.html b/public/tags/clojure/index.html new file mode 100644 index 0000000..b95b5d8 --- /dev/null +++ b/public/tags/clojure/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

clojure

+ + + +
+ + + + diff --git a/public/tags/cloud/index.html b/public/tags/cloud/index.html new file mode 100644 index 0000000..8d7b059 --- /dev/null +++ b/public/tags/cloud/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cloud

+ + + +
+ + + + diff --git a/public/tags/cobol/index.html b/public/tags/cobol/index.html new file mode 100644 index 0000000..ee1b1d5 --- /dev/null +++ b/public/tags/cobol/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cobol

+ + + +
+ + + + diff --git a/public/tags/coc/index.html b/public/tags/coc/index.html new file mode 100644 index 0000000..a72d740 --- /dev/null +++ b/public/tags/coc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

coc

+ + + +
+ + + + diff --git a/public/tags/code-formatting/index.html b/public/tags/code-formatting/index.html new file mode 100644 index 0000000..fe9e42b --- /dev/null +++ b/public/tags/code-formatting/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

code formatting

+ + + +
+ + + + diff --git a/public/tags/code-reviews/index.html b/public/tags/code-reviews/index.html new file mode 100644 index 0000000..c4be185 --- /dev/null +++ b/public/tags/code-reviews/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

code reviews

+ + + +
+ + + + diff --git a/public/tags/code-style/index.html b/public/tags/code-style/index.html new file mode 100644 index 0000000..ef1e4e6 --- /dev/null +++ b/public/tags/code-style/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

code style

+ + + +
+ + + + diff --git a/public/tags/code/index.html b/public/tags/code/index.html new file mode 100644 index 0000000..5585a30 --- /dev/null +++ b/public/tags/code/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

code

+ + + +
+ + + + diff --git a/public/tags/codescanning/index.html b/public/tags/codescanning/index.html new file mode 100644 index 0000000..b0f0d6f --- /dev/null +++ b/public/tags/codescanning/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

codescanning

+ + + +
+ + + + diff --git a/public/tags/codespaces/index.html b/public/tags/codespaces/index.html new file mode 100644 index 0000000..b7a3f42 --- /dev/null +++ b/public/tags/codespaces/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

codespaces

+ + + +
+ + + + diff --git a/public/tags/coding/index.html b/public/tags/coding/index.html new file mode 100644 index 0000000..de8cf65 --- /dev/null +++ b/public/tags/coding/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

coding

+ + + +
+ + + + diff --git a/public/tags/coffeescript/index.html b/public/tags/coffeescript/index.html new file mode 100644 index 0000000..34621a7 --- /dev/null +++ b/public/tags/coffeescript/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

coffeescript

+ + + +
+ + + + diff --git a/public/tags/cognitive-cost/index.html b/public/tags/cognitive-cost/index.html new file mode 100644 index 0000000..f72fbc4 --- /dev/null +++ b/public/tags/cognitive-cost/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cognitive cost

+ + + +
+ + + + diff --git a/public/tags/cognitive-dissonance/index.html b/public/tags/cognitive-dissonance/index.html new file mode 100644 index 0000000..c7dc79b --- /dev/null +++ b/public/tags/cognitive-dissonance/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cognitive dissonance

+ + + +
+ + + + diff --git a/public/tags/comedy/index.html b/public/tags/comedy/index.html new file mode 100644 index 0000000..4f24e6c --- /dev/null +++ b/public/tags/comedy/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

comedy

+ + + +
+ + + + diff --git a/public/tags/comics/index.html b/public/tags/comics/index.html new file mode 100644 index 0000000..185d1e7 --- /dev/null +++ b/public/tags/comics/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

comics

+ + + +
+ + + + diff --git a/public/tags/command-line-options/index.html b/public/tags/command-line-options/index.html new file mode 100644 index 0000000..9d67932 --- /dev/null +++ b/public/tags/command-line-options/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

command line options

+ + + +
+ + + + diff --git a/public/tags/command-line/index.html b/public/tags/command-line/index.html new file mode 100644 index 0000000..c10c6bd --- /dev/null +++ b/public/tags/command-line/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

command line

+ + + +
+ + + + diff --git a/public/tags/command/index.html b/public/tags/command/index.html new file mode 100644 index 0000000..5b2b8a9 --- /dev/null +++ b/public/tags/command/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

command

+ + + +
+ + + + diff --git a/public/tags/comments/index.html b/public/tags/comments/index.html new file mode 100644 index 0000000..f66738a --- /dev/null +++ b/public/tags/comments/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

comments

+ + + +
+ + + + diff --git a/public/tags/commit/index.html b/public/tags/commit/index.html new file mode 100644 index 0000000..bae23d1 --- /dev/null +++ b/public/tags/commit/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

commit

+ + + +
+ + + + diff --git a/public/tags/commits/index.html b/public/tags/commits/index.html new file mode 100644 index 0000000..d1c17df --- /dev/null +++ b/public/tags/commits/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

commits

+ + + +
+ + + + diff --git a/public/tags/commons-clause/index.html b/public/tags/commons-clause/index.html new file mode 100644 index 0000000..0272666 --- /dev/null +++ b/public/tags/commons-clause/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

commons clause

+ + + +
+ + + + diff --git a/public/tags/communication/index.html b/public/tags/communication/index.html new file mode 100644 index 0000000..e8740a1 --- /dev/null +++ b/public/tags/communication/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

communication

+ + + +
+ + + + diff --git a/public/tags/community/index.html b/public/tags/community/index.html new file mode 100644 index 0000000..89e974b --- /dev/null +++ b/public/tags/community/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

community

+ + + +
+ + + + diff --git a/public/tags/complexity/index.html b/public/tags/complexity/index.html new file mode 100644 index 0000000..a85f519 --- /dev/null +++ b/public/tags/complexity/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

complexity

+ + + +
+ + + + diff --git a/public/tags/composition/index.html b/public/tags/composition/index.html new file mode 100644 index 0000000..8b7f258 --- /dev/null +++ b/public/tags/composition/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

composition

+ + + +
+ + + + diff --git a/public/tags/computer-architecture/index.html b/public/tags/computer-architecture/index.html new file mode 100644 index 0000000..b631d2a --- /dev/null +++ b/public/tags/computer-architecture/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

computer architecture

+ + + +
+ + + + diff --git a/public/tags/concepts/index.html b/public/tags/concepts/index.html new file mode 100644 index 0000000..1690ffa --- /dev/null +++ b/public/tags/concepts/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

concepts

+ + + +
+ + + + diff --git a/public/tags/concurrency/index.html b/public/tags/concurrency/index.html new file mode 100644 index 0000000..556e09d --- /dev/null +++ b/public/tags/concurrency/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

concurrency

+ + + +
+ + + + diff --git a/public/tags/conference/index.html b/public/tags/conference/index.html new file mode 100644 index 0000000..687cc6c --- /dev/null +++ b/public/tags/conference/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

conference

+ + + +
+ + + + diff --git a/public/tags/config-file/index.html b/public/tags/config-file/index.html new file mode 100644 index 0000000..54ca60b --- /dev/null +++ b/public/tags/config-file/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

config file

+ + + +
+ + + + diff --git a/public/tags/config-files/index.html b/public/tags/config-files/index.html new file mode 100644 index 0000000..19a7197 --- /dev/null +++ b/public/tags/config-files/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

config files

+ + + +
+ + + + diff --git a/public/tags/config/index.html b/public/tags/config/index.html new file mode 100644 index 0000000..f39bf2d --- /dev/null +++ b/public/tags/config/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

config

+ + + +
+ + + + diff --git a/public/tags/configuration/index.html b/public/tags/configuration/index.html new file mode 100644 index 0000000..bb65db4 --- /dev/null +++ b/public/tags/configuration/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

configuration

+ + + +
+ + + + diff --git a/public/tags/connection/index.html b/public/tags/connection/index.html new file mode 100644 index 0000000..9ac2df2 --- /dev/null +++ b/public/tags/connection/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

connection

+ + + +
+ + + + diff --git a/public/tags/conrad-barski/index.html b/public/tags/conrad-barski/index.html new file mode 100644 index 0000000..c15e8dc --- /dev/null +++ b/public/tags/conrad-barski/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

conrad barski

+ + + +
+ + + + diff --git a/public/tags/contact-tracing/index.html b/public/tags/contact-tracing/index.html new file mode 100644 index 0000000..0ac2ba3 --- /dev/null +++ b/public/tags/contact-tracing/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

contact tracing

+ + + +
+ + + + diff --git a/public/tags/containers/index.html b/public/tags/containers/index.html new file mode 100644 index 0000000..cf9a4e8 --- /dev/null +++ b/public/tags/containers/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

containers

+ + + +
+ + + + diff --git a/public/tags/context-manager/index.html b/public/tags/context-manager/index.html new file mode 100644 index 0000000..6f321f0 --- /dev/null +++ b/public/tags/context-manager/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

context manager

+ + + +
+ + + + diff --git a/public/tags/contracts/index.html b/public/tags/contracts/index.html new file mode 100644 index 0000000..5668e47 --- /dev/null +++ b/public/tags/contracts/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

contracts

+ + + +
+ + + + diff --git a/public/tags/contributing/index.html b/public/tags/contributing/index.html new file mode 100644 index 0000000..8800f41 --- /dev/null +++ b/public/tags/contributing/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

contributing

+ + + +
+ + + + diff --git a/public/tags/cookies/index.html b/public/tags/cookies/index.html new file mode 100644 index 0000000..e423722 --- /dev/null +++ b/public/tags/cookies/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cookies

+ + + +
+ + + + diff --git a/public/tags/copyleft/index.html b/public/tags/copyleft/index.html new file mode 100644 index 0000000..ada7d37 --- /dev/null +++ b/public/tags/copyleft/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

copyleft

+ + + +
+ + + + diff --git a/public/tags/copyright/index.html b/public/tags/copyright/index.html new file mode 100644 index 0000000..36ac7e1 --- /dev/null +++ b/public/tags/copyright/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

copyright

+ + + +
+ + + + diff --git a/public/tags/cornice/index.html b/public/tags/cornice/index.html new file mode 100644 index 0000000..332f8f1 --- /dev/null +++ b/public/tags/cornice/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

cornice

+ + + +
+ + + + diff --git a/public/tags/corotines/index.html b/public/tags/corotines/index.html new file mode 100644 index 0000000..39bd990 --- /dev/null +++ b/public/tags/corotines/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

corotines

+ + + +
+ + + + diff --git a/public/tags/couchbase/index.html b/public/tags/couchbase/index.html new file mode 100644 index 0000000..f411d80 --- /dev/null +++ b/public/tags/couchbase/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

couchbase

+ + + +
+ + + + diff --git a/public/tags/count/index.html b/public/tags/count/index.html new file mode 100644 index 0000000..0fe7106 --- /dev/null +++ b/public/tags/count/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

count

+ + + +
+ + + + diff --git a/public/tags/covid-19/index.html b/public/tags/covid-19/index.html new file mode 100644 index 0000000..580a4e9 --- /dev/null +++ b/public/tags/covid-19/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

covid-19

+ + + +
+ + + + diff --git a/public/tags/covid/index.html b/public/tags/covid/index.html new file mode 100644 index 0000000..ab9a723 --- /dev/null +++ b/public/tags/covid/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

covid

+ + + +
+ + + + diff --git a/public/tags/creative-commons/index.html b/public/tags/creative-commons/index.html new file mode 100644 index 0000000..ab60bc3 --- /dev/null +++ b/public/tags/creative-commons/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

creative commons

+ + + +
+ + + + diff --git a/public/tags/csp/index.html b/public/tags/csp/index.html new file mode 100644 index 0000000..281795a --- /dev/null +++ b/public/tags/csp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

csp

+ + + +
+ + + + diff --git a/public/tags/css/index.html b/public/tags/css/index.html new file mode 100644 index 0000000..b11adea --- /dev/null +++ b/public/tags/css/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

css

+ + + +
+ + + + diff --git a/public/tags/culture-tests/index.html b/public/tags/culture-tests/index.html new file mode 100644 index 0000000..90e559f --- /dev/null +++ b/public/tags/culture-tests/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

culture tests

+ + + +
+ + + + diff --git a/public/tags/culture-war/index.html b/public/tags/culture-war/index.html new file mode 100644 index 0000000..d880696 --- /dev/null +++ b/public/tags/culture-war/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

culture war

+ + + +
+ + + + diff --git a/public/tags/dairy/index.html b/public/tags/dairy/index.html new file mode 100644 index 0000000..59703fc --- /dev/null +++ b/public/tags/dairy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dairy

+ + + +
+ + + + diff --git a/public/tags/dan-abnett/index.html b/public/tags/dan-abnett/index.html new file mode 100644 index 0000000..cdb1aa3 --- /dev/null +++ b/public/tags/dan-abnett/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dan abnett

+ + + +
+ + + + diff --git a/public/tags/daniel-higginbotham/index.html b/public/tags/daniel-higginbotham/index.html new file mode 100644 index 0000000..3745ec5 --- /dev/null +++ b/public/tags/daniel-higginbotham/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

daniel higginbotham

+ + + +
+ + + + diff --git a/public/tags/dark-patterns/index.html b/public/tags/dark-patterns/index.html new file mode 100644 index 0000000..6922b60 --- /dev/null +++ b/public/tags/dark-patterns/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dark patterns

+ + + +
+ + + + diff --git a/public/tags/data-classes/index.html b/public/tags/data-classes/index.html new file mode 100644 index 0000000..d042406 --- /dev/null +++ b/public/tags/data-classes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data classes

+ + + +
+ + + + diff --git a/public/tags/data-flow/index.html b/public/tags/data-flow/index.html new file mode 100644 index 0000000..4d51e96 --- /dev/null +++ b/public/tags/data-flow/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data flow

+ + + +
+ + + + diff --git a/public/tags/data-oriented-designs/index.html b/public/tags/data-oriented-designs/index.html new file mode 100644 index 0000000..be34252 --- /dev/null +++ b/public/tags/data-oriented-designs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data-oriented designs

+ + + +
+ + + + diff --git a/public/tags/data-science/index.html b/public/tags/data-science/index.html new file mode 100644 index 0000000..b0c0f21 --- /dev/null +++ b/public/tags/data-science/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data science

+ + + +
+ + + + diff --git a/public/tags/data-structures/index.html b/public/tags/data-structures/index.html new file mode 100644 index 0000000..58ecf99 --- /dev/null +++ b/public/tags/data-structures/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data structures

+ + + +
+ + + + diff --git a/public/tags/data/index.html b/public/tags/data/index.html new file mode 100644 index 0000000..d427ff2 --- /dev/null +++ b/public/tags/data/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

data

+ + + +
+ + + + diff --git a/public/tags/databases/index.html b/public/tags/databases/index.html new file mode 100644 index 0000000..60cfb35 --- /dev/null +++ b/public/tags/databases/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

databases

+ + + +
+ + + + diff --git a/public/tags/dataframes/index.html b/public/tags/dataframes/index.html new file mode 100644 index 0000000..68b6f3c --- /dev/null +++ b/public/tags/dataframes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dataframes

+ + + +
+ + + + diff --git a/public/tags/dates/index.html b/public/tags/dates/index.html new file mode 100644 index 0000000..82079c6 --- /dev/null +++ b/public/tags/dates/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dates

+ + + +
+ + + + diff --git a/public/tags/datetime/index.html b/public/tags/datetime/index.html new file mode 100644 index 0000000..4292771 --- /dev/null +++ b/public/tags/datetime/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

datetime

+ + + +
+ + + + diff --git a/public/tags/datomic/index.html b/public/tags/datomic/index.html new file mode 100644 index 0000000..219e7d6 --- /dev/null +++ b/public/tags/datomic/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

datomic

+ + + +
+ + + + diff --git a/public/tags/dave-zwieback/index.html b/public/tags/dave-zwieback/index.html new file mode 100644 index 0000000..f757b21 --- /dev/null +++ b/public/tags/dave-zwieback/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dave zwieback

+ + + +
+ + + + diff --git a/public/tags/david-allen/index.html b/public/tags/david-allen/index.html new file mode 100644 index 0000000..663a47e --- /dev/null +++ b/public/tags/david-allen/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

david allen

+ + + +
+ + + + diff --git a/public/tags/david-johnson/index.html b/public/tags/david-johnson/index.html new file mode 100644 index 0000000..265f54c --- /dev/null +++ b/public/tags/david-johnson/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

david johnson

+ + + +
+ + + + diff --git a/public/tags/david-leigh/index.html b/public/tags/david-leigh/index.html new file mode 100644 index 0000000..ea1da25 --- /dev/null +++ b/public/tags/david-leigh/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

david leigh

+ + + +
+ + + + diff --git a/public/tags/david-macaulay/index.html b/public/tags/david-macaulay/index.html new file mode 100644 index 0000000..550a832 --- /dev/null +++ b/public/tags/david-macaulay/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

david macaulay

+ + + +
+ + + + diff --git a/public/tags/david-ramenah/index.html b/public/tags/david-ramenah/index.html new file mode 100644 index 0000000..f50cb68 --- /dev/null +++ b/public/tags/david-ramenah/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

david ramenah

+ + + +
+ + + + diff --git a/public/tags/ddd/index.html b/public/tags/ddd/index.html new file mode 100644 index 0000000..8bce3ed --- /dev/null +++ b/public/tags/ddd/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ddd

+ + + +
+ + + + diff --git a/public/tags/dead-code/index.html b/public/tags/dead-code/index.html new file mode 100644 index 0000000..d3b159b --- /dev/null +++ b/public/tags/dead-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dead code

+ + + +
+ + + + diff --git a/public/tags/debug/index.html b/public/tags/debug/index.html new file mode 100644 index 0000000..6704cbb --- /dev/null +++ b/public/tags/debug/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

debug

+ + + +
+ + + + diff --git a/public/tags/debuggers/index.html b/public/tags/debuggers/index.html new file mode 100644 index 0000000..646f0d5 --- /dev/null +++ b/public/tags/debuggers/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

debuggers

+ + + +
+ + + + diff --git a/public/tags/debugging/index.html b/public/tags/debugging/index.html new file mode 100644 index 0000000..659be8e --- /dev/null +++ b/public/tags/debugging/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

debugging

+ + + +
+ + + + diff --git a/public/tags/defend/index.html b/public/tags/defend/index.html new file mode 100644 index 0000000..498bbce --- /dev/null +++ b/public/tags/defend/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

defend

+ + + +
+ + + + diff --git a/public/tags/delete/index.html b/public/tags/delete/index.html new file mode 100644 index 0000000..0d57202 --- /dev/null +++ b/public/tags/delete/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

delete

+ + + +
+ + + + diff --git a/public/tags/denis-kolodin/index.html b/public/tags/denis-kolodin/index.html new file mode 100644 index 0000000..6a287c0 --- /dev/null +++ b/public/tags/denis-kolodin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

denis kolodin

+ + + +
+ + + + diff --git a/public/tags/dependency-injection/index.html b/public/tags/dependency-injection/index.html new file mode 100644 index 0000000..1f98a5a --- /dev/null +++ b/public/tags/dependency-injection/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dependency injection

+ + + +
+ + + + diff --git a/public/tags/design-patterns/index.html b/public/tags/design-patterns/index.html new file mode 100644 index 0000000..723f10f --- /dev/null +++ b/public/tags/design-patterns/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

design patterns

+ + + +
+ + + + diff --git a/public/tags/design/index.html b/public/tags/design/index.html new file mode 100644 index 0000000..9fdc193 --- /dev/null +++ b/public/tags/design/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

design

+ + + +
+ + + + diff --git a/public/tags/developer/index.html b/public/tags/developer/index.html new file mode 100644 index 0000000..65df3e3 --- /dev/null +++ b/public/tags/developer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

developer

+ + + +
+ + + + diff --git a/public/tags/developers/index.html b/public/tags/developers/index.html new file mode 100644 index 0000000..af56b4e --- /dev/null +++ b/public/tags/developers/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

developers

+ + + +
+ + + + diff --git a/public/tags/devops/index.html b/public/tags/devops/index.html new file mode 100644 index 0000000..1ca352c --- /dev/null +++ b/public/tags/devops/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

devops

+ + + +
+ + + + diff --git a/public/tags/diagrams/index.html b/public/tags/diagrams/index.html new file mode 100644 index 0000000..e71264a --- /dev/null +++ b/public/tags/diagrams/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

diagrams

+ + + +
+ + + + diff --git a/public/tags/diesel/index.html b/public/tags/diesel/index.html new file mode 100644 index 0000000..b3dcf94 --- /dev/null +++ b/public/tags/diesel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

diesel

+ + + +
+ + + + diff --git a/public/tags/disability/index.html b/public/tags/disability/index.html new file mode 100644 index 0000000..a3d8622 --- /dev/null +++ b/public/tags/disability/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

disability

+ + + +
+ + + + diff --git a/public/tags/disclaimer/index.html b/public/tags/disclaimer/index.html new file mode 100644 index 0000000..769bcd2 --- /dev/null +++ b/public/tags/disclaimer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

disclaimer

+ + + +
+ + + + diff --git a/public/tags/disenfranchise/index.html b/public/tags/disenfranchise/index.html new file mode 100644 index 0000000..8af2bea --- /dev/null +++ b/public/tags/disenfranchise/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

disenfranchise

+ + + +
+ + + + diff --git a/public/tags/distributed/index.html b/public/tags/distributed/index.html new file mode 100644 index 0000000..019d252 --- /dev/null +++ b/public/tags/distributed/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

distributed

+ + + +
+ + + + diff --git a/public/tags/distros/index.html b/public/tags/distros/index.html new file mode 100644 index 0000000..4273eaf --- /dev/null +++ b/public/tags/distros/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

distros

+ + + +
+ + + + diff --git a/public/tags/django/index.html b/public/tags/django/index.html new file mode 100644 index 0000000..4ad91e7 --- /dev/null +++ b/public/tags/django/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

django

+ + + +
+ + + + diff --git a/public/tags/dmitri-sotnikov/index.html b/public/tags/dmitri-sotnikov/index.html new file mode 100644 index 0000000..9059b7d --- /dev/null +++ b/public/tags/dmitri-sotnikov/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dmitri sotnikov

+ + + +
+ + + + diff --git a/public/tags/docker-compose/index.html b/public/tags/docker-compose/index.html new file mode 100644 index 0000000..6866b35 --- /dev/null +++ b/public/tags/docker-compose/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

docker-compose

+ + + +
+ + + + diff --git a/public/tags/docker/index.html b/public/tags/docker/index.html new file mode 100644 index 0000000..f8d2954 --- /dev/null +++ b/public/tags/docker/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

docker

+ + + +
+ + + + diff --git a/public/tags/documentaries/index.html b/public/tags/documentaries/index.html new file mode 100644 index 0000000..d75e344 --- /dev/null +++ b/public/tags/documentaries/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

documentaries

+ + + +
+ + + + diff --git a/public/tags/documentary/index.html b/public/tags/documentary/index.html new file mode 100644 index 0000000..43f5a92 --- /dev/null +++ b/public/tags/documentary/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

documentary

+ + + +
+ + + + diff --git a/public/tags/documentation/index.html b/public/tags/documentation/index.html new file mode 100644 index 0000000..4010d2a --- /dev/null +++ b/public/tags/documentation/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

documentation

+ + + +
+ + + + diff --git a/public/tags/dokuwiki/index.html b/public/tags/dokuwiki/index.html new file mode 100644 index 0000000..4a85cbd --- /dev/null +++ b/public/tags/dokuwiki/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dokuwiki

+ + + +
+ + + + diff --git a/public/tags/donald-sutherland/index.html b/public/tags/donald-sutherland/index.html new file mode 100644 index 0000000..4900cad --- /dev/null +++ b/public/tags/donald-sutherland/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

donald sutherland

+ + + +
+ + + + diff --git a/public/tags/download/index.html b/public/tags/download/index.html new file mode 100644 index 0000000..56f9b51 --- /dev/null +++ b/public/tags/download/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

download

+ + + +
+ + + + diff --git a/public/tags/drew-neil/index.html b/public/tags/drew-neil/index.html new file mode 100644 index 0000000..b966508 --- /dev/null +++ b/public/tags/drew-neil/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

drew neil

+ + + +
+ + + + diff --git a/public/tags/dusty-phillips/index.html b/public/tags/dusty-phillips/index.html new file mode 100644 index 0000000..cb9c52a --- /dev/null +++ b/public/tags/dusty-phillips/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dusty phillips

+ + + +
+ + + + diff --git a/public/tags/dynamic-dispatch/index.html b/public/tags/dynamic-dispatch/index.html new file mode 100644 index 0000000..036aff6 --- /dev/null +++ b/public/tags/dynamic-dispatch/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dynamic dispatch

+ + + +
+ + + + diff --git a/public/tags/dynamic-types/index.html b/public/tags/dynamic-types/index.html new file mode 100644 index 0000000..ceea169 --- /dev/null +++ b/public/tags/dynamic-types/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

dynamic types

+ + + +
+ + + + diff --git a/public/tags/earphones/index.html b/public/tags/earphones/index.html new file mode 100644 index 0000000..1f71dab --- /dev/null +++ b/public/tags/earphones/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

earphones

+ + + +
+ + + + diff --git a/public/tags/ebay/index.html b/public/tags/ebay/index.html new file mode 100644 index 0000000..78091bf --- /dev/null +++ b/public/tags/ebay/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ebay

+ + + +
+ + + + diff --git a/public/tags/economy/index.html b/public/tags/economy/index.html new file mode 100644 index 0000000..c9f0b10 --- /dev/null +++ b/public/tags/economy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

economy

+ + + +
+ + + + diff --git a/public/tags/ecosystem/index.html b/public/tags/ecosystem/index.html new file mode 100644 index 0000000..b2e769e --- /dev/null +++ b/public/tags/ecosystem/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ecosystem

+ + + +
+ + + + diff --git a/public/tags/edition-2013/index.html b/public/tags/edition-2013/index.html new file mode 100644 index 0000000..1598e7a --- /dev/null +++ b/public/tags/edition-2013/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

edition:2013

+ + + +
+ + + + diff --git a/public/tags/editors/index.html b/public/tags/editors/index.html new file mode 100644 index 0000000..b80fef4 --- /dev/null +++ b/public/tags/editors/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

editors

+ + + +
+ + + + diff --git a/public/tags/ejection/index.html b/public/tags/ejection/index.html new file mode 100644 index 0000000..5cdc49a --- /dev/null +++ b/public/tags/ejection/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ejection

+ + + +
+ + + + diff --git a/public/tags/elixir/index.html b/public/tags/elixir/index.html new file mode 100644 index 0000000..87b1ac5 --- /dev/null +++ b/public/tags/elixir/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elixir

+ + + +
+ + + + diff --git a/public/tags/elizabeth-a-lynn/index.html b/public/tags/elizabeth-a-lynn/index.html new file mode 100644 index 0000000..ec5e78b --- /dev/null +++ b/public/tags/elizabeth-a-lynn/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elizabeth a lynn

+ + + +
+ + + + diff --git a/public/tags/elizabeth-briggs/index.html b/public/tags/elizabeth-briggs/index.html new file mode 100644 index 0000000..7fac0ad --- /dev/null +++ b/public/tags/elizabeth-briggs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elizabeth briggs

+ + + +
+ + + + diff --git a/public/tags/elm/index.html b/public/tags/elm/index.html new file mode 100644 index 0000000..48262a2 --- /dev/null +++ b/public/tags/elm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

elm

+ + + +
+ + + + diff --git a/public/tags/emacs/index.html b/public/tags/emacs/index.html new file mode 100644 index 0000000..cbe523b --- /dev/null +++ b/public/tags/emacs/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

emacs

+ + + +
+ + + + diff --git a/public/tags/embedded/index.html b/public/tags/embedded/index.html new file mode 100644 index 0000000..4d223ef --- /dev/null +++ b/public/tags/embedded/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

embedded

+ + + +
+ + + + diff --git a/public/tags/emily-prokop/index.html b/public/tags/emily-prokop/index.html new file mode 100644 index 0000000..97d2d3e --- /dev/null +++ b/public/tags/emily-prokop/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

emily prokop

+ + + +
+ + + + diff --git a/public/tags/empowerment/index.html b/public/tags/empowerment/index.html new file mode 100644 index 0000000..cda920c --- /dev/null +++ b/public/tags/empowerment/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

empowerment

+ + + +
+ + + + diff --git a/public/tags/en-us/index.html b/public/tags/en-us/index.html new file mode 100644 index 0000000..f01fc4e --- /dev/null +++ b/public/tags/en-us/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

en-us

+ + + +
+ + + + diff --git a/public/tags/encoding/index.html b/public/tags/encoding/index.html new file mode 100644 index 0000000..4aa8352 --- /dev/null +++ b/public/tags/encoding/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

encoding

+ + + +
+ + + + diff --git a/public/tags/energy/index.html b/public/tags/energy/index.html new file mode 100644 index 0000000..0feb2c4 --- /dev/null +++ b/public/tags/energy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

energy

+ + + +
+ + + + diff --git a/public/tags/eric-san-juan/index.html b/public/tags/eric-san-juan/index.html new file mode 100644 index 0000000..d22de27 --- /dev/null +++ b/public/tags/eric-san-juan/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

eric san juan

+ + + +
+ + + + diff --git a/public/tags/erich-maria-remarque/index.html b/public/tags/erich-maria-remarque/index.html new file mode 100644 index 0000000..0151633 --- /dev/null +++ b/public/tags/erich-maria-remarque/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

erich maria remarque

+ + + +
+ + + + diff --git a/public/tags/erland/index.html b/public/tags/erland/index.html new file mode 100644 index 0000000..c8eadda --- /dev/null +++ b/public/tags/erland/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

erland

+ + + +
+ + + + diff --git a/public/tags/erlang/index.html b/public/tags/erlang/index.html new file mode 100644 index 0000000..8bd500a --- /dev/null +++ b/public/tags/erlang/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

erlang

+ + + +
+ + + + diff --git a/public/tags/ernest-cline/index.html b/public/tags/ernest-cline/index.html new file mode 100644 index 0000000..cd421a8 --- /dev/null +++ b/public/tags/ernest-cline/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ernest cline

+ + + +
+ + + + diff --git a/public/tags/error-handling/index.html b/public/tags/error-handling/index.html new file mode 100644 index 0000000..de72cc9 --- /dev/null +++ b/public/tags/error-handling/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

error handling

+ + + +
+ + + + diff --git a/public/tags/etymology/index.html b/public/tags/etymology/index.html new file mode 100644 index 0000000..d9a04a9 --- /dev/null +++ b/public/tags/etymology/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

etymology

+ + + +
+ + + + diff --git a/public/tags/europe/index.html b/public/tags/europe/index.html new file mode 100644 index 0000000..d679d04 --- /dev/null +++ b/public/tags/europe/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

europe

+ + + +
+ + + + diff --git a/public/tags/event-source/index.html b/public/tags/event-source/index.html new file mode 100644 index 0000000..a4a99db --- /dev/null +++ b/public/tags/event-source/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

event source

+ + + +
+ + + + diff --git a/public/tags/events/index.html b/public/tags/events/index.html new file mode 100644 index 0000000..2d45cd4 --- /dev/null +++ b/public/tags/events/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

events

+ + + +
+ + + + diff --git a/public/tags/example/index.html b/public/tags/example/index.html new file mode 100644 index 0000000..950701d --- /dev/null +++ b/public/tags/example/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

example

+ + + +
+ + + + diff --git a/public/tags/examples/index.html b/public/tags/examples/index.html new file mode 100644 index 0000000..5c8970c --- /dev/null +++ b/public/tags/examples/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

examples

+ + + +
+ + + + diff --git a/public/tags/excel/index.html b/public/tags/excel/index.html new file mode 100644 index 0000000..3825ef9 --- /dev/null +++ b/public/tags/excel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

excel

+ + + +
+ + + + diff --git a/public/tags/exceptions/index.html b/public/tags/exceptions/index.html new file mode 100644 index 0000000..4fcd5c4 --- /dev/null +++ b/public/tags/exceptions/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

exceptions

+ + + +
+ + + + diff --git a/public/tags/expectations/index.html b/public/tags/expectations/index.html new file mode 100644 index 0000000..47f78c3 --- /dev/null +++ b/public/tags/expectations/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

expectations

+ + + +
+ + + + diff --git a/public/tags/explicit/index.html b/public/tags/explicit/index.html new file mode 100644 index 0000000..925404d --- /dev/null +++ b/public/tags/explicit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

explicit

+ + + +
+ + + + diff --git a/public/tags/exploit/index.html b/public/tags/exploit/index.html new file mode 100644 index 0000000..e47d87d --- /dev/null +++ b/public/tags/exploit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

exploit

+ + + +
+ + + + diff --git a/public/tags/f/index.html b/public/tags/f/index.html new file mode 100644 index 0000000..9912362 --- /dev/null +++ b/public/tags/f/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

f#

+ + + +
+ + + + diff --git a/public/tags/facebook/index.html b/public/tags/facebook/index.html new file mode 100644 index 0000000..2024fb8 --- /dev/null +++ b/public/tags/facebook/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

facebook

+ + + +
+ + + + diff --git a/public/tags/factory/index.html b/public/tags/factory/index.html new file mode 100644 index 0000000..4936043 --- /dev/null +++ b/public/tags/factory/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

factory

+ + + +
+ + + + diff --git a/public/tags/fakes/index.html b/public/tags/fakes/index.html new file mode 100644 index 0000000..cbc3fec --- /dev/null +++ b/public/tags/fakes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fakes

+ + + +
+ + + + diff --git a/public/tags/fallacies/index.html b/public/tags/fallacies/index.html new file mode 100644 index 0000000..14002a4 --- /dev/null +++ b/public/tags/fallacies/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fallacies

+ + + +
+ + + + diff --git a/public/tags/fantasy/index.html b/public/tags/fantasy/index.html new file mode 100644 index 0000000..beff104 --- /dev/null +++ b/public/tags/fantasy/index.html @@ -0,0 +1,93 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fantasy

+ + + +
+ + + + diff --git a/public/tags/fast/index.html b/public/tags/fast/index.html new file mode 100644 index 0000000..624125d --- /dev/null +++ b/public/tags/fast/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fast

+ + + +
+ + + + diff --git a/public/tags/feature-flags/index.html b/public/tags/feature-flags/index.html new file mode 100644 index 0000000..9d30d9e --- /dev/null +++ b/public/tags/feature-flags/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

feature flags

+ + + +
+ + + + diff --git a/public/tags/fediverse/index.html b/public/tags/fediverse/index.html new file mode 100644 index 0000000..6a3affb --- /dev/null +++ b/public/tags/fediverse/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fediverse

+ + + +
+ + + + diff --git a/public/tags/fedora/index.html b/public/tags/fedora/index.html new file mode 100644 index 0000000..5012122 --- /dev/null +++ b/public/tags/fedora/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fedora

+ + + +
+ + + + diff --git a/public/tags/fiction/index.html b/public/tags/fiction/index.html new file mode 100644 index 0000000..25438bd --- /dev/null +++ b/public/tags/fiction/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fiction

+ + + +
+ + + + diff --git a/public/tags/file/index.html b/public/tags/file/index.html new file mode 100644 index 0000000..5ee6b7d --- /dev/null +++ b/public/tags/file/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

file

+ + + +
+ + + + diff --git a/public/tags/finance/index.html b/public/tags/finance/index.html new file mode 100644 index 0000000..a9f824b --- /dev/null +++ b/public/tags/finance/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

finance

+ + + +
+ + + + diff --git a/public/tags/find/index.html b/public/tags/find/index.html new file mode 100644 index 0000000..85722fc --- /dev/null +++ b/public/tags/find/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

find

+ + + +
+ + + + diff --git a/public/tags/fira/index.html b/public/tags/fira/index.html new file mode 100644 index 0000000..b580adb --- /dev/null +++ b/public/tags/fira/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fira

+ + + +
+ + + + diff --git a/public/tags/firebase/index.html b/public/tags/firebase/index.html new file mode 100644 index 0000000..24d06a8 --- /dev/null +++ b/public/tags/firebase/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

firebase

+ + + +
+ + + + diff --git a/public/tags/firefox/index.html b/public/tags/firefox/index.html new file mode 100644 index 0000000..af6a603 --- /dev/null +++ b/public/tags/firefox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

firefox

+ + + +
+ + + + diff --git a/public/tags/fix/index.html b/public/tags/fix/index.html new file mode 100644 index 0000000..382971e --- /dev/null +++ b/public/tags/fix/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fix

+ + + +
+ + + + diff --git a/public/tags/flask/index.html b/public/tags/flask/index.html new file mode 100644 index 0000000..bc556c5 --- /dev/null +++ b/public/tags/flask/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

flask

+ + + +
+ + + + diff --git a/public/tags/flexbox/index.html b/public/tags/flexbox/index.html new file mode 100644 index 0000000..aeb40c4 --- /dev/null +++ b/public/tags/flexbox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

flexbox

+ + + +
+ + + + diff --git a/public/tags/fonts/index.html b/public/tags/fonts/index.html new file mode 100644 index 0000000..38ac15c --- /dev/null +++ b/public/tags/fonts/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fonts

+ + + +
+ + + + diff --git a/public/tags/formula-1/index.html b/public/tags/formula-1/index.html new file mode 100644 index 0000000..0a2d837 --- /dev/null +++ b/public/tags/formula-1/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

formula 1

+ + + +
+ + + + diff --git a/public/tags/frameworks/index.html b/public/tags/frameworks/index.html new file mode 100644 index 0000000..37281ec --- /dev/null +++ b/public/tags/frameworks/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

frameworks

+ + + +
+ + + + diff --git a/public/tags/fred-hebert/index.html b/public/tags/fred-hebert/index.html new file mode 100644 index 0000000..074062e --- /dev/null +++ b/public/tags/fred-hebert/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fred hebert

+ + + +
+ + + + diff --git a/public/tags/fred-miller/index.html b/public/tags/fred-miller/index.html new file mode 100644 index 0000000..e263cf4 --- /dev/null +++ b/public/tags/fred-miller/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fred miller

+ + + +
+ + + + diff --git a/public/tags/fred-vogelstein/index.html b/public/tags/fred-vogelstein/index.html new file mode 100644 index 0000000..ba4a9a0 --- /dev/null +++ b/public/tags/fred-vogelstein/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fred vogelstein

+ + + +
+ + + + diff --git a/public/tags/free-software-foundation/index.html b/public/tags/free-software-foundation/index.html new file mode 100644 index 0000000..85612a8 --- /dev/null +++ b/public/tags/free-software-foundation/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

free software foundation

+ + + +
+ + + + diff --git a/public/tags/free-software/index.html b/public/tags/free-software/index.html new file mode 100644 index 0000000..fb3e784 --- /dev/null +++ b/public/tags/free-software/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

free software

+ + + +
+ + + + diff --git a/public/tags/fsf/index.html b/public/tags/fsf/index.html new file mode 100644 index 0000000..b9b94d0 --- /dev/null +++ b/public/tags/fsf/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fsf

+ + + +
+ + + + diff --git a/public/tags/fuchsia/index.html b/public/tags/fuchsia/index.html new file mode 100644 index 0000000..b4a32c6 --- /dev/null +++ b/public/tags/fuchsia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fuchsia

+ + + +
+ + + + diff --git a/public/tags/fun/index.html b/public/tags/fun/index.html new file mode 100644 index 0000000..f1d10c6 --- /dev/null +++ b/public/tags/fun/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

fun

+ + + +
+ + + + diff --git a/public/tags/functional-programming/index.html b/public/tags/functional-programming/index.html new file mode 100644 index 0000000..aafb64f --- /dev/null +++ b/public/tags/functional-programming/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

functional programming

+ + + +
+ + + + diff --git a/public/tags/functional/index.html b/public/tags/functional/index.html new file mode 100644 index 0000000..299b669 --- /dev/null +++ b/public/tags/functional/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

functional

+ + + +
+ + + + diff --git a/public/tags/functions/index.html b/public/tags/functions/index.html new file mode 100644 index 0000000..ac210f4 --- /dev/null +++ b/public/tags/functions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

functions

+ + + +
+ + + + diff --git a/public/tags/funny/index.html b/public/tags/funny/index.html new file mode 100644 index 0000000..814eaeb --- /dev/null +++ b/public/tags/funny/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

funny

+ + + +
+ + + + diff --git a/public/tags/future-shock/index.html b/public/tags/future-shock/index.html new file mode 100644 index 0000000..d3e3126 --- /dev/null +++ b/public/tags/future-shock/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

future shock

+ + + +
+ + + + diff --git a/public/tags/gact/index.html b/public/tags/gact/index.html new file mode 100644 index 0000000..549099c --- /dev/null +++ b/public/tags/gact/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gact

+ + + +
+ + + + diff --git a/public/tags/gcp/index.html b/public/tags/gcp/index.html new file mode 100644 index 0000000..71a817c --- /dev/null +++ b/public/tags/gcp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gcp

+ + + +
+ + + + diff --git a/public/tags/geek/index.html b/public/tags/geek/index.html new file mode 100644 index 0000000..dda69d9 --- /dev/null +++ b/public/tags/geek/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

geek

+ + + +
+ + + + diff --git a/public/tags/gene-kim/index.html b/public/tags/gene-kim/index.html new file mode 100644 index 0000000..93ccec7 --- /dev/null +++ b/public/tags/gene-kim/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gene kim

+ + + +
+ + + + diff --git a/public/tags/generalists/index.html b/public/tags/generalists/index.html new file mode 100644 index 0000000..1cec13f --- /dev/null +++ b/public/tags/generalists/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

generalists

+ + + +
+ + + + diff --git a/public/tags/generics/index.html b/public/tags/generics/index.html new file mode 100644 index 0000000..82291f3 --- /dev/null +++ b/public/tags/generics/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

generics

+ + + +
+ + + + diff --git a/public/tags/genevieve-valentine/index.html b/public/tags/genevieve-valentine/index.html new file mode 100644 index 0000000..d660334 --- /dev/null +++ b/public/tags/genevieve-valentine/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

genevieve valentine

+ + + +
+ + + + diff --git a/public/tags/geography/index.html b/public/tags/geography/index.html new file mode 100644 index 0000000..b807596 --- /dev/null +++ b/public/tags/geography/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

geography

+ + + +
+ + + + diff --git a/public/tags/george-spafford/index.html b/public/tags/george-spafford/index.html new file mode 100644 index 0000000..0452d7e --- /dev/null +++ b/public/tags/george-spafford/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

george spafford

+ + + +
+ + + + diff --git a/public/tags/george-takei/index.html b/public/tags/george-takei/index.html new file mode 100644 index 0000000..58ad53b --- /dev/null +++ b/public/tags/george-takei/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

george takei

+ + + +
+ + + + diff --git a/public/tags/germany/index.html b/public/tags/germany/index.html new file mode 100644 index 0000000..6bc36a0 --- /dev/null +++ b/public/tags/germany/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

germany

+ + + +
+ + + + diff --git a/public/tags/gerrit/index.html b/public/tags/gerrit/index.html new file mode 100644 index 0000000..ecca0c0 --- /dev/null +++ b/public/tags/gerrit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gerrit

+ + + +
+ + + + diff --git a/public/tags/gherkin/index.html b/public/tags/gherkin/index.html new file mode 100644 index 0000000..b808fca --- /dev/null +++ b/public/tags/gherkin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gherkin

+ + + +
+ + + + diff --git a/public/tags/git-flow/index.html b/public/tags/git-flow/index.html new file mode 100644 index 0000000..ba9c082 --- /dev/null +++ b/public/tags/git-flow/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

git flow

+ + + +
+ + + + diff --git a/public/tags/git-ignore/index.html b/public/tags/git-ignore/index.html new file mode 100644 index 0000000..92f2638 --- /dev/null +++ b/public/tags/git-ignore/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

git ignore

+ + + +
+ + + + diff --git a/public/tags/git/index.html b/public/tags/git/index.html new file mode 100644 index 0000000..ffa12bd --- /dev/null +++ b/public/tags/git/index.html @@ -0,0 +1,95 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

git

+ + + +
+ + + + diff --git a/public/tags/github-actions/index.html b/public/tags/github-actions/index.html new file mode 100644 index 0000000..d21152e --- /dev/null +++ b/public/tags/github-actions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

github actions

+ + + +
+ + + + diff --git a/public/tags/github/index.html b/public/tags/github/index.html new file mode 100644 index 0000000..39e39be --- /dev/null +++ b/public/tags/github/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

github

+ + + +
+ + + + diff --git a/public/tags/gleam/index.html b/public/tags/gleam/index.html new file mode 100644 index 0000000..24a0a77 --- /dev/null +++ b/public/tags/gleam/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gleam

+ + + +
+ + + + diff --git a/public/tags/gnome/index.html b/public/tags/gnome/index.html new file mode 100644 index 0000000..b88160c --- /dev/null +++ b/public/tags/gnome/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gnome

+ + + +
+ + + + diff --git a/public/tags/go/index.html b/public/tags/go/index.html new file mode 100644 index 0000000..f925dbe --- /dev/null +++ b/public/tags/go/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

go

+ + + +
+ + + + diff --git a/public/tags/golang/index.html b/public/tags/golang/index.html new file mode 100644 index 0000000..09e8379 --- /dev/null +++ b/public/tags/golang/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

golang

+ + + +
+ + + + diff --git a/public/tags/google-code-style/index.html b/public/tags/google-code-style/index.html new file mode 100644 index 0000000..647cd06 --- /dev/null +++ b/public/tags/google-code-style/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

google code style

+ + + +
+ + + + diff --git a/public/tags/google/index.html b/public/tags/google/index.html new file mode 100644 index 0000000..fdfeaab --- /dev/null +++ b/public/tags/google/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

google

+ + + +
+ + + + diff --git a/public/tags/government/index.html b/public/tags/government/index.html new file mode 100644 index 0000000..ca8ad38 --- /dev/null +++ b/public/tags/government/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

government

+ + + +
+ + + + diff --git a/public/tags/gpl/index.html b/public/tags/gpl/index.html new file mode 100644 index 0000000..593278e --- /dev/null +++ b/public/tags/gpl/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

gpl

+ + + +
+ + + + diff --git a/public/tags/graalvm/index.html b/public/tags/graalvm/index.html new file mode 100644 index 0000000..78a7169 --- /dev/null +++ b/public/tags/graalvm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

graalvm

+ + + +
+ + + + diff --git a/public/tags/graham-mcneill/index.html b/public/tags/graham-mcneill/index.html new file mode 100644 index 0000000..9b7637e --- /dev/null +++ b/public/tags/graham-mcneill/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

graham mcneill

+ + + +
+ + + + diff --git a/public/tags/great-code/index.html b/public/tags/great-code/index.html new file mode 100644 index 0000000..88f7d1f --- /dev/null +++ b/public/tags/great-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

great code

+ + + +
+ + + + diff --git a/public/tags/greek-mythology/index.html b/public/tags/greek-mythology/index.html new file mode 100644 index 0000000..8302961 --- /dev/null +++ b/public/tags/greek-mythology/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

greek mythology

+ + + +
+ + + + diff --git a/public/tags/greg-bear/index.html b/public/tags/greg-bear/index.html new file mode 100644 index 0000000..ad54101 --- /dev/null +++ b/public/tags/greg-bear/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

greg bear

+ + + +
+ + + + diff --git a/public/tags/grim-dawn/index.html b/public/tags/grim-dawn/index.html new file mode 100644 index 0000000..c983b0b --- /dev/null +++ b/public/tags/grim-dawn/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

grim dawn

+ + + +
+ + + + diff --git a/public/tags/guix/index.html b/public/tags/guix/index.html new file mode 100644 index 0000000..a11fa83 --- /dev/null +++ b/public/tags/guix/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

guix

+ + + +
+ + + + diff --git a/public/tags/h-g-wells/index.html b/public/tags/h-g-wells/index.html new file mode 100644 index 0000000..09813e8 --- /dev/null +++ b/public/tags/h-g-wells/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

h.g. wells

+ + + +
+ + + + diff --git a/public/tags/h-p-lovecraft/index.html b/public/tags/h-p-lovecraft/index.html new file mode 100644 index 0000000..8a2f901 --- /dev/null +++ b/public/tags/h-p-lovecraft/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

h.p. lovecraft

+ + + +
+ + + + diff --git a/public/tags/hadoop/index.html b/public/tags/hadoop/index.html new file mode 100644 index 0000000..27ba81a --- /dev/null +++ b/public/tags/hadoop/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hadoop

+ + + +
+ + + + diff --git a/public/tags/hap-and-leonard/index.html b/public/tags/hap-and-leonard/index.html new file mode 100644 index 0000000..2d8803a --- /dev/null +++ b/public/tags/hap-and-leonard/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hap and leonard

+ + + +
+ + + + diff --git a/public/tags/harlan-ellison/index.html b/public/tags/harlan-ellison/index.html new file mode 100644 index 0000000..2375eac --- /dev/null +++ b/public/tags/harlan-ellison/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

harlan ellison

+ + + +
+ + + + diff --git a/public/tags/haskell/index.html b/public/tags/haskell/index.html new file mode 100644 index 0000000..270e993 --- /dev/null +++ b/public/tags/haskell/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

haskell

+ + + +
+ + + + diff --git a/public/tags/healing/index.html b/public/tags/healing/index.html new file mode 100644 index 0000000..551c91f --- /dev/null +++ b/public/tags/healing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

healing

+ + + +
+ + + + diff --git a/public/tags/hero-project/index.html b/public/tags/hero-project/index.html new file mode 100644 index 0000000..f1a59f0 --- /dev/null +++ b/public/tags/hero-project/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hero project

+ + + +
+ + + + diff --git a/public/tags/hero-syndrome/index.html b/public/tags/hero-syndrome/index.html new file mode 100644 index 0000000..bd0014c --- /dev/null +++ b/public/tags/hero-syndrome/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hero syndrome

+ + + +
+ + + + diff --git a/public/tags/hierarchical-data/index.html b/public/tags/hierarchical-data/index.html new file mode 100644 index 0000000..fcc1ca7 --- /dev/null +++ b/public/tags/hierarchical-data/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hierarchical data

+ + + +
+ + + + diff --git a/public/tags/highlight/index.html b/public/tags/highlight/index.html new file mode 100644 index 0000000..cd15046 --- /dev/null +++ b/public/tags/highlight/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

highlight

+ + + +
+ + + + diff --git a/public/tags/hiroshi-sakurazaka/index.html b/public/tags/hiroshi-sakurazaka/index.html new file mode 100644 index 0000000..3f32bb4 --- /dev/null +++ b/public/tags/hiroshi-sakurazaka/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hiroshi sakurazaka

+ + + +
+ + + + diff --git a/public/tags/history/index.html b/public/tags/history/index.html new file mode 100644 index 0000000..ae5eda2 --- /dev/null +++ b/public/tags/history/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

history

+ + + +
+ + + + diff --git a/public/tags/home-office/index.html b/public/tags/home-office/index.html new file mode 100644 index 0000000..93ac784 --- /dev/null +++ b/public/tags/home-office/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

home office

+ + + +
+ + + + diff --git a/public/tags/horror/index.html b/public/tags/horror/index.html new file mode 100644 index 0000000..eae0cc3 --- /dev/null +++ b/public/tags/horror/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

horror

+ + + +
+ + + + diff --git a/public/tags/horus-heresy/index.html b/public/tags/horus-heresy/index.html new file mode 100644 index 0000000..9980c86 --- /dev/null +++ b/public/tags/horus-heresy/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

horus heresy

+ + + +
+ + + + diff --git a/public/tags/html/index.html b/public/tags/html/index.html new file mode 100644 index 0000000..d7c6486 --- /dev/null +++ b/public/tags/html/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

html

+ + + +
+ + + + diff --git a/public/tags/http/index.html b/public/tags/http/index.html new file mode 100644 index 0000000..a8e556d --- /dev/null +++ b/public/tags/http/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

http

+ + + +
+ + + + diff --git a/public/tags/httpx/index.html b/public/tags/httpx/index.html new file mode 100644 index 0000000..f4b1604 --- /dev/null +++ b/public/tags/httpx/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

httpx

+ + + +
+ + + + diff --git a/public/tags/hugh-hefner/index.html b/public/tags/hugh-hefner/index.html new file mode 100644 index 0000000..4f80912 --- /dev/null +++ b/public/tags/hugh-hefner/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

hugh hefner

+ + + +
+ + + + diff --git a/public/tags/humor/index.html b/public/tags/humor/index.html new file mode 100644 index 0000000..2411ce9 --- /dev/null +++ b/public/tags/humor/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

humor

+ + + +
+ + + + diff --git a/public/tags/ian-young/index.html b/public/tags/ian-young/index.html new file mode 100644 index 0000000..486e6a9 --- /dev/null +++ b/public/tags/ian-young/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ian young

+ + + +
+ + + + diff --git a/public/tags/ibm/index.html b/public/tags/ibm/index.html new file mode 100644 index 0000000..4d6c759 --- /dev/null +++ b/public/tags/ibm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ibm

+ + + +
+ + + + diff --git a/public/tags/ide/index.html b/public/tags/ide/index.html new file mode 100644 index 0000000..96bd966 --- /dev/null +++ b/public/tags/ide/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ide

+ + + +
+ + + + diff --git a/public/tags/ides/index.html b/public/tags/ides/index.html new file mode 100644 index 0000000..4e3b78f --- /dev/null +++ b/public/tags/ides/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ides

+ + + +
+ + + + diff --git a/public/tags/illutations/index.html b/public/tags/illutations/index.html new file mode 100644 index 0000000..28319be --- /dev/null +++ b/public/tags/illutations/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

illutations

+ + + +
+ + + + diff --git a/public/tags/images/index.html b/public/tags/images/index.html new file mode 100644 index 0000000..682a2dc --- /dev/null +++ b/public/tags/images/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

images

+ + + +
+ + + + diff --git a/public/tags/immutable/index.html b/public/tags/immutable/index.html new file mode 100644 index 0000000..7d3165b --- /dev/null +++ b/public/tags/immutable/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

immutable

+ + + +
+ + + + diff --git a/public/tags/incognito-mode/index.html b/public/tags/incognito-mode/index.html new file mode 100644 index 0000000..3eaa48f --- /dev/null +++ b/public/tags/incognito-mode/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

incognito mode

+ + + +
+ + + + diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..f686f20 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,3803 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ + + + 1password (1) + + + + 1x developer (1) + + + + 2019 (2) + + + + about me (1) + + + + accessibility (2) + + + + activitypub (3) + + + + actix (2) + + + + actor model (1) + + + + addresses (1) + + + + adoption (1) + + + + ads (1) + + + + adsense (1) + + + + advertising (1) + + + + advice (1) + + + + agct (1) + + + + agenda (1) + + + + agile (1) + + + + agpl (2) + + + + ai (2) + + + + aidas bendoraitis (1) + + + + airflow (1) + + + + akhil wali (1) + + + + alan kay (1) + + + + alan shepard (1) + + + + alberto boschetti (1) + + + + aldous huxley (1) + + + + alex holmes (1) + + + + algorithm (1) + + + + algorithms (2) + + + + ali almossawi (1) + + + + alternatives (1) + + + + amazon (4) + + + + american gods (1) + + + + andrew maynard (1) + + + + android (1) + + + + andy weir (1) + + + + angularjs (1) + + + + annals of the western shore (1) + + + + anonymized data (1) + + + + ansible (2) + + + + anthony jones (1) + + + + antipatterns (1) + + + + apis (3) + + + + apollo (1) + + + + apple (7) + + + + apple inc. (1) + + + + applications (1) + + + + apprenticeships (1) + + + + architecture (1) + + + + arm (2) + + + + artifacts (3) + + + + arun ravindran (1) + + + + arvind ravulavaru (1) + + + + asciiflow (1) + + + + assignment (1) + + + + async (6) + + + + async requests (1) + + + + automated (1) + + + + avery monsen (1) + + + + awk (1) + + + + aws (2) + + + + azure (1) + + + + backbone.js (3) + + + + bad code (1) + + + + bash (4) + + + + bass jobsen (1) + + + + ben counter (1) + + + + benchmarks (1) + + + + benghazi (1) + + + + big data (4) + + + + bill murray (1) + + + + bill nye (1) + + + + binaries (1) + + + + binary (2) + + + + biography (5) + + + + biowaste (1) + + + + blog (3) + + + + blogging (2) + + + + book (8) + + + + bookmarks (1) + + + + books (246) + + + + books:2020 (31) + + + + books:2021 (12) + + + + booleans (1) + + + + boring stuff (1) + + + + brad green (1) + + + + brad pitt (2) + + + + branches (3) + + + + brandon sanderson (1) + + + + brave (1) + + + + brett james (1) + + + + brian mcgackin (1) + + + + brian tracy (1) + + + + bruce a tate (1) + + + + bruce willis (1) + + + + build (1) + + + + builder (1) + + + + builder pattern (1) + + + + bulma (1) + + + + burn out (1) + + + + bytecodes (1) + + + + c (9) + + + + caches (1) + + + + california (1) + + + + cameras (1) + + + + capacitors (1) + + + + care (1) + + + + cargo cult (1) + + + + case (1) + + + + catherine asaro (1) + + + + cc (1) + + + + cd (1) + + + + censorship (1) + + + + changes (1) + + + + charger (1) + + + + chassis (1) + + + + cheatsheet (1) + + + + christopher j. lee (1) + + + + christopher walken (1) + + + + chrome (1) + + + + ci (2) + + + + cinema (1) + + + + cities (1) + + + + clang (1) + + + + clean air (1) + + + + clean code (1) + + + + cli (11) + + + + client (1) + + + + clipboard (1) + + + + clojure (5) + + + + cloud (3) + + + + cobol (2) + + + + coc (1) + + + + code (8) + + + + code formatting (1) + + + + code reviews (1) + + + + code style (4) + + + + codescanning (1) + + + + codespaces (1) + + + + coding (1) + + + + coffeescript (1) + + + + cognitive cost (1) + + + + cognitive dissonance (1) + + + + comedy (3) + + + + comics (2) + + + + command (3) + + + + command line (1) + + + + command line options (1) + + + + comments (2) + + + + commit (2) + + + + commits (2) + + + + commons clause (1) + + + + communication (1) + + + + community (2) + + + + complexity (1) + + + + composition (2) + + + + computer architecture (1) + + + + concepts (1) + + + + concurrency (1) + + + + conference (2) + + + + config (2) + + + + config file (1) + + + + config files (1) + + + + configuration (3) + + + + connection (1) + + + + conrad barski (1) + + + + contact tracing (3) + + + + containers (1) + + + + context manager (1) + + + + contracts (1) + + + + contributing (2) + + + + cookies (1) + + + + copyleft (2) + + + + copyright (3) + + + + cornice (1) + + + + corotines (1) + + + + couchbase (1) + + + + count (1) + + + + covid (4) + + + + covid-19 (1) + + + + creative commons (1) + + + + csp (1) + + + + css (4) + + + + culture tests (1) + + + + culture war (1) + + + + dairy (1) + + + + dan abnett (1) + + + + daniel higginbotham (1) + + + + dark patterns (1) + + + + data (1) + + + + data classes (1) + + + + data flow (2) + + + + data-oriented designs (1) + + + + data science (1) + + + + data structures (1) + + + + databases (1) + + + + dataframes (1) + + + + dates (2) + + + + datetime (1) + + + + datomic (1) + + + + dave zwieback (1) + + + + david allen (1) + + + + david johnson (1) + + + + david leigh (1) + + + + david macaulay (1) + + + + david ramenah (1) + + + + ddd (1) + + + + dead code (1) + + + + debug (1) + + + + debuggers (1) + + + + debugging (1) + + + + defend (1) + + + + delete (2) + + + + denis kolodin (1) + + + + dependency injection (1) + + + + design (2) + + + + design patterns (5) + + + + developer (1) + + + + developers (1) + + + + devops (3) + + + + diagrams (1) + + + + diesel (1) + + + + disability (1) + + + + disclaimer (1) + + + + disenfranchise (1) + + + + distributed (1) + + + + distros (1) + + + + django (3) + + + + dmitri sotnikov (1) + + + + docker (3) + + + + docker-compose (1) + + + + documentaries (1) + + + + documentary (1) + + + + documentation (8) + + + + dokuwiki (1) + + + + donald sutherland (1) + + + + download (1) + + + + drew neil (1) + + + + dusty phillips (1) + + + + dynamic dispatch (1) + + + + dynamic types (1) + + + + earphones (1) + + + + ebay (1) + + + + economy (1) + + + + ecosystem (2) + + + + edition:2013 (1) + + + + editors (1) + + + + ejection (1) + + + + elixir (1) + + + + elizabeth a lynn (1) + + + + elizabeth briggs (1) + + + + elm (1) + + + + emacs (8) + + + + embedded (1) + + + + emily prokop (1) + + + + empowerment (1) + + + + en-us (1) + + + + encoding (1) + + + + energy (1) + + + + eric san juan (1) + + + + erich maria remarque (1) + + + + erland (1) + + + + erlang (4) + + + + ernest cline (1) + + + + error handling (2) + + + + etymology (1) + + + + europe (2) + + + + event source (1) + + + + events (2) + + + + example (2) + + + + examples (1) + + + + excel (1) + + + + exceptions (2) + + + + expectations (1) + + + + explicit (1) + + + + exploit (1) + + + + f# (1) + + + + facebook (5) + + + + factory (1) + + + + fakes (1) + + + + fallacies (1) + + + + fantasy (13) + + + + fast (2) + + + + feature flags (1) + + + + fediverse (1) + + + + fedora (1) + + + + fiction (10) + + + + file (1) + + + + finance (3) + + + + find (1) + + + + fira (1) + + + + firebase (1) + + + + firefox (1) + + + + fix (2) + + + + flask (1) + + + + flexbox (1) + + + + fonts (1) + + + + formula 1 (1) + + + + frameworks (3) + + + + fred hebert (1) + + + + fred miller (1) + + + + fred vogelstein (1) + + + + free software (1) + + + + free software foundation (1) + + + + fsf (2) + + + + fuchsia (1) + + + + fun (7) + + + + functional (3) + + + + functional programming (1) + + + + functions (1) + + + + funny (1) + + + + future shock (1) + + + + gact (1) + + + + gcp (1) + + + + geek (1) + + + + gene kim (1) + + + + generalists (2) + + + + generics (1) + + + + genevieve valentine (1) + + + + geography (1) + + + + george spafford (1) + + + + george takei (1) + + + + germany (1) + + + + gerrit (1) + + + + gherkin (1) + + + + git (14) + + + + git flow (2) + + + + git ignore (2) + + + + github (3) + + + + github actions (1) + + + + gleam (1) + + + + gnome (3) + + + + go (4) + + + + golang (2) + + + + google (16) + + + + google code style (1) + + + + government (1) + + + + gpl (1) + + + + graalvm (1) + + + + graham mcneill (1) + + + + great code (1) + + + + greek mythology (1) + + + + greg bear (1) + + + + grim dawn (1) + + + + guix (1) + + + + h.g. wells (1) + + + + h.p. lovecraft (1) + + + + hadoop (1) + + + + hap and leonard (1) + + + + harlan ellison (2) + + + + haskell (4) + + + + healing (1) + + + + hero project (1) + + + + hero syndrome (1) + + + + hierarchical data (1) + + + + highlight (1) + + + + hiroshi sakurazaka (1) + + + + history (5) + + + + home office (1) + + + + horror (3) + + + + horus heresy (4) + + + + html (1) + + + + http (2) + + + + httpx (1) + + + + hugh hefner (1) + + + + humor (1) + + + + ian young (1) + + + + ibm (1) + + + + ide (1) + + + + ides (1) + + + + illutations (1) + + + + images (1) + + + + immutable (1) + + + + incognito mode (1) + + + + infrastructure (1) + + + + insights (1) + + + + integration tests (3) + + + + interfaces (1) + + + + interviews (1) + + + + intro (1) + + + + io (1) + + + + io-uring (1) + + + + ionic (1) + + + + ios (2) + + + + ios 14 (1) + + + + ipad (2) + + + + iphone (1) + + + + irc (1) + + + + isaac asimov (1) + + + + isaac strack (1) + + + + it (64) + + + + iterators (1) + + + + ivo balbaert (1) + + + + j david eisenberg (1) + + + + jack campbell (1) + + + + james gleick (1) + + + + james swallow (1) + + + + jason bourne (1) + + + + java (4) + + + + java 8 (1) + + + + java 9 (1) + + + + javascript (13) + + + + jenny volvovski (1) + + + + jens oliver meiert (1) + + + + jeremy walker (1) + + + + jerzy kosinski (1) + + + + jim blandy (1) + + + + jira (1) + + + + jobs (1) + + + + joe haldeman (1) + + + + joe mayo (1) + + + + joe r. lansdale (1) + + + + joel spolsky (1) + + + + john ringo (1) + + + + john scalzi (8) + + + + jon morris (1) + + + + jonas boner (1) + + + + jonathan hayward (1) + + + + joplin (1) + + + + jory john (1) + + + + joseph pisenti (1) + + + + journal (1) + + + + judith kat (1) + + + + julia rothman (1) + + + + julian assange (1) + + + + juniors (1) + + + + justin seitz (1) + + + + k8s (1) + + + + kanban (1) + + + + kernel (1) + + + + kevin behr (1) + + + + kevin david anderson (1) + + + + keybinds (3) + + + + kids (1) + + + + kiss (1) + + + + kubernetes (2) + + + + kublets (1) + + + + language server (1) + + + + languages (3) + + + + laptop (1) + + + + last.fm (1) + + + + latency (1) + + + + lavie tidhar (1) + + + + layers (2) + + + + leadership (2) + + + + leading (1) + + + + legacy (1) + + + + less (1) + + + + liaden universe (1) + + + + liang yuxian eugene (1) + + + + libraries (1) + + + + library (1) + + + + libre (1) + + + + licenses (5) + + + + licensing (1) + + + + linda rodriguez mcrobbie (1) + + + + linkedin (1) + + + + links (56) + + + + linux (6) + + + + lisp (1) + + + + lists (1) + + + + local run (1) + + + + lockdown (1) + + + + log (1) + + + + logging (2) + + + + logic (1) + + + + logs (1) + + + + lsp (1) + + + + mac (1) + + + + macbooks (1) + + + + machine learning (1) + + + + macos (1) + + + + macros (1) + + + + mahesh venkitachalam (1) + + + + make (1) + + + + management (2) + + + + managers (1) + + + + manifesto (1) + + + + marc clifton (1) + + + + marios christou (1) + + + + mark mcdonnell (1) + + + + mark richards (1) + + + + marketing (1) + + + + mars (1) + + + + martin kleppmann (1) + + + + marvel (1) + + + + mastodon (5) + + + + material design (2) + + + + matt lamothe (1) + + + + matt moore (1) + + + + matt wagner (1) + + + + maureen f mchugh (1) + + + + medium (2) + + + + meds (1) + + + + meetings (1) + + + + memory (1) + + + + mercurial (1) + + + + meritocracy (1) + + + + messages (2) + + + + meta (3) + + + + meter.js (1) + + + + metrodome (1) + + + + michael bay (1) + + + + michael heap (1) + + + + michal zalewski (1) + + + + mickey petersen (1) + + + + microaggressions (2) + + + + microblog (1) + + + + microservices (15) + + + + microsoft (2) + + + + mike pirnat (1) + + + + miran lipovaca (1) + + + + mobile (1) + + + + mock (1) + + + + mocking (1) + + + + mocks (1) + + + + modules (1) + + + + mongodb (2) + + + + monitoring (1) + + + + monologues (1) + + + + morgan bruce (1) + + + + mouse (1) + + + + movies (17) + + + + movies:2021 (5) + + + + mozilla (1) + + + + music (1) + + + + myself (1) + + + + mysql (1) + + + + n k jemisin (1) + + + + names (1) + + + + naming (1) + + + + narayan prusty (1) + + + + nasa (1) + + + + neil gaiman (1) + + + + neovim (2) + + + + netlify (1) + + + + news (1) + + + + nginx (1) + + + + nirmala nataraj (1) + + + + nishant garg (1) + + + + nitpick (1) + + + + no code (1) + + + + no man's sky (1) + + + + note taking (1) + + + + notes (2) + + + + nroff (1) + + + + nvim (1) + + + + oath (1) + + + + objects (1) + + + + oil companies (1) + + + + old man's war (6) + + + + onboarding (1) + + + + online (1) + + + + open (1) + + + + open source (4) + + + + openjdk (1) + + + + optimization (2) + + + + oracle (1) + + + + org-mode (2) + + + + organization (1) + + + + own your shit (1) + + + + owning (1) + + + + packt (1) + + + + pandoc (1) + + + + paper notes (1) + + + + paradox (1) + + + + parameters (1) + + + + pascal (1) + + + + password manager (2) + + + + patents (1) + + + + patrick foote (1) + + + + patrick niemeyer (1) + + + + pattern (1) + + + + patterns (2) + + + + paul crowther (1) + + + + paul ekman (1) + + + + paying (1) + + + + paywalls (1) + + + + pc (1) + + + + pentest (1) + + + + pep8 (2) + + + + personal (37) + + + + personal time (1) + + + + peter lake (1) + + + + pharma (1) + + + + philosophy (1) + + + + phishing (1) + + + + phoenix (1) + + + + photos (1) + + + + pictures (1) + + + + piers anthony (1) + + + + pitfalls (1) + + + + plausible (1) + + + + playbook (1) + + + + playboy (1) + + + + plugins (1) + + + + podman (1) + + + + poetry (1) + + + + pong (1) + + + + porn industry (1) + + + + post its (1) + + + + post-mortems (1) + + + + postgres (1) + + + + postgresql (1) + + + + pre-order (1) + + + + predicable (1) + + + + presentations (1) + + + + principles (1) + + + + privacy (11) + + + + process (1) + + + + product manager (1) + + + + productivity (1) + + + + programming (6) + + + + programming languages (3) + + + + project (2) + + + + project organization (3) + + + + projects (17) + + + + prolog (1) + + + + prometheus (1) + + + + protection (1) + + + + protocol (2) + + + + psychology (1) + + + + public domain (1) + + + + published:1853 (1) + + + + published:1896 (1) + + + + published:1929 (1) + + + + published:1932 (1) + + + + published:1954 (1) + + + + published:1965 (2) + + + + published:1967 (2) + + + + published:1970 (1) + + + + published:1971 (1) + + + + published:1974 (1) + + + + published:1982 (1) + + + + published:1985 (2) + + + + published:1987 (2) + + + + published:1989 (1) + + + + published:1991 (1) + + + + published:1992 (1) + + + + published:1994 (1) + + + + published:1997 (1) + + + + published:2001 (1) + + + + published:2002 (3) + + + + published:2003 (2) + + + + published:2004 (3) + + + + published:2005 (5) + + + + published:2006 (4) + + + + published:2007 (6) + + + + published:2008 (2) + + + + published:2009 (1) + + + + published:2010 (8) + + + + published:2011 (7) + + + + published:2012 (11) + + + + published:2013 (17) + + + + published:2014 (16) + + + + published:2015 (22) + + + + published:2016 (8) + + + + published:2017 (10) + + + + published:2018 (7) + + + + published:2019 (4) + + + + pull requests (1) + + + + pylint (1) + + + + pyramid (1) + + + + python (25) + + + + python 3 (1) + + + + quinton anderson (1) + + + + quirks (1) + + + + quit (1) + + + + r.a. macavoy (1) + + + + racism (1) + + + + racket (1) + + + + rahul soni (1) + + + + randall hyde (1) + + + + random (3) + + + + range (1) + + + + raoul-gabriel urma (1) + + + + re-identifying (1) + + + + react (1) + + + + react native (1) + + + + reactions (1) + + + + reactive (1) + + + + readability (1) + + + + recutils (1) + + + + reddit (2) + + + + refactor (1) + + + + released:2020 (1) + + + + remote (2) + + + + reports (1) + + + + request (1) + + + + requirements (1) + + + + research (1) + + + + responsibility (3) + + + + rest (1) + + + + restful (1) + + + + rethink (1) + + + + review (9) + + + + reviews (174) + + + + rewrite (1) + + + + rewrites (1) + + + + richard burton (1) + + + + richard dawkins (1) + + + + richard feyman (1) + + + + richard feynman (1) + + + + richard matheson (1) + + + + right tool (2) + + + + rms (2) + + + + roads (1) + + + + robert boesel (1) + + + + robert c. martin (1) + + + + robert r mccammon (1) + + + + robert redford (1) + + + + robert schnakenberg (2) + + + + robert silverberg (1) + + + + robotics (1) + + + + rolland roberts (1) + + + + rss (1) + + + + ruby (1) + + + + runbook (2) + + + + runner (1) + + + + russ mckendrick (1) + + + + russell crowe (1) + + + + rust (46) + + + + ryan roemer (1) + + + + safety (1) + + + + say no (1) + + + + scala (1) + + + + sci (1) + + + + science (3) + + + + scifi (35) + + + + scotty (1) + + + + scp (1) + + + + screen recording (1) + + + + scripts (1) + + + + scrobble (1) + + + + search (1) + + + + second order thinking (1) + + + + secrets (1) + + + + security (2) + + + + seek (1) + + + + segmentation fault (1) + + + + self-help (2) + + + + self-hosted (1) + + + + seo (1) + + + + series (7) + + + + series:2021 (4) + + + + server (1) + + + + seth grahame-smith (1) + + + + shantanu tushar (1) + + + + shapes of code (1) + + + + sharing (1) + + + + sharring (1) + + + + shell (1) + + + + shell script (1) + + + + short (1) + + + + sigsegv (1) + + + + silverblue (1) + + + + simon st laurent (2) + + + + simon timms (1) + + + + single responsibility (1) + + + + size (1) + + + + slack (1) + + + + slides (1) + + + + small teams (1) + + + + software architecture (1) + + + + solomon northup (1) + + + + solution (1) + + + + solutions (1) + + + + source control (4) + + + + source of truth (1) + + + + spa (1) + + + + spaces (1) + + + + spawn (1) + + + + specialists (2) + + + + specs (1) + + + + spotify (1) + + + + spring (2) + + + + spying (1) + + + + stackoverflow (3) + + + + stallman (2) + + + + stanislaw lem (1) + + + + star trek (3) + + + + stars:0 (4) + + + + stars:1 (34) + + + + stars:2 (50) + + + + stars:3 (38) + + + + stars:4 (35) + + + + stars:5 (18) + + + + state (2) + + + + static (1) + + + + status (1) + + + + stdlib (1) + + + + stephen blackheath (1) + + + + stephen h segal (1) + + + + stephen king (3) + + + + steps (2) + + + + steve fenton (1) + + + + steven f lott (1) + + + + steven seagal (1) + + + + stoicism (1) + + + + stop (1) + + + + storage (2) + + + + storm (1) + + + + stoyan stefanov (1) + + + + stream (1) + + + + stream processing (1) + + + + structs (1) + + + + studio ghibli (1) + + + + stupid bugs (1) + + + + superheroes (1) + + + + survey (3) + + + + swift (1) + + + + syntax highlight (1) + + + + systemd (1) + + + + t s mcnamara (1) + + + + tables (1) + + + + tabs (1) + + + + task manager (1) + + + + team (1) + + + + team building (1) + + + + teams (2) + + + + technical debt (1) + + + + technical specs (1) + + + + technology (1) + + + + ted chiang (1) + + + + telefork (1) + + + + telegram (2) + + + + temporary solutions (1) + + + + terms and conditions (1) + + + + testing (6) + + + + tests (10) + + + + text processing (1) + + + + the dark tower (4) + + + + the forever war (1) + + + + the pillars of reality (1) + + + + the secret life of walter mitty (1) + + + + the way (1) + + + + the witcher (1) + + + + things i don't know (1) + + + + things i learnt (86) + + + + thomas hunter ii (1) + + + + thoughts (2) + + + + threadpools (1) + + + + thriller (2) + + + + ti (3) + + + + tide (1) + + + + tiktok (1) + + + + til (1) + + + + tiler (1) + + + + tiling (2) + + + + time (1) + + + + timeout (1) + + + + timer (1) + + + + timezones (1) + + + + timothy zahn (1) + + + + tmux (1) + + + + tobias klein (1) + + + + tokio (1) + + + + tommy lee jones (1) + + + + tony mott (1) + + + + toolbox (1) + + + + toolbx (1) + + + + top (1) + + + + torture (1) + + + + toxic people (2) + + + + tracking (1) + + + + travis s taylor (1) + + + + treesitter (1) + + + + tribes (1) + + + + trim (1) + + + + trivia (1) + + + + troff (1) + + + + trump (1) + + + + tui (1) + + + + twitter (4) + + + + types (2) + + + + typescript (2) + + + + typesetting (1) + + + + ui (2) + + + + ultra-rich (1) + + + + unit tests (8) + + + + units (1) + + + + universities (1) + + + + unix (1) + + + + upgrades (1) + + + + ursula k. le guin (2) + + + + user data (1) + + + + utf-8 (1) + + + + uuid (1) + + + + ux (1) + + + + vcs (1) + + + + versions (1) + + + + vicky oliver (1) + + + + video games (1) + + + + vim (10) + + + + vimconf (1) + + + + virtual (1) + + + + vscode (1) + + + + vulnerability (1) + + + + wallpapers (1) + + + + warhammer 40000 (4) + + + + wash your hands (1) + + + + wasm (2) + + + + web (1) + + + + web apis (1) + + + + web development (13) + + + + webdav (1) + + + + webkit (1) + + + + website (1) + + + + websites (1) + + + + werewolves (1) + + + + wfh (2) + + + + whatsapp (1) + + + + wiki (1) + + + + wikileaks (1) + + + + wil wheaton (1) + + + + windows (2) + + + + winrt (1) + + + + word generator (1) + + + + work (5) + + + + work from home (2) + + + + writing (2) + + + + writing code (1) + + + + xml (1) + + + + yaml (1) + + + + year (1) + + + + yew (1) + + + + youtube (2) + + + + zaki hasan (1) + + + + zig (2) + + + + zola (3) + + + + zombies (1) + + + + zoom (2) + + + + zsh (1) + + + + zshell (1) + + + + zuckerberg (1) + + + +
+ + + + diff --git a/public/tags/infrastructure/index.html b/public/tags/infrastructure/index.html new file mode 100644 index 0000000..472aa0f --- /dev/null +++ b/public/tags/infrastructure/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

infrastructure

+ + + +
+ + + + diff --git a/public/tags/insights/index.html b/public/tags/insights/index.html new file mode 100644 index 0000000..7002380 --- /dev/null +++ b/public/tags/insights/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

insights

+ + + +
+ + + + diff --git a/public/tags/integration-tests/index.html b/public/tags/integration-tests/index.html new file mode 100644 index 0000000..efbd547 --- /dev/null +++ b/public/tags/integration-tests/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

integration tests

+ + + +
+ + + + diff --git a/public/tags/interfaces/index.html b/public/tags/interfaces/index.html new file mode 100644 index 0000000..64ab223 --- /dev/null +++ b/public/tags/interfaces/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

interfaces

+ + + +
+ + + + diff --git a/public/tags/interviews/index.html b/public/tags/interviews/index.html new file mode 100644 index 0000000..4c91a09 --- /dev/null +++ b/public/tags/interviews/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

interviews

+ + + +
+ + + + diff --git a/public/tags/intro/index.html b/public/tags/intro/index.html new file mode 100644 index 0000000..b24be7e --- /dev/null +++ b/public/tags/intro/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

intro

+ + + +
+ + + + diff --git a/public/tags/io-uring/index.html b/public/tags/io-uring/index.html new file mode 100644 index 0000000..937d298 --- /dev/null +++ b/public/tags/io-uring/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

io-uring

+ + + +
+ + + + diff --git a/public/tags/io/index.html b/public/tags/io/index.html new file mode 100644 index 0000000..f8b3d45 --- /dev/null +++ b/public/tags/io/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

io

+ + + +
+ + + + diff --git a/public/tags/ionic/index.html b/public/tags/ionic/index.html new file mode 100644 index 0000000..d119e4f --- /dev/null +++ b/public/tags/ionic/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ionic

+ + + +
+ + + + diff --git a/public/tags/ios-14/index.html b/public/tags/ios-14/index.html new file mode 100644 index 0000000..a40c37b --- /dev/null +++ b/public/tags/ios-14/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ios 14

+ + + +
+ + + + diff --git a/public/tags/ios/index.html b/public/tags/ios/index.html new file mode 100644 index 0000000..4add97e --- /dev/null +++ b/public/tags/ios/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ios

+ + + +
+ + + + diff --git a/public/tags/ipad/index.html b/public/tags/ipad/index.html new file mode 100644 index 0000000..ea1c7a7 --- /dev/null +++ b/public/tags/ipad/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ipad

+ + + +
+ + + + diff --git a/public/tags/iphone/index.html b/public/tags/iphone/index.html new file mode 100644 index 0000000..1c0bbf7 --- /dev/null +++ b/public/tags/iphone/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

iphone

+ + + +
+ + + + diff --git a/public/tags/irc/index.html b/public/tags/irc/index.html new file mode 100644 index 0000000..8f6899e --- /dev/null +++ b/public/tags/irc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

irc

+ + + +
+ + + + diff --git a/public/tags/isaac-asimov/index.html b/public/tags/isaac-asimov/index.html new file mode 100644 index 0000000..a9063fa --- /dev/null +++ b/public/tags/isaac-asimov/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

isaac asimov

+ + + +
+ + + + diff --git a/public/tags/isaac-strack/index.html b/public/tags/isaac-strack/index.html new file mode 100644 index 0000000..7bf16b3 --- /dev/null +++ b/public/tags/isaac-strack/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

isaac strack

+ + + +
+ + + + diff --git a/public/tags/it/index.html b/public/tags/it/index.html new file mode 100644 index 0000000..7e5d6bf --- /dev/null +++ b/public/tags/it/index.html @@ -0,0 +1,195 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

it

+ + + +
+ + + + diff --git a/public/tags/iterators/index.html b/public/tags/iterators/index.html new file mode 100644 index 0000000..112dabc --- /dev/null +++ b/public/tags/iterators/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

iterators

+ + + +
+ + + + diff --git a/public/tags/ivo-balbaert/index.html b/public/tags/ivo-balbaert/index.html new file mode 100644 index 0000000..7f4d249 --- /dev/null +++ b/public/tags/ivo-balbaert/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ivo balbaert

+ + + +
+ + + + diff --git a/public/tags/j-david-eisenberg/index.html b/public/tags/j-david-eisenberg/index.html new file mode 100644 index 0000000..fb32620 --- /dev/null +++ b/public/tags/j-david-eisenberg/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

j david eisenberg

+ + + +
+ + + + diff --git a/public/tags/jack-campbell/index.html b/public/tags/jack-campbell/index.html new file mode 100644 index 0000000..4c3da2d --- /dev/null +++ b/public/tags/jack-campbell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jack campbell

+ + + +
+ + + + diff --git a/public/tags/james-gleick/index.html b/public/tags/james-gleick/index.html new file mode 100644 index 0000000..d0ed404 --- /dev/null +++ b/public/tags/james-gleick/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

james gleick

+ + + +
+ + + + diff --git a/public/tags/james-swallow/index.html b/public/tags/james-swallow/index.html new file mode 100644 index 0000000..b650758 --- /dev/null +++ b/public/tags/james-swallow/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

james swallow

+ + + +
+ + + + diff --git a/public/tags/jason-bourne/index.html b/public/tags/jason-bourne/index.html new file mode 100644 index 0000000..821b4fb --- /dev/null +++ b/public/tags/jason-bourne/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jason bourne

+ + + +
+ + + + diff --git a/public/tags/java-8/index.html b/public/tags/java-8/index.html new file mode 100644 index 0000000..6ba6160 --- /dev/null +++ b/public/tags/java-8/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

java 8

+ + + +
+ + + + diff --git a/public/tags/java-9/index.html b/public/tags/java-9/index.html new file mode 100644 index 0000000..5e7d128 --- /dev/null +++ b/public/tags/java-9/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

java 9

+ + + +
+ + + + diff --git a/public/tags/java/index.html b/public/tags/java/index.html new file mode 100644 index 0000000..3f84017 --- /dev/null +++ b/public/tags/java/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

java

+ + + +
+ + + + diff --git a/public/tags/javascript/index.html b/public/tags/javascript/index.html new file mode 100644 index 0000000..c53c066 --- /dev/null +++ b/public/tags/javascript/index.html @@ -0,0 +1,93 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

javascript

+ + + +
+ + + + diff --git a/public/tags/jenny-volvovski/index.html b/public/tags/jenny-volvovski/index.html new file mode 100644 index 0000000..a392fd2 --- /dev/null +++ b/public/tags/jenny-volvovski/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jenny volvovski

+ + + +
+ + + + diff --git a/public/tags/jens-oliver-meiert/index.html b/public/tags/jens-oliver-meiert/index.html new file mode 100644 index 0000000..e98adb7 --- /dev/null +++ b/public/tags/jens-oliver-meiert/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jens oliver meiert

+ + + +
+ + + + diff --git a/public/tags/jeremy-walker/index.html b/public/tags/jeremy-walker/index.html new file mode 100644 index 0000000..fdabd3b --- /dev/null +++ b/public/tags/jeremy-walker/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jeremy walker

+ + + +
+ + + + diff --git a/public/tags/jerzy-kosinski/index.html b/public/tags/jerzy-kosinski/index.html new file mode 100644 index 0000000..eb1ca49 --- /dev/null +++ b/public/tags/jerzy-kosinski/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jerzy kosinski

+ + + +
+ + + + diff --git a/public/tags/jim-blandy/index.html b/public/tags/jim-blandy/index.html new file mode 100644 index 0000000..3adff02 --- /dev/null +++ b/public/tags/jim-blandy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jim blandy

+ + + +
+ + + + diff --git a/public/tags/jira/index.html b/public/tags/jira/index.html new file mode 100644 index 0000000..7033a2f --- /dev/null +++ b/public/tags/jira/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jira

+ + + +
+ + + + diff --git a/public/tags/jobs/index.html b/public/tags/jobs/index.html new file mode 100644 index 0000000..eac8e6d --- /dev/null +++ b/public/tags/jobs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jobs

+ + + +
+ + + + diff --git a/public/tags/joe-haldeman/index.html b/public/tags/joe-haldeman/index.html new file mode 100644 index 0000000..2105dfd --- /dev/null +++ b/public/tags/joe-haldeman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joe haldeman

+ + + +
+ + + + diff --git a/public/tags/joe-mayo/index.html b/public/tags/joe-mayo/index.html new file mode 100644 index 0000000..fd807b0 --- /dev/null +++ b/public/tags/joe-mayo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joe mayo

+ + + +
+ + + + diff --git a/public/tags/joe-r-lansdale/index.html b/public/tags/joe-r-lansdale/index.html new file mode 100644 index 0000000..8a315cb --- /dev/null +++ b/public/tags/joe-r-lansdale/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joe r. lansdale

+ + + +
+ + + + diff --git a/public/tags/joel-spolsky/index.html b/public/tags/joel-spolsky/index.html new file mode 100644 index 0000000..d27c158 --- /dev/null +++ b/public/tags/joel-spolsky/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joel spolsky

+ + + +
+ + + + diff --git a/public/tags/john-ringo/index.html b/public/tags/john-ringo/index.html new file mode 100644 index 0000000..29d69db --- /dev/null +++ b/public/tags/john-ringo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

john ringo

+ + + +
+ + + + diff --git a/public/tags/john-scalzi/index.html b/public/tags/john-scalzi/index.html new file mode 100644 index 0000000..639e0f4 --- /dev/null +++ b/public/tags/john-scalzi/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

john scalzi

+ + + +
+ + + + diff --git a/public/tags/jon-morris/index.html b/public/tags/jon-morris/index.html new file mode 100644 index 0000000..2ec3aa0 --- /dev/null +++ b/public/tags/jon-morris/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jon morris

+ + + +
+ + + + diff --git a/public/tags/jonas-boner/index.html b/public/tags/jonas-boner/index.html new file mode 100644 index 0000000..80cd9d8 --- /dev/null +++ b/public/tags/jonas-boner/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jonas boner

+ + + +
+ + + + diff --git a/public/tags/jonathan-hayward/index.html b/public/tags/jonathan-hayward/index.html new file mode 100644 index 0000000..b418511 --- /dev/null +++ b/public/tags/jonathan-hayward/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jonathan hayward

+ + + +
+ + + + diff --git a/public/tags/joplin/index.html b/public/tags/joplin/index.html new file mode 100644 index 0000000..67a8dd2 --- /dev/null +++ b/public/tags/joplin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joplin

+ + + +
+ + + + diff --git a/public/tags/jory-john/index.html b/public/tags/jory-john/index.html new file mode 100644 index 0000000..7848b1f --- /dev/null +++ b/public/tags/jory-john/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

jory john

+ + + +
+ + + + diff --git a/public/tags/joseph-pisenti/index.html b/public/tags/joseph-pisenti/index.html new file mode 100644 index 0000000..518f97a --- /dev/null +++ b/public/tags/joseph-pisenti/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

joseph pisenti

+ + + +
+ + + + diff --git a/public/tags/journal/index.html b/public/tags/journal/index.html new file mode 100644 index 0000000..1f86c61 --- /dev/null +++ b/public/tags/journal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

journal

+ + + +
+ + + + diff --git a/public/tags/judith-kat/index.html b/public/tags/judith-kat/index.html new file mode 100644 index 0000000..558bfb2 --- /dev/null +++ b/public/tags/judith-kat/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

judith kat

+ + + +
+ + + + diff --git a/public/tags/julia-rothman/index.html b/public/tags/julia-rothman/index.html new file mode 100644 index 0000000..2d6c1cf --- /dev/null +++ b/public/tags/julia-rothman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

julia rothman

+ + + +
+ + + + diff --git a/public/tags/julian-assange/index.html b/public/tags/julian-assange/index.html new file mode 100644 index 0000000..8f5e59a --- /dev/null +++ b/public/tags/julian-assange/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

julian assange

+ + + +
+ + + + diff --git a/public/tags/juniors/index.html b/public/tags/juniors/index.html new file mode 100644 index 0000000..afc5700 --- /dev/null +++ b/public/tags/juniors/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

juniors

+ + + +
+ + + + diff --git a/public/tags/justin-seitz/index.html b/public/tags/justin-seitz/index.html new file mode 100644 index 0000000..6b4e6cc --- /dev/null +++ b/public/tags/justin-seitz/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

justin seitz

+ + + +
+ + + + diff --git a/public/tags/k8s/index.html b/public/tags/k8s/index.html new file mode 100644 index 0000000..3c38497 --- /dev/null +++ b/public/tags/k8s/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

k8s

+ + + +
+ + + + diff --git a/public/tags/kanban/index.html b/public/tags/kanban/index.html new file mode 100644 index 0000000..9995563 --- /dev/null +++ b/public/tags/kanban/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kanban

+ + + +
+ + + + diff --git a/public/tags/kernel/index.html b/public/tags/kernel/index.html new file mode 100644 index 0000000..9d095c9 --- /dev/null +++ b/public/tags/kernel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kernel

+ + + +
+ + + + diff --git a/public/tags/kevin-behr/index.html b/public/tags/kevin-behr/index.html new file mode 100644 index 0000000..a359f01 --- /dev/null +++ b/public/tags/kevin-behr/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kevin behr

+ + + +
+ + + + diff --git a/public/tags/kevin-david-anderson/index.html b/public/tags/kevin-david-anderson/index.html new file mode 100644 index 0000000..7c0fbd0 --- /dev/null +++ b/public/tags/kevin-david-anderson/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kevin david anderson

+ + + +
+ + + + diff --git a/public/tags/keybinds/index.html b/public/tags/keybinds/index.html new file mode 100644 index 0000000..d78c9d0 --- /dev/null +++ b/public/tags/keybinds/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

keybinds

+ + + +
+ + + + diff --git a/public/tags/kids/index.html b/public/tags/kids/index.html new file mode 100644 index 0000000..4667faa --- /dev/null +++ b/public/tags/kids/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kids

+ + + +
+ + + + diff --git a/public/tags/kiss/index.html b/public/tags/kiss/index.html new file mode 100644 index 0000000..72a59ac --- /dev/null +++ b/public/tags/kiss/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kiss

+ + + +
+ + + + diff --git a/public/tags/kubernetes/index.html b/public/tags/kubernetes/index.html new file mode 100644 index 0000000..899ee2a --- /dev/null +++ b/public/tags/kubernetes/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kubernetes

+ + + +
+ + + + diff --git a/public/tags/kublets/index.html b/public/tags/kublets/index.html new file mode 100644 index 0000000..7d2d920 --- /dev/null +++ b/public/tags/kublets/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

kublets

+ + + +
+ + + + diff --git a/public/tags/language-server/index.html b/public/tags/language-server/index.html new file mode 100644 index 0000000..e05eba5 --- /dev/null +++ b/public/tags/language-server/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

language server

+ + + +
+ + + + diff --git a/public/tags/languages/index.html b/public/tags/languages/index.html new file mode 100644 index 0000000..3d301fd --- /dev/null +++ b/public/tags/languages/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

languages

+ + + +
+ + + + diff --git a/public/tags/laptop/index.html b/public/tags/laptop/index.html new file mode 100644 index 0000000..66bf7c7 --- /dev/null +++ b/public/tags/laptop/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

laptop

+ + + +
+ + + + diff --git a/public/tags/last-fm/index.html b/public/tags/last-fm/index.html new file mode 100644 index 0000000..1de1530 --- /dev/null +++ b/public/tags/last-fm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

last.fm

+ + + +
+ + + + diff --git a/public/tags/latency/index.html b/public/tags/latency/index.html new file mode 100644 index 0000000..afa3c96 --- /dev/null +++ b/public/tags/latency/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

latency

+ + + +
+ + + + diff --git a/public/tags/lavie-tidhar/index.html b/public/tags/lavie-tidhar/index.html new file mode 100644 index 0000000..c34c965 --- /dev/null +++ b/public/tags/lavie-tidhar/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lavie tidhar

+ + + +
+ + + + diff --git a/public/tags/layers/index.html b/public/tags/layers/index.html new file mode 100644 index 0000000..ba58593 --- /dev/null +++ b/public/tags/layers/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

layers

+ + + +
+ + + + diff --git a/public/tags/leadership/index.html b/public/tags/leadership/index.html new file mode 100644 index 0000000..59ecc36 --- /dev/null +++ b/public/tags/leadership/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

leadership

+ + + +
+ + + + diff --git a/public/tags/leading/index.html b/public/tags/leading/index.html new file mode 100644 index 0000000..68c8549 --- /dev/null +++ b/public/tags/leading/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

leading

+ + + +
+ + + + diff --git a/public/tags/legacy/index.html b/public/tags/legacy/index.html new file mode 100644 index 0000000..cc197f6 --- /dev/null +++ b/public/tags/legacy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

legacy

+ + + +
+ + + + diff --git a/public/tags/less/index.html b/public/tags/less/index.html new file mode 100644 index 0000000..07d7b15 --- /dev/null +++ b/public/tags/less/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

less

+ + + +
+ + + + diff --git a/public/tags/liaden-universe/index.html b/public/tags/liaden-universe/index.html new file mode 100644 index 0000000..418d011 --- /dev/null +++ b/public/tags/liaden-universe/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

liaden universe

+ + + +
+ + + + diff --git a/public/tags/liang-yuxian-eugene/index.html b/public/tags/liang-yuxian-eugene/index.html new file mode 100644 index 0000000..50a970e --- /dev/null +++ b/public/tags/liang-yuxian-eugene/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

liang yuxian eugene

+ + + +
+ + + + diff --git a/public/tags/libraries/index.html b/public/tags/libraries/index.html new file mode 100644 index 0000000..68a3c3a --- /dev/null +++ b/public/tags/libraries/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

libraries

+ + + +
+ + + + diff --git a/public/tags/library/index.html b/public/tags/library/index.html new file mode 100644 index 0000000..55270f1 --- /dev/null +++ b/public/tags/library/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

library

+ + + +
+ + + + diff --git a/public/tags/libre/index.html b/public/tags/libre/index.html new file mode 100644 index 0000000..6d17b6c --- /dev/null +++ b/public/tags/libre/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

libre

+ + + +
+ + + + diff --git a/public/tags/licenses/index.html b/public/tags/licenses/index.html new file mode 100644 index 0000000..626ff41 --- /dev/null +++ b/public/tags/licenses/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

licenses

+ + + +
+ + + + diff --git a/public/tags/licensing/index.html b/public/tags/licensing/index.html new file mode 100644 index 0000000..8871a6c --- /dev/null +++ b/public/tags/licensing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

licensing

+ + + +
+ + + + diff --git a/public/tags/linda-rodriguez-mcrobbie/index.html b/public/tags/linda-rodriguez-mcrobbie/index.html new file mode 100644 index 0000000..fcb7020 --- /dev/null +++ b/public/tags/linda-rodriguez-mcrobbie/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linda rodriguez mcrobbie

+ + + +
+ + + + diff --git a/public/tags/linkedin/index.html b/public/tags/linkedin/index.html new file mode 100644 index 0000000..9af8e5c --- /dev/null +++ b/public/tags/linkedin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linkedin

+ + + +
+ + + + diff --git a/public/tags/links/index.html b/public/tags/links/index.html new file mode 100644 index 0000000..c74d365 --- /dev/null +++ b/public/tags/links/index.html @@ -0,0 +1,179 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

links

+ + + +
+ + + + diff --git a/public/tags/linux/index.html b/public/tags/linux/index.html new file mode 100644 index 0000000..edb3634 --- /dev/null +++ b/public/tags/linux/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

linux

+ + + +
+ + + + diff --git a/public/tags/lisp/index.html b/public/tags/lisp/index.html new file mode 100644 index 0000000..63b09af --- /dev/null +++ b/public/tags/lisp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lisp

+ + + +
+ + + + diff --git a/public/tags/lists/index.html b/public/tags/lists/index.html new file mode 100644 index 0000000..9d7eebd --- /dev/null +++ b/public/tags/lists/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lists

+ + + +
+ + + + diff --git a/public/tags/local-run/index.html b/public/tags/local-run/index.html new file mode 100644 index 0000000..f1a3122 --- /dev/null +++ b/public/tags/local-run/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

local run

+ + + +
+ + + + diff --git a/public/tags/lockdown/index.html b/public/tags/lockdown/index.html new file mode 100644 index 0000000..c430bec --- /dev/null +++ b/public/tags/lockdown/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lockdown

+ + + +
+ + + + diff --git a/public/tags/log/index.html b/public/tags/log/index.html new file mode 100644 index 0000000..342aa10 --- /dev/null +++ b/public/tags/log/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

log

+ + + +
+ + + + diff --git a/public/tags/logging/index.html b/public/tags/logging/index.html new file mode 100644 index 0000000..550d150 --- /dev/null +++ b/public/tags/logging/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

logging

+ + + +
+ + + + diff --git a/public/tags/logic/index.html b/public/tags/logic/index.html new file mode 100644 index 0000000..75128d1 --- /dev/null +++ b/public/tags/logic/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

logic

+ + + +
+ + + + diff --git a/public/tags/logs/index.html b/public/tags/logs/index.html new file mode 100644 index 0000000..fa1ca84 --- /dev/null +++ b/public/tags/logs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

logs

+ + + +
+ + + + diff --git a/public/tags/lsp/index.html b/public/tags/lsp/index.html new file mode 100644 index 0000000..95c0296 --- /dev/null +++ b/public/tags/lsp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

lsp

+ + + +
+ + + + diff --git a/public/tags/mac/index.html b/public/tags/mac/index.html new file mode 100644 index 0000000..24f0a4f --- /dev/null +++ b/public/tags/mac/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mac

+ + + +
+ + + + diff --git a/public/tags/macbooks/index.html b/public/tags/macbooks/index.html new file mode 100644 index 0000000..b26fd07 --- /dev/null +++ b/public/tags/macbooks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

macbooks

+ + + +
+ + + + diff --git a/public/tags/machine-learning/index.html b/public/tags/machine-learning/index.html new file mode 100644 index 0000000..2ad8da0 --- /dev/null +++ b/public/tags/machine-learning/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

machine learning

+ + + +
+ + + + diff --git a/public/tags/macos/index.html b/public/tags/macos/index.html new file mode 100644 index 0000000..8264489 --- /dev/null +++ b/public/tags/macos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

macos

+ + + +
+ + + + diff --git a/public/tags/macros/index.html b/public/tags/macros/index.html new file mode 100644 index 0000000..ea1c5c9 --- /dev/null +++ b/public/tags/macros/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

macros

+ + + +
+ + + + diff --git a/public/tags/mahesh-venkitachalam/index.html b/public/tags/mahesh-venkitachalam/index.html new file mode 100644 index 0000000..37c446f --- /dev/null +++ b/public/tags/mahesh-venkitachalam/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mahesh venkitachalam

+ + + +
+ + + + diff --git a/public/tags/make/index.html b/public/tags/make/index.html new file mode 100644 index 0000000..a92e35b --- /dev/null +++ b/public/tags/make/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

make

+ + + +
+ + + + diff --git a/public/tags/management/index.html b/public/tags/management/index.html new file mode 100644 index 0000000..db22063 --- /dev/null +++ b/public/tags/management/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

management

+ + + +
+ + + + diff --git a/public/tags/managers/index.html b/public/tags/managers/index.html new file mode 100644 index 0000000..53beb61 --- /dev/null +++ b/public/tags/managers/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

managers

+ + + +
+ + + + diff --git a/public/tags/manifesto/index.html b/public/tags/manifesto/index.html new file mode 100644 index 0000000..1226ab4 --- /dev/null +++ b/public/tags/manifesto/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

manifesto

+ + + +
+ + + + diff --git a/public/tags/marc-clifton/index.html b/public/tags/marc-clifton/index.html new file mode 100644 index 0000000..4d23f5a --- /dev/null +++ b/public/tags/marc-clifton/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

marc clifton

+ + + +
+ + + + diff --git a/public/tags/marios-christou/index.html b/public/tags/marios-christou/index.html new file mode 100644 index 0000000..610d0cc --- /dev/null +++ b/public/tags/marios-christou/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

marios christou

+ + + +
+ + + + diff --git a/public/tags/mark-mcdonnell/index.html b/public/tags/mark-mcdonnell/index.html new file mode 100644 index 0000000..401e9f8 --- /dev/null +++ b/public/tags/mark-mcdonnell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mark mcdonnell

+ + + +
+ + + + diff --git a/public/tags/mark-richards/index.html b/public/tags/mark-richards/index.html new file mode 100644 index 0000000..c0ad646 --- /dev/null +++ b/public/tags/mark-richards/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mark richards

+ + + +
+ + + + diff --git a/public/tags/marketing/index.html b/public/tags/marketing/index.html new file mode 100644 index 0000000..68d606b --- /dev/null +++ b/public/tags/marketing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

marketing

+ + + +
+ + + + diff --git a/public/tags/mars/index.html b/public/tags/mars/index.html new file mode 100644 index 0000000..ba07bf6 --- /dev/null +++ b/public/tags/mars/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mars

+ + + +
+ + + + diff --git a/public/tags/martin-kleppmann/index.html b/public/tags/martin-kleppmann/index.html new file mode 100644 index 0000000..8a0a18c --- /dev/null +++ b/public/tags/martin-kleppmann/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

martin kleppmann

+ + + +
+ + + + diff --git a/public/tags/marvel/index.html b/public/tags/marvel/index.html new file mode 100644 index 0000000..6b85864 --- /dev/null +++ b/public/tags/marvel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

marvel

+ + + +
+ + + + diff --git a/public/tags/mastodon/index.html b/public/tags/mastodon/index.html new file mode 100644 index 0000000..020fb87 --- /dev/null +++ b/public/tags/mastodon/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mastodon

+ + + +
+ + + + diff --git a/public/tags/material-design/index.html b/public/tags/material-design/index.html new file mode 100644 index 0000000..149c009 --- /dev/null +++ b/public/tags/material-design/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

material design

+ + + +
+ + + + diff --git a/public/tags/matt-lamothe/index.html b/public/tags/matt-lamothe/index.html new file mode 100644 index 0000000..a7d431d --- /dev/null +++ b/public/tags/matt-lamothe/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

matt lamothe

+ + + +
+ + + + diff --git a/public/tags/matt-moore/index.html b/public/tags/matt-moore/index.html new file mode 100644 index 0000000..5047593 --- /dev/null +++ b/public/tags/matt-moore/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

matt moore

+ + + +
+ + + + diff --git a/public/tags/matt-wagner/index.html b/public/tags/matt-wagner/index.html new file mode 100644 index 0000000..3428acd --- /dev/null +++ b/public/tags/matt-wagner/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

matt wagner

+ + + +
+ + + + diff --git a/public/tags/maureen-f-mchugh/index.html b/public/tags/maureen-f-mchugh/index.html new file mode 100644 index 0000000..f6a11fe --- /dev/null +++ b/public/tags/maureen-f-mchugh/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

maureen f mchugh

+ + + +
+ + + + diff --git a/public/tags/medium/index.html b/public/tags/medium/index.html new file mode 100644 index 0000000..c1c26d1 --- /dev/null +++ b/public/tags/medium/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

medium

+ + + +
+ + + + diff --git a/public/tags/meds/index.html b/public/tags/meds/index.html new file mode 100644 index 0000000..860cfda --- /dev/null +++ b/public/tags/meds/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meds

+ + + +
+ + + + diff --git a/public/tags/meetings/index.html b/public/tags/meetings/index.html new file mode 100644 index 0000000..b0e1644 --- /dev/null +++ b/public/tags/meetings/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meetings

+ + + +
+ + + + diff --git a/public/tags/memory/index.html b/public/tags/memory/index.html new file mode 100644 index 0000000..26d399b --- /dev/null +++ b/public/tags/memory/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

memory

+ + + +
+ + + + diff --git a/public/tags/mercurial/index.html b/public/tags/mercurial/index.html new file mode 100644 index 0000000..c558de6 --- /dev/null +++ b/public/tags/mercurial/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mercurial

+ + + +
+ + + + diff --git a/public/tags/meritocracy/index.html b/public/tags/meritocracy/index.html new file mode 100644 index 0000000..239b301 --- /dev/null +++ b/public/tags/meritocracy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meritocracy

+ + + +
+ + + + diff --git a/public/tags/messages/index.html b/public/tags/messages/index.html new file mode 100644 index 0000000..e869296 --- /dev/null +++ b/public/tags/messages/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

messages

+ + + +
+ + + + diff --git a/public/tags/meta/index.html b/public/tags/meta/index.html new file mode 100644 index 0000000..2dddf14 --- /dev/null +++ b/public/tags/meta/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meta

+ + + +
+ + + + diff --git a/public/tags/meter-js/index.html b/public/tags/meter-js/index.html new file mode 100644 index 0000000..32db7e8 --- /dev/null +++ b/public/tags/meter-js/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

meter.js

+ + + +
+ + + + diff --git a/public/tags/metrodome/index.html b/public/tags/metrodome/index.html new file mode 100644 index 0000000..8ca480c --- /dev/null +++ b/public/tags/metrodome/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

metrodome

+ + + +
+ + + + diff --git a/public/tags/michael-bay/index.html b/public/tags/michael-bay/index.html new file mode 100644 index 0000000..55de406 --- /dev/null +++ b/public/tags/michael-bay/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

michael bay

+ + + +
+ + + + diff --git a/public/tags/michael-heap/index.html b/public/tags/michael-heap/index.html new file mode 100644 index 0000000..ebec7f5 --- /dev/null +++ b/public/tags/michael-heap/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

michael heap

+ + + +
+ + + + diff --git a/public/tags/michal-zalewski/index.html b/public/tags/michal-zalewski/index.html new file mode 100644 index 0000000..ba9c3de --- /dev/null +++ b/public/tags/michal-zalewski/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

michal zalewski

+ + + +
+ + + + diff --git a/public/tags/mickey-petersen/index.html b/public/tags/mickey-petersen/index.html new file mode 100644 index 0000000..d757779 --- /dev/null +++ b/public/tags/mickey-petersen/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mickey petersen

+ + + +
+ + + + diff --git a/public/tags/microaggressions/index.html b/public/tags/microaggressions/index.html new file mode 100644 index 0000000..f0e3338 --- /dev/null +++ b/public/tags/microaggressions/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microaggressions

+ + + +
+ + + + diff --git a/public/tags/microblog/index.html b/public/tags/microblog/index.html new file mode 100644 index 0000000..54daccc --- /dev/null +++ b/public/tags/microblog/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microblog

+ + + +
+ + + + diff --git a/public/tags/microservices/index.html b/public/tags/microservices/index.html new file mode 100644 index 0000000..4525905 --- /dev/null +++ b/public/tags/microservices/index.html @@ -0,0 +1,97 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microservices

+ + + +
+ + + + diff --git a/public/tags/microsoft/index.html b/public/tags/microsoft/index.html new file mode 100644 index 0000000..fcd91de --- /dev/null +++ b/public/tags/microsoft/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

microsoft

+ + + +
+ + + + diff --git a/public/tags/mike-pirnat/index.html b/public/tags/mike-pirnat/index.html new file mode 100644 index 0000000..b3984e5 --- /dev/null +++ b/public/tags/mike-pirnat/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mike pirnat

+ + + +
+ + + + diff --git a/public/tags/miran-lipovaca/index.html b/public/tags/miran-lipovaca/index.html new file mode 100644 index 0000000..66038fe --- /dev/null +++ b/public/tags/miran-lipovaca/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

miran lipovaca

+ + + +
+ + + + diff --git a/public/tags/mobile/index.html b/public/tags/mobile/index.html new file mode 100644 index 0000000..e3f4a39 --- /dev/null +++ b/public/tags/mobile/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mobile

+ + + +
+ + + + diff --git a/public/tags/mock/index.html b/public/tags/mock/index.html new file mode 100644 index 0000000..4ef9ba7 --- /dev/null +++ b/public/tags/mock/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mock

+ + + +
+ + + + diff --git a/public/tags/mocking/index.html b/public/tags/mocking/index.html new file mode 100644 index 0000000..043fac4 --- /dev/null +++ b/public/tags/mocking/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mocking

+ + + +
+ + + + diff --git a/public/tags/mocks/index.html b/public/tags/mocks/index.html new file mode 100644 index 0000000..904788e --- /dev/null +++ b/public/tags/mocks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mocks

+ + + +
+ + + + diff --git a/public/tags/modules/index.html b/public/tags/modules/index.html new file mode 100644 index 0000000..8176dda --- /dev/null +++ b/public/tags/modules/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

modules

+ + + +
+ + + + diff --git a/public/tags/mongodb/index.html b/public/tags/mongodb/index.html new file mode 100644 index 0000000..ba4d2ad --- /dev/null +++ b/public/tags/mongodb/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mongodb

+ + + +
+ + + + diff --git a/public/tags/monitoring/index.html b/public/tags/monitoring/index.html new file mode 100644 index 0000000..037d481 --- /dev/null +++ b/public/tags/monitoring/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

monitoring

+ + + +
+ + + + diff --git a/public/tags/monologues/index.html b/public/tags/monologues/index.html new file mode 100644 index 0000000..1b25295 --- /dev/null +++ b/public/tags/monologues/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

monologues

+ + + +
+ + + + diff --git a/public/tags/morgan-bruce/index.html b/public/tags/morgan-bruce/index.html new file mode 100644 index 0000000..8dff0db --- /dev/null +++ b/public/tags/morgan-bruce/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

morgan bruce

+ + + +
+ + + + diff --git a/public/tags/mouse/index.html b/public/tags/mouse/index.html new file mode 100644 index 0000000..2077247 --- /dev/null +++ b/public/tags/mouse/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mouse

+ + + +
+ + + + diff --git a/public/tags/movies-2021/index.html b/public/tags/movies-2021/index.html new file mode 100644 index 0000000..c65a181 --- /dev/null +++ b/public/tags/movies-2021/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

movies:2021

+ + + +
+ + + + diff --git a/public/tags/movies/index.html b/public/tags/movies/index.html new file mode 100644 index 0000000..e25c40f --- /dev/null +++ b/public/tags/movies/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

movies

+ + + +
+ + + + diff --git a/public/tags/mozilla/index.html b/public/tags/mozilla/index.html new file mode 100644 index 0000000..2f38d21 --- /dev/null +++ b/public/tags/mozilla/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mozilla

+ + + +
+ + + + diff --git a/public/tags/music/index.html b/public/tags/music/index.html new file mode 100644 index 0000000..a67c7fa --- /dev/null +++ b/public/tags/music/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

music

+ + + +
+ + + + diff --git a/public/tags/myself/index.html b/public/tags/myself/index.html new file mode 100644 index 0000000..555c6be --- /dev/null +++ b/public/tags/myself/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

myself

+ + + +
+ + + + diff --git a/public/tags/mysql/index.html b/public/tags/mysql/index.html new file mode 100644 index 0000000..39b240d --- /dev/null +++ b/public/tags/mysql/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

mysql

+ + + +
+ + + + diff --git a/public/tags/n-k-jemisin/index.html b/public/tags/n-k-jemisin/index.html new file mode 100644 index 0000000..c4bc81b --- /dev/null +++ b/public/tags/n-k-jemisin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

n k jemisin

+ + + +
+ + + + diff --git a/public/tags/names/index.html b/public/tags/names/index.html new file mode 100644 index 0000000..96b7b24 --- /dev/null +++ b/public/tags/names/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

names

+ + + +
+ + + + diff --git a/public/tags/naming/index.html b/public/tags/naming/index.html new file mode 100644 index 0000000..69c1a27 --- /dev/null +++ b/public/tags/naming/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

naming

+ + + +
+ + + + diff --git a/public/tags/narayan-prusty/index.html b/public/tags/narayan-prusty/index.html new file mode 100644 index 0000000..a0d8ebb --- /dev/null +++ b/public/tags/narayan-prusty/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

narayan prusty

+ + + +
+ + + + diff --git a/public/tags/nasa/index.html b/public/tags/nasa/index.html new file mode 100644 index 0000000..7d3366e --- /dev/null +++ b/public/tags/nasa/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nasa

+ + + +
+ + + + diff --git a/public/tags/neil-gaiman/index.html b/public/tags/neil-gaiman/index.html new file mode 100644 index 0000000..f2f84bd --- /dev/null +++ b/public/tags/neil-gaiman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

neil gaiman

+ + + +
+ + + + diff --git a/public/tags/neovim/index.html b/public/tags/neovim/index.html new file mode 100644 index 0000000..12028cf --- /dev/null +++ b/public/tags/neovim/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

neovim

+ + + +
+ + + + diff --git a/public/tags/netlify/index.html b/public/tags/netlify/index.html new file mode 100644 index 0000000..382866f --- /dev/null +++ b/public/tags/netlify/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

netlify

+ + + +
+ + + + diff --git a/public/tags/news/index.html b/public/tags/news/index.html new file mode 100644 index 0000000..adf3b8f --- /dev/null +++ b/public/tags/news/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

news

+ + + +
+ + + + diff --git a/public/tags/nginx/index.html b/public/tags/nginx/index.html new file mode 100644 index 0000000..7b431e2 --- /dev/null +++ b/public/tags/nginx/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nginx

+ + + +
+ + + + diff --git a/public/tags/nirmala-nataraj/index.html b/public/tags/nirmala-nataraj/index.html new file mode 100644 index 0000000..36f569b --- /dev/null +++ b/public/tags/nirmala-nataraj/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nirmala nataraj

+ + + +
+ + + + diff --git a/public/tags/nishant-garg/index.html b/public/tags/nishant-garg/index.html new file mode 100644 index 0000000..3943a81 --- /dev/null +++ b/public/tags/nishant-garg/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nishant garg

+ + + +
+ + + + diff --git a/public/tags/nitpick/index.html b/public/tags/nitpick/index.html new file mode 100644 index 0000000..2bf6840 --- /dev/null +++ b/public/tags/nitpick/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nitpick

+ + + +
+ + + + diff --git a/public/tags/no-code/index.html b/public/tags/no-code/index.html new file mode 100644 index 0000000..1d2099c --- /dev/null +++ b/public/tags/no-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

no code

+ + + +
+ + + + diff --git a/public/tags/no-man-s-sky/index.html b/public/tags/no-man-s-sky/index.html new file mode 100644 index 0000000..49a16ab --- /dev/null +++ b/public/tags/no-man-s-sky/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

no man's sky

+ + + +
+ + + + diff --git a/public/tags/note-taking/index.html b/public/tags/note-taking/index.html new file mode 100644 index 0000000..fcf23b0 --- /dev/null +++ b/public/tags/note-taking/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

note taking

+ + + +
+ + + + diff --git a/public/tags/notes/index.html b/public/tags/notes/index.html new file mode 100644 index 0000000..c2efe24 --- /dev/null +++ b/public/tags/notes/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

notes

+ + + +
+ + + + diff --git a/public/tags/nroff/index.html b/public/tags/nroff/index.html new file mode 100644 index 0000000..3e12250 --- /dev/null +++ b/public/tags/nroff/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nroff

+ + + +
+ + + + diff --git a/public/tags/nvim/index.html b/public/tags/nvim/index.html new file mode 100644 index 0000000..085e108 --- /dev/null +++ b/public/tags/nvim/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

nvim

+ + + +
+ + + + diff --git a/public/tags/oath/index.html b/public/tags/oath/index.html new file mode 100644 index 0000000..07cc367 --- /dev/null +++ b/public/tags/oath/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

oath

+ + + +
+ + + + diff --git a/public/tags/objects/index.html b/public/tags/objects/index.html new file mode 100644 index 0000000..aafb944 --- /dev/null +++ b/public/tags/objects/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

objects

+ + + +
+ + + + diff --git a/public/tags/oil-companies/index.html b/public/tags/oil-companies/index.html new file mode 100644 index 0000000..4f04dca --- /dev/null +++ b/public/tags/oil-companies/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

oil companies

+ + + +
+ + + + diff --git a/public/tags/old-man-s-war/index.html b/public/tags/old-man-s-war/index.html new file mode 100644 index 0000000..b1e47ed --- /dev/null +++ b/public/tags/old-man-s-war/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

old man's war

+ + + +
+ + + + diff --git a/public/tags/onboarding/index.html b/public/tags/onboarding/index.html new file mode 100644 index 0000000..857c480 --- /dev/null +++ b/public/tags/onboarding/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

onboarding

+ + + +
+ + + + diff --git a/public/tags/online/index.html b/public/tags/online/index.html new file mode 100644 index 0000000..6e48309 --- /dev/null +++ b/public/tags/online/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

online

+ + + +
+ + + + diff --git a/public/tags/open-source/index.html b/public/tags/open-source/index.html new file mode 100644 index 0000000..4386384 --- /dev/null +++ b/public/tags/open-source/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

open source

+ + + +
+ + + + diff --git a/public/tags/open/index.html b/public/tags/open/index.html new file mode 100644 index 0000000..4559614 --- /dev/null +++ b/public/tags/open/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

open

+ + + +
+ + + + diff --git a/public/tags/openjdk/index.html b/public/tags/openjdk/index.html new file mode 100644 index 0000000..ab8c691 --- /dev/null +++ b/public/tags/openjdk/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

openjdk

+ + + +
+ + + + diff --git a/public/tags/optimization/index.html b/public/tags/optimization/index.html new file mode 100644 index 0000000..a5f015c --- /dev/null +++ b/public/tags/optimization/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

optimization

+ + + +
+ + + + diff --git a/public/tags/oracle/index.html b/public/tags/oracle/index.html new file mode 100644 index 0000000..6abea05 --- /dev/null +++ b/public/tags/oracle/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

oracle

+ + + +
+ + + + diff --git a/public/tags/org-mode/index.html b/public/tags/org-mode/index.html new file mode 100644 index 0000000..057d9f5 --- /dev/null +++ b/public/tags/org-mode/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

org-mode

+ + + +
+ + + + diff --git a/public/tags/organization/index.html b/public/tags/organization/index.html new file mode 100644 index 0000000..dd5bb2d --- /dev/null +++ b/public/tags/organization/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

organization

+ + + +
+ + + + diff --git a/public/tags/own-your-shit/index.html b/public/tags/own-your-shit/index.html new file mode 100644 index 0000000..27a6687 --- /dev/null +++ b/public/tags/own-your-shit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

own your shit

+ + + +
+ + + + diff --git a/public/tags/owning/index.html b/public/tags/owning/index.html new file mode 100644 index 0000000..713c36e --- /dev/null +++ b/public/tags/owning/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

owning

+ + + +
+ + + + diff --git a/public/tags/packt/index.html b/public/tags/packt/index.html new file mode 100644 index 0000000..83b2162 --- /dev/null +++ b/public/tags/packt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

packt

+ + + +
+ + + + diff --git a/public/tags/pandoc/index.html b/public/tags/pandoc/index.html new file mode 100644 index 0000000..f5d67c3 --- /dev/null +++ b/public/tags/pandoc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pandoc

+ + + +
+ + + + diff --git a/public/tags/paper-notes/index.html b/public/tags/paper-notes/index.html new file mode 100644 index 0000000..12129e6 --- /dev/null +++ b/public/tags/paper-notes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paper notes

+ + + +
+ + + + diff --git a/public/tags/paradox/index.html b/public/tags/paradox/index.html new file mode 100644 index 0000000..dc5a6b9 --- /dev/null +++ b/public/tags/paradox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paradox

+ + + +
+ + + + diff --git a/public/tags/parameters/index.html b/public/tags/parameters/index.html new file mode 100644 index 0000000..dcf5c4c --- /dev/null +++ b/public/tags/parameters/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

parameters

+ + + +
+ + + + diff --git a/public/tags/pascal/index.html b/public/tags/pascal/index.html new file mode 100644 index 0000000..caa2c08 --- /dev/null +++ b/public/tags/pascal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pascal

+ + + +
+ + + + diff --git a/public/tags/password-manager/index.html b/public/tags/password-manager/index.html new file mode 100644 index 0000000..a6fb8ed --- /dev/null +++ b/public/tags/password-manager/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

password manager

+ + + +
+ + + + diff --git a/public/tags/patents/index.html b/public/tags/patents/index.html new file mode 100644 index 0000000..a0174de --- /dev/null +++ b/public/tags/patents/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

patents

+ + + +
+ + + + diff --git a/public/tags/patrick-foote/index.html b/public/tags/patrick-foote/index.html new file mode 100644 index 0000000..b44e9bf --- /dev/null +++ b/public/tags/patrick-foote/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

patrick foote

+ + + +
+ + + + diff --git a/public/tags/patrick-niemeyer/index.html b/public/tags/patrick-niemeyer/index.html new file mode 100644 index 0000000..c645169 --- /dev/null +++ b/public/tags/patrick-niemeyer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

patrick niemeyer

+ + + +
+ + + + diff --git a/public/tags/pattern/index.html b/public/tags/pattern/index.html new file mode 100644 index 0000000..009d3e8 --- /dev/null +++ b/public/tags/pattern/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pattern

+ + + +
+ + + + diff --git a/public/tags/patterns/index.html b/public/tags/patterns/index.html new file mode 100644 index 0000000..1d4081c --- /dev/null +++ b/public/tags/patterns/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

patterns

+ + + +
+ + + + diff --git a/public/tags/paul-crowther/index.html b/public/tags/paul-crowther/index.html new file mode 100644 index 0000000..e08382c --- /dev/null +++ b/public/tags/paul-crowther/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paul crowther

+ + + +
+ + + + diff --git a/public/tags/paul-ekman/index.html b/public/tags/paul-ekman/index.html new file mode 100644 index 0000000..52b94a1 --- /dev/null +++ b/public/tags/paul-ekman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paul ekman

+ + + +
+ + + + diff --git a/public/tags/paying/index.html b/public/tags/paying/index.html new file mode 100644 index 0000000..0ba9e3a --- /dev/null +++ b/public/tags/paying/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paying

+ + + +
+ + + + diff --git a/public/tags/paywalls/index.html b/public/tags/paywalls/index.html new file mode 100644 index 0000000..285f4cb --- /dev/null +++ b/public/tags/paywalls/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

paywalls

+ + + +
+ + + + diff --git a/public/tags/pc/index.html b/public/tags/pc/index.html new file mode 100644 index 0000000..5055f29 --- /dev/null +++ b/public/tags/pc/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pc

+ + + +
+ + + + diff --git a/public/tags/pentest/index.html b/public/tags/pentest/index.html new file mode 100644 index 0000000..e0e96c1 --- /dev/null +++ b/public/tags/pentest/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pentest

+ + + +
+ + + + diff --git a/public/tags/pep8/index.html b/public/tags/pep8/index.html new file mode 100644 index 0000000..0c2cb83 --- /dev/null +++ b/public/tags/pep8/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pep8

+ + + +
+ + + + diff --git a/public/tags/personal-time/index.html b/public/tags/personal-time/index.html new file mode 100644 index 0000000..4b9d62b --- /dev/null +++ b/public/tags/personal-time/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

personal time

+ + + +
+ + + + diff --git a/public/tags/personal/index.html b/public/tags/personal/index.html new file mode 100644 index 0000000..6b54f10 --- /dev/null +++ b/public/tags/personal/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

personal

+ + + +
+ + + + diff --git a/public/tags/peter-lake/index.html b/public/tags/peter-lake/index.html new file mode 100644 index 0000000..18c90bf --- /dev/null +++ b/public/tags/peter-lake/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

peter lake

+ + + +
+ + + + diff --git a/public/tags/pharma/index.html b/public/tags/pharma/index.html new file mode 100644 index 0000000..a6e4d01 --- /dev/null +++ b/public/tags/pharma/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pharma

+ + + +
+ + + + diff --git a/public/tags/philosophy/index.html b/public/tags/philosophy/index.html new file mode 100644 index 0000000..efad308 --- /dev/null +++ b/public/tags/philosophy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

philosophy

+ + + +
+ + + + diff --git a/public/tags/phishing/index.html b/public/tags/phishing/index.html new file mode 100644 index 0000000..1a85338 --- /dev/null +++ b/public/tags/phishing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

phishing

+ + + +
+ + + + diff --git a/public/tags/phoenix/index.html b/public/tags/phoenix/index.html new file mode 100644 index 0000000..991002f --- /dev/null +++ b/public/tags/phoenix/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

phoenix

+ + + +
+ + + + diff --git a/public/tags/photos/index.html b/public/tags/photos/index.html new file mode 100644 index 0000000..f2e1767 --- /dev/null +++ b/public/tags/photos/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

photos

+ + + +
+ + + + diff --git a/public/tags/pictures/index.html b/public/tags/pictures/index.html new file mode 100644 index 0000000..2ef4af4 --- /dev/null +++ b/public/tags/pictures/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pictures

+ + + +
+ + + + diff --git a/public/tags/piers-anthony/index.html b/public/tags/piers-anthony/index.html new file mode 100644 index 0000000..ca97d64 --- /dev/null +++ b/public/tags/piers-anthony/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

piers anthony

+ + + +
+ + + + diff --git a/public/tags/pitfalls/index.html b/public/tags/pitfalls/index.html new file mode 100644 index 0000000..d926686 --- /dev/null +++ b/public/tags/pitfalls/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pitfalls

+ + + +
+ + + + diff --git a/public/tags/plausible/index.html b/public/tags/plausible/index.html new file mode 100644 index 0000000..eddc464 --- /dev/null +++ b/public/tags/plausible/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

plausible

+ + + +
+ + + + diff --git a/public/tags/playbook/index.html b/public/tags/playbook/index.html new file mode 100644 index 0000000..6dfdc2a --- /dev/null +++ b/public/tags/playbook/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

playbook

+ + + +
+ + + + diff --git a/public/tags/playboy/index.html b/public/tags/playboy/index.html new file mode 100644 index 0000000..e1d6672 --- /dev/null +++ b/public/tags/playboy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

playboy

+ + + +
+ + + + diff --git a/public/tags/plugins/index.html b/public/tags/plugins/index.html new file mode 100644 index 0000000..5c5f5f0 --- /dev/null +++ b/public/tags/plugins/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

plugins

+ + + +
+ + + + diff --git a/public/tags/podman/index.html b/public/tags/podman/index.html new file mode 100644 index 0000000..2c34db3 --- /dev/null +++ b/public/tags/podman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

podman

+ + + +
+ + + + diff --git a/public/tags/poetry/index.html b/public/tags/poetry/index.html new file mode 100644 index 0000000..a86d2fe --- /dev/null +++ b/public/tags/poetry/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

poetry

+ + + +
+ + + + diff --git a/public/tags/pong/index.html b/public/tags/pong/index.html new file mode 100644 index 0000000..6fd4fe7 --- /dev/null +++ b/public/tags/pong/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pong

+ + + +
+ + + + diff --git a/public/tags/porn-industry/index.html b/public/tags/porn-industry/index.html new file mode 100644 index 0000000..61f57e0 --- /dev/null +++ b/public/tags/porn-industry/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

porn industry

+ + + +
+ + + + diff --git a/public/tags/post-its/index.html b/public/tags/post-its/index.html new file mode 100644 index 0000000..f75036b --- /dev/null +++ b/public/tags/post-its/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

post its

+ + + +
+ + + + diff --git a/public/tags/post-mortems/index.html b/public/tags/post-mortems/index.html new file mode 100644 index 0000000..954b861 --- /dev/null +++ b/public/tags/post-mortems/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

post-mortems

+ + + +
+ + + + diff --git a/public/tags/postgres/index.html b/public/tags/postgres/index.html new file mode 100644 index 0000000..3ffce23 --- /dev/null +++ b/public/tags/postgres/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

postgres

+ + + +
+ + + + diff --git a/public/tags/postgresql/index.html b/public/tags/postgresql/index.html new file mode 100644 index 0000000..bc58412 --- /dev/null +++ b/public/tags/postgresql/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

postgresql

+ + + +
+ + + + diff --git a/public/tags/pre-order/index.html b/public/tags/pre-order/index.html new file mode 100644 index 0000000..4546723 --- /dev/null +++ b/public/tags/pre-order/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pre-order

+ + + +
+ + + + diff --git a/public/tags/predicable/index.html b/public/tags/predicable/index.html new file mode 100644 index 0000000..3c21c45 --- /dev/null +++ b/public/tags/predicable/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

predicable

+ + + +
+ + + + diff --git a/public/tags/presentations/index.html b/public/tags/presentations/index.html new file mode 100644 index 0000000..f66e253 --- /dev/null +++ b/public/tags/presentations/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

presentations

+ + + +
+ + + + diff --git a/public/tags/principles/index.html b/public/tags/principles/index.html new file mode 100644 index 0000000..8dba240 --- /dev/null +++ b/public/tags/principles/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

principles

+ + + +
+ + + + diff --git a/public/tags/privacy/index.html b/public/tags/privacy/index.html new file mode 100644 index 0000000..917256d --- /dev/null +++ b/public/tags/privacy/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

privacy

+ + + +
+ + + + diff --git a/public/tags/process/index.html b/public/tags/process/index.html new file mode 100644 index 0000000..b87c388 --- /dev/null +++ b/public/tags/process/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

process

+ + + +
+ + + + diff --git a/public/tags/product-manager/index.html b/public/tags/product-manager/index.html new file mode 100644 index 0000000..a15570d --- /dev/null +++ b/public/tags/product-manager/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

product manager

+ + + +
+ + + + diff --git a/public/tags/productivity/index.html b/public/tags/productivity/index.html new file mode 100644 index 0000000..606b4c0 --- /dev/null +++ b/public/tags/productivity/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

productivity

+ + + +
+ + + + diff --git a/public/tags/programming-languages/index.html b/public/tags/programming-languages/index.html new file mode 100644 index 0000000..bb21cd6 --- /dev/null +++ b/public/tags/programming-languages/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

programming languages

+ + + +
+ + + + diff --git a/public/tags/programming/index.html b/public/tags/programming/index.html new file mode 100644 index 0000000..41406d6 --- /dev/null +++ b/public/tags/programming/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

programming

+ + + +
+ + + + diff --git a/public/tags/project-organization/index.html b/public/tags/project-organization/index.html new file mode 100644 index 0000000..54aa3c5 --- /dev/null +++ b/public/tags/project-organization/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

project organization

+ + + +
+ + + + diff --git a/public/tags/project/index.html b/public/tags/project/index.html new file mode 100644 index 0000000..f5e3d82 --- /dev/null +++ b/public/tags/project/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

project

+ + + +
+ + + + diff --git a/public/tags/projects/index.html b/public/tags/projects/index.html new file mode 100644 index 0000000..6bb5951 --- /dev/null +++ b/public/tags/projects/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

projects

+ + + +
+ + + + diff --git a/public/tags/prolog/index.html b/public/tags/prolog/index.html new file mode 100644 index 0000000..e588869 --- /dev/null +++ b/public/tags/prolog/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

prolog

+ + + +
+ + + + diff --git a/public/tags/prometheus/index.html b/public/tags/prometheus/index.html new file mode 100644 index 0000000..49428f5 --- /dev/null +++ b/public/tags/prometheus/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

prometheus

+ + + +
+ + + + diff --git a/public/tags/protection/index.html b/public/tags/protection/index.html new file mode 100644 index 0000000..2cf94a6 --- /dev/null +++ b/public/tags/protection/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

protection

+ + + +
+ + + + diff --git a/public/tags/protocol/index.html b/public/tags/protocol/index.html new file mode 100644 index 0000000..4964bba --- /dev/null +++ b/public/tags/protocol/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

protocol

+ + + +
+ + + + diff --git a/public/tags/psychology/index.html b/public/tags/psychology/index.html new file mode 100644 index 0000000..e31c515 --- /dev/null +++ b/public/tags/psychology/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

psychology

+ + + +
+ + + + diff --git a/public/tags/public-domain/index.html b/public/tags/public-domain/index.html new file mode 100644 index 0000000..e8e458d --- /dev/null +++ b/public/tags/public-domain/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

public domain

+ + + +
+ + + + diff --git a/public/tags/published-1853/index.html b/public/tags/published-1853/index.html new file mode 100644 index 0000000..0d06988 --- /dev/null +++ b/public/tags/published-1853/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1853

+ + + +
+ + + + diff --git a/public/tags/published-1896/index.html b/public/tags/published-1896/index.html new file mode 100644 index 0000000..a938648 --- /dev/null +++ b/public/tags/published-1896/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1896

+ + + +
+ + + + diff --git a/public/tags/published-1929/index.html b/public/tags/published-1929/index.html new file mode 100644 index 0000000..df487f2 --- /dev/null +++ b/public/tags/published-1929/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1929

+ + + +
+ + + + diff --git a/public/tags/published-1932/index.html b/public/tags/published-1932/index.html new file mode 100644 index 0000000..9b1fd4e --- /dev/null +++ b/public/tags/published-1932/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1932

+ + + +
+ + + + diff --git a/public/tags/published-1954/index.html b/public/tags/published-1954/index.html new file mode 100644 index 0000000..f9138f0 --- /dev/null +++ b/public/tags/published-1954/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1954

+ + + +
+ + + + diff --git a/public/tags/published-1965/index.html b/public/tags/published-1965/index.html new file mode 100644 index 0000000..9b7facf --- /dev/null +++ b/public/tags/published-1965/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1965

+ + + +
+ + + + diff --git a/public/tags/published-1967/index.html b/public/tags/published-1967/index.html new file mode 100644 index 0000000..21f2745 --- /dev/null +++ b/public/tags/published-1967/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1967

+ + + +
+ + + + diff --git a/public/tags/published-1970/index.html b/public/tags/published-1970/index.html new file mode 100644 index 0000000..a798618 --- /dev/null +++ b/public/tags/published-1970/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1970

+ + + +
+ + + + diff --git a/public/tags/published-1971/index.html b/public/tags/published-1971/index.html new file mode 100644 index 0000000..09a8b0c --- /dev/null +++ b/public/tags/published-1971/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1971

+ + + +
+ + + + diff --git a/public/tags/published-1974/index.html b/public/tags/published-1974/index.html new file mode 100644 index 0000000..81097a9 --- /dev/null +++ b/public/tags/published-1974/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1974

+ + + +
+ + + + diff --git a/public/tags/published-1982/index.html b/public/tags/published-1982/index.html new file mode 100644 index 0000000..189f180 --- /dev/null +++ b/public/tags/published-1982/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1982

+ + + +
+ + + + diff --git a/public/tags/published-1985/index.html b/public/tags/published-1985/index.html new file mode 100644 index 0000000..0021ac9 --- /dev/null +++ b/public/tags/published-1985/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1985

+ + + +
+ + + + diff --git a/public/tags/published-1987/index.html b/public/tags/published-1987/index.html new file mode 100644 index 0000000..bd868ac --- /dev/null +++ b/public/tags/published-1987/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1987

+ + + +
+ + + + diff --git a/public/tags/published-1989/index.html b/public/tags/published-1989/index.html new file mode 100644 index 0000000..d5badd0 --- /dev/null +++ b/public/tags/published-1989/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1989

+ + + +
+ + + + diff --git a/public/tags/published-1991/index.html b/public/tags/published-1991/index.html new file mode 100644 index 0000000..426d693 --- /dev/null +++ b/public/tags/published-1991/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1991

+ + + +
+ + + + diff --git a/public/tags/published-1992/index.html b/public/tags/published-1992/index.html new file mode 100644 index 0000000..a3df2c2 --- /dev/null +++ b/public/tags/published-1992/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1992

+ + + +
+ + + + diff --git a/public/tags/published-1994/index.html b/public/tags/published-1994/index.html new file mode 100644 index 0000000..f4c6a7a --- /dev/null +++ b/public/tags/published-1994/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1994

+ + + +
+ + + + diff --git a/public/tags/published-1997/index.html b/public/tags/published-1997/index.html new file mode 100644 index 0000000..5593b0b --- /dev/null +++ b/public/tags/published-1997/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:1997

+ + + +
+ + + + diff --git a/public/tags/published-2001/index.html b/public/tags/published-2001/index.html new file mode 100644 index 0000000..6b1dc13 --- /dev/null +++ b/public/tags/published-2001/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2001

+ + + +
+ + + + diff --git a/public/tags/published-2002/index.html b/public/tags/published-2002/index.html new file mode 100644 index 0000000..7cd2f6d --- /dev/null +++ b/public/tags/published-2002/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2002

+ + + +
+ + + + diff --git a/public/tags/published-2003/index.html b/public/tags/published-2003/index.html new file mode 100644 index 0000000..bcb22c6 --- /dev/null +++ b/public/tags/published-2003/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2003

+ + + +
+ + + + diff --git a/public/tags/published-2004/index.html b/public/tags/published-2004/index.html new file mode 100644 index 0000000..1adfb43 --- /dev/null +++ b/public/tags/published-2004/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2004

+ + + +
+ + + + diff --git a/public/tags/published-2005/index.html b/public/tags/published-2005/index.html new file mode 100644 index 0000000..32deb56 --- /dev/null +++ b/public/tags/published-2005/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2005

+ + + +
+ + + + diff --git a/public/tags/published-2006/index.html b/public/tags/published-2006/index.html new file mode 100644 index 0000000..6d91b1c --- /dev/null +++ b/public/tags/published-2006/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2006

+ + + +
+ + + + diff --git a/public/tags/published-2007/index.html b/public/tags/published-2007/index.html new file mode 100644 index 0000000..48ecb4f --- /dev/null +++ b/public/tags/published-2007/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2007

+ + + +
+ + + + diff --git a/public/tags/published-2008/index.html b/public/tags/published-2008/index.html new file mode 100644 index 0000000..54dfac3 --- /dev/null +++ b/public/tags/published-2008/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2008

+ + + +
+ + + + diff --git a/public/tags/published-2009/index.html b/public/tags/published-2009/index.html new file mode 100644 index 0000000..2c1b8fb --- /dev/null +++ b/public/tags/published-2009/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2009

+ + + +
+ + + + diff --git a/public/tags/published-2010/index.html b/public/tags/published-2010/index.html new file mode 100644 index 0000000..c648fce --- /dev/null +++ b/public/tags/published-2010/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2010

+ + + +
+ + + + diff --git a/public/tags/published-2011/index.html b/public/tags/published-2011/index.html new file mode 100644 index 0000000..f8850b5 --- /dev/null +++ b/public/tags/published-2011/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2011

+ + + +
+ + + + diff --git a/public/tags/published-2012/index.html b/public/tags/published-2012/index.html new file mode 100644 index 0000000..0d344f4 --- /dev/null +++ b/public/tags/published-2012/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2012

+ + + +
+ + + + diff --git a/public/tags/published-2013/index.html b/public/tags/published-2013/index.html new file mode 100644 index 0000000..d3959e3 --- /dev/null +++ b/public/tags/published-2013/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2013

+ + + +
+ + + + diff --git a/public/tags/published-2014/index.html b/public/tags/published-2014/index.html new file mode 100644 index 0000000..bf1394e --- /dev/null +++ b/public/tags/published-2014/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2014

+ + + +
+ + + + diff --git a/public/tags/published-2015/index.html b/public/tags/published-2015/index.html new file mode 100644 index 0000000..2ade3eb --- /dev/null +++ b/public/tags/published-2015/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2015

+ + + +
+ + + + diff --git a/public/tags/published-2016/index.html b/public/tags/published-2016/index.html new file mode 100644 index 0000000..41e73d6 --- /dev/null +++ b/public/tags/published-2016/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2016

+ + + +
+ + + + diff --git a/public/tags/published-2017/index.html b/public/tags/published-2017/index.html new file mode 100644 index 0000000..2556b87 --- /dev/null +++ b/public/tags/published-2017/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2017

+ + + +
+ + + + diff --git a/public/tags/published-2018/index.html b/public/tags/published-2018/index.html new file mode 100644 index 0000000..ed27312 --- /dev/null +++ b/public/tags/published-2018/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2018

+ + + +
+ + + + diff --git a/public/tags/published-2019/index.html b/public/tags/published-2019/index.html new file mode 100644 index 0000000..b7256c8 --- /dev/null +++ b/public/tags/published-2019/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

published:2019

+ + + +
+ + + + diff --git a/public/tags/pull-requests/index.html b/public/tags/pull-requests/index.html new file mode 100644 index 0000000..9f32626 --- /dev/null +++ b/public/tags/pull-requests/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pull requests

+ + + +
+ + + + diff --git a/public/tags/pylint/index.html b/public/tags/pylint/index.html new file mode 100644 index 0000000..ee6530c --- /dev/null +++ b/public/tags/pylint/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pylint

+ + + +
+ + + + diff --git a/public/tags/pyramid/index.html b/public/tags/pyramid/index.html new file mode 100644 index 0000000..b6784ee --- /dev/null +++ b/public/tags/pyramid/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

pyramid

+ + + +
+ + + + diff --git a/public/tags/python-3/index.html b/public/tags/python-3/index.html new file mode 100644 index 0000000..7d42fd1 --- /dev/null +++ b/public/tags/python-3/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

python 3

+ + + +
+ + + + diff --git a/public/tags/python/index.html b/public/tags/python/index.html new file mode 100644 index 0000000..25bd006 --- /dev/null +++ b/public/tags/python/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

python

+ + + +
+ + + + diff --git a/public/tags/quinton-anderson/index.html b/public/tags/quinton-anderson/index.html new file mode 100644 index 0000000..9c68535 --- /dev/null +++ b/public/tags/quinton-anderson/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

quinton anderson

+ + + +
+ + + + diff --git a/public/tags/quirks/index.html b/public/tags/quirks/index.html new file mode 100644 index 0000000..43cf864 --- /dev/null +++ b/public/tags/quirks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

quirks

+ + + +
+ + + + diff --git a/public/tags/quit/index.html b/public/tags/quit/index.html new file mode 100644 index 0000000..5093f0b --- /dev/null +++ b/public/tags/quit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

quit

+ + + +
+ + + + diff --git a/public/tags/r-a-macavoy/index.html b/public/tags/r-a-macavoy/index.html new file mode 100644 index 0000000..f3142ca --- /dev/null +++ b/public/tags/r-a-macavoy/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

r.a. macavoy

+ + + +
+ + + + diff --git a/public/tags/racism/index.html b/public/tags/racism/index.html new file mode 100644 index 0000000..eb28948 --- /dev/null +++ b/public/tags/racism/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

racism

+ + + +
+ + + + diff --git a/public/tags/racket/index.html b/public/tags/racket/index.html new file mode 100644 index 0000000..bbf7131 --- /dev/null +++ b/public/tags/racket/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

racket

+ + + +
+ + + + diff --git a/public/tags/rahul-soni/index.html b/public/tags/rahul-soni/index.html new file mode 100644 index 0000000..a6e30c7 --- /dev/null +++ b/public/tags/rahul-soni/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rahul soni

+ + + +
+ + + + diff --git a/public/tags/randall-hyde/index.html b/public/tags/randall-hyde/index.html new file mode 100644 index 0000000..cd2daa9 --- /dev/null +++ b/public/tags/randall-hyde/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

randall hyde

+ + + +
+ + + + diff --git a/public/tags/random/index.html b/public/tags/random/index.html new file mode 100644 index 0000000..2aafe3b --- /dev/null +++ b/public/tags/random/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

random

+ + + +
+ + + + diff --git a/public/tags/range/index.html b/public/tags/range/index.html new file mode 100644 index 0000000..eb5e8a7 --- /dev/null +++ b/public/tags/range/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

range

+ + + +
+ + + + diff --git a/public/tags/raoul-gabriel-urma/index.html b/public/tags/raoul-gabriel-urma/index.html new file mode 100644 index 0000000..5bbed01 --- /dev/null +++ b/public/tags/raoul-gabriel-urma/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

raoul-gabriel urma

+ + + +
+ + + + diff --git a/public/tags/re-identifying/index.html b/public/tags/re-identifying/index.html new file mode 100644 index 0000000..14c7333 --- /dev/null +++ b/public/tags/re-identifying/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

re-identifying

+ + + +
+ + + + diff --git a/public/tags/react-native/index.html b/public/tags/react-native/index.html new file mode 100644 index 0000000..6d18d44 --- /dev/null +++ b/public/tags/react-native/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

react native

+ + + +
+ + + + diff --git a/public/tags/react/index.html b/public/tags/react/index.html new file mode 100644 index 0000000..34493bf --- /dev/null +++ b/public/tags/react/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

react

+ + + +
+ + + + diff --git a/public/tags/reactions/index.html b/public/tags/reactions/index.html new file mode 100644 index 0000000..287333f --- /dev/null +++ b/public/tags/reactions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reactions

+ + + +
+ + + + diff --git a/public/tags/reactive/index.html b/public/tags/reactive/index.html new file mode 100644 index 0000000..27aa6fd --- /dev/null +++ b/public/tags/reactive/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reactive

+ + + +
+ + + + diff --git a/public/tags/readability/index.html b/public/tags/readability/index.html new file mode 100644 index 0000000..5d748fa --- /dev/null +++ b/public/tags/readability/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

readability

+ + + +
+ + + + diff --git a/public/tags/recutils/index.html b/public/tags/recutils/index.html new file mode 100644 index 0000000..52e952a --- /dev/null +++ b/public/tags/recutils/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

recutils

+ + + +
+ + + + diff --git a/public/tags/reddit/index.html b/public/tags/reddit/index.html new file mode 100644 index 0000000..2a0143b --- /dev/null +++ b/public/tags/reddit/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reddit

+ + + +
+ + + + diff --git a/public/tags/refactor/index.html b/public/tags/refactor/index.html new file mode 100644 index 0000000..11c8d9b --- /dev/null +++ b/public/tags/refactor/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

refactor

+ + + +
+ + + + diff --git a/public/tags/released-2020/index.html b/public/tags/released-2020/index.html new file mode 100644 index 0000000..d561d64 --- /dev/null +++ b/public/tags/released-2020/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

released:2020

+ + + +
+ + + + diff --git a/public/tags/remote/index.html b/public/tags/remote/index.html new file mode 100644 index 0000000..57a1e00 --- /dev/null +++ b/public/tags/remote/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

remote

+ + + +
+ + + + diff --git a/public/tags/reports/index.html b/public/tags/reports/index.html new file mode 100644 index 0000000..e268700 --- /dev/null +++ b/public/tags/reports/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reports

+ + + +
+ + + + diff --git a/public/tags/request/index.html b/public/tags/request/index.html new file mode 100644 index 0000000..5bf78a0 --- /dev/null +++ b/public/tags/request/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

request

+ + + +
+ + + + diff --git a/public/tags/requirements/index.html b/public/tags/requirements/index.html new file mode 100644 index 0000000..c69a113 --- /dev/null +++ b/public/tags/requirements/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

requirements

+ + + +
+ + + + diff --git a/public/tags/research/index.html b/public/tags/research/index.html new file mode 100644 index 0000000..13c9482 --- /dev/null +++ b/public/tags/research/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

research

+ + + +
+ + + + diff --git a/public/tags/responsibility/index.html b/public/tags/responsibility/index.html new file mode 100644 index 0000000..d1e772d --- /dev/null +++ b/public/tags/responsibility/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

responsibility

+ + + +
+ + + + diff --git a/public/tags/rest/index.html b/public/tags/rest/index.html new file mode 100644 index 0000000..e50e818 --- /dev/null +++ b/public/tags/rest/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rest

+ + + +
+ + + + diff --git a/public/tags/restful/index.html b/public/tags/restful/index.html new file mode 100644 index 0000000..6a01c7d --- /dev/null +++ b/public/tags/restful/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

restful

+ + + +
+ + + + diff --git a/public/tags/rethink/index.html b/public/tags/rethink/index.html new file mode 100644 index 0000000..2935bf2 --- /dev/null +++ b/public/tags/rethink/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rethink

+ + + +
+ + + + diff --git a/public/tags/review/index.html b/public/tags/review/index.html new file mode 100644 index 0000000..6e9f23a --- /dev/null +++ b/public/tags/review/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

review

+ + + +
+ + + + diff --git a/public/tags/reviews/index.html b/public/tags/reviews/index.html new file mode 100644 index 0000000..e4602df --- /dev/null +++ b/public/tags/reviews/index.html @@ -0,0 +1,415 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

reviews

+ + + +
+ + + + diff --git a/public/tags/rewrite/index.html b/public/tags/rewrite/index.html new file mode 100644 index 0000000..6ac23b6 --- /dev/null +++ b/public/tags/rewrite/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rewrite

+ + + +
+ + + + diff --git a/public/tags/rewrites/index.html b/public/tags/rewrites/index.html new file mode 100644 index 0000000..77196fb --- /dev/null +++ b/public/tags/rewrites/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rewrites

+ + + +
+ + + + diff --git a/public/tags/richard-burton/index.html b/public/tags/richard-burton/index.html new file mode 100644 index 0000000..b540f79 --- /dev/null +++ b/public/tags/richard-burton/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

richard burton

+ + + +
+ + + + diff --git a/public/tags/richard-dawkins/index.html b/public/tags/richard-dawkins/index.html new file mode 100644 index 0000000..daffb23 --- /dev/null +++ b/public/tags/richard-dawkins/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

richard dawkins

+ + + +
+ + + + diff --git a/public/tags/richard-feyman/index.html b/public/tags/richard-feyman/index.html new file mode 100644 index 0000000..d1ed9e6 --- /dev/null +++ b/public/tags/richard-feyman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

richard feyman

+ + + +
+ + + + diff --git a/public/tags/richard-feynman/index.html b/public/tags/richard-feynman/index.html new file mode 100644 index 0000000..11f2c1f --- /dev/null +++ b/public/tags/richard-feynman/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

richard feynman

+ + + +
+ + + + diff --git a/public/tags/richard-matheson/index.html b/public/tags/richard-matheson/index.html new file mode 100644 index 0000000..e65df0a --- /dev/null +++ b/public/tags/richard-matheson/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

richard matheson

+ + + +
+ + + + diff --git a/public/tags/right-tool/index.html b/public/tags/right-tool/index.html new file mode 100644 index 0000000..8488a9f --- /dev/null +++ b/public/tags/right-tool/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

right tool

+ + + +
+ + + + diff --git a/public/tags/rms/index.html b/public/tags/rms/index.html new file mode 100644 index 0000000..b31f29b --- /dev/null +++ b/public/tags/rms/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rms

+ + + +
+ + + + diff --git a/public/tags/roads/index.html b/public/tags/roads/index.html new file mode 100644 index 0000000..0fb866a --- /dev/null +++ b/public/tags/roads/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

roads

+ + + +
+ + + + diff --git a/public/tags/robert-boesel/index.html b/public/tags/robert-boesel/index.html new file mode 100644 index 0000000..c75f141 --- /dev/null +++ b/public/tags/robert-boesel/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert boesel

+ + + +
+ + + + diff --git a/public/tags/robert-c-martin/index.html b/public/tags/robert-c-martin/index.html new file mode 100644 index 0000000..6379b61 --- /dev/null +++ b/public/tags/robert-c-martin/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert c. martin

+ + + +
+ + + + diff --git a/public/tags/robert-r-mccammon/index.html b/public/tags/robert-r-mccammon/index.html new file mode 100644 index 0000000..a0b0339 --- /dev/null +++ b/public/tags/robert-r-mccammon/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert r mccammon

+ + + +
+ + + + diff --git a/public/tags/robert-redford/index.html b/public/tags/robert-redford/index.html new file mode 100644 index 0000000..947b0a4 --- /dev/null +++ b/public/tags/robert-redford/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert redford

+ + + +
+ + + + diff --git a/public/tags/robert-schnakenberg/index.html b/public/tags/robert-schnakenberg/index.html new file mode 100644 index 0000000..fef7830 --- /dev/null +++ b/public/tags/robert-schnakenberg/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert schnakenberg

+ + + +
+ + + + diff --git a/public/tags/robert-silverberg/index.html b/public/tags/robert-silverberg/index.html new file mode 100644 index 0000000..1dddec0 --- /dev/null +++ b/public/tags/robert-silverberg/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robert silverberg

+ + + +
+ + + + diff --git a/public/tags/robotics/index.html b/public/tags/robotics/index.html new file mode 100644 index 0000000..2c333d7 --- /dev/null +++ b/public/tags/robotics/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

robotics

+ + + +
+ + + + diff --git a/public/tags/rolland-roberts/index.html b/public/tags/rolland-roberts/index.html new file mode 100644 index 0000000..9a622ee --- /dev/null +++ b/public/tags/rolland-roberts/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rolland roberts

+ + + +
+ + + + diff --git a/public/tags/rss/index.html b/public/tags/rss/index.html new file mode 100644 index 0000000..c1ca876 --- /dev/null +++ b/public/tags/rss/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rss

+ + + +
+ + + + diff --git a/public/tags/ruby/index.html b/public/tags/ruby/index.html new file mode 100644 index 0000000..7a0b0a4 --- /dev/null +++ b/public/tags/ruby/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ruby

+ + + +
+ + + + diff --git a/public/tags/runbook/index.html b/public/tags/runbook/index.html new file mode 100644 index 0000000..3b12e0e --- /dev/null +++ b/public/tags/runbook/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

runbook

+ + + +
+ + + + diff --git a/public/tags/runner/index.html b/public/tags/runner/index.html new file mode 100644 index 0000000..c0fc8a4 --- /dev/null +++ b/public/tags/runner/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

runner

+ + + +
+ + + + diff --git a/public/tags/russ-mckendrick/index.html b/public/tags/russ-mckendrick/index.html new file mode 100644 index 0000000..665f022 --- /dev/null +++ b/public/tags/russ-mckendrick/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

russ mckendrick

+ + + +
+ + + + diff --git a/public/tags/russell-crowe/index.html b/public/tags/russell-crowe/index.html new file mode 100644 index 0000000..dd04e91 --- /dev/null +++ b/public/tags/russell-crowe/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

russell crowe

+ + + +
+ + + + diff --git a/public/tags/rust/index.html b/public/tags/rust/index.html new file mode 100644 index 0000000..5313b32 --- /dev/null +++ b/public/tags/rust/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

rust

+ + + +
+ + + + diff --git a/public/tags/ryan-roemer/index.html b/public/tags/ryan-roemer/index.html new file mode 100644 index 0000000..1ff19cd --- /dev/null +++ b/public/tags/ryan-roemer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ryan roemer

+ + + +
+ + + + diff --git a/public/tags/safety/index.html b/public/tags/safety/index.html new file mode 100644 index 0000000..c5fe358 --- /dev/null +++ b/public/tags/safety/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

safety

+ + + +
+ + + + diff --git a/public/tags/say-no/index.html b/public/tags/say-no/index.html new file mode 100644 index 0000000..4cc48e5 --- /dev/null +++ b/public/tags/say-no/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

say no

+ + + +
+ + + + diff --git a/public/tags/scala/index.html b/public/tags/scala/index.html new file mode 100644 index 0000000..d65c486 --- /dev/null +++ b/public/tags/scala/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scala

+ + + +
+ + + + diff --git a/public/tags/sci/index.html b/public/tags/sci/index.html new file mode 100644 index 0000000..f28c722 --- /dev/null +++ b/public/tags/sci/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sci

+ + + +
+ + + + diff --git a/public/tags/science/index.html b/public/tags/science/index.html new file mode 100644 index 0000000..8ba2b8a --- /dev/null +++ b/public/tags/science/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

science

+ + + +
+ + + + diff --git a/public/tags/scifi/index.html b/public/tags/scifi/index.html new file mode 100644 index 0000000..b11f9f2 --- /dev/null +++ b/public/tags/scifi/index.html @@ -0,0 +1,137 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scifi

+ + + +
+ + + + diff --git a/public/tags/scotty/index.html b/public/tags/scotty/index.html new file mode 100644 index 0000000..eaa7952 --- /dev/null +++ b/public/tags/scotty/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scotty

+ + + +
+ + + + diff --git a/public/tags/scp/index.html b/public/tags/scp/index.html new file mode 100644 index 0000000..bd97d21 --- /dev/null +++ b/public/tags/scp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scp

+ + + +
+ + + + diff --git a/public/tags/screen-recording/index.html b/public/tags/screen-recording/index.html new file mode 100644 index 0000000..8ec50a7 --- /dev/null +++ b/public/tags/screen-recording/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

screen recording

+ + + +
+ + + + diff --git a/public/tags/scripts/index.html b/public/tags/scripts/index.html new file mode 100644 index 0000000..c06beb4 --- /dev/null +++ b/public/tags/scripts/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scripts

+ + + +
+ + + + diff --git a/public/tags/scrobble/index.html b/public/tags/scrobble/index.html new file mode 100644 index 0000000..00be6fe --- /dev/null +++ b/public/tags/scrobble/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

scrobble

+ + + +
+ + + + diff --git a/public/tags/search/index.html b/public/tags/search/index.html new file mode 100644 index 0000000..5b32c9d --- /dev/null +++ b/public/tags/search/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

search

+ + + +
+ + + + diff --git a/public/tags/second-order-thinking/index.html b/public/tags/second-order-thinking/index.html new file mode 100644 index 0000000..97ba177 --- /dev/null +++ b/public/tags/second-order-thinking/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

second order thinking

+ + + +
+ + + + diff --git a/public/tags/secrets/index.html b/public/tags/secrets/index.html new file mode 100644 index 0000000..a64f572 --- /dev/null +++ b/public/tags/secrets/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

secrets

+ + + +
+ + + + diff --git a/public/tags/security/index.html b/public/tags/security/index.html new file mode 100644 index 0000000..e742378 --- /dev/null +++ b/public/tags/security/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

security

+ + + +
+ + + + diff --git a/public/tags/seek/index.html b/public/tags/seek/index.html new file mode 100644 index 0000000..63b3e23 --- /dev/null +++ b/public/tags/seek/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

seek

+ + + +
+ + + + diff --git a/public/tags/segmentation-fault/index.html b/public/tags/segmentation-fault/index.html new file mode 100644 index 0000000..f7453ac --- /dev/null +++ b/public/tags/segmentation-fault/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

segmentation fault

+ + + +
+ + + + diff --git a/public/tags/self-help/index.html b/public/tags/self-help/index.html new file mode 100644 index 0000000..de374fa --- /dev/null +++ b/public/tags/self-help/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

self-help

+ + + +
+ + + + diff --git a/public/tags/self-hosted/index.html b/public/tags/self-hosted/index.html new file mode 100644 index 0000000..2fc06c3 --- /dev/null +++ b/public/tags/self-hosted/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

self-hosted

+ + + +
+ + + + diff --git a/public/tags/seo/index.html b/public/tags/seo/index.html new file mode 100644 index 0000000..15e8752 --- /dev/null +++ b/public/tags/seo/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

seo

+ + + +
+ + + + diff --git a/public/tags/series-2021/index.html b/public/tags/series-2021/index.html new file mode 100644 index 0000000..d2a834c --- /dev/null +++ b/public/tags/series-2021/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

series:2021

+ + + +
+ + + + diff --git a/public/tags/series/index.html b/public/tags/series/index.html new file mode 100644 index 0000000..0142071 --- /dev/null +++ b/public/tags/series/index.html @@ -0,0 +1,81 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

series

+ + + +
+ + + + diff --git a/public/tags/server/index.html b/public/tags/server/index.html new file mode 100644 index 0000000..68de0e9 --- /dev/null +++ b/public/tags/server/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

server

+ + + +
+ + + + diff --git a/public/tags/seth-grahame-smith/index.html b/public/tags/seth-grahame-smith/index.html new file mode 100644 index 0000000..6961b3a --- /dev/null +++ b/public/tags/seth-grahame-smith/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

seth grahame-smith

+ + + +
+ + + + diff --git a/public/tags/shantanu-tushar/index.html b/public/tags/shantanu-tushar/index.html new file mode 100644 index 0000000..3482433 --- /dev/null +++ b/public/tags/shantanu-tushar/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

shantanu tushar

+ + + +
+ + + + diff --git a/public/tags/shapes-of-code/index.html b/public/tags/shapes-of-code/index.html new file mode 100644 index 0000000..5408d83 --- /dev/null +++ b/public/tags/shapes-of-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

shapes of code

+ + + +
+ + + + diff --git a/public/tags/sharing/index.html b/public/tags/sharing/index.html new file mode 100644 index 0000000..b4bd9cf --- /dev/null +++ b/public/tags/sharing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sharing

+ + + +
+ + + + diff --git a/public/tags/sharring/index.html b/public/tags/sharring/index.html new file mode 100644 index 0000000..6d7b69c --- /dev/null +++ b/public/tags/sharring/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sharring

+ + + +
+ + + + diff --git a/public/tags/shell-script/index.html b/public/tags/shell-script/index.html new file mode 100644 index 0000000..8b763c7 --- /dev/null +++ b/public/tags/shell-script/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

shell script

+ + + +
+ + + + diff --git a/public/tags/shell/index.html b/public/tags/shell/index.html new file mode 100644 index 0000000..254cb0d --- /dev/null +++ b/public/tags/shell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

shell

+ + + +
+ + + + diff --git a/public/tags/short/index.html b/public/tags/short/index.html new file mode 100644 index 0000000..98cc860 --- /dev/null +++ b/public/tags/short/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

short

+ + + +
+ + + + diff --git a/public/tags/sigsegv/index.html b/public/tags/sigsegv/index.html new file mode 100644 index 0000000..2166b14 --- /dev/null +++ b/public/tags/sigsegv/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

sigsegv

+ + + +
+ + + + diff --git a/public/tags/silverblue/index.html b/public/tags/silverblue/index.html new file mode 100644 index 0000000..2cf9857 --- /dev/null +++ b/public/tags/silverblue/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

silverblue

+ + + +
+ + + + diff --git a/public/tags/simon-st-laurent/index.html b/public/tags/simon-st-laurent/index.html new file mode 100644 index 0000000..95004da --- /dev/null +++ b/public/tags/simon-st-laurent/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

simon st laurent

+ + + +
+ + + + diff --git a/public/tags/simon-timms/index.html b/public/tags/simon-timms/index.html new file mode 100644 index 0000000..cfd018b --- /dev/null +++ b/public/tags/simon-timms/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

simon timms

+ + + +
+ + + + diff --git a/public/tags/single-responsibility/index.html b/public/tags/single-responsibility/index.html new file mode 100644 index 0000000..bc824e3 --- /dev/null +++ b/public/tags/single-responsibility/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

single responsibility

+ + + +
+ + + + diff --git a/public/tags/size/index.html b/public/tags/size/index.html new file mode 100644 index 0000000..8016cab --- /dev/null +++ b/public/tags/size/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

size

+ + + +
+ + + + diff --git a/public/tags/slack/index.html b/public/tags/slack/index.html new file mode 100644 index 0000000..64e5aaa --- /dev/null +++ b/public/tags/slack/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

slack

+ + + +
+ + + + diff --git a/public/tags/slides/index.html b/public/tags/slides/index.html new file mode 100644 index 0000000..fdd8185 --- /dev/null +++ b/public/tags/slides/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

slides

+ + + +
+ + + + diff --git a/public/tags/small-teams/index.html b/public/tags/small-teams/index.html new file mode 100644 index 0000000..17b270d --- /dev/null +++ b/public/tags/small-teams/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

small teams

+ + + +
+ + + + diff --git a/public/tags/software-architecture/index.html b/public/tags/software-architecture/index.html new file mode 100644 index 0000000..f39d04f --- /dev/null +++ b/public/tags/software-architecture/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

software architecture

+ + + +
+ + + + diff --git a/public/tags/solomon-northup/index.html b/public/tags/solomon-northup/index.html new file mode 100644 index 0000000..c46c9bd --- /dev/null +++ b/public/tags/solomon-northup/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

solomon northup

+ + + +
+ + + + diff --git a/public/tags/solution/index.html b/public/tags/solution/index.html new file mode 100644 index 0000000..9533d63 --- /dev/null +++ b/public/tags/solution/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

solution

+ + + +
+ + + + diff --git a/public/tags/solutions/index.html b/public/tags/solutions/index.html new file mode 100644 index 0000000..5c8f9a1 --- /dev/null +++ b/public/tags/solutions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

solutions

+ + + +
+ + + + diff --git a/public/tags/source-control/index.html b/public/tags/source-control/index.html new file mode 100644 index 0000000..6dce890 --- /dev/null +++ b/public/tags/source-control/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

source control

+ + + +
+ + + + diff --git a/public/tags/source-of-truth/index.html b/public/tags/source-of-truth/index.html new file mode 100644 index 0000000..e752787 --- /dev/null +++ b/public/tags/source-of-truth/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

source of truth

+ + + +
+ + + + diff --git a/public/tags/spa/index.html b/public/tags/spa/index.html new file mode 100644 index 0000000..ce0a098 --- /dev/null +++ b/public/tags/spa/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spa

+ + + +
+ + + + diff --git a/public/tags/spaces/index.html b/public/tags/spaces/index.html new file mode 100644 index 0000000..e89edeb --- /dev/null +++ b/public/tags/spaces/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spaces

+ + + +
+ + + + diff --git a/public/tags/spawn/index.html b/public/tags/spawn/index.html new file mode 100644 index 0000000..97efd0c --- /dev/null +++ b/public/tags/spawn/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spawn

+ + + +
+ + + + diff --git a/public/tags/specialists/index.html b/public/tags/specialists/index.html new file mode 100644 index 0000000..51736f8 --- /dev/null +++ b/public/tags/specialists/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

specialists

+ + + +
+ + + + diff --git a/public/tags/specs/index.html b/public/tags/specs/index.html new file mode 100644 index 0000000..fbff2ff --- /dev/null +++ b/public/tags/specs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

specs

+ + + +
+ + + + diff --git a/public/tags/spotify/index.html b/public/tags/spotify/index.html new file mode 100644 index 0000000..e9b33f6 --- /dev/null +++ b/public/tags/spotify/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spotify

+ + + +
+ + + + diff --git a/public/tags/spring/index.html b/public/tags/spring/index.html new file mode 100644 index 0000000..963050d --- /dev/null +++ b/public/tags/spring/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spring

+ + + +
+ + + + diff --git a/public/tags/spying/index.html b/public/tags/spying/index.html new file mode 100644 index 0000000..4f8ae49 --- /dev/null +++ b/public/tags/spying/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

spying

+ + + +
+ + + + diff --git a/public/tags/stackoverflow/index.html b/public/tags/stackoverflow/index.html new file mode 100644 index 0000000..5d92356 --- /dev/null +++ b/public/tags/stackoverflow/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stackoverflow

+ + + +
+ + + + diff --git a/public/tags/stallman/index.html b/public/tags/stallman/index.html new file mode 100644 index 0000000..41aa513 --- /dev/null +++ b/public/tags/stallman/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stallman

+ + + +
+ + + + diff --git a/public/tags/stanislaw-lem/index.html b/public/tags/stanislaw-lem/index.html new file mode 100644 index 0000000..0b93e05 --- /dev/null +++ b/public/tags/stanislaw-lem/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stanislaw lem

+ + + +
+ + + + diff --git a/public/tags/star-trek/index.html b/public/tags/star-trek/index.html new file mode 100644 index 0000000..8a4a0ad --- /dev/null +++ b/public/tags/star-trek/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

star trek

+ + + +
+ + + + diff --git a/public/tags/stars-0/index.html b/public/tags/stars-0/index.html new file mode 100644 index 0000000..9a8f462 --- /dev/null +++ b/public/tags/stars-0/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:0

+ + + +
+ + + + diff --git a/public/tags/stars-1/index.html b/public/tags/stars-1/index.html new file mode 100644 index 0000000..a284b47 --- /dev/null +++ b/public/tags/stars-1/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:1

+ + + +
+ + + + diff --git a/public/tags/stars-2/index.html b/public/tags/stars-2/index.html new file mode 100644 index 0000000..064f26d --- /dev/null +++ b/public/tags/stars-2/index.html @@ -0,0 +1,167 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:2

+ + + +
+ + + + diff --git a/public/tags/stars-3/index.html b/public/tags/stars-3/index.html new file mode 100644 index 0000000..e8ee9ac --- /dev/null +++ b/public/tags/stars-3/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:3

+ + + +
+ + + + diff --git a/public/tags/stars-4/index.html b/public/tags/stars-4/index.html new file mode 100644 index 0000000..552f811 --- /dev/null +++ b/public/tags/stars-4/index.html @@ -0,0 +1,137 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:4

+ + + +
+ + + + diff --git a/public/tags/stars-5/index.html b/public/tags/stars-5/index.html new file mode 100644 index 0000000..c3a8e4a --- /dev/null +++ b/public/tags/stars-5/index.html @@ -0,0 +1,103 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stars:5

+ + + +
+ + + + diff --git a/public/tags/state/index.html b/public/tags/state/index.html new file mode 100644 index 0000000..dbf88c0 --- /dev/null +++ b/public/tags/state/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

state

+ + + +
+ + + + diff --git a/public/tags/static/index.html b/public/tags/static/index.html new file mode 100644 index 0000000..c703c9c --- /dev/null +++ b/public/tags/static/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

static

+ + + +
+ + + + diff --git a/public/tags/status/index.html b/public/tags/status/index.html new file mode 100644 index 0000000..967e53f --- /dev/null +++ b/public/tags/status/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

status

+ + + +
+ + + + diff --git a/public/tags/stdlib/index.html b/public/tags/stdlib/index.html new file mode 100644 index 0000000..060e43f --- /dev/null +++ b/public/tags/stdlib/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stdlib

+ + + +
+ + + + diff --git a/public/tags/stephen-blackheath/index.html b/public/tags/stephen-blackheath/index.html new file mode 100644 index 0000000..d631c05 --- /dev/null +++ b/public/tags/stephen-blackheath/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stephen blackheath

+ + + +
+ + + + diff --git a/public/tags/stephen-h-segal/index.html b/public/tags/stephen-h-segal/index.html new file mode 100644 index 0000000..7868a1f --- /dev/null +++ b/public/tags/stephen-h-segal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stephen h segal

+ + + +
+ + + + diff --git a/public/tags/stephen-king/index.html b/public/tags/stephen-king/index.html new file mode 100644 index 0000000..79e7f8d --- /dev/null +++ b/public/tags/stephen-king/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stephen king

+ + + +
+ + + + diff --git a/public/tags/steps/index.html b/public/tags/steps/index.html new file mode 100644 index 0000000..072be20 --- /dev/null +++ b/public/tags/steps/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

steps

+ + + +
+ + + + diff --git a/public/tags/steve-fenton/index.html b/public/tags/steve-fenton/index.html new file mode 100644 index 0000000..5837e64 --- /dev/null +++ b/public/tags/steve-fenton/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

steve fenton

+ + + +
+ + + + diff --git a/public/tags/steven-f-lott/index.html b/public/tags/steven-f-lott/index.html new file mode 100644 index 0000000..02495a1 --- /dev/null +++ b/public/tags/steven-f-lott/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

steven f lott

+ + + +
+ + + + diff --git a/public/tags/steven-seagal/index.html b/public/tags/steven-seagal/index.html new file mode 100644 index 0000000..d04f260 --- /dev/null +++ b/public/tags/steven-seagal/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

steven seagal

+ + + +
+ + + + diff --git a/public/tags/stoicism/index.html b/public/tags/stoicism/index.html new file mode 100644 index 0000000..c4c7767 --- /dev/null +++ b/public/tags/stoicism/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stoicism

+ + + +
+ + + + diff --git a/public/tags/stop/index.html b/public/tags/stop/index.html new file mode 100644 index 0000000..9bfba42 --- /dev/null +++ b/public/tags/stop/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stop

+ + + +
+ + + + diff --git a/public/tags/storage/index.html b/public/tags/storage/index.html new file mode 100644 index 0000000..bd6c7d0 --- /dev/null +++ b/public/tags/storage/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

storage

+ + + +
+ + + + diff --git a/public/tags/storm/index.html b/public/tags/storm/index.html new file mode 100644 index 0000000..b4afbe1 --- /dev/null +++ b/public/tags/storm/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

storm

+ + + +
+ + + + diff --git a/public/tags/stoyan-stefanov/index.html b/public/tags/stoyan-stefanov/index.html new file mode 100644 index 0000000..b198b39 --- /dev/null +++ b/public/tags/stoyan-stefanov/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stoyan stefanov

+ + + +
+ + + + diff --git a/public/tags/stream-processing/index.html b/public/tags/stream-processing/index.html new file mode 100644 index 0000000..f8c8197 --- /dev/null +++ b/public/tags/stream-processing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stream processing

+ + + +
+ + + + diff --git a/public/tags/stream/index.html b/public/tags/stream/index.html new file mode 100644 index 0000000..16b1ae1 --- /dev/null +++ b/public/tags/stream/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stream

+ + + +
+ + + + diff --git a/public/tags/structs/index.html b/public/tags/structs/index.html new file mode 100644 index 0000000..ade94a0 --- /dev/null +++ b/public/tags/structs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

structs

+ + + +
+ + + + diff --git a/public/tags/studio-ghibli/index.html b/public/tags/studio-ghibli/index.html new file mode 100644 index 0000000..7ae2c98 --- /dev/null +++ b/public/tags/studio-ghibli/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

studio ghibli

+ + + +
+ + + + diff --git a/public/tags/stupid-bugs/index.html b/public/tags/stupid-bugs/index.html new file mode 100644 index 0000000..6fe9e78 --- /dev/null +++ b/public/tags/stupid-bugs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

stupid bugs

+ + + +
+ + + + diff --git a/public/tags/superheroes/index.html b/public/tags/superheroes/index.html new file mode 100644 index 0000000..9ca5179 --- /dev/null +++ b/public/tags/superheroes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

superheroes

+ + + +
+ + + + diff --git a/public/tags/survey/index.html b/public/tags/survey/index.html new file mode 100644 index 0000000..4049fc7 --- /dev/null +++ b/public/tags/survey/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

survey

+ + + +
+ + + + diff --git a/public/tags/swift/index.html b/public/tags/swift/index.html new file mode 100644 index 0000000..a2d2a2d --- /dev/null +++ b/public/tags/swift/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

swift

+ + + +
+ + + + diff --git a/public/tags/syntax-highlight/index.html b/public/tags/syntax-highlight/index.html new file mode 100644 index 0000000..67cf59f --- /dev/null +++ b/public/tags/syntax-highlight/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

syntax highlight

+ + + +
+ + + + diff --git a/public/tags/systemd/index.html b/public/tags/systemd/index.html new file mode 100644 index 0000000..73061a7 --- /dev/null +++ b/public/tags/systemd/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

systemd

+ + + +
+ + + + diff --git a/public/tags/t-s-mcnamara/index.html b/public/tags/t-s-mcnamara/index.html new file mode 100644 index 0000000..1ce1b63 --- /dev/null +++ b/public/tags/t-s-mcnamara/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

t s mcnamara

+ + + +
+ + + + diff --git a/public/tags/tables/index.html b/public/tags/tables/index.html new file mode 100644 index 0000000..ca96ffe --- /dev/null +++ b/public/tags/tables/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tables

+ + + +
+ + + + diff --git a/public/tags/tabs/index.html b/public/tags/tabs/index.html new file mode 100644 index 0000000..f831517 --- /dev/null +++ b/public/tags/tabs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tabs

+ + + +
+ + + + diff --git a/public/tags/task-manager/index.html b/public/tags/task-manager/index.html new file mode 100644 index 0000000..ec77467 --- /dev/null +++ b/public/tags/task-manager/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

task manager

+ + + +
+ + + + diff --git a/public/tags/team-building/index.html b/public/tags/team-building/index.html new file mode 100644 index 0000000..b6970cd --- /dev/null +++ b/public/tags/team-building/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

team building

+ + + +
+ + + + diff --git a/public/tags/team/index.html b/public/tags/team/index.html new file mode 100644 index 0000000..1c9cfb0 --- /dev/null +++ b/public/tags/team/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

team

+ + + +
+ + + + diff --git a/public/tags/teams/index.html b/public/tags/teams/index.html new file mode 100644 index 0000000..f4923cf --- /dev/null +++ b/public/tags/teams/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

teams

+ + + +
+ + + + diff --git a/public/tags/technical-debt/index.html b/public/tags/technical-debt/index.html new file mode 100644 index 0000000..8326667 --- /dev/null +++ b/public/tags/technical-debt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

technical debt

+ + + +
+ + + + diff --git a/public/tags/technical-specs/index.html b/public/tags/technical-specs/index.html new file mode 100644 index 0000000..a38de1e --- /dev/null +++ b/public/tags/technical-specs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

technical specs

+ + + +
+ + + + diff --git a/public/tags/technology/index.html b/public/tags/technology/index.html new file mode 100644 index 0000000..c4d0ce3 --- /dev/null +++ b/public/tags/technology/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

technology

+ + + +
+ + + + diff --git a/public/tags/ted-chiang/index.html b/public/tags/ted-chiang/index.html new file mode 100644 index 0000000..a2513f5 --- /dev/null +++ b/public/tags/ted-chiang/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ted chiang

+ + + +
+ + + + diff --git a/public/tags/telefork/index.html b/public/tags/telefork/index.html new file mode 100644 index 0000000..0a0333b --- /dev/null +++ b/public/tags/telefork/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

telefork

+ + + +
+ + + + diff --git a/public/tags/telegram/index.html b/public/tags/telegram/index.html new file mode 100644 index 0000000..01a9900 --- /dev/null +++ b/public/tags/telegram/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

telegram

+ + + +
+ + + + diff --git a/public/tags/temporary-solutions/index.html b/public/tags/temporary-solutions/index.html new file mode 100644 index 0000000..b72b03f --- /dev/null +++ b/public/tags/temporary-solutions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

temporary solutions

+ + + +
+ + + + diff --git a/public/tags/terms-and-conditions/index.html b/public/tags/terms-and-conditions/index.html new file mode 100644 index 0000000..c86fcfa --- /dev/null +++ b/public/tags/terms-and-conditions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

terms and conditions

+ + + +
+ + + + diff --git a/public/tags/testing/index.html b/public/tags/testing/index.html new file mode 100644 index 0000000..4216c23 --- /dev/null +++ b/public/tags/testing/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

testing

+ + + +
+ + + + diff --git a/public/tags/tests/index.html b/public/tags/tests/index.html new file mode 100644 index 0000000..158271c --- /dev/null +++ b/public/tags/tests/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tests

+ + + +
+ + + + diff --git a/public/tags/text-processing/index.html b/public/tags/text-processing/index.html new file mode 100644 index 0000000..c90509d --- /dev/null +++ b/public/tags/text-processing/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

text processing

+ + + +
+ + + + diff --git a/public/tags/the-dark-tower/index.html b/public/tags/the-dark-tower/index.html new file mode 100644 index 0000000..32bb0f3 --- /dev/null +++ b/public/tags/the-dark-tower/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the dark tower

+ + + +
+ + + + diff --git a/public/tags/the-forever-war/index.html b/public/tags/the-forever-war/index.html new file mode 100644 index 0000000..a766470 --- /dev/null +++ b/public/tags/the-forever-war/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the forever war

+ + + +
+ + + + diff --git a/public/tags/the-pillars-of-reality/index.html b/public/tags/the-pillars-of-reality/index.html new file mode 100644 index 0000000..4067e81 --- /dev/null +++ b/public/tags/the-pillars-of-reality/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the pillars of reality

+ + + +
+ + + + diff --git a/public/tags/the-secret-life-of-walter-mitty/index.html b/public/tags/the-secret-life-of-walter-mitty/index.html new file mode 100644 index 0000000..b76f10d --- /dev/null +++ b/public/tags/the-secret-life-of-walter-mitty/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the secret life of walter mitty

+ + + +
+ + + + diff --git a/public/tags/the-way/index.html b/public/tags/the-way/index.html new file mode 100644 index 0000000..f5e924f --- /dev/null +++ b/public/tags/the-way/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the way

+ + + +
+ + + + diff --git a/public/tags/the-witcher/index.html b/public/tags/the-witcher/index.html new file mode 100644 index 0000000..eb24a6b --- /dev/null +++ b/public/tags/the-witcher/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

the witcher

+ + + +
+ + + + diff --git a/public/tags/things-i-don-t-know/index.html b/public/tags/things-i-don-t-know/index.html new file mode 100644 index 0000000..c560892 --- /dev/null +++ b/public/tags/things-i-don-t-know/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

things i don't know

+ + + +
+ + + + diff --git a/public/tags/things-i-learnt/index.html b/public/tags/things-i-learnt/index.html new file mode 100644 index 0000000..6ab75ca --- /dev/null +++ b/public/tags/things-i-learnt/index.html @@ -0,0 +1,239 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

things i learnt

+ + + +
+ + + + diff --git a/public/tags/thomas-hunter-ii/index.html b/public/tags/thomas-hunter-ii/index.html new file mode 100644 index 0000000..edf9f5c --- /dev/null +++ b/public/tags/thomas-hunter-ii/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

thomas hunter ii

+ + + +
+ + + + diff --git a/public/tags/thoughts/index.html b/public/tags/thoughts/index.html new file mode 100644 index 0000000..3496b12 --- /dev/null +++ b/public/tags/thoughts/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

thoughts

+ + + +
+ + + + diff --git a/public/tags/threadpools/index.html b/public/tags/threadpools/index.html new file mode 100644 index 0000000..5c067cc --- /dev/null +++ b/public/tags/threadpools/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

threadpools

+ + + +
+ + + + diff --git a/public/tags/thriller/index.html b/public/tags/thriller/index.html new file mode 100644 index 0000000..2430e99 --- /dev/null +++ b/public/tags/thriller/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

thriller

+ + + +
+ + + + diff --git a/public/tags/ti/index.html b/public/tags/ti/index.html new file mode 100644 index 0000000..7f32dfd --- /dev/null +++ b/public/tags/ti/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ti

+ + + +
+ + + + diff --git a/public/tags/tide/index.html b/public/tags/tide/index.html new file mode 100644 index 0000000..c6b4de4 --- /dev/null +++ b/public/tags/tide/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tide

+ + + +
+ + + + diff --git a/public/tags/tiktok/index.html b/public/tags/tiktok/index.html new file mode 100644 index 0000000..e64431b --- /dev/null +++ b/public/tags/tiktok/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tiktok

+ + + +
+ + + + diff --git a/public/tags/til/index.html b/public/tags/til/index.html new file mode 100644 index 0000000..2c43e3a --- /dev/null +++ b/public/tags/til/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

til

+ + + +
+ + + + diff --git a/public/tags/tiler/index.html b/public/tags/tiler/index.html new file mode 100644 index 0000000..7e74eda --- /dev/null +++ b/public/tags/tiler/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tiler

+ + + +
+ + + + diff --git a/public/tags/tiling/index.html b/public/tags/tiling/index.html new file mode 100644 index 0000000..dc44586 --- /dev/null +++ b/public/tags/tiling/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tiling

+ + + +
+ + + + diff --git a/public/tags/time/index.html b/public/tags/time/index.html new file mode 100644 index 0000000..302b68b --- /dev/null +++ b/public/tags/time/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

time

+ + + +
+ + + + diff --git a/public/tags/timeout/index.html b/public/tags/timeout/index.html new file mode 100644 index 0000000..95050b6 --- /dev/null +++ b/public/tags/timeout/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

timeout

+ + + +
+ + + + diff --git a/public/tags/timer/index.html b/public/tags/timer/index.html new file mode 100644 index 0000000..d1d4029 --- /dev/null +++ b/public/tags/timer/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

timer

+ + + +
+ + + + diff --git a/public/tags/timezones/index.html b/public/tags/timezones/index.html new file mode 100644 index 0000000..afde6f2 --- /dev/null +++ b/public/tags/timezones/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

timezones

+ + + +
+ + + + diff --git a/public/tags/timothy-zahn/index.html b/public/tags/timothy-zahn/index.html new file mode 100644 index 0000000..90f5500 --- /dev/null +++ b/public/tags/timothy-zahn/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

timothy zahn

+ + + +
+ + + + diff --git a/public/tags/tmux/index.html b/public/tags/tmux/index.html new file mode 100644 index 0000000..babc6ce --- /dev/null +++ b/public/tags/tmux/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tmux

+ + + +
+ + + + diff --git a/public/tags/tobias-klein/index.html b/public/tags/tobias-klein/index.html new file mode 100644 index 0000000..7e2cc84 --- /dev/null +++ b/public/tags/tobias-klein/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tobias klein

+ + + +
+ + + + diff --git a/public/tags/tokio/index.html b/public/tags/tokio/index.html new file mode 100644 index 0000000..8f8c5bd --- /dev/null +++ b/public/tags/tokio/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tokio

+ + + +
+ + + + diff --git a/public/tags/tommy-lee-jones/index.html b/public/tags/tommy-lee-jones/index.html new file mode 100644 index 0000000..33e47d8 --- /dev/null +++ b/public/tags/tommy-lee-jones/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tommy lee jones

+ + + +
+ + + + diff --git a/public/tags/tony-mott/index.html b/public/tags/tony-mott/index.html new file mode 100644 index 0000000..9761d71 --- /dev/null +++ b/public/tags/tony-mott/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tony mott

+ + + +
+ + + + diff --git a/public/tags/toolbox/index.html b/public/tags/toolbox/index.html new file mode 100644 index 0000000..61baf1d --- /dev/null +++ b/public/tags/toolbox/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

toolbox

+ + + +
+ + + + diff --git a/public/tags/toolbx/index.html b/public/tags/toolbx/index.html new file mode 100644 index 0000000..9b04086 --- /dev/null +++ b/public/tags/toolbx/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

toolbx

+ + + +
+ + + + diff --git a/public/tags/top/index.html b/public/tags/top/index.html new file mode 100644 index 0000000..8a2f17b --- /dev/null +++ b/public/tags/top/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

top

+ + + +
+ + + + diff --git a/public/tags/torture/index.html b/public/tags/torture/index.html new file mode 100644 index 0000000..9c51e3c --- /dev/null +++ b/public/tags/torture/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

torture

+ + + +
+ + + + diff --git a/public/tags/toxic-people/index.html b/public/tags/toxic-people/index.html new file mode 100644 index 0000000..7008f3f --- /dev/null +++ b/public/tags/toxic-people/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

toxic people

+ + + +
+ + + + diff --git a/public/tags/tracking/index.html b/public/tags/tracking/index.html new file mode 100644 index 0000000..6a65020 --- /dev/null +++ b/public/tags/tracking/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tracking

+ + + +
+ + + + diff --git a/public/tags/travis-s-taylor/index.html b/public/tags/travis-s-taylor/index.html new file mode 100644 index 0000000..8773362 --- /dev/null +++ b/public/tags/travis-s-taylor/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

travis s taylor

+ + + +
+ + + + diff --git a/public/tags/treesitter/index.html b/public/tags/treesitter/index.html new file mode 100644 index 0000000..9ee5e19 --- /dev/null +++ b/public/tags/treesitter/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

treesitter

+ + + +
+ + + + diff --git a/public/tags/tribes/index.html b/public/tags/tribes/index.html new file mode 100644 index 0000000..0ea92d1 --- /dev/null +++ b/public/tags/tribes/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tribes

+ + + +
+ + + + diff --git a/public/tags/trim/index.html b/public/tags/trim/index.html new file mode 100644 index 0000000..117ba41 --- /dev/null +++ b/public/tags/trim/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

trim

+ + + +
+ + + + diff --git a/public/tags/trivia/index.html b/public/tags/trivia/index.html new file mode 100644 index 0000000..b97067f --- /dev/null +++ b/public/tags/trivia/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

trivia

+ + + +
+ + + + diff --git a/public/tags/troff/index.html b/public/tags/troff/index.html new file mode 100644 index 0000000..8702ee3 --- /dev/null +++ b/public/tags/troff/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

troff

+ + + +
+ + + + diff --git a/public/tags/trump/index.html b/public/tags/trump/index.html new file mode 100644 index 0000000..3ce015a --- /dev/null +++ b/public/tags/trump/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

trump

+ + + +
+ + + + diff --git a/public/tags/tui/index.html b/public/tags/tui/index.html new file mode 100644 index 0000000..6814fc1 --- /dev/null +++ b/public/tags/tui/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

tui

+ + + +
+ + + + diff --git a/public/tags/twitter/index.html b/public/tags/twitter/index.html new file mode 100644 index 0000000..8f0c68b --- /dev/null +++ b/public/tags/twitter/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

twitter

+ + + +
+ + + + diff --git a/public/tags/types/index.html b/public/tags/types/index.html new file mode 100644 index 0000000..48ef518 --- /dev/null +++ b/public/tags/types/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

types

+ + + +
+ + + + diff --git a/public/tags/typescript/index.html b/public/tags/typescript/index.html new file mode 100644 index 0000000..935cee6 --- /dev/null +++ b/public/tags/typescript/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

typescript

+ + + +
+ + + + diff --git a/public/tags/typesetting/index.html b/public/tags/typesetting/index.html new file mode 100644 index 0000000..ba1ff82 --- /dev/null +++ b/public/tags/typesetting/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

typesetting

+ + + +
+ + + + diff --git a/public/tags/ui/index.html b/public/tags/ui/index.html new file mode 100644 index 0000000..3221fdf --- /dev/null +++ b/public/tags/ui/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ui

+ + + +
+ + + + diff --git a/public/tags/ultra-rich/index.html b/public/tags/ultra-rich/index.html new file mode 100644 index 0000000..e2a9e31 --- /dev/null +++ b/public/tags/ultra-rich/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ultra-rich

+ + + +
+ + + + diff --git a/public/tags/unit-tests/index.html b/public/tags/unit-tests/index.html new file mode 100644 index 0000000..dd1ffa8 --- /dev/null +++ b/public/tags/unit-tests/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

unit tests

+ + + +
+ + + + diff --git a/public/tags/units/index.html b/public/tags/units/index.html new file mode 100644 index 0000000..5d46fad --- /dev/null +++ b/public/tags/units/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

units

+ + + +
+ + + + diff --git a/public/tags/universities/index.html b/public/tags/universities/index.html new file mode 100644 index 0000000..9d0c18f --- /dev/null +++ b/public/tags/universities/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

universities

+ + + +
+ + + + diff --git a/public/tags/unix/index.html b/public/tags/unix/index.html new file mode 100644 index 0000000..f05d256 --- /dev/null +++ b/public/tags/unix/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

unix

+ + + +
+ + + + diff --git a/public/tags/upgrades/index.html b/public/tags/upgrades/index.html new file mode 100644 index 0000000..98bbea4 --- /dev/null +++ b/public/tags/upgrades/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

upgrades

+ + + +
+ + + + diff --git a/public/tags/ursula-k-le-guin/index.html b/public/tags/ursula-k-le-guin/index.html new file mode 100644 index 0000000..a464ab1 --- /dev/null +++ b/public/tags/ursula-k-le-guin/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ursula k. le guin

+ + + +
+ + + + diff --git a/public/tags/user-data/index.html b/public/tags/user-data/index.html new file mode 100644 index 0000000..e96d148 --- /dev/null +++ b/public/tags/user-data/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

user data

+ + + +
+ + + + diff --git a/public/tags/utf-8/index.html b/public/tags/utf-8/index.html new file mode 100644 index 0000000..119c686 --- /dev/null +++ b/public/tags/utf-8/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

utf-8

+ + + +
+ + + + diff --git a/public/tags/uuid/index.html b/public/tags/uuid/index.html new file mode 100644 index 0000000..5ed8b95 --- /dev/null +++ b/public/tags/uuid/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

uuid

+ + + +
+ + + + diff --git a/public/tags/ux/index.html b/public/tags/ux/index.html new file mode 100644 index 0000000..63b2821 --- /dev/null +++ b/public/tags/ux/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

ux

+ + + +
+ + + + diff --git a/public/tags/vcs/index.html b/public/tags/vcs/index.html new file mode 100644 index 0000000..56033af --- /dev/null +++ b/public/tags/vcs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vcs

+ + + +
+ + + + diff --git a/public/tags/versions/index.html b/public/tags/versions/index.html new file mode 100644 index 0000000..949fdaf --- /dev/null +++ b/public/tags/versions/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

versions

+ + + +
+ + + + diff --git a/public/tags/vicky-oliver/index.html b/public/tags/vicky-oliver/index.html new file mode 100644 index 0000000..21b9e02 --- /dev/null +++ b/public/tags/vicky-oliver/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vicky oliver

+ + + +
+ + + + diff --git a/public/tags/video-games/index.html b/public/tags/video-games/index.html new file mode 100644 index 0000000..f82f713 --- /dev/null +++ b/public/tags/video-games/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

video games

+ + + +
+ + + + diff --git a/public/tags/vim/index.html b/public/tags/vim/index.html new file mode 100644 index 0000000..f41a418 --- /dev/null +++ b/public/tags/vim/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vim

+ + + +
+ + + + diff --git a/public/tags/vimconf/index.html b/public/tags/vimconf/index.html new file mode 100644 index 0000000..62559fa --- /dev/null +++ b/public/tags/vimconf/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vimconf

+ + + +
+ + + + diff --git a/public/tags/virtual/index.html b/public/tags/virtual/index.html new file mode 100644 index 0000000..ebda32a --- /dev/null +++ b/public/tags/virtual/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

virtual

+ + + +
+ + + + diff --git a/public/tags/vscode/index.html b/public/tags/vscode/index.html new file mode 100644 index 0000000..7f4e15a --- /dev/null +++ b/public/tags/vscode/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vscode

+ + + +
+ + + + diff --git a/public/tags/vulnerability/index.html b/public/tags/vulnerability/index.html new file mode 100644 index 0000000..c8cdaac --- /dev/null +++ b/public/tags/vulnerability/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

vulnerability

+ + + +
+ + + + diff --git a/public/tags/wallpapers/index.html b/public/tags/wallpapers/index.html new file mode 100644 index 0000000..ea84782 --- /dev/null +++ b/public/tags/wallpapers/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wallpapers

+ + + +
+ + + + diff --git a/public/tags/warhammer-40000/index.html b/public/tags/warhammer-40000/index.html new file mode 100644 index 0000000..f24d712 --- /dev/null +++ b/public/tags/warhammer-40000/index.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

warhammer 40000

+ + + +
+ + + + diff --git a/public/tags/wash-your-hands/index.html b/public/tags/wash-your-hands/index.html new file mode 100644 index 0000000..d5f1695 --- /dev/null +++ b/public/tags/wash-your-hands/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wash your hands

+ + + +
+ + + + diff --git a/public/tags/wasm/index.html b/public/tags/wasm/index.html new file mode 100644 index 0000000..f3cad35 --- /dev/null +++ b/public/tags/wasm/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wasm

+ + + +
+ + + + diff --git a/public/tags/web-apis/index.html b/public/tags/web-apis/index.html new file mode 100644 index 0000000..53daae5 --- /dev/null +++ b/public/tags/web-apis/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

web apis

+ + + +
+ + + + diff --git a/public/tags/web-development/index.html b/public/tags/web-development/index.html new file mode 100644 index 0000000..e192ee2 --- /dev/null +++ b/public/tags/web-development/index.html @@ -0,0 +1,93 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

web development

+ + + +
+ + + + diff --git a/public/tags/web/index.html b/public/tags/web/index.html new file mode 100644 index 0000000..fb46bca --- /dev/null +++ b/public/tags/web/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

web

+ + + +
+ + + + diff --git a/public/tags/webdav/index.html b/public/tags/webdav/index.html new file mode 100644 index 0000000..1d83294 --- /dev/null +++ b/public/tags/webdav/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

webdav

+ + + +
+ + + + diff --git a/public/tags/webkit/index.html b/public/tags/webkit/index.html new file mode 100644 index 0000000..a34da46 --- /dev/null +++ b/public/tags/webkit/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

webkit

+ + + +
+ + + + diff --git a/public/tags/website/index.html b/public/tags/website/index.html new file mode 100644 index 0000000..ce029f7 --- /dev/null +++ b/public/tags/website/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

website

+ + + +
+ + + + diff --git a/public/tags/websites/index.html b/public/tags/websites/index.html new file mode 100644 index 0000000..5896e50 --- /dev/null +++ b/public/tags/websites/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

websites

+ + + +
+ + + + diff --git a/public/tags/werewolves/index.html b/public/tags/werewolves/index.html new file mode 100644 index 0000000..ce97b98 --- /dev/null +++ b/public/tags/werewolves/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

werewolves

+ + + +
+ + + + diff --git a/public/tags/wfh/index.html b/public/tags/wfh/index.html new file mode 100644 index 0000000..1143d21 --- /dev/null +++ b/public/tags/wfh/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wfh

+ + + +
+ + + + diff --git a/public/tags/whatsapp/index.html b/public/tags/whatsapp/index.html new file mode 100644 index 0000000..dce04eb --- /dev/null +++ b/public/tags/whatsapp/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

whatsapp

+ + + +
+ + + + diff --git a/public/tags/wiki/index.html b/public/tags/wiki/index.html new file mode 100644 index 0000000..451cb6b --- /dev/null +++ b/public/tags/wiki/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wiki

+ + + +
+ + + + diff --git a/public/tags/wikileaks/index.html b/public/tags/wikileaks/index.html new file mode 100644 index 0000000..d326257 --- /dev/null +++ b/public/tags/wikileaks/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wikileaks

+ + + +
+ + + + diff --git a/public/tags/wil-wheaton/index.html b/public/tags/wil-wheaton/index.html new file mode 100644 index 0000000..7faa74b --- /dev/null +++ b/public/tags/wil-wheaton/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

wil wheaton

+ + + +
+ + + + diff --git a/public/tags/windows/index.html b/public/tags/windows/index.html new file mode 100644 index 0000000..a6182de --- /dev/null +++ b/public/tags/windows/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

windows

+ + + +
+ + + + diff --git a/public/tags/winrt/index.html b/public/tags/winrt/index.html new file mode 100644 index 0000000..f380372 --- /dev/null +++ b/public/tags/winrt/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

winrt

+ + + +
+ + + + diff --git a/public/tags/word-generator/index.html b/public/tags/word-generator/index.html new file mode 100644 index 0000000..cc512b8 --- /dev/null +++ b/public/tags/word-generator/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

word generator

+ + + +
+ + + + diff --git a/public/tags/work-from-home/index.html b/public/tags/work-from-home/index.html new file mode 100644 index 0000000..0f1e448 --- /dev/null +++ b/public/tags/work-from-home/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

work from home

+ + + +
+ + + + diff --git a/public/tags/work/index.html b/public/tags/work/index.html new file mode 100644 index 0000000..86c973b --- /dev/null +++ b/public/tags/work/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

work

+ + + +
+ + + + diff --git a/public/tags/writing-code/index.html b/public/tags/writing-code/index.html new file mode 100644 index 0000000..5ed06fa --- /dev/null +++ b/public/tags/writing-code/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

writing code

+ + + +
+ + + + diff --git a/public/tags/writing/index.html b/public/tags/writing/index.html new file mode 100644 index 0000000..a304df9 --- /dev/null +++ b/public/tags/writing/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

writing

+ + + +
+ + + + diff --git a/public/tags/xml/index.html b/public/tags/xml/index.html new file mode 100644 index 0000000..76e62b6 --- /dev/null +++ b/public/tags/xml/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

xml

+ + + +
+ + + + diff --git a/public/tags/yaml/index.html b/public/tags/yaml/index.html new file mode 100644 index 0000000..a1b1475 --- /dev/null +++ b/public/tags/yaml/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

yaml

+ + + +
+ + + + diff --git a/public/tags/year/index.html b/public/tags/year/index.html new file mode 100644 index 0000000..92c49ca --- /dev/null +++ b/public/tags/year/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

year

+ + + +
+ + + + diff --git a/public/tags/yew/index.html b/public/tags/yew/index.html new file mode 100644 index 0000000..e428cbc --- /dev/null +++ b/public/tags/yew/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

yew

+ + + +
+ + + + diff --git a/public/tags/youtube/index.html b/public/tags/youtube/index.html new file mode 100644 index 0000000..57b6c62 --- /dev/null +++ b/public/tags/youtube/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

youtube

+ + + +
+ + + + diff --git a/public/tags/zaki-hasan/index.html b/public/tags/zaki-hasan/index.html new file mode 100644 index 0000000..d3f494f --- /dev/null +++ b/public/tags/zaki-hasan/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zaki hasan

+ + + +
+ + + + diff --git a/public/tags/zig/index.html b/public/tags/zig/index.html new file mode 100644 index 0000000..a28568e --- /dev/null +++ b/public/tags/zig/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zig

+ + + +
+ + + + diff --git a/public/tags/zola/index.html b/public/tags/zola/index.html new file mode 100644 index 0000000..16e137f --- /dev/null +++ b/public/tags/zola/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zola

+ + + +
+ + + + diff --git a/public/tags/zombies/index.html b/public/tags/zombies/index.html new file mode 100644 index 0000000..2f6b3f0 --- /dev/null +++ b/public/tags/zombies/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zombies

+ + + +
+ + + + diff --git a/public/tags/zoom/index.html b/public/tags/zoom/index.html new file mode 100644 index 0000000..6d04928 --- /dev/null +++ b/public/tags/zoom/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zoom

+ + + +
+ + + + diff --git a/public/tags/zsh/index.html b/public/tags/zsh/index.html new file mode 100644 index 0000000..5874621 --- /dev/null +++ b/public/tags/zsh/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zsh

+ + + +
+ + + + diff --git a/public/tags/zshell/index.html b/public/tags/zshell/index.html new file mode 100644 index 0000000..a50ad80 --- /dev/null +++ b/public/tags/zshell/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zshell

+ + + +
+ + + + diff --git a/public/tags/zuckerberg/index.html b/public/tags/zuckerberg/index.html new file mode 100644 index 0000000..0ee301a --- /dev/null +++ b/public/tags/zuckerberg/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +

zuckerberg

+ + + +
+ + + + diff --git a/public/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html b/public/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html new file mode 100644 index 0000000..32083ca --- /dev/null +++ b/public/thoughts/code-is-a-book-unittests-are-spell-checkers/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Code is a Book, Unit Tests are Spellcheckers

+ +

If we use an analogy for code as being the words in a book and the system +being built as the whole book, then what are unit tests?

+ +

I just found this analogy pretty good1: You can to think about your code +as a book: Each module is a chapter, each class is a paragraph and each +function is a sentence.

+

In that analogy, were would unit tests sit?

+

To me, the unit tests are like spell checkers -- or, at least, the more modern +ones: Are you writing the proper words? Are your sentences grammatically +correct? The spell checker will take care of this.

+

But there is one thing that the spell checker won't do: make sure the chapter +makes sense in the whole context of the book. Escaping the analogy for a +moment, let me ask you this: Have you read "Les Misérables"? I did, and there +is one chapter in the middle of the book in which Victor Hugo discuss the +Battle of Waterloo. Although it makes sense in the historical point of the +story of Les Misérables, it makes absolutely no sense in the general story +itself -- no matter how well punctuate, correct in spelling and grammar it may +be.

+

This is a huge failure of unit tests: They don't see the whole. The whole is +given by reviewers of a book and integration tests of a system. Jumping back +to the analogy, when you have your integration tests defined by the system +requisites, anything that isn't being covered is a chapter that doesn't make +sense in the whole of the book.

+

In the long run, as writers will remember the times the spell checker +pointed a word was spelled wrong or a verb was in the wrong tense and, thus, +make it pop less and less, so does unit tests: In the long run, the ROI2 of +unit tests tend to go down, while the integration tests -- the ones that check +if the "chapter" makes sense in the story being told by the "book" -- tend to +go up.

+

And I just found the analogy so good for the way I see those two test +methodologies.

+
+
1 +

... but I lost the source of it. :(

+
+
2 +

"Return Of Investment"

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/daily-links/index.html b/public/thoughts/daily-links/index.html new file mode 100644 index 0000000..9928fa0 --- /dev/null +++ b/public/thoughts/daily-links/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Sharing Daily Links

+ +

I'm changing the way I share links around the web.

+ +

For a while, I used my Mastodon +Account to share interesting links from +different subjects.

+

Today I decided to change that.

+

From now on, instead of sharing links directly on the microblogging site, I'll +make one post per day1 with links for different subjects that I collect +around the web. The difference between those two, besides the fact that I used +to post one toot2 per link and now it will be a post with several links, is +that I'll add some small information about the link itself or its content.

+

In case you're wondering why the change, the reason is that I realized it is +way better to grep the content of this blog than using the search feature of +DayOne, which collects all the toots I do.

+
+

Just to explain how I collect those links:

+
    +
  1. I favourite toots and some tweets;
  2. +
  3. Every morning, I run downfav to +collect those toots and save them locally;
  4. +
  5. A small Python script (which I want to replace at some point) uploads the +saved texts to my Joplin;
  6. +
  7. I check a specific Notebook (the one the Python script uploads things to) +for things that have links;
  8. +
  9. I click the links, which open a tab on Firefox;
  10. +
  11. Repeat 4 till all links have been clicked;
  12. +
  13. Read posts;
  14. +
  15. If interesting, make a toot.
  16. +
+

The step I'm changing is the 8th: Instead of making a toot for each link, I'm +going to start a blog post, add every interesting link, add a comment about it +(something missing in the previous flow) and then post everything.

+ +
+
+
1 +

People who remember "Delicious" (or "De.li.cio.us") may remember that it +had a feature that it will make a post on a WordPress install with the links +you captured the day before. This is basically me resurrecting this, but in +a manual form.

+
+
2 +

For those who don't know Mastodon, a "toot" is a post, kinda like +Twitter calls its posts "tweets".

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/go-problem-is-not-the-xml-vulnerability/index.html b/public/thoughts/go-problem-is-not-the-xml-vulnerability/index.html new file mode 100644 index 0000000..5815021 --- /dev/null +++ b/public/thoughts/go-problem-is-not-the-xml-vulnerability/index.html @@ -0,0 +1,137 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Go problem is not the XML vulnerability

+ +

Yesterday I posted some comments about the vulnerability in go XML +stdlib1 and some people said it was not a big +deal.

+

The problem is not the vulnerability in itself, though.

+ +

Also, the problem is just partially related the fact that it can't be reliable +fixed. And it is not related with the "http" library had a DoS problem. And it +is not related with the natural number functions (and specifically +divRecursiveStep) had an error that put Etherium network down. And it is not +related with the "ssh" library had a vulnerability that had to be fixed.

+

The problem is the pattern.

+

I'm don't expect projects to be some mythical "everything should be flawless". +Heck, with the exception of the "xml" issue in the original post, all other +issues are already fixed.

+

But there is a pattern emerging from go stdlib that shows that little care was +taken when building it. And, along with this pattern, we have the issue that +this is in the stdlib. Stdlibs should, even more than just provide an +infrastructure for bigger applications, be reference implementations. For +example, if you want to see how the heck Python managed to add SQLite, you just +need to check Python stdlib (FFI); you can check the source (FFI); or if you +want to know how can sets in Python be fast (faster then everything else in +Python, that is) you can also check the stdlib (it is written in C); or how they +managed to make "namedtuples" create objects dynamically (eval). All those +describe how you can build something that connects to something external, that +is fast or that is magical.

+

And the pattern shows that go stdlib is doing it wrong. It seems the go team +focused too much in "adding value" and too little in "being a reference".

+

Another example that there is something wrong with the language: in four +months, the problem with the ordering could not be fixed. In half of that time, +I can write binding for libxml2 in Python, or even Rust, even if I'm not that +experienced with Python or Rust FFI. That means that the layer that gives the +stdlib access to external things is taking too much control, in a way that you +can't let external libraries use their own structures without that being messed +up with the runtime. If the FFI had enough freedom to just expose the top +layers, writing their own implementation of a XML parser in C and just exposing +to the top layers would be completely doable in four months -- even without the +use of libxml2.

+

All those are patterns of things going wrong with the language architecture. +And that's why I said that anything half-serious shouldn't be written in go in +the first place.

+

I'm someone that likes to say something controversial from time to time. At the +start of this year, in one event, I said that any technical leader worth its +salt wouldn't recommend go for anything. And I stand by that. Tech leaders +should see this kind of problem appear and take steps to not be dragging into +some hole they can't get out, and the pattern of architectural problems with go +was emerging a long time already.

+

PS: You may have noticed that I typed "go" instead of "Go" in most of this +post. This is on purpose; I don't believe the language deserves getting a +capital "G".

+
+
1 +

From now on, I'll use "stdlib" for "standard libraries", the +libraries/modules that come with a language.

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/how-to-kill-developer-productivity/index.html b/public/thoughts/how-to-kill-developer-productivity/index.html new file mode 100644 index 0000000..6aa6102 --- /dev/null +++ b/public/thoughts/how-to-kill-developer-productivity/index.html @@ -0,0 +1,128 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

How to Kill Developer Productivity

+ +

There are several ways to not kill developer productivity in a project. +Unfortunately, the real causes are never discussed.

+ +

Recently I read another post about "how to not kill your developer +productivity", that says exactly what every other post about it says: +Basically, "do not interrupt".

+

But can we really avoid interruptions? Isn't the "ping!" from the coffee +machine an interruption? Isn't a full bladder an interruption? Isn't the front +door bell ringing when a package and/or food delivery an interruption?

+

What's the difference between those interruptions and someone asking +something?

+

And do less meetings? Why? Is it because nobody cares enough to write a +meeting agenda to point what needs to be decided? Or maybe 'cause the frontend +developers don't care enough about the problems the backend developers are +facing and vice-versa?

+

Would a meeting scheduled a week in advance an "interruption"?

+

I can't see how interruptions can be a problem. Imagine this:

+

This developer went though an onboarding when they joined the company, and +they were shown the purpose of the company, they were shown the product the +company sells and how it works, there were shown the product architecture, +they were explained the reasons behind every solution applied, they were given +time to discuss other solutions with their pairs, they were not put on a +corner to explain every minute of their working day.

+

With that, can you imagine that someone making a question about some part of +the system while whoever is coding is in the middle of a function to +frobnicate1 foo? Maybe they will need a bit time to find where they +stopped, but as the solution was already discussed, and they know the purpose +of the solution they are working, the interruption would do very little in +their productivity.

+

Unfortunately, in IT, we are seen as "machines" and most manufacturing +techniques are applied directly without considering that we are people (or do +you think "kanban" was born in IT and not inside the Toyota manufacturing +plant?).

+

A stopped machine is wasted money. Stopping production for preventive +maintenance, without the machine being really broken, having to take it and +check every part, is wasted money.

+

And, unfortunately, when a developer is not "developing", they are seen as +wasted money. And that's why simple stuff, like explaining why a system +exists, what is the idea of the data flow inside the system and things like +that are completely ignored: 'Cause the "machine" is not producing anything.

+

And that's why, when the production is halted, productivity goes down.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/index.html b/public/thoughts/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/thoughts/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/public/thoughts/my-2019-review/index.html b/public/thoughts/my-2019-review/index.html new file mode 100644 index 0000000..40284d4 --- /dev/null +++ b/public/thoughts/my-2019-review/index.html @@ -0,0 +1,163 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

My 2019 Review

+ +

This year, I decided to make some review of what happened last year, to me.

+ +

2019 can be called "The Year I Rode".

+

In 2018 I did some presentations on Tchelinux, and +2019 started with a "Let's just ride all the way to the border" from my +cousin. The result is that, in 2019, I did presentations in 13 of the 15 +events Tchelinux promoted. I spoked about Rust 8 times, how people can help +open source projects 7 times, stream processing 5 times, Python 4 times (with +one I basically took over from another friend that couldn't get to the event) +and testing 2 times.

+

Honestly, I did enjoy the combination of presentations and riding. My +psychiatrist mentioned I seemed better after all that (she basically +complained that I should get "more in touch with nature" and such, which I +guess it could count, if you see the amount of trees there are around the +roads). I also got a brand new interest in the presentations, to the point +that I'm already studying some new topics for presentations.

+

I got so into doing technical presentations that in the end of 2019 I applied +for the Mozilla Tech Speakers, +although the answer will only come in 2020. Fingers crossed.

+

I also rode all the way from Porto +Alegre to +Montevideo, which took about 12 +hours (24 total, back and forth), just to be there for 3 days for Rust +Latam.

+

Speaking of Rust, this year I added "Rust in POA" as my other Meetup -- I +already help organize PyTche and took Rust in POA when it was about to be +deactivated. Also, I think this year I finally managed to write some code that +actually let the compiler happy -- and I'm still using it! And I still way +more personal projects I want to experiment in Rust.

+

But my coding life wasn't just about Rust. This year I got deep into Java 8 +and, honestly, the experience wasn't as bad as I recalled from Java 2. Streams +and Optionals are, basically, my everyday tools now. We are in a dysfunctional +relationship, but it actually works.

+

I did some other tech changes: I dropped Evernote and moved everything I had +to NextCloud and Joplin. +It always bugged me that I kept pushing to "Own your platform", but my heavy +content was in a platform I had no control over it. Now I do.

+

Speaking of "owning your platform", I become way more active on +Mastodon. Although it's not running on +my own platform (yet), it's open source and I can take my data any time I want +-- and move to another place with no issues. You can take your +Twitter/Facebook data, but can you put it somewhere else? I don't think so.

+

I also moved a bunch of stuff to my new domain. So, +again, owning my platform.

+

Out of the tech sphere, I found +Synthwave, which basically is +consuming all my music listening hours (including when I'm writing this post).

+

So, good year, right? No so much.

+

Since the mid of 2018, I'm feeling really burnt out, and although the change +of pace is helping, I'm still not feeling 100% productive. I mentioned a lot +of personal projects, but I only check them half-hour after lunch; I don't +feel like going anywhere near code after the end of my working hours. This is +really annoying, 'cause I have a bunch of things I want to automate, but doing +any sort of code outside the office feels... painful. This is a complete +different picture from 2008 (I know, that was 11 years ago) when I would get +to work, code code code, go back home and then code some more. I have strong +hopes of getting some vacation and finally "get fixed".

+

Insomnia is still part of my nights. I'm taking meds now to help me sleep. The +only good side of this is that it help me read 32 books this year (you may +have seen the reviews in this blog).

+

2019 was also the year I feared for some friends. There is a strong alt-right +movement in the country -- specially after the alt-right candidate was elected +-- and I feared mostly for my friends. I also felt guilty for not standing +that up as I should: I'm white, male and cis, and I'm pretty sure I won't be a +target, and that's why I should be in the front lines, but I'm too much of a +coward to do so.

+

Also, this year I lost two people. The first one was a new friend I made on +Rust in POA. He was one of the people that really understood Rust. I still +feel kinda guilty about this, 'cause I saw he had some depressing posts on +Twitter and it took me way to long to talk to him before it happened.

+

The second person was my uncle. He was the guy who was only 13 years old than +me, did the Santiago de +Compostela pilgrimage +route about four (or even five) times, was cycling all the time, did +marathons. And, suddenly, heart attack. He was the guy I would expect to make +fun of my funeral.

+

But what about 2020?

+

First, personally, I really really hoping this stupid burn out will go away +after vacations, so I can finally fix my own digital life.

+

Second, I'll keep my presentations. I also hope I get selected for Tech +Speaker, only to have more stuff to talk about.

+

Third, for the fucks sake, I hope I won't lose anyone else, 'cause even after +all this time, I still don't know how to handle these loses (I still feel bad +when my gramma passed away, and that was 10 years ago).

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/one-week-with-tiler/index.html b/public/thoughts/one-week-with-tiler/index.html new file mode 100644 index 0000000..bd5ebe6 --- /dev/null +++ b/public/thoughts/one-week-with-tiler/index.html @@ -0,0 +1,128 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

One Week with Tiler

+ +

Tiler is a tiling split manager for VIM. Here is my experience with it +installed for one week.

+ +

Recently I had to work with Java (instead of Python) and one thing that happens +when you're working with Java is that you have a bunch of files open at the +same time. Also, I do prefer to keep things in splits 'cause there is always +some information you need to keep visible for reference. But a lot of splits +make visibly finding stuff very very hard.

+

Then suddenly, it hit me: I could use a tiling window manager and it wouldn't +be such a mess; on the other hand, using different windows for each VIM (with +each file) would make copying'n'pasting a hell. So if I could actually find a +tiling plugin, that would give me the best of both worlds.

+

And that's where Tiler gets in.

+

Tiler is a tiling plugin for VIM. But it doesn't do anything by itself, +meaning, it won't intercept every call to a split to do the tiling. But itadds +new commands to manage the tiling.

+

For example, to open a new split using the tiling, you need to use +:TilerOpen. Again, Tiler won't capture every split, so you can still open +splits with :split and :vsplit, which would break the tiling arrangements, +so you can put everyhing back in order with :TilerReorder.

+

Tiler has a layout (well, layouts, but they follow the same principle) of one +large split for the main content and small ones for everything else. To bring +one split to the main area, you can use :TilerFocus.

+

And that's basically it.

+

What I did was to add shortcuts to :TilerReorder and :TilerFocus. So I +open splits like everyone else

+

+

... and then using <leader><space> (the configurable leader key followed by +space) to call :TilerReorder and I get a nice, tidy workspace:

+

+

Although it may look cumbersome, my leader is defined to space, so to tidy +up everything, all I have to do is press space twice in normal mode.

+

Also, to help with the "focus on one thing" part, I also put a shortcut to the +:TilerFocus command, with <leader>f.

+

And here are my bindings:

+
nmap <Leader>f :TilerFocus<CR>
+nmap <Leader><space> :TilerReorder<CR>
+
+

One last thing: The size of the main area is configurable, which is good, +since I found it a bit too large. To adjust it, you can use +g:tiler#master#size, which is the size of main split. I found 55% to be a +good size, so I put

+
let g:tiler#master#size = 55
+
+

And that's it. As usual, it takes some time to put the keybinds in "auto mode" +(you know, day-to-day use), but I feel it helps a lot on actually put focus on +some task without the cluttering of splits.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/one-week-with-tiler/tiler-no-tiling.png b/public/thoughts/one-week-with-tiler/tiler-no-tiling.png new file mode 100644 index 0000000..d19ada5 Binary files /dev/null and b/public/thoughts/one-week-with-tiler/tiler-no-tiling.png differ diff --git a/public/thoughts/one-week-with-tiler/tiler-tiling.png b/public/thoughts/one-week-with-tiler/tiler-tiling.png new file mode 100644 index 0000000..cd8847c Binary files /dev/null and b/public/thoughts/one-week-with-tiler/tiler-tiling.png differ diff --git a/public/thoughts/pre-order-the-case-of-no-mans-sky/index.html b/public/thoughts/pre-order-the-case-of-no-mans-sky/index.html new file mode 100644 index 0000000..33cf222 --- /dev/null +++ b/public/thoughts/pre-order-the-case-of-no-mans-sky/index.html @@ -0,0 +1,121 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Pre-Orders: The Case of No Man's Sky

+ +

No Man's Sky is getting a lot of heat recently +because, well, the game is not all what the developers promised. And a lot of +people are putting the blame on pre-orders and whatnot.

+ +

Thing is, this is not a problem with pre-orders. This is a problem with a +development company not getting up with the times.

+

Example: Grim Dawn. Although not a pre-order thing +per-se, the game was on a Kickstart. Today, the game is polished, fun, have +lots of stuff to do but nowhere there is someone claiming this "pre-order" +thing ruined the game.

+

The difference between Grim Dawn and No Man's Sky is that Crate, the +developers of the first, continuously delivered versions to get feedback. +Falling through the world? Ok, we can fix. Game doesn't run on your rig even +when you have the minimal specs? There is something wrong with our engine. +That feature? Yeah, it's too big for now, we'll work on it later.

+

Not on this list, but ArenaNet did something close to that with Guild Wars 2: +People who pre-purchased the game -- an "extreme" version of pre-order -- +could participate on the closed beta events. Those events, although not +spawning through whole maps, would allow players to experience some part of +the game and return feedback. They would even claim "we just want to stress +the servers, so weird things could happen" and people were fine with that.

+

Hello Games, on the other hand, did all development behind closed doors. Sure +they are a small company, but there was nothing stoping them from actually +doing some open beta test or whatever to receive feedback. Well, except on +thing: Sony.

+

Sony injected money on Hello Games for their first title (I was about to claim +"a lot of money" but heck if I know how much they funded) and wanted it on +their console. Now, consoles do not have a "here, play for testing" or "signup +for this and we'll add your console ID in our database and you can download +the game". To keep the things hyped, no one could see the game before release. +No previews, no betas, no nothing. Feature wasn't fun? Who would know, it's +scrapped now. The engine blows up on certain configurations? Only way to check +this is after the final release.

+

So, again, it's not a problem with "Pre-orders are bad and you should feel +bad". This is a problem with a company not keeping up with the times. A lot of +companies are now sharing things beforehand to get larger feedback than their +friends and family: Microsoft is continuously releasing Windows versions +through their "Microsoft Insider" program, which anyone can join; Apple is +giving betas of all their OSes for anyone who wants to test them. The idea of +"many eyes makes all bugs shallow" finally caught up and people realised it +was right.

+

But, apparently, Hello Games + Sony didn't.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/python-loses-2nd-place-loved-language/index.html b/public/thoughts/python-loses-2nd-place-loved-language/index.html new file mode 100644 index 0000000..fa98bff --- /dev/null +++ b/public/thoughts/python-loses-2nd-place-loved-language/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Python Losing the 2nd Place on Loved Languages: A Thought

+ +

On this year StackOverflow Survey, Python lost its 2nd place in the "Most +Loved Languages" ranking to TypeScript. On our Python group, people started +wondering why. And I just thought it would be nice to post my thoughts on +the situation.

+ +

Before anything, I may have do make a disclaimer saying that I do love Python, +and I think it is a great language 'cause it is very concise but also very +expressive. I don't think any other language get close to Python in doing +those points so well.

+

Disclaimer done, let me explain why I think Python lost its second place in +the hearts of developers.

+

Types

+

One of the first thoughts one can think when we talk about "losing a +position" in any rank is "because it got worse". But I really don't think this +is what happened here, and what actually happened is that TypeScript shown +developers something better.

+

TypeScript is aimed to JavaScript development, a zone where anything goes, +types are very flexible and magical -- to the point what most of things +actually produce a Wat. By +using types, making sure you're not adding a string to an array, a lot of +problems suddenly disappear. It is no silver bullet, but it prevents a whole +class of issues that would popup in production.

+

So, in an environment that chaotic things happen, suddenly you have something +that puts order back and you gotta love it for that. Surely, it's not just +types that make TypeScript more loved than JavaScript, but it is partially +why.

+

(Just to add to this point: Rust is still the most loved language 5 years in a +row, and it uses some pretty strong typing, close do Haskell, with added +syntax closer to what most languages use.)

+

I still believe that, in the long run, type hinting can fill the gap for +Python to reach the proper position. I'd love to use it to add hinting in all +functions and then have something that I could set the level of checking on +different environments: make the application crash if the function was called +with the wrong types on development environment; just log (logging or stderr) +on staging; and do absolutely nothing on production. That would allow me to +use the best of both worlds: Dynamic when developing, but static when testing.

+

Python 2 is dead

+

One of the things that happened to Python in the beginning of this year, when +the survey was done, was that Python 2 became unsupported. Surely, that +doesn't mean any Python 2 installation would stop working, but it gave an +extra jump to porting things to Python 3.

+

And, even with all the backporting and improvements in Python 3, it was not a +smooth sail. That change, that forced change, may have let some Python devs +with some bitter taste about the language. No one wants to just fix changes in +the language, when the way things work must still work, quirks and all.

+

Hype

+

Python is not a hyped language anymore.

+

Sure, it is still a reference for machine learning and related fields, but the +once thriving environment of web dev was taking by the hype of other +languages.

+

Python is not the hot stuff on web dev anymore. And because it is not the hot +stuff, people don't want the old stuff; the old stuff is not cool anymore, +so they don't like it anymore.

+

Related: Just because something has hype, it doesn't mean it is better; it +just makes the non-hyped stuff "not better", even if there was no change at +all in the latest.

+

Side-point

+

One point not raised by anyone in the group: Although Python lost its second +place in the "Most Loved" ranking, it is still the most wanted language -- +meaning, it is the language most developers want to learn. If the general +feeling was "Python sucks!", I pretty much doubt the want would still be +representative -- and Python have a large lead compared to JavaScript.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/real-life-rust/index.html b/public/thoughts/real-life-rust/index.html new file mode 100644 index 0000000..2c941a0 --- /dev/null +++ b/public/thoughts/real-life-rust/index.html @@ -0,0 +1,175 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Rust in Real Life

+ +

For a while, I've been talking about Rust, making presentations, going to +meetups...

+

But a few months back I had the opportunity to finally work in a real +project in Rust.

+

So, how was it?

+

Cargo is magic

+

The first application I used Rust was a small part of a bigger project. I had +to capture the values coming in a websocket and store them in a database.

+

There were two options for languages straight away: Python and C. Python was +being used in other parts of the company, so it would have more eyes in case +something went wrong. C was used in another application of the same project, so +I could keep the project itself in a single language. Both languages had a +couple of problems: I wasn't sure if Python could handle the load of a +continuous stream of the websocket and I didn't want to write my own websocket +and JSON parser in C.

+

And that's why I picked Rust for this application: I had the performance of C +with a very good package manager, plus a thousand packages already available.

+

So Cargo was the thing that drove the inclusion of Rust in the project. And the +language proved quite capable, as the application kept running to the point we +forgot it was running.

+

.unwrap() is the enemy

+

I point in my presentations how you can do use .unwrap() (and .expect()) to +avoid dealing with errors, and although that would close your application, you +have total control on where it can close itself (compared to a +NullPointerException or reading NULL values or not capturing the proper +exceptions). But, in the end, .unwrap() will hurt you. Badly.

+

That happened in the second application I wrote: The main part of the +application was reading a bunch of bytes, and the meaning of those bytes were +in the bits themselves, in a combination of bitmap and UTF-8-like numbers. But +it wasn't simply parsing that was involved: There was a socket to be read, and +the parsed data should be stored in a database, and there were usually problems +involved in it -- the socket may be closed on the server side, we could lose +connectivity, the parser could produce weird values in case of a missed bit, +which couldn't be stored in the database...

+

For all the possible problems (which are pretty clear, as Result is the base +for almost everything), and because I was in a hurry to deliver the +application, I did use a lot of .expect() around -- again, with the idea +that, if it crashes, at least I told it it could crash, and it would give me a +somewhat traceable message. The reality is that issues happened with such +frequency (specially the parser receiving weird bits that would produce weird +values) that the application would not run for very long.

+

The solution to this constant crashes was quite simple, although laborious: +replace every .unwrap() and .expect() with if let Ok(_) and match. That +gave me total control on how to deal with unexpected values/results. The result +was that the application run without stop for days, to the point that we, +again, forgot it was running -- except when the data changed and we needed to +update our filters.

+

Cargo again

+

In this second application, there were a bunch of little finicky things in the +protocol that were really hard to grasp. Fortunately, we captured some packets +from the service, which allow us to test the parser locally. All I needed was +something to give me a harness to throw those bits and see how the code would +process them.

+

With C, this would probably mean building another executable for testing and +running it instead of the real executable (and, to be honest, that's what Rust +does) but Cargo hid all the complexities of getting this done. I just dropped a +test.rs into my modules, marked it as #[cfg(test)] (meaning, build this +only if the configuration is the test configuration), and cargo test would +build the code and run the tests.

+

The fact that I had a testing framework and a test runner just there was a huge +helper, specially when thing broke down.

+

Should've tryed more

+

One of the side-effects of switching every .unwrap() and .expect() for some +explicit error management was the increase in indentation -- 'cause all I did +was do this replace, but I did not break things into smaller functions.

+

Rust have the try operator -- ? -- but that requires that the function +using it should return a Result, which I kinda neglected in the first pass +'cause, well, the only exit on all functions was success, and failure meant +panic!() (due .unwrap()).

+

If I was using Result as return values from the start, I have the impression +that the code would not be a mess of 7-8 indentation levels. So, another thing +I would have "gained" if I hadn't used .unwrap().

+

Async doesn't make sense till it does

+

The third application in the project required a lot of I/O -- reading from +multiple databases, sending data through a socket, writing again in the +database... It seemed a perfect fit for an async experiment.

+

In the initial version I wrote, I used tasks (async functions) the same way I +did with threads. It initially produced a bunch of errors from the borrow +checker that I couldn't figure out why -- at this point, I could understand +exactly why the borrow checker complained about something in an application +using threads, but the errors were really confusing, to the point that I may +have mentioned that "async is unnatural for Rust". And, when I did manage to +avoid the borrow checker complaints, the performance was... abysmal. Something +like 0.8 records processed per second, which was extremely low for what we +expected.

+

Due this bad performance, I removed all the async things and used threads. That +was in my ballpark -- I knew what I did wrong when the borrow checker +complained -- and the performance did improve: Now it was processing 7 records +per second.

+

During the rewrite, I kept reading about async and how it works, till I came +with a mental model to work with async (more about this in a future post). I +did managed to take some time later to actually apply this mental model -- and +then the errors from the borrow checker made sense, and I felt productive +again. The result? 70 records per second, a whole 10x improvement from simple +threads.

+

Conclusion

+

All that I learnt in a space of 6 months. I ended up switching jobs to a place +that doesn't have anything in Rust (yet 😈), and although the road for Rust is +a bit steep and with some tight corners, it is still worth going.

+

(And, as far as I know, all those applications are still running...)

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/reveries-about-testing/index.html b/public/thoughts/reveries-about-testing/index.html new file mode 100644 index 0000000..0db2f51 --- /dev/null +++ b/public/thoughts/reveries-about-testing/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Reveries About Testing

+ +

Today, a large number of developers use some testing methodology. But what are +tests? What are they for? What is the purpose of writing testes, anyway? Are +we testing the right things?

+
+

This is a companion post for one my presentations, Filosofando Sobre +Testes, which +is in Portuguese.

+ +
+

Before we start, let me give you some disclaimers:

+
    +
  1. +

    I'm non-orthodox about tests. What I mean by that is that some of stuff +I'll mention here are exactly the opposite of what everyone says and the +opposite of the way people work with tests.

    +
  2. +
  3. +

    In no way, consider this a set of rules. What I really want is to stop +people from writing tests without knowing why they are writing those tests.

    +
  4. +
  5. +

    You don't need to agree with anything here. Again, the idea is to sotp and +think what is being tested before writing tests.

    +
  6. +
+

What I want to discuss:

+
    +
  1. TDD, Kent Beck Style;
  2. +
  3. "Fast Tests, Slow Tests";
  4. +
  5. The Explosion of Slow Tests;
  6. +
  7. Coverage;
  8. +
  9. Mocks.
  10. +
+

TDD, Kent Beck Style

+

What made me rethink the way I wrote tests was a video by Ian Cooper, called +"TDD, where it all go wrong". In this video, +Cooper points out that the Beck's book (which brought the whole TDD +revolution) says two things:

+
    +
  1. Tests should run in an isolated way, nothing more, nothing less;
  2. +
  3. Avoid testing implementation details, test behaviors.
  4. +
+

The first point is what it means for a "unit test", meaning "run in +isolation", in the sense that the test does not depend on others. This way, +"unit tests" should be seen as "the test is a unit", not "testing units" -- +there are no "units", the test itself is a unit that doesn't depend on +anything else.

+

The second point is that one should test behaviors, not the implementation. +This is a point that I see we fail a lot when we talk about testing every +class/function: What if the expected behavior is the combination of two +classes? Is it worth writing tests for both, if splitting the classes (or +functions) is just a matter of implementation/way to simplify the code?

+

Also, another question for writing tests for every function and every class: +What we have know an application are their input channels -- which could be a +button in a graphical interface, an option passed in the command line or a web +request -- and the output channels; that way, the behavior is "given that +input in the input channel, I want this in the output channel", and everything +in the middle is implementation. And, for that transformation of something in +the input channel to the output channel, I may need a combination of +classes/functions; if I test every class/function, am I really testing the +expected behavior or the implementation?

+

"But this looks like BDD!", you must be thinking. Cooper says this in the +video above: the idea of "test every class/function" became the norm, the +point of checking behavior had to be used somewhere else, what gave us ATDD +(Acceptance-Test Driven Development) and BDD (Behavior Driven Development).

+

An example of testing behaviors: In the Django subreddit, there was a +question: Should I write unit tests for Django's built in types? +The question is basically this: Django allows defining the database model, and +from that model create a form that I can put on my templates and validate the +incoming data; that way, if I defined that there is a field in my model called +"Year of Birth" -- which can only receive numbers -- and I create a form based +on the model, put it on my template, send the data back and Django will make +sure, from the type in the model, that the incoming request will have a number +in that field. Should I still write a test for that?

+

The answer, though, is in take a step back and do the following question: Why +the year is a number? Obviously, 'cause years are defined as numbers1 and +the behavior of the field was defined way before we added the field in the +model. Also, supposed that for some reason, I need to store the field as a +string2; if the type changes, the behavior should also change? Probably +not.

+

When I ignored that the year should be a number 'cause "the framework will +take care of it", I ignored the expected behavior due the implemtantation.

+

And "test behaviors, not the implementation".

+

Non-factual, but an anecdote: In a project, we had an "alarm manager" where, +from an event, it should generate only a log entry, generate a log entry and +send a SNMP signal or, if the user set it, generate a log, send a SNMP signal +and turn on a LED in the front of the device. With that, we created a module +for the log, a module for sending SNMP signals and a module to turn on/off the +LEDs. Every module had tests, but we didn't feel comfortable with it yet. +That's when I suggested we write a test that would bring the service up and +send events to it, just like any other application in the system, and check +what would happen. That's when the tests finally made sense. (I'll still talk +about these tests in the coverage part of this post.)

+

Fast Tests, Slow Tests

+

The counterpoint of the points above can be something similar to what Gary +Bernhardt says in his presentation Fast Test, Slow +Test. In it, Bernhardt mentions +that they changed the way the tests work, and that now they could run +hundreds of tests in less than a second (an example shows around 600 tests +being run in 1.5 seconds).

+

What Bernhardt suggest is to write tests that checks online the models, with +no connection to the database or the views; tests for controllers with no +connection to the models or views; and tests for the views without the +controllers.

+

Does that sound familiar (specially if you use a MVC framework, which puts +each of those layers in different classes)?

+

Still about those tests, Bernhardt points that those "quick runs" help the +developers to test their to test their changes quickly (does that still sound +familiar?) but those tests do not replace the "integration tests".

+

In that point, I have to ask: If the tests are written to check if a +controller can be run without being connected to the rest of the system, but +one still have to write the (so called) integration tests to verify that the +project is delivering whatever was promised it would deliver, what is really +being tested here? The impression I have from the type of test Bernhardt +proposes is more to check architectural adherence than a quality test: Does +this controller follow the structure of not having any connections to the +database itself? Does this model has only functions related to the storage and +retrieval of data, without any logic? If that's it, what is the value for my +user if a controller doesn't access the database directly?

+

It's not that I don't believe those tests have no value, but they give the +impression that, in the long run, they tend to become structurally very +similar while the (so called) integration tests tend to give more returns to +the quality of the project: Tests that defined an input and an expected result +tend to make sure that, in the long run, the functionality of the project will +still be the same.

+

The Explosion of Slow Tests

+

The first thing that may pop up with a point like the above is that +"integration tests are slow and that will make the tests slow and make +developers less productive."

+

Yes, integration tests are slow, specially 'cause there is a good leg of work +in creating the expected initial state, all the inputs as expected by the +I/O system (again, graphical interface, command line, web), run the whole +processing stack and verify the result. And yes, waiting all this time may end +up breaking the developer's flow.

+

On the other hand, when a developer is working with some input, if it is a new +functionality/expected behavior, then there should be a test for this +behavior; if there is a change in the expected behavior, there should be a +test for the old behavior that needs to be changed. Running just this test is +enough? No, but it should give a very good indication if the functionality is +working as expected. After making sure the behavior is correct, the developer +may execute the suite of tests for the thing being changed and let everything +else to the CI.

+

For example, if I'm working in a new functionality to show an error message +when there is an invoice when the product is not in stock, I have to write a +test that creates the product, let it with no pieces in stock, make an invoice +and check for the error message. Once this test checks the behavior is +correct, I can run all the other invoice tests, and then let the CI validate +that I didn't break anything else else in the stock management module or even +the customer module (for some reason).

+

And plugging with the first point, in order to do all the checks, I'd probably +need lots of functions/classes and test every single one of them will not make +sure the expected behavior is correct, but I'll get back to this later in the +coverage part.

+

I have the impression that we don't use this kind of stuff due two different +problems: the first is that testing tools have a very bad interface for +running suite of tests (for example, running all the invoice tests and only +the invoice tests); the second is that developers are lazy, and it's a lot +easier to run all tests than picking a single suite (not to mention organizing +said tests in suites to be run that way).

+

Coverage

+

Against what most people claim, I do believe that you can reach 100% coverage +pretty easily: You just need to delete code.

+

The idea is quite simple, actually: If your tests check the system behavior, +and I'm proving that all tests pass, everything that doesn't have coverage +point to code that isn't necessary and, thus, can be deleted.

+

It is not every code that can be removed. In the alarm manager example, even +when our "unit tests" cover all functionalities of each module, we got a block +in the "integration tests" that didn't have any coverage. This block was +responsible for checking the input of a module (for example, it won't allow +sending a SNMP message without a text). But, when we checked the code, we +realized that the base module (the one calling the others) was already doing +that validation and that this check was unnecessary. This lead into the +discussion of which test (and code block) should be removed. But we did have a +piece of "dead code" that was being marked as "alive" because we had unit +tests for both blocks.

+

A more practical example. Imagine there is a class that keeps customer data in +a web shop3:

+
class Client:
+    def __init__(self, name):
+        self.name = name
+
+

After awhile, comes a new requirement: A certain "Dewey" keeps creating +accounts non-stop, without doing any purchases, just to put trash in the +database; we need to block any new customers that make their name as just one +name.

+

Then, thinking about SOLID4, the developer changes teh code to this:

+
def _multiple_names(name):
+    split_names = name.split(' ')
+    return len(split_names) > 1
+
+def _validate_name(name):
+    if not _multiple_names(name):
+        raise Exception("Invalid name")
+    return name
+
+class Client:
+    def __init__(self, name):
+        self.name = _validate_name(name)
+
+

Now, when there is any service trying to create a new customer, the name is +validated against a certain rules and one of those is that the name must have +multiple names5.

+

New funcionality, new tests, right?

+
import pytest
+
+def test_single_name():
+	"""'Cher' não tem multiplos nomes."""
+    assert not _multiple_names('Cher')
+
+def test_multiple_name():
+	"""'Julio Biason' tem múltiplos nomes."""
+    assert _multiple_names('Julio Biason')
+
+def test_valid_name():
+	"""'Julio Biason' é um nome válido."""
+    _validate_name('Julio Biason')
+
+def test_invalid_name():
+	"""'Cher' não é um nome válido e por isso levanta uma exceção."""
+    with pytest.raises(Exception):
+        _validate_name('Cher')
+
+def test_client_error():
+	"""Se tentar criar uma conta com 'Cher', deve dar erro."""
+    with pytest.raises(Exception):
+        Client(name='Cher')
+
+def test_client():
+	"""Uma conta com nome 'Julio Biason' deve funcionar."""
+    Client(name='Julio Biason')
+
+

Running the tests:

+
$ pytest --cov=client client.py
+==== test session starts ====
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      25      0   100%
+
+==== 6 passed in 0.11 seconds ====
+
+

100% coverage and new functionality done! The developer give themselves some +pats in the back and go home.

+

But, in the middle of the night, one of the managers who is also a friend of +Björk, gets a call from her telling that she tried to buy something and just +got an error message. The developer gets in the office next morning, sees the +manager email complaining about their famous friend being blocked and goes +into fixing the code:

+
class Client:
+    def __init__(self, name):
+        self.name = name
+
+

There, no more validation6 e now Björk can buy whatever she wants. But +running the tests:

+
==== FAILURES ====
+____ test_client_error ____
+
+    def test_client_error():
+        with pytest.raises(Exception):
+>           Client(name='Cher')
+E           Failed: DID NOT RAISE <class 'Exception'>
+
+client.py:37: Failed
+==== 1 failed, 5 passed in 0.63 seconds ====
+
+

Oh, sure! Cher is now a valid name and that behavior being tested is invalid. +We need to change the test to accept Cher:

+
def test_client_error():
+	"""Se tentar criar uma conta com 'Cher', deve funcionar."""
+	Client(name='Cher')
+
+

And running the tests once again:

+
$ pytest --cov=client  client.py
+==== test session starts ====
+rootdir: /home/jbiason/unitt, inifile:
+plugins: cov-2.4.0
+collected 6 items
+
+client.py ......
+
+---- coverage: platform linux, python 3.4.3-final-0 ----
+Name        Stmts   Miss  Cover
+-------------------------------
+client.py      24      0   100%
+
+==== 6 passed in 0.12 seconds ====
+
+

Wonderful! Everything is working with the expected behaviors and we still have +100% coverage.

+

But can you spot the problem in the code?

+

The problem is now that _multiple_names is not being used anywhere, but it +is shown as "alive" 'cause there is a lost test that keeps saying that the +code is being used. If we had started with just the behavior tests -- +using just the system inputs and outputs -- right out of the bat we would see +that the function is not used anymore -- and if we need it in the future... +well, that's what version control systems are for.

+

Although this looks like a silly example, there are some cases in which the +processing flow can be changed by the environment itself. For example, in +Django, you can add "middleware" classes, which are capable of intercepting +Requests or Responses and change their result. The most common example of +middleware is the Authentication, which adds the logged user information in +the Request; but those changes can be more deep, like changing some form +information. In those cases, the input (or the output, or both) is changed +and writing tests that ignore the middleware will not be a correct +representation of the input (or output, or both) of the system. And there we +can ask if the test is valid 'cause it is using a state that should not exist +in the normal use of the system.

+

Mocks

+

Some time ago, I used to say that mocks should be used for things external to +the system. But I realized that definition is not quite correct -- there are +external things that shouldn't be mocked -- and that a better definition for +what should be mocked is "anything that you have no control".

+

For example, if you're writing a system that uses IP geolocation using an +external service, you probably will mock the call for that service, as it is +out of your control. But a call to a database, when you're using a +system/framework that abstracts all the calls for the database (like Django +does), then the database, even being an external resource, is still under your +control and, thus, shouldn't be mocked -- but since the system/framework +offers a database abstraction, using any database shouldn't affect the +results.

+

Another example are microservices. Even microservices inside the same company +or steam are external and out of control of the project and, thus, should be +mocked. "But they are from the same team!" Yes, but they are not part of the +same project and a) the idea behind microservices is to uncouple those +services and/or b) are in different directory trees. One of the advantages of +microservices from the same team is that the expected contract from one is +know by the team and that could be easily mocked (the team knows that, calling +a service with X inputs, it should receive an Y response -- or error).

+

Conclusion

+

Again, the idea is not to rewrite every test that you have 'cause "the right +way is my way". On the other hand, I see a lot of tests being written in any +way, just using the context of "one test for each function/class" and, in some +cases, that doesn't make any sense and should get a little more thinking. By +exposing those "impure thoughts" about tests, I hope that would make people +rethink the way they are writing their tests

+
+
1 +

Unless you want to use roman numerals, but anyway...

+
+
2 +

The reason for being changed to a string can be anything: due some +security plugin, 'cause we are using a database that doesn't work properly +with integers, 'cause we are plugging this system with a legacy one...

+
+
3 +

A class that keeps customer information should be way more complex that +this, but let's keep it simple just for this example.

+
+
4 +

No, that's not really SOLID, but that's keep it simple again for this +example.

+
+
5 +

Someone will send me the "Fallacies Developers Believe About User Names" +links for this, right?

+
+
6 +

Sure, I should change just _validate_name, but this way it makes it +even more clear what the problem is.

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/rms-and-fsf-again/index.html b/public/thoughts/rms-and-fsf-again/index.html new file mode 100644 index 0000000..4edcc7a --- /dev/null +++ b/public/thoughts/rms-and-fsf-again/index.html @@ -0,0 +1,207 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

FSF and rms (Again)

+ +

About six months ago, in 2020-09-161, Richard Stallman, a.k.a. "rms", resigned from +FSF +(the Free Software Foundation, maintainer of the GPL family of licenses) with +not-so-great headlines. A week ago, in 2021-03-22, rms told the world that he +is back.

+

And now we have a huge mess. Again.

+

First of all...

+

Let me say this first and foremost: No one is denying the works of rms. No one +is denying that taking a huge undertaking of writing a whole compiler to +produce an open source operating system isn't without merit. All those are +recognizable and show a lot of effort for the greater good.

+

But then...

+

There are allegations coming from all sides that rms seems to harass people +(mostly women), some people feeling uncomfortable with his words and acting; +and we also have people saying that it is not all that, that there is a +"lynching" going around (I'm not kidding) and general support for him.

+

"Is he a bad or good person?" is not a question I intent answer here. This is +not the part that annoys me in this whole discussion.

+

Due his strong opinions and general complains about his presence, +he decided to resign from the FSF, the body responsible for the GPL license and +everything related to it, from keeping it active to helping developers with +legal situations with the license.

+

(Personally, while the linked article points that his resignation was in part +for the news about people using the "services" of Jeffrey Epstein of young +girls for sex, I've read that rms support for Marvin Minsky, cited in Epstein +list of clients, was not "yeah, sex with kids is alright!" but actually "I +think Minsky was convinced that the girls weren't underage and forced into +sex, so he was unknowingly part of it" -- again, that's my understanding. +And only on that point, just to be clear.)

+

But, in the end, that's what's pointed as his resignation.

+

And then...

+

In 2021-03-22, rms appeared in an online event, +LibrePlanet to announce that he's back into +the board of the FSF. There wasn't an official statement about it, it was like +a huge surprise for everyone.

+

In the follow days, RedHat, FSFE (Free Software Foundation Europe) and a lot +other companies and groups removed their support for the FSF.

+

But...

+

The first problem I see with it all is that the FSF, while promoting the +openness of software, by securing a license that allows anyone to have access +to the code, a license that promotes the evolution of code in the open, suddenly took +a closed decision behind closed doors without consulting anyone outside the +board.

+

It seems weird promoting openness when they are closed in their own decisions.

+

Also...

+

The second problem is the content of the announcement.

+

Again, without ever getting into "he said that" "he didn't said that" matter, +one must recognize what they said that could cause people to revolt. +There wasn't any words about "Look, thinks I said were taken out of +context" or even a "I've chosen words poorly and that hurt people, and I +promise I'll take care of that in the future"2.

+

I believe that if there was any mention of that, the current revolt wouldn't be +so strong. Not saying "There wouldn't be any", but less aggressive. Heck, if +there was the acknowledgment that he learnt why there was a revolt in the first +place, this time it would be a lot less painful.

+

And finally...

+

The third problem is the current state of free software. No, I don't mean "WE +ARE BEING SWALLOWED BY CORPORATE GREED", although that's partially true, but we +are seeing the use of "kind-of-open-source-but-not-quite" license, a.k.a. +"source available" license, like the +SSPL being recently +adopted by the Elastic Corporation.

+

While resources from FSF could be used to dispel any +FUD or +misconceptions about GPL licenses, we now focus on "Should he be in the +board?". The board even had to engineer a staff member to act as +director +and other measures of openness, when there should be a focus on making sure +"source available" licenses don't spread too much.

+

In conclusion...

+

I just have one question floating my head right now: Does anyone need to be on +the board to actually help the FSF? Imagine if instead of "I'm back to the +board of FSF", rms announcement actually was "I'm back helping the FSF promote +free software". Sure, some people would complain, but you can see that even +them would think "Yeah, but he's not part of the FSF." And life would move +on, and the FSF could focus on the GPL and other licenses, and helping +companies not get trapped into "source-available license is our only solution" +and so on.

+

So why in the board? Isn't there any other position where rms can't help the +FSF? I pretty much doubt that, but someone (or someones) decided that wasn't +enough; board or burst.

+

"Since he's there, just leave him there" as a way to quell the discussion is no +way to deal with this. Unless we see open discussion on why -- and, for morbid +curiosity, who -- rms is back on the board, the whole point of the FSF as +promoters of openness feels shaken to me, personally.

+

Post-script

+

One of the easiest way to make a project crumble is to have heroes. "If this +person takes a vacation, the system will crash", "The whole success of this +project is due that person" are very bad signs in a project.

+

For example, when Guido von Rossum decided to resign from his BDFL position, +the whole Python community scrabbled to figure out a way to move along -- +mostly 'cause the community put a lot of pressure on him because it thought the +only way to move forward was with Guido at the helm. The Rust community, on the +other hand, focus a lot of taking this image of "This is the project of this +person" by giving small parts to a lot of people: I know there is a person +leading the "better error messages" part, I know there is a person leading the +"async" part (although I'm seeing a movement on the lead of that part), I know there +is person leading the "Rust in Embedded environments" part and so on. If any +one of those resigns, I don't feel like the Rust ecosystem is in danger; it is +only part of it, and a substitute can be found 'cause that person was not "the +hero" of that part.

+

That need for heroes seems to be part of the problem with FSF: With rms out, +there was no hero in tow to promote the project. Because nobody actually tried +to move out of rms shadow before his resignation, the leadership ended with a +vacuum that nobody filled -- or felt the need to fill. That was the moment to +push small projects, assign several names (maybe a handful of names) into those +projects and show that the FSF found a better way to move. But because they +never tried to innovate, they seems to have get stuck into "finding another +hero" and decided to call the old one back.

+

Free Software shouldn't be synonymous of rms.

+
+
1 +

Well, screw this, I don't want to use the Imperial format for dates and I +don't want to confuse people that use the Imperial format, so let's go with +the ISO format and confuse the world.

+
+
2 +

That isn't that freaking hard, people! I've been called out for using +"guys", which I responded that I understood what they meant, would take more +care in the future, and thanked for their reply. From that point, instead of +"guys", I use "people" and neutral pronouns. And it doesn't freaking +hurt at all (although it is really hard when my native language -- +Portuguese -- have only gendered pronouns, but I try).

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/the-hidden-value-of-tiktok/index.html b/public/thoughts/the-hidden-value-of-tiktok/index.html new file mode 100644 index 0000000..a6d3ad5 --- /dev/null +++ b/public/thoughts/the-hidden-value-of-tiktok/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Hidden Value of TikTok

+ +

As if 2020 wasn't weird enough, Oracle bought the US operations of TikTok, +which makes no sense.

+

Except when it does.

+

Background 1

+

For some reason, the USA president thought a popular Chinese application +should not operate on USA soil. So TikTok would be banned from USA internet.

+

Why? Dunno why, but probably for a trade war.

+

There was one chance for TikTok to continue working on USA: if it was operated +by an American company.

+

Background 2

+

Oracle is famous for its databases. When someone says "Oracle", the mind of +most developers jump to databases, either by its namesake or MySQL or +SQLite12.

+

So, when the news of Oracle buying the TikTok operations in USA, that confused +a lot of people, to the point of saying that it would accomplish +nothing.

+

But it does. A lot. That's why we need more background.

+

Background 3

+

Oracle is also a player in a larger market called "Cloud Providers". This +market is lead by Amazon with AWS, followed by Microsoft with Azure, then +Google with Google Cloud Platform (GCP) and a mishmash of Huawei with Huawai +Cloud and Oracle with Oracle Cloud.

+

One of the important things, marketing-wise, is who is using your product. You +get a big player and you can use them as sort of endorsement.

+

AWS captures a lot of those, but most prominent are the Amazon Store itself +and Netflix; Microsoft have the whole Office365; Google have Spotify. And, up +to a few months, Oracle had nothing (Huawei have the whole Chinese market, so +it is, basically, a player on its own).

+

Background 4

+

A few months ago, Zoom made a surprising announcement of taking Oracle Cloud +as its provider. +People were expecting this announcement saying something like Microsoft or +even Google, but... Oracle? That was a huge surprise but, at the same time, it +gave Oracle the leverage to say "the most used video conferencing software now +runs on Oracle Cloud".

+

So, does it make sense?

+

Sure it does. Not in the technological point, although Oracle could profit +with the knowledge of serving lots of videos over the internet for its own +cloud operations, but it gives them another big name as sort of endorsement of +its cloud service. "TikTok, powered by Oracle Cloud" is one hell of an +advertisement.

+

And I think that's why it does accomplish a lot.

+

The biggest loser

+

When TikTok operations where on the table, Oracle wasn't the only one to get +it: Microsoft was far away in talks with TikTok to be the USA operator of the +service.

+

But besides that, Microsoft isn't the biggest loser in this sale of +operations. Google is.

+

Remember when I mentioned that Google is considered to be in the third place +in the cloud market? Now Oracle have Zoom and TikTok as endorsers and users of +their services. And that could give a huge boost for Oracle Cloud, even if not +by getting more customers or more profit, but the numbers from hosting those +two services may give the impression they surpassed GCP.

+

It's all a marketing move. And a pretty clever one.

+
+
1 +

Yes, MySQL and SQLite are Oracle products.

+
+
2 +

NO! Not SQLite! Oracle bought Berkeley DB, which is mostly always +available on Linux systems.

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/the-sad-life-of-walter-mitty/index.html b/public/thoughts/the-sad-life-of-walter-mitty/index.html new file mode 100644 index 0000000..70fd8d5 --- /dev/null +++ b/public/thoughts/the-sad-life-of-walter-mitty/index.html @@ -0,0 +1,108 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

The Sad Life of Walter Mitty

+ +

I once wrote about The Secret Life of Walter +Mitty +and how nice story about a guy outgrowing his daydreams.

+ +

But today I realized I see everything wrong.

+

The second time I watched the movie, in the scene Walter talks to Todd (from +E-Harmony) on the top of the Himalayas, I thought "Well, that's one hell of a +mobile company, they have signal on the top of Himalayas".

+

The third time I realized how the signal was that good: Walter never went to +the Himalayas.

+

Let's assume that, in the story, Walter really went to Greenland and Iceland +and came back. And then he got fired by losing the negative #25. This is where +I believe everybody is tricked. At that point, Walter actually lost his only +connection to the real life (his job) and descend into a full time illusion.

+

That's why the recluse Mitty went to Afghanistan and had to give cake to guys +with guns. That's how his call is crystal clear on the top of Himalayas. That's +why Tood, who never really knew Walter, went to the airport to rescue him. +That's how his E-Harmony profile suddenly was the hottest profile ever. That's +why the piano check was so large, so he wouldn't need to worry about his +unemployed life. That's why his mom saved the wallet. This how he finally +manages to face Ted. That's why Cheryl is right there when he gets his +severance check. And that's how his damn face appears on the cover of Life. +That even explains why Sean never took the picture -- if there is no picture, +there is nothing to show that the whole thing was a dream.

+

When you pick the "he's in complete disconnection with reality and he lives in +his imagination now", the whole ending stops being a succession of lucky +happenings and starts to make sense. A sad sense, but a sense, nonetheless.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/things-i-learnt-the-hard-way-the-book/index.html b/public/thoughts/things-i-learnt-the-hard-way-the-book/index.html new file mode 100644 index 0000000..e4605d1 --- /dev/null +++ b/public/thoughts/things-i-learnt-the-hard-way-the-book/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way - The... Book?

+ +

Random thought about the previous post about "Things I Learnt The Hard Way".

+ +

When I wrote the post about "Things I Learnt The Hard Way", I never thought it +would gather the traction it did.

+

It was posted on Reddit, +on Lobste.rs, +and it is being discussed on Twitter.

+

None of those was posted by me (except a single tweet, which didn't gather +that much attention).

+

Since then, I've added a bunch of new points -- as life goes on, I remember +another thing that I forgot to mention in the first time -- and when I write +this new post, the original now captures 83 (!!!) points.

+

But while the short format gives a quick idea of what I meant, it doesn't +properly explain the points -- and a lot of people are (correctly) raising +those in the discussion boards. So I feel I should really expand those.

+

And, at the same time, I have created a few macros for +Zola (the blogging engine I'm using) to "publish" some +books (if you allow me to be really loose with the meaning of "publishing").

+

That's why I'm currently considering expanding the points in a digital book +format, also here in this blog, using each point as a chapter.

+

I'll still update the original post, but expanding the points into chapters +will give me more room to put my thoughts on each of them, and I can link each +point to the longer explanation.

+

Sounds like a plan, doesn't it?

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/things-i-learnt-the-hard-way/index.html b/public/thoughts/things-i-learnt-the-hard-way/index.html new file mode 100644 index 0000000..753a119 --- /dev/null +++ b/public/thoughts/things-i-learnt-the-hard-way/index.html @@ -0,0 +1,791 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Things I Learnt The Hard Way (in 30 Years of Software Development)

+ +

This is a cynical, clinical collection of things I learnt in 30 years working +with software development.

+

Again, some things are really cynical, others are long observations on +different jobs.

+

Software Development

+

Spec first, then code

+

If you don't know what you're trying to solve, you don't know what to code.

+

Write something specifying how the application works before writing any code.

+

"Without requirements or design, programming is the art of adding bugs to an +empty text file." -- Louis Srygley

+

Sometimes, even an "elevator pitch" -- up to two paragraphs that describe what +the application does -- is enough.

+

The times I stood longer looking at my own code wondering what to do next were +when we didn't have the next step defined. It is a good sign that it's time to +stop and discuss it with your coworkers -- or maybe rethink the solution.

+

Write steps as comments

+

If you have no idea how to start, describe the flow of the application in high +level, pure English/your language first. Then fill the spaces between comments +with the code.

+

Better yet: think of every comment as a function, then write the function that +does exactly that.

+

Gherkin is your friend to understand expectations

+

Gherkin is a test description format which points "Given that the system is in +a certain state, When something happens, then this is expected". Even if +you don't use any testing tool that reads Gherkin, it will give you a good +understanding of what it is expected from the app.

+

Unit tests are good, integration tests are gooder

+

On my current job, we do test modules and classes only (for example, we write +tests for the view layer only, then tests for the controller layer only, and so +on). It gives us some idea if things are going right or not, but they lack a +view of how the whole is going on -- a thing integration tests, which tests how +the system as a whole behaves -- do better.

+

Tests make better APIs

+

We code in layers: There is the storage layer, which should make our data +permanent; there is a processing layer, which should do some transformation on +the data stored; there is a view layer, which has information on how the data +must be present; and so on.

+

As I mentioned, integration tests feel better, but testing layers by themselves +can give you a better view on how their API looks like. Then you can have a +better look on how to call things: Is the API too complex? Do you have to keep +to much data around to be able to make a single call?

+

Make tests that you know how to run on the command line

+

Not that command lines are important for any projects, but when you know the +command to run the tests, you know how to automate the execution of the tests, +which you then can use in a continuous integration tool.

+

Be ready to throw your code away

+

A lot of people, when they start with TDD, get annoyed when you say that you +may have to rewrite a lot of stuff, including whatever your already wrote.

+

TDD was designed to throw code away: The more you learn about your problem, +the more you understand that, whatever you wrote, won't solve the problem in +the long run.

+

You shouldn't worry about this. Your code is not a wall: if you have to throw +it always, it is not wasted material. Surely it means your time writing code +was lost, but you got a better understanding about the problem now.

+

Good languages come with integrated tests

+

You can be sure that if a language brings a testing framework -- even minimal +-- in its standard library, the ecosystem around it will have better tests +than a language that doesn't carry a testing framework, no matter how good the +external testing frameworks for the language are.

+

Future thinking is future trashing

+

When developers try to solve a problem, they sometimes try to find a way that +will solve all the problems, including the ones that may appear in the future.

+

But here is the thing: The problems from the future will never come and you'll +end up either having to maintain a huge behemoth of code that will never be +fully used or you'll end up rewriting the whole thing 'cause there is a shitton +of unused stuff.

+

Solve the problem you have right now. Then solve the next one. And the next +one. At one point, you'll realize there is a pattern emerging from those +solutions and then you'll find your "solve everything".

+

Documentation is a love letter to your future self

+

We all know writing the damn docs for functions and classes and modules is a +pain in the backside. But realizing what you were thinking when you wrote the +function will save your butt in the future.

+

The function documentation is its contract

+

When you start the code by writing the documentation, you're actually making a +contract (probably with your future self): I'm saying this function does this +and this is what it does.

+

If later you find out that the code doesn't match the documentation, you have a +code problem, not a documentation problem.

+

If a function description includes an "and", it's wrong

+

Functions should do one thing and one thing only. When you're writing the +function documentation and find that you added an "and", it means the function +is doing more than one thing. Break that function into two and remove the +"and".

+

Don't use Booleans as parameters

+

When you're designing a function, you may be tempted to add a flag. Don't do +this.

+

Here, let me show you an example: Suppose you have a messaging system and you +have a function that returns all the messages to an user, called +getUserMessages. But there is a case where you need to return a summary of +each message (say, the first paragraph) or the full message. So you add a +flag/Boolean parameter called retrieveFullMessage.

+

Again, don't do that.

+

'Cause anyone reading your code will see getUserMessage(userId, true) and +wonder what the heck that true means.

+

You can either rename the function to getUserMessageSummaries and have +another getUserMessagesFull or something around those lines, but each +function just call the original getUserMessage with true or false -- but the +interface to the outside of your class/module will still be clear.

+

But don't add flags/Boolean parameters to your functions.

+

Beware of interface changes

+

In the point above, I mentioned about renaming the function. If you control +the whole source where the function is used, that's not issue, it's just a +matter of search and replace.

+

But if that function is actually exposed by a library, you shouldn't change +function names in a whim. That will break a lot of other applications beyond +your control and make a lot of other people unhappy.

+

You can create the new functions and mark the current one as deprecated, +either by documentation or by some code feature. Then, after a few released, +you can finally kill the original function.

+

(A dickish move you can do is to create the new functions, mark the current +function as deprecated and add a sleep at the start of the function, in a +way that people using the old function are forced to update.)

+

Good languages come with integrated documentation

+

If the language comes with its own way of documenting +functions/classes/modules/whatever and it comes even with the simplest doc +generator, you can be sure that all the language +functions/classes/modules/libraries/frameworks will have a good documentation +(not great, but at least good).

+

Languages that do not have integrated documentation will, most of the time, +have a bad documentation.

+

A language is much more than a language

+

A programming language is that thing that you write and make things "go". But +it has much more beyond special words: It has a build system, it has a +dependency control system, it has a way of making tools/libraries/frameworks +interact, it has a community, it has a way of dealing with people.

+

Don't pick languages just 'cause they easier to use. Always remember that you +may approve the syntax of a language for being that easy, but you're also +enabling the way maintainers deal with the community by choosing that language.

+

Sometimes, it's better to let the application crash than do nothing

+

Although that sounds weird, it's better to not add any error handling than +silently capturing errors and doing nothing.

+

A sadly common pattern in Java is

+
try {
+  something_that_can_raise_exception()
+} catch (Exception ex) {
+  System.out.println(ex);
+}
+
+

This does nothing to deal with the exception -- besides printing it, that is.

+

If you don't know how to handle it, let it happen,so you can figure out when +it will happen.

+

If you know how to handle the issue, handle it

+

Counter-point to the previous point: If you know when something will raise an +exception/error/result and you know how to handle it, handle it. Show an error +message, try to save the data somewhere else, capture the user input in a log +file to later processing, but handle it.

+

Types say what you data is

+

Memory is just a sequence of bytes; bytes are just numbers from 0 to 255; what +those numbers mean is described on the language type system.

+

For example, in C, a char type of value 65 is most probably the letter "A", +which an int of value is 65 is the number 65.

+

Remember this when dealing with your data.

+

This is what most people get wrong about adding booleans to check the number +of True values. Here, let me show you an example of JavaScript that I saw +recently:

+
console.log(true+true === 2);
+> true
+console.log(true === 1);
+> false
+
+

If your data has a schema, use a structure to keep it

+

You may be tempted to use a list (or tuple, if your language allows) to keep +your data if it's simple -- like, say, only 2 fields.

+

But if you data has a schema -- it has a fixed format -- you should always +use some structure to keep it, but it a struct or a class.

+

Understand and stay way of cargo cult

+

"Cargo cult" is the idea that, if someone else did, so can we. Most of the +time, cargo cult is simply an "easy way out" of a problem: Why would we think +about how to properly store our users if X did that?

+

"If BigCompany stores data like this, so can we".

+

"If BigCompany is behind this, this is good."

+

"Right tool for the job" is just to push an agenda

+

"Right tool for the job" should be an expression that meant that there is a +right and a wrong tool to do something -- e.g., using a certain +language/framework instead of the current language/framework.

+

But every time I heard someone mention it, they were trying to push their +favourite language/framework instead of, say, the right language/framework.

+

"The right tool" is more obvious than you think

+

Maybe you're in a project that needs to process some text. Maybe you're +tempted to say "Let's use Perl" 'cause you know that Perl is very strong in +processing text.

+

What you're missing: You're working on a C shop. Everybody knows C, not Perl.

+

Sure, if it is a small, "on the corner" kind of project, it's fine to be in +Perl; if it is important for the company, it's better that if it is a C +project.

+

PS: Your hero project (more about it later in this doc) may fail due this.

+

Don't mess with things outside your project

+

Sometimes people are tempted to, instead of using the proper extension tools, +change external libraries/frameworks -- for example, making changes directly +into WordPress or Django.

+

This is an easy way to make the project unmaintainable really really fast. As +soon as a new version is released, you'll have to keep up your changes in sync +with the main project and, pretty soon, you'll find that the changes don't +apply anymore and you'll leave the external project in an old version, full of +security bugs.

+

Data flows beat patterns

+

(This is personal opinion) When you understand how the data must flow in your +code, you'll end up with better code than if you applied a bunch of design +patterns.

+

Design patterns are used to describe solutions, not to find them

+

(Again, personal opinion) Most of the time I saw design patterns being +applied, they were applied as a way to find a solution, so you end up twisting +a solution -- and, sometimes, the problem it self -- to fit the pattern.

+

First, solve your problem; find a good solution; then you can check the +patterns to know how you name that solution.

+

I saw this happens a lot: We have this problem; a design pattern gets close +to the proper solution; let's use the design pattern; now we need to add a lot +of things around the proper solution to make it fit the pattern.

+

Learn the basics functional programming

+

You don't need to go deep into "what is a monad" and "is this a functor". But +remember to not keep changing your data all the time, create a new element +with the new values (treat your data as immutable) and make functions/classes +that don't keep some internal state (pure functions/classes) if possible.

+

Cognitive Cost is the readability killer

+

"Cognitive dissonance" +is a fancy way of saying "I need to remember two (or more) different things at +the same time to understand this." Keeping those different things in your head +creates a cost and it keeps accumulating the more indirect the things are +('cause you'll have to keep all those in your head).

+

For example, adding booleans to count the number of True values is a mild +cognitive dissonance; if you're reading a piece of code and see a sum() +function, which you know makes the sum of all numbers in a list, you'd expect +the list to be composed of numbers, but I've seen people using sum() to +count number of True values in a list of booleans, which is confusing as heck.

+

The Magical Number Seven, Plus or Minus Two

+

"The magical number" +is a psychology article about the number of things one can keep in their mind +at the same time.

+

If you have a function, that calls a function, that calls a function, that +calls a function, that calls a function, that calls function, you may be sure +it will be a hell to read later.

+

Think more about: I'll get the result of this function, then pass it to the +second function, get its result, pass to the third an so on.

+

But:

+
    +
  1. Today, psychologists talk more about the magical number FOUR, not seven.
  2. +
  3. Think function composition (as in "I'll call that function, then that +function, then that function..."), not function calling (as in "That +function will call that function, that will call that function...").
  4. +
+

Shortcuts are nice, but only in the short run

+

A lot of languages/libraries/frameworks add a way to make things shorter, +reducing the number of things you need to type.

+

But, later, that will bite you and you'll have to remove the shortcut and do +the long things.

+

So learn what the shortcut does before using it.

+

You don't need to write things the hard way first and then clean up using the +shortcuts: All you need to do is what the shortcut does in the background, so +you at least have knowledge of what can go wrong using it, or how to replace +it with the non-shortcut version.

+

Resist the temptation of "easy"

+

Sure that IDE will help you with a ton of autocomplete stuff and let you +easily build your project, but do you understand what's going on?

+

Do you understand how your build system works? If you had to run it without +the IDE, would you know how?

+

Can you remember your function names without autocomplete? Isn't there a way +to break/rename things to make them easier to understand?

+

Be curious about what goes behind the curtains.

+

ALWAYS use timezones with your dates

+

When dealing with dates, always always add the timezone with it. There +will be always a problem with your computer timezone and the production +server timezone (or one of the instances timezones) and you'll lose a lot of +time trying to debug what the heck the interface is showing the wrong time.

+

ALWAYS use UTF-8

+

The same problem you'll have with dates, you'll have with character encoding. +So always convert your strings to UTF8; save them in the database as UTF8; +return UTF8 on your APIs.

+

(You may convert to any other encoding, but UTF8 won the encoding wars, so it +is easier to keep it this way.)

+

Start stupid

+

One way to get away from the IDE is to "start stupid": Just get the compiler +and get an editor (ANY editor) with code highlight and do your thing: Code, +build it, run it.

+

No, it's not easy. But when you jump into some IDE, you'll think of buttons of +simply "Yeah, it runs that" (which is exactly what IDEs do, by the way.)

+

Logs are for events, not user interface

+

For a long time, I used logs to show the user whatever was happening -- +'cause, you know, it's a lot easier to use a single thing instead of two.

+

Use the standard output to inform the user of events, standard err to inform +the user about errors but use logs to capture something that you can later +process easily.

+

Think about logs of something you'll have to parse to extract some information +at that time, not user interface; it doesn't have to be human-readable.

+

Debuggers are over-rated

+

I heard a lot of people complaining that code editors that don't come with +debugging are terrible, exactly because they don't come with debugging.

+

But when your code is in production, you can't run your favorite debugger. +Heck, you can't even run your favourite IDE. But logging... Logging runs +everywhere. You may not have the information you want at the time of the crash +(different logging levels, for example) but you can enable logging to figure +out something later.

+

(Not saying debuggers are bad, they just not as helpful as most people would +think.)

+

Always use a Version Control System

+

"This is my stupid application that I just want to learn something" is not +even a good excuse to not use a version control system.

+

If you start using a VCS right from the start, it will be easier to roll back +when you do something stupid.

+

One commit per change

+

I've seen people writing commit messages like "Fixes issues #1, #2 and #3". +Unless all those issues are duplicates -- in which two of those should be +already closed -- they should be 3 commits, not one.

+

Try to keep a change in a single commit (and by change I don't mean "one file +change"; if a change requires changes in three files, you should commit those +three files together. Think "if I revert this back, what must go away?")

+

"git add -p" is your friend when you overchange

+

(Git topic only) Git allows merging a file partially with "-p". This allows +you to pick only the related changes and leave the other behind -- probably +for a new commit.

+

Organize projects by data/type, not functionality

+

Most projects keep an organization like:

+
.
++-- IncomingModels
+|   +-- DataTypeInterface
+|   +-- DataType1
+|   +-- DataType2
+|   +-- DataType3
++-- Filters
+|   +-- FilterInterface
+|   +-- FilterValidDataType2
++-- Processors
+|   +-- ProcessorInterface
+|   +-- ConvertDataType1ToDto1
+|   +-- ConvertDataType2ToDto2
++-- OutgoingModels
+    +-- DtoInterface
+    +-- Dto1
+	+-- Dto2
+
+

in other words, they keep data organized by functionality (all the incoming +models are in the same directory/package, all the filters are in the same +directory/package and so on).

+

This is fine and works. But when you organize by data, it'll make a lot easier +to split your project in smaller projects -- 'cause, at some point, you may +want to do almost the same thing as you're doing right now, but with small +differences.

+
.
++-- Base
+|   +-- IncomingModels
+|   |   +-- DataTypeInterface
+|   +-- Filters
+|   |   +-- FilterInterface
+|   +-- Processors
+|   |   +-- ProcessorInterface
+|   +-- OutgoingModels
+|       +-- DtoInterface
++-- Data1
+|   +-- IncomingModels
+|   |   +-- DataType1
+|   +-- Processors
+|   |   +-- ConvertDataType1ToDto1
+|   +-- OutgoingModels
+|       +-- Dto1
+...
+
+

Now you can make a module that deals only with Data1, another that works +only with Data2 and so on. And then you can break them into isolated modules.

+

And then when you have another project that also have Data1 but also deals +with Data3, you can reuse most of the stuff in the Data1 module.

+

Create libraries

+

I've seen a lot of projects that either make a mega repository with different +projects or keep different branches that instead of just being a temporary +environment for later joining the main development area, are just to keep that +small, different thing going (picking the point above about modularization, +imagine that instead of building a new project that reuse the Data1 type, I +have a branch that has a completely different main function and the Data3 +type).

+

Why not split the common parts into libraries and require it in different +projects?

+

The reason is, most of the time, 'cause people don't know how to either +create libraries or they worry how they are goint to "publish" those libraries +into the dependency sources without giving it around (so maybe it's a good +idea to also understand how your project management tool retrieves +dependencies, so you can create your own dependency repository).

+

Learn to monitor

+

On a previous life, to understand how a system behaved, I added a ton of +metrics: how fast things were going in, how fast things were going out, how +many things were in the middle, how many the job processed...

+

It gives a really good view of how a system is behaving. Is the speed going +down? If it is, I can check what is going into the system to understand why. Is +it normal going down at some point?

+

Thing is, after this, it is really weird trying to figure out how "healthy" a +system without any monitoring is after that. Checking a system health with just +"Is it answering requests" doesn't fly anymore.

+

Adding monitoring early will help you understand how your system behaves.

+

The config file is friend

+

Imagine you wrote a function that you have to pass a value for it to start +processing (say, a twitter user account id). But then you have to do that with +two values and you just call the function again with the other value.

+

It makes more sense to use a config file and just run the application twice +with two different config files.

+

Command line options are weird, but helpful

+

If you move things to config files, you could also help your users by adding +an option to select the config file and expose it.

+

There are libraries to handling command line options for every language today, +which will help you into building a good command line and giving your users a +standard interface for everything.

+

Not just function composition, but application composition

+

Unix came with the idea of "applications that do one thing and do it well".

+

Now, I said you could use one application with two config files, but what if +you need the result of both applications?

+

That's when you can write an application that reads the results of the first +one with both config files) and turn into a single result.

+

Even for app composition, start stupid

+

Application composition may lead to microservices -- which is good -- but +microservices require some ideas about how applications "talk" between them +over the wire (protocols and such).

+

You don't need to start with that. Both applications can write and read from +files, which is way easier.

+

Worry about talking over the wire later, when you understand how networks +work.

+

Optimization is for compilers

+

Let's say you need more performance. You may be tempted to look at your code +and thing "where I can squeeze a little bit more performance here" or "How can +I remove a few cycles here to get more speed".

+

Well, guess what? Compilers know how to do that. Smarted compilers can even +delete your code 'cause it will always generate the same result.

+

What you need to do is think a better design for your code, not how to +improve the current code.

+

Code is humans to read. ALWAYS. Optimization is what compilers do. So find a +smarted way to explain what you're trying to do (in code) instead of using +shorter words.

+

By lazy (evaluated)

+

A long time ago, a small language made the rounds by not evaluating +expressions when they appeared, but when they were needed.

+

Lisp did this a long time ago, and now most languages are getting it too.

+

For example, Python have the yield statement, which will stop the execution +of the current function and return the value immediately, yielding a new +value only when the function is called again. If you chain functions that keep +yielding results, you won't need as much memory as functions that keep +returning lists.

+

On a Team/Work

+

Code reviews are not for style

+

Take your time on code reviews to point architectural or design problems, not +code style problems. Nobody really likes the person whose code reviews are only +"you left blanks in this line" or "missing space before parenthesis" and such.

+

Now, if you do find architectural or design problems, then you can add your +code style problems.

+

Code formatting tools are ok, but they are no silver bullet

+

One thing a team may be tempted to do to avoid discussing style in code reviews +is to use a code formatting tool to auto-format code before committing.

+

Now yeah, that kinda solves the problem, but there is one small problem: +we, humans, are not as flexible to read code as computers are; what is +readable by a computer may not be readable by a human. Surely they try to +create some heuristics on what is good for human reading, but that doesn't mean +it gets right.

+

If you do use a code formatting tool, use it to find out where it changes the +code the most; you probably need to simplify that part of the code to avoid it +messing so much.

+

Code style: Follow it

+

If your project have a defined code style, you must follow it. Sometimes it +may not be clear ("this struct/class should be singular or plural"?), but do +your best to follow it.

+

... unless that code style is the Google Code style

+

(Totally personal opinion, feel free to disagree) Every freaking time Google +comes with their own coding style, it's a garbage fire. The community came +with a better style way before and Google seem to come with a style with high +contrasting parts just to call it theirs.

+

There is only one coding style for C/C++: K&R

+

(Totally personal opinion again) Every other coding style is WRONG. :)

+

There is only one coding style for Python: PEP8

+

The community (most of it) writes code in PEP8. Follow it and your code +smoothly integrate with the rest of the ecosystem.

+

Explicit is better than implicit

+

You know what's one of the worst function names ever? sleep().

+

Sleep for how long? It is seconds or milliseconds?

+

Be explicit with what you use; sleepForSecs and sleepForMs are not +perfect, but are better than sleep.

+

(Think about this when you're writing your app command line interface or its +config file.)

+

(I could throw the whole "Zen of Python" here, but I'm trying to focus on +personal, direct experience.)

+

Companies look for specialists but keep generalists longer

+

If you know a lot about one single language, it may make it easier to get a +job, but in the long run, language usage dies and you'll need to find +something else. Knowing a bit about a lot of other languages helps in the long +run, not to mention that may help you think of better solutions.

+

"A language that doesn't affect the way you think about programming, is not +worth knowing." -- Alan Perlis

+

For a long time, I kept a simple programming rule: The language I'm playing at +home should not be the same language I'm using at work. This allowed me to +learn new things that later I applied in the work codebase.

+

I learnt how generics work in Java by writing Rust code; I understood how +Spring does dependency injection by reading how to do it in C++.

+

Think of the users

+

Think how the data you're collecting from your users will be used -- this is +more prevalent on these days, where "privacy" is a premium.

+

If you capture any used data, remember to protect it against unauthorized use.

+

The best secure way to deal with user data is not to capture it

+

You can be sure that, at some point, the data will leak, either by some +security flaw or human interference.

+

If you don't capture any user data -- or store it in anonymized way -- you +won't have any problems.

+

Keep a record of "stupid errors that took me more than 1 hour to solve"

+

I tried but never managed to create a list of stupid errors I kept finding +that took more than 1 hour to solve it, which were simply "forgot to add +dependency" or "add annotation", mostly because there was more than once that +I kept fighting some stupid error for more than 1 hour.

+

But you should try to keep a list of stupid errors that took you 1 hour to +solve, 'cause later you can use it to not stay more than 1 hour to solve some +stupid error.

+

If it doesn't run on your computer, you have a problem

+

I've seen a lot of systems that would never run on a isolated computer, like +the developer tool, 'cause the system requires running on a specialized +environment.

+

This is something that really kills productivity.

+

If your system will run on a specialized environment -- and I'm including "the +cloud" here -- look for something that can abstract whatever you're using. For +example, if you're using AWS SQS, which is a queue, look for a library that +can abstract the way a queue works so you can also run with RabbitMQ, which +can be easily run on your own computer.

+

If you're using a very specialized thing, you may have to write the +abstraction yourself, isolating it from the main system, so you can develop +the main product in peace.

+

Personal

+

When it's time to stop, it's time to stop

+

Learn when you can't code anymore. Learn when you can't process things anymore. +Don't push beyond that, it will just make things worse in the future.

+

I tried to keep coding once when I had a migraine (not strong, but not mild). +Next day, when I was better, I had to rewrite most of the stuff I did, 'cause +it was all shit.

+

Code of conduct protect you, not them

+

When you're beginning with any language/library/framework, check their CoC; +they will protect you from being harassed for not immediately getting what +is going on instead of blocking you from telling them what you think.

+

I'm mentioning this 'cause a lot of people complain about CoC, but they +forget that they allow them to join in any project without being called +"freaking noob" or "just go read the docs before annoying us".

+

Also, remember that most people that are against CoCs are the ones that want +to be able to call names on everyone.

+

Learn to say no

+

Sometimes, you'll have to say no: No, I can't do it; no, it can't be made in +this time; no, I don't feel capable of doing this; no, I don't feel +comfortable writing this.

+

Once I had to say to our CTO: "Ok, I'll do it, but I want to note that I don't +agree with what we are doing." In the end, the app was barred exactly because +the thing we were doing.

+

You're responsible for the use of your code

+

This is hard. Very very hard. It's the difference between "freedom" and +"responsibility".

+

There is nothing wrong in writing, for example, a software to capture people's +faces and detect their ethnicity, but you have to think about what that will +be used on.

+

Don't tell "It's done" when it's not

+

You are tired of running the same thing over and over again. You kinda +remember that something weird may happen, but because you're tired, you tell +everyone that "It's finished".

+

Don't do that.

+

Someone will try that weird case on the first run and immediately tell you +that it is not working.

+

You'll learn about yourself the hard way

+

We get frustrated with code that doesn't compile. We get angry with customers +asking things back and forth.

+

And we lash out on other when that happens.

+

And that will get you in trouble.

+

It happens.

+

People get pissed/annoyed about code/architecture because they care

+

You'll find yourself in the other side of the coin: You'll describe some +solution and people will seem annoyed/pissed about some solution.

+

When people care about a product/code, they do that.

+

"Yeah, you don't like that hushed solution 'cause you care" was one of the +nicest things someone told about myself.

+

Learn from your troubles

+

You'll get annoyed, pissed, frustrated, and angry. You'll get you in trouble. +You'll see people getting in trouble because of this kind of stuff.

+

You must learn about it. Don't ignore it.

+

One thing I learnt the hard way was that I get really aggressive when I'm +frustrated. Now, when I notice I start to get frustrated, I ask help from +someone else. It's really therapeutic to see that someone else also struggles +with your problem, and that's not just you.

+

Pay attention on how people react to you

+

I have a "angry man resting face" kind of face.

+

Sometimes I'll ask things and people will move a bit back -- like I'm telling +them their solution is wrong.

+

That's when I have to add "I'm not saying it's wrong, I'm just confused".

+

That may help you to not get in trouble.

+

Learn to recognize toxic people; stay away from them

+

You'll find people that, even if they don't small talk you, they will bad +mouth everything else -- even some other people -- openly.

+

Stay away from those people.

+

You have no idea how that kind of attitude will drive you down.

+

Beware of micro-aggressions

+

"Micro-aggressions" are aggressive comments in small doses. Like someone that +keeps calling you "that person" or seemingly innocuous comments about your +position in some policy.

+

Those are hard to fight, 'cause PR won't listen to you saying that they are +attacking you. Also, they are hard to detect, 'cause they seem small enough, +but they do pile up and you'll blow your anger all at once.

+

Better just stay away and avoid contact as possible.

+

No, I don't think they are "fixable"

+

(Personal opinion) Someone could say "Hey, maybe if you spoke to that person, +they would stop".

+

Personally, I don't think they would. This kind of stuff is going for so long +to them that it feels natural and, most of the time, you're the wrong one (for +not seeing that they are joking, for example, in true "Schrödinger's asshole" +style.)

+

Toxic/micro-aggressors are only fixable if they are YOU

+

Unless it's you realizing you're acting like a toxic person or micro-attacking +someone, and realize that you're actually doing more harm than good being that +way, there is no way to fix those traits (again, personal opinion).

+

...mostly 'cause hearing from someone else may feel "they are the ones +against me!" to them.

+

Hero Projects: You'll have to do it someday

+

An "hero project" is a project/spec change/framework that you personally think +will solve a group of problems in your project. It could be a different +architecture, a new framework or even a new language.

+

That means you'll spent your free time to write something that is already +being worked/exists just to prove a point.

+

Sometimes it proves you where wrong.

+

(But you got something from it, nonetheless.)

+

Don't confuse "hero project" with "hero syndrome"

+

I have seen this at least two times: Someone claims things don't work when +they aren't around or that they don't need help.

+

This is "hero syndrome", the idea that that person is the only one capable of +solving all the problems.

+

Don't be that person.

+

Learn when to quit

+

You tell your boss that you didn't finish on time because something weird +happened and he lashed out at you.

+

One of your coworkers is constantly micro-attacking you.

+

Another one is the guy that keeps doing stupid pranks, saying bullshit and +small talking other groups all the time.

+

A third is always complaining that when he's not around, things don't work.

+

It's time to start sending your resume around, no matter how good the pay is +or how awesome the project is.

+

... unless you want to be a constantly pissed off, annoyed person when you're +in the forties.

+

I.T. world is a very small egg

+

We have a expression here: "The world of something is a small egg", which +means that you don't live in a large world; the world is small.

+

I.T. world is really small.

+

The person you work with today will find you again in 15 years after you both +changed 3 or 4 jobs already.

+

And you'll meet a lot of other I.T. people in the way.

+

And they will talk about themselves.

+

And whatever you say/do will be talked around, which one person will hear and +pass along another company, which will pass along other people, which will +pass the story along to another company and, suddenly, when you realized, +nobody will hire you locally 'cause everybody knows that time when you fucked +up a project or punched a colleague in the face.

+

Paper notes are actually helpful

+

I tried to become "paperless" many times. At some point, I did keep the papers +away, but in the very end, it really do help to have a small notebook and a +pen right next to you write that damn URL you need to send the data.

+

Trello is cool and all, but Post-its are nicer

+

Nothing says "I'm really busy, but organized" like having a bunch of post-its +on your desk.

+

Blogging about your stupid solution is still better than being quiet

+

You may feel "I'm not start enough to talk about this" or "This must be so +stupid I shouldn't talk about it".

+

Create a blog. Post about your stupid solutions. They are still smarter than +someone else's solution.

+

Also, come back later and fight your own solutions with better ones.

+

Show your growth.

+

On top of that, they help you keep small notes or things you need to do.

+

... but turn off the comments

+

One thing about posting your stupid solution is that it will attract people +who just want to mess with you. "This is stupid", for example. "Your dumb" may +someone say, unaware of who's actually dumb.

+

Turn it off. Don't let those people stop you.

+

Post your stupid solution online

+

Don't keep a Github only for those "cool, almost perfect" projects. You're +free to show that, at some point, you were a beginner.

+

You can always come back and improve your code.

+

(Or don't: I still have a public repo of my first Python project that looks +like I just translated Java into Python, without the Pythonic part.)

+

Keep a list of "Things I Don't Know"

+

Richard Feymann, famous physicist, kept a notebook with the title "Things I +Don't Know".

+

When you find something that seems cool and you'd like to know more, create a +file/note/whatever with it in the title. Then make notes about what you +find/figure out.

+
+

Changelog:

+ + +
+ + + + +
+ + + + diff --git a/public/thoughts/three-weeks-with-silverblue/index.html b/public/thoughts/three-weeks-with-silverblue/index.html new file mode 100644 index 0000000..404aa08 --- /dev/null +++ b/public/thoughts/three-weeks-with-silverblue/index.html @@ -0,0 +1,157 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Three Weeks With Silverblue

+ +

A few weeks ago (four weeks ago, to be exact, based on this post date), my +Fedora Workstation crashed hard, in some freak accident that, I believe, killed +my /boot partition. At first I reinstalled Workstation, but then decided to +give a change to Silverblue.

+

What's a Silverblue?

+

Silverblue is a distribution that is pretty close to what containers do: The +base system sits on a immutable file system, giving the impression that the +system is just a kernel and Docker (it uses Podman actually, but it is +basically the same thing, when we look at the functionality) and a volume with +all the applications.

+

How Does It Feel?

+

Honestly, it doesn't have any difference from the Workstation, in a day-to-day +perspective. I still use the same editors, the same browser, the same terminal +and, with a few caveats, everything feels exactly the same.

+

What's Different, though?

+

Install

+

To install packages, you need to use rpm-ostree instead of dnf. The weird +part is that by installing a package, it doesn't make things available +immediately -- because it generates a new layer on the top of the current +volume and you're still using the current (not yet updated) volume. If you were +using a container system, you would shutdown your container and restart it, so +the new layer would assume. Since the whole system is (basically) a container, +you need to restart the whole thing... Which isn't something that weird if +you use Workstation, 'cause that's the way Workstation works, most of the time +(which you can completely ignore on Workstation but not here).

+

Once a package is installed with rpm-ostree install <package>, you can +restart the whole thing with systemctl reboot (yes, no sudo required). But +once it reboots, there is no need to run the scriptlets in the packages: Reboot +loads the new volume and things appear. You can also run multiple installs to +buy just a single layer on top of the original.

+

(So far, I haven't seen anything like "this volume is getting too many layers +and now it is taking forever; but, then again, three weeks only.)

+

Firefox

+

Firefox bundled in the base file system (the immutable part) comes without any +codecs, so basically no video on the internet works. You can install the +Flatpak version -- which is also something you can use for most things -- but +then you end with two Firefox installs.

+

And before Firefox is part of the base, immutable file system, you can uninstall +it. But you can override the install by putting a new layer which removes +Firefox from the base install. For that, you use

+
rpm-ostree override remove firefox
+
+

... instead of the expected...

+
rpm-ostree uninstall firefox
+
+

Extra Repositories

+

Silverblue doesn't allow adding extra repositories the way you normally do with +Workstation -- creating a simple file in /etc/yum.repos.d/. Now you need to +use ostree remote add <name> <url> -- Yup, that's pretty close the way you +add a Git remote or something.

+

After that, installing packages takes the normal rpm-ostree install.

+

Speed

+

No, sorry. I didn't notice any speed improvements, although it feels like it +boots a bit faster than Workstation.

+

Kinda related, since I'm running on a laptop, it seems the battery life +improved under Silverblue, for some reason. I may take a leap here and say that +maybe the base image is smaller -- since it is immutable and you can uninstall, +I feel they put the bare minimum to boot a desktop system instead of everything +that may be useful.

+

Podman

+

Not that you can't use Docker on Silverblue, but Silverblue uses Podman by +default for almost everything -- there is even a tool to create your own small +containers for running things in isolation, called toolbox. It takes a bit of +time to understand how it works, specially since, so far, I couldn't find a +group I can add my user to it so I can run commands without sudo, but +whatever.

+

Besides the sudo thing, you may want to enable the podman.socket service, +which makes Podman create a socket the same way Docker does, so you can use +docker-compose like you were using Docker.

+

Honestly, I feel I should take a bit more time to properly understand Podman +instead of using it as Docker, but since I had a docker-compose file already and +I needed to quickly jump back into work, I postponed this learning so far.

+

Conclusion

+

So far, I'm pretty happy with Silverblue as a main drive. It works, it seems -- +emphasis on "seems" -- to be more lightweight than Workstation and I still have +everything I need.

+ +
+ + + + +
+ + + + diff --git a/public/thoughts/what-the-hell-is-apple-doing/index.html b/public/thoughts/what-the-hell-is-apple-doing/index.html new file mode 100644 index 0000000..a124024 --- /dev/null +++ b/public/thoughts/what-the-hell-is-apple-doing/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

What The Hell Is Apple Doing?

+ +

Apple announced that the new iPhone won't come with a charger or earphones, "to +help the environment". And a lot of people said they are just trying to get +more money.

+

But maybe there is something more in this.

+ +

Apple is not a dumb company. One of the things they do (very well) is "train" +people to accept their products, in a way that people don't realize they are +being trained.

+

One example: Apple developed the iPad before the iPhone. But they knew people +won't understand why one would buy a touch screen with a (at the time) small +processing power when there were laptops. But by released the iPhone, they +"trained" people to accept the touch screen and, with that, allowed the iPad +(and other tablets) to be generally accepted.

+

Another example: In a time when the only screen resolution for the iPhone was +4.7", for two (or three) WWDCs there were talks about how to use the +contrain-based layout in iOS applications. This layout mechanic is based on +defining things like "this element must be X pixels/Y% distant from that other +element (or border)". But for something that always had the same resolution1 +and the same size, why would anyone use this? The reason was the release of +iPhone with larger screens. Again, Apple trained developers to think in a +different way before making their move.

+

So what the hell can we expect from phones with no charger and no earphones?

+

First of all, let's think who doesn't need a charger or earphones: People who +already have chargers and earphones. And who already have chargers and +earphones compatible with iPhones? People who already have an iPhone.

+

In a way, Apple seems resigned to the idea that people that buy an iPhone +already have an iPhone. It's not people that are replacing their Android phones +with an Apple solution, it's people who are updating to the newest version of +the phone. Sure, there is that one person that is getting their first phone and +won't have a previous charger+earphones, but that seems to be a small +percentage in Apple's view.

+

If that's the case, the "helping the environment" actually makes sense: Less +materials required, less things just thrown in drawers that will never be +used...

+

Still, there is no "training" in this; it is simple "not used, not required". +So what could be the training involved in this?

+

And I believe that the plan is to offer an annual upgrade plan by Apple itself. +Imagine this: You pay a plan, a very small fee every month or so and, every +year, you go to an Apple store, drop your old phone and get the brand new +model! What a deal! And, because the model is the latest version of the same +thing, the charger and earphones are still compatible.

+

I've seen this kind of model offered by phone companies already, but this +strategy would cut the middle man and go directly to Apple. With the advantage +-- to Apple -- that it would provide constant income instead of bursts of money +once a year.

+
+
1 +

There was a resolution change from the original screen to retina display, +but that made the resolution twice as it was before, and the OS itself would +change your "10 pixels from the left side" to "20 pixels from the left side".

+
+ +
+ + + + +
+ + + + diff --git a/public/thoughts/why-rust-and-not-go/index.html b/public/thoughts/why-rust-and-not-go/index.html new file mode 100644 index 0000000..77b0982 --- /dev/null +++ b/public/thoughts/why-rust-and-not-go/index.html @@ -0,0 +1,560 @@ + + + + + + + + + + + Julio Biason .Me 4.3 + + + + + + + + + + + + + + + + + + +
+ +
+

Why Rust and not Go

+ +
+

This is a rebuttal to Why Go and not +Rust?.

+ +
+

HUGE DISCLAIMER

+

Before jumping into the discussion, let me put this first: I do write code in +Rust (not professionally), I've not written something in Go yet but I keep +reading about the language and its ecosystem. I also follow the Rust as a +language and its ecosystem.

+

Second, another thing you must know about me: I've been a developer +professionally for about 30 years (its no hyperbole here: I did start +professionally writing code when I was 12 and didn't leave the field yet). +I've written code that run in about 15 different languages, so I have strong +opinions about coding after suffering with those languages.

+

Third, I do believe languages do not exist in a vacuum: Besides the language, +you have libraries and frameworks; besides the languages and the frameworks, +there is dependency control; besides dependency control, there is a community.

+

Fourth, if that's not really clear so far, all this is a matter of opinion -- +even the original post is, although it doesn't say so.

+

Fifth, yes, I did take things out of order, mostly 'cause I thought some +points are scattered around the original text that are complementary.

+

That being said...

+

The Nitpicking

+

(Those are points that just brushed me in the wrong way, but they are not +major points and you can really skip this if you don't want to read a bunch of +complains.)

+
+

Go is fast, but Rust is faster.

+
+

C is even faster. So what?

+
+

Go has an efficient garbage collector, but Rust has static memory management.

+
+

And so does C and C++. So what?

+
+

Go has interfaces, but Rust has traits and other zero-cost abstractions

+
+

Well, Go doesn't have interfaces per-se. Their interface is akin to Python +"if it has an open(), read() and fseek(), then it's a File-like object", +as far as I know. Python even changed that from the "it looks like a +file-like" to using the double-dunder functions to fit the interface ("if it +has a __len__() method, it is an object with a size").

+
+

Go has great support for HTTP and related protocols and it doesn't take long +to write a satisfactory web service.

+
+

More satisfactory than Flask, in which +you can create a service (a very dumb one, in that) with only 5 lines of code? +Does it? Or is it a personal opinion?

+

Honestly, I haven't seen -- even with Rust -- something as dead simple as +Flask, so there we have it. If you need performance, one could use +Sanic, which is a uvloop powered +server with a syntax that is pretty close to Flask.

+

So, when you say "great support" and "satisfactory" is that a fact or an +opinion?

+

Obviously it is an opinion, as much as me saying Flask/Sanic can beat anything +Go has, and neither of those are valid for anything. Beauty is in the eye of +the beholder.

+

(But if I'm nitpicking, I can throw whatever language I want here.)

+
+

The creators of Go like to call it a “boring” language.

+
+

Weirdly enough, I heard the same thing about Rust. So which one is the +"boriest" of them all?

+

This kind of call is akin to the PyPy devs saying that "PyPy is 300% faster +than CPython -- for tests written specifically to prove that PyPy is 300% faster +than CPython". The same thing can be said here: Go/Rust devs call their +language boring 'cause they want to prove their language is boring. Neither is +true -- and, weirdly enough, both are true.

+

One could even claim that Python is more boring that Go. 1 And Rust, by the +way.

+
+

do more with less” has proven to be very successful.

+
+

Wait, are you really quoting Dennis Ritchie, in which he was defending C? C +has less than Go or Rust, so maybe we should jump back to C? Is that what you +mean?

+
+

In truth, none of these things alone is particularly impressive, but they do +describe the mindset that Go wants to impose. Many don’t like it but, in my +opinion, it’s a killer feature for some types of development, like +enterprise software.

+
+

If we point that Rust does exactly what you're saying and better ("enforce" +vs "you need to run something, otherwise nothing changes", which I will +discuss later in this post2), then Rust kills Go in enterprise software, right?

+
+

Enterprise software always has a big scope.

+
+

Yes, and that's why we break this scope -- and some domains and everything +else -- into smaller parts that connect to each other. Those are called +"microservices" and one thing is that you can write them in whatever, but the +scope is always a small one (for different scales of "small") but it won't +be something ginourmous like a monolith, in which all the scopes exist in the +same place.

+

(I'll make this point again later, but it is weird how the author says one can +spin a Go app really fast, but then comes with the sort of points like this +that make sense only for monoliths, and I'm not sure which is the real point +being pointed in these cases.)

+
+

To unravel complex domains you need a well-structured process.

+
+

(And then he jumps into discussing about domains and expects and stakeholders) +You know what you're talking about? A DSL. You want a DSL to is close to the +experts about their domain, you want a DSL so stakeholders can understand +what's going on above the code.

+

You want Racket. I've seen things close to this in Rust using macros (which is +witchcraft to me) but I'll refrain from saying "Rust has it, and better".

+

The Freaking Cargo Cult

+
+

Go was created at Google to solve Google problems

+
+

This is something that we, developers, who love and hate any language need +to discuss. And it comes in this other point:

+
+

As I already mentioned, Go was created to solve Google problems, and Google +problems are definitely enterprise-scale problems.

+
+

You know who has Google problems? GOOGLE! You know who else has Google +problems? NO ONE!

+

No one is a huge search engine that lives capturing peoples data to provide +relevant ads (and, sometimes, search results, and shopping lists and +whatever).

+

It's the same bullshit people claiming "Netflix has 600+ microservices using +Spring, so we should use Spring for our microservices", 'cause you won't have +600+ microservices, and most probably none of them are related to providing +video streaming.

+

It's the same bullshit people claiming "Amazon deploys a microservice every 11 +seconds, so we must use microservices too!" 'cause, again, you're not a huge +cloud provider with two or three different versions of the same solution.

+

This "Cargo Cult": The idea that if we do the same thing someone else did and +it worked, it will work for us too. Enterprises everywhere run Java, for huge +scales -- AWS is the first that comes to mind -- but you're not claiming Java +can solve "enterprise-scale" problems, are you? The point that you're trying +to make here is "worked for Google, will work for you", which is plain wrong.

+

And it doesn't even involve Go or Rust. You're trying to make a point by +saying "They use" and that's not a point. At all.

+

The Plain Wrong

+
+

Go is also strict about things that other languages are usually more lax about.

+
+

Guess you never saw the borrow checker. Or the fact that Rust doesn't allow +passing an u32 (unsigned int of 32 bits) as a parameter that requires an u64, +even if the later is larger than the former. There is no implicit conversion +in Rust and a Rust dev must explicit convert from one type to the other. +That's very strict in my opinion, even if you believe this is just an +annoyance.

+

You can't have strictness with flexibility. The are opposite points: Either +the language is flexible (allowing you to use an u32 in a u64 parameter and +doing the conversion to you, for example) or it's very strict (like Rust +does).

+

Also, since you're talking about "strictness", let me ask you this: Have the +Go core devs fixed this?

+
result, err := some_function()
+return result
+
+

What is there to fix? No, it's not the "it should complain that err is never +used" (I could replace err with _ and the error would still be there). It +is the freaking error treatment! You can't call a language strict if, in +2019, it let this kind of stuff slip by. We learnt, in those last years, that +the "not-happy" path happens more often than the happy path. And ignoring such +errors is the major cause of headaches we get, and that's why we have those +stupid "restart job at midnight" cronjobs or watchdogs that keep checking if +the process is running and start it again if it crashes.

+

I can also bring the borrow checker back into this: You see, we don't talk +about processor speed anymore these days, we talk about cores. The future (and +the present) are multi-thread. I won't deny that launching a concurrent, +multi-threaded service in Go is a lot simpler than Rust, but Go doesn't have +any validation about the memory usage; it won't prevent you from doing +something like sending a structure over a channel and changing that structure +in the same thread. So, while Go makes it easier, Rust makes sure you're not +shooting yourself in the foot in the long run -- which would require the +cronjobs or watchdogs.

+
+

Go doesn’t want unused variables or imports

+
+

Neither does Rust -- it throws a large, explicative warning right in the +middle of your screen -- , so what's the point of this here?

+
+

files belonging to different packages in the same directory

+
+

Hey, do you know that, in Rust, directories are packages, and so you can't +put files of different packages in the different directories? In this case, +Rust seem more strict than Go, doesn't it?

+
+

Go also doesn’t want any “fingerprints” in the code, so it enforces a +single, universal style via go fmt.

+
+

It doesn't enforce if you have to run this. Rust also have a rustfmt, if +that's your point but, besides that, the Rust compiler will complain about +things that are not following the coding style. Try to name a variable in +camelCase and see what the rust compiler will say.

+

Besides rustfmt, Python has Black (which I hate, but still); before Black, +Python have flake8 and pylint, both which would "enforce" the Python style. So +this is, again, a moot point.

+
+

The toolchain is very often lousy and/or dated.

+
+

You mean, projects don't have rustup, the way Rust has? +Crazy!

+

Or even the backwards compatibility, like when Rust changed from the 2015 +edition to 2018, but you could select which edition (compiler version, AST, +and so on) your project would use?

+
+

The Go compiler is fast.

+
+

Ah crap, not that shit again.

+

The whole point is "compiler is fast, tests run faster". Well, what if I said +the compiler would catch bugs before the tests? That would be even faster, +'cause then you can focus your tests on system behaviour, which is way more +important than function behaviour or class/structure/module behaviour.

+

We are, once again, discussing Fast Test, Slow +Test, aren't we? Let me write a +test for every single function, every single class and oh, look how fast they +run, 'cause the compiler is fast! Then we put the "integration tests" in the +CI and everybody is happy.

+

Except you wrote tests twice when the only tests that matter are the ones that +check the system behaviours.

+
+

With Go, it’s easier as a junior developer to be more productive

+
+

[Citation needed]. I know this is pretty close a nitpick and I can understand +where this is going, but my guess is that, in the long run, when juniors +understand why certain snippets don't compile, they can be more productive +'cause errors in their code will be caught way earlier in compilation (see +point below about types and above about compiler strictness).

+

Also, feel free to call [Citation needed] about my point here too, 'cause we +both know we are both pulling data out of our asses.

+

The Somewhat Right

+
+

There are a lot of junior developers

+
+

Yes, there are. Also, they are, sadly, not getting that many jobs, 'cause as +this point, nobody is hiring juniors. We can go back to the point of "juniors +being more productive" and say "Hey, junior dev, if you learn programming +language X, you'd get a job, 'cause it's really an easy language" and I'd +throw Python here and break your engine.

+

Sure, there may be that Go is simpler than Rust (and I'll outright say that +Python is easier than Rust), but we can't say Go is easier than Rust.

+

If I can go into anecdote mode, I could say that I personally find Go code +harder to understand than Rust, and no, it's not because I've wrote some Rust +code an no code in Go; Go syntax simply does look weird to me, and one can say +that is because the order of the languages I learnt. So, for me, it's harder +to learn Go due its syntax than it is to learn Rust. 3 Does the same apply +to junior devs? I'm not sure, but languages are not hard per-se, they may have +some weird stuff, but if you describe the building blocks in order, then any +language is easy to learn.

+

4 Also, let me point out that Rust have an "Ergonomics Working Group" (now +simply called "Language Changes RFCs", +which discuss ways to make the language easier to use and there is a whole +"Compiler Errors Working +Group" which +discuss how to make the error messages in the compiler easier to understand. +With all that, if you junior devs are having issues with the language, they +are invited to go there and show the problems they are having with the +language -- and the Rust community is really focused on that, and all they +need is a Github account, instead of being part of the cabal that decides the +changes. Do Go devs have an open, transparent discussion like that?

+
+

This pushes further down technological concerns such as efficiency, and even +correctness. Don’t get me wrong, the business does care about correctness, +but they have a different definition for it. When you’re thinking about +algorithmic correctness, they are thinking about a reconciliation +back-office for the operations team they keep in a country where labor is +cheap.

+
+

Wait, so it is technological but it is not technological? I know, this should +be in the nitpick section, but there is another important point here.

+

Thing is, business people do not care about reconciliation; they worry about +deliveries and cheap labor and that is. Are they delivering? Are they cheap? +Good, case closed. We don't care if there is a problem that will appear in 10 +months or if they connection is slow between services; it works right now and we +saved money right now, so the math is solid.

+

On the other hand, if we are talking about "technological efficiency", you've +already said Rust is faster than Go, so it's more efficient (for the level of +efficient I want to use to prove that Rust is better than Go -- and I'm being +sarcastic here); if we are talking about "technological correctness", we can +go down the rabbit hole of Rust types and that, although not close to Haskell +types, it forces a good bunch of correctness in your processes. And nothing +about Go types (and their correctness) is ever mentioned; wanna guess why?

+
+

Software projects quickly become huge and complex for all the wrong reasons.

+
+

I have to agree with this. Yes, software grows beyond maintainability and +domains change.

+

On the other hand, we keep pushing microservices in those larger contexts, +specially to avoid being stuck in certain domains, 'cause you can just +rewrite services (yes, you can) or you break code into different services so +they don't go being the maintainability barrier.

+

(This point is also annoying the heck out of me, with the comparison of Go +being easy to spin something and then calling monolith problems. Either it is +a language consistent to huge deployments, like Java, or it is a language with +prospects towards simpler things, like Python. There are drawbacks in both and +one can't push towards the to points without breaking everything.)

+
+

Go is much easier to learn than Java or C#.

+
+

Says who? I mean, I don't want to bring the "That's, like, your opinion, man" +card again, but I guess one could find a lot more resources about Java or C# +than Go.

+

What about Rust? I give that the language is not that easy to pick, but every +working group on the Rust community writes their own book, so one could bring +those juniors devs into reading the books they will need to use and be done +with that.

+
+

The Go community regards as anti-patterns many abstractions regularly +employed by Java / C#

+
+

And I guess Java and C# regards Go abstraction as anti-patterns too, so what's +the point? Any language that has different ways to express abstractions +compared to other languages, and they will call the other language +abstractions "anti-patterns".

+

Rust will call some Java patterns anti-patterns too and I have to, once again, +ask "So what?" Does this makes Rust better than Java if it does? Does it make +better than Go if it calls the same Java abstractions "anti-patterns", but has +better performance than Go and is more strict than Go?

+
+

Go is faster than Java

+
+

For a very small +margin.

+

But I have to pull the "moving +goalpost" card in the +blog post here: "Go is simple so that all of this can hold true when +confronting the average Go program with the average Java / C# program." So now +we are comparing the "average" Go vs the "average" Java/C# (which, +surprisingly, are nothing like the "average" Rust program). Except whatever is +an "average" Go/Java/C# program is never defined, so we can keep pulling data +from our asses and keep saying that the benchmark game isn't valid 'cause the +examples are not "average".

+

And whatever I can point as "average", you will point that is not "average", +right? That's what a "moving goalpost" means.

+

Oh, you mean, "on all the things, Go is faster". As in "it compiles faster", +which we know means nothing, if it doesn't bring the strictness and +correctness factors into it (let me write a very fast compiler in Bash that +produces code that never runs, but it is fast!); as in "We can fix things +faster", in which I can call that Rust is pretty close to Elm, in which "if it +compiles, it will run without runtime exceptions", so in actuality, there are +less bugs (personal observation, it actually does!).

+

As "average" as in what, actually? As in "whatever point I want to make about +Go being better than Java/C#", for absolutely no reason?

+

5 Dropping All Euphemisms

+

There one point that, if you take the birds-eye view of both posts, is truly +being discussed here: TTSIW (Time To See It Working).

+

I'll give it that TTSIW for Go is smaller than Rust, and that seeing something +"working" is a huge step in producing serotonin in your system.

+

Rust, with all its checkers and rules and strictness have a larger TTSIW, +which may cause the release of glucocorticoid -- the stress hormone.

+

So, the whole point the original post tries to make is "Go gives me +serotonin".

+

But after you are in the field for some time, when you have to go back to the +office 'cause some service is not working, when you have to stop your leisure +time to find out why something is breaking... That's a glucocorticoid release +larger than fighting your compiler for 2 hours. In other words: Having to deal +with stupid mistakes you left behind 'cause your compiler didn't warn you +about them is more stressful than the ones it warned you about, 'cause it is +right there, in front of you, when you're building the system.

+

I had a talk with an embedded developer about a month ago. His company was +replacing Go applications with Rust, simply because the thing would run for +awhile and then crash because there was some lock he should've used and the +compiler never told him about it. Replacing with Rust was trading the long +term glucocorticoid with a short term glucocorticoid and long term serotonin.

+

And that's what we are talking in those two articles: Do you want a short +term pleasure and a long term stress or a short term stress and long term +pleasure?

+

The Things We Don't Talk About

+

There is one important piece that is never discussed: Ecosystem.

+

And no, ecosystem is not simply the number of libraries and packages in the +package manager; it is way beyond that: It's about its community and the way +the management deals with it.

+

And we have to talk about go dep.

+

go dep, the Go dependency tool, is a replacement of the dependency tool +created by the community, godep, after a whole year with said community +asking for a decent dependency tool, specially compared to the vendor +solution. So, without every inquiring the community, the Go core devs decided +they know better, made a tool and gave a big "screw you" to the community.

+

Not only that, but just recently the same tool decided to call +home by adding a +proxy on the call of every package, including your private ones. Why? No +real explanation. It simply does. It's not for CDN, 'cause it is just a proxy. +It's not for CDN, 'cause other it would require coordination between the +package repository and the CDN and none of this is included in this change. +Simply, every single install of a package will be captured by Google. For. No. +Good. Reason.

+

Not only the situation of the core Go devs going against the wishes of the +community, there was even some whisper about forking Go into a community +version, so it could run with a core group that would actually listen to the +community.

+

And Go is just one year older than Rust. And nobody is saying "Let's fork +Rust" -- even if you count without boats +comments about a simpler version of Rust, in which he was talking about +another language that would borrow some stuff from Rust, the same way Rust +borrowed some stuff from OCaml and other ML languages.

+

Cargo is the Rust counterpart of go dep. +Cargo was born in the Rust infancy and it is evolving along the Rust compiler. +All discussions about it are done in the +open with the community input. +Rust itself goes through the same +motions -- and that could be the +reason async/await is almost a whole year in the cooking, with discussions +about its syntax going through iterations over the issue list.

+

You Have To Have a Posture

+

You, the reader, may now be wondering why I brought the go dep discussion +into this. You may believe that discussions in the open (and taking longer +than they needed) is a big turn off for you 'cause it makes things move +slower.

+

But let me ask you this: Which one of those models follow an open source +development model? Let's take Mike Hoye, from Mozilla, definition of open +source: "I think that openness as a practice – not just code you can fork but +the transparency and accessibility of the development process."

+

With that, take a step back and re-read the last point again. Which one of +those are really an open project? Is the Go development transparent and +accessible?

+

In Closing

+

I have to call the original post completely baloney, mostly 'cause I want this +post to end in a lighter mood. I mean, there is a huge confusion of saying "Go +is better than Java/C#" while what we are talking about is "Go vs Rust". The +whole "Let me take a huge turn here, saying Go is better than Java/C# only to, +in the end, say that Go is for Java and Rust is for C++, but I'll never +compare Java vs C++ to actually make a point about Go vs Rust with their +comparative other languages".

+

And then, when we pick the points in which the author goes straight for the +"Go vs Rust" discussion, all the points are wrong or seemed more about opinion +than actual facts.

+

So what is actually the point? That Go is better than Java and Rust is better +than C++ and, thus, Go is better than Rust? 'Cause I can totally buy in the +first part, but the second is bullshit.

+

I won't say Go is a bad language, but Go is in no way a better language than +Rust, specially if we consider the future, in which more cores will be +available (considering the current trends) and more threaded applications will +be more common. I'll say that Rust design decisions give an edge over Go, so +Go should seriously go back to the basics of error control and memory +protection if it wants to be a language for the future. But being bad managed +probably means it would never happen.

+

And those points make Go a bad option for anyone writing something serious.

+

But what do I meant by "badly managed"? Well, as you can see, the core devs +don't seem to listen the community on the big issues (one could bring the +discussion about a Try operator, which would be a minor change, compared to +the dependency control, which the community said no and the core devs agreed +but, again, that's a minor thing compared to dependency control tool). The go dep was a complete "ignore whatever the community built, 'cause we know +better" and the Google proxy was simple a PSA, not a "let's ask the community +what they think about it before doing it so" are two signs that they don't +care about what the community wants and that means they can pivot the language +in a way that the community doesn't want and there would be nothing one +could do.

+

"It's just one tool, not the whole thing!", you're screaming at me. But it is +a tool the community seriously wanted (the Go Evangelist inside Microsoft came +to her twitter account to loudly say "Go core, fix this or I will stop +promoting go inside Microsoft, 'cause it's bad right now") and they were first +ignored and then pushed aside.

+

That's not how open source projects should move about.

+

You may not care about this "open source" thingy, and that's ok. You may +believe that the core team knows better how Go should move forward than the +people actually writing code in Go, and that's ok. But if you're an open +source proponent, evangelist or admirer, there is absolutely no reason to +defend Go on any accounts.

+

Want to bash me? Agree with any of the points? Disagree? Come talk to me on +Functional Cafe.

+
+
1 +

Added in 2019.09.17.

+
+
2 +

Update in 2019.09.17, pointing that the discussion about this will come +later in the post.

+
+
3 +

Added in 2019.09.17, to point that senior devs discussing which language +is easier or harder to teach to juniors is a moot point.

+
+
4 +

Added in 2019.09.17, pointing that even if senior devs discussing if a +language is harder or easier for juniors to understand, Rust have an open +door policy for this kind of stuff.

+
+
5 +

Added in 2019.09.17, when I realized what we were really talking about.

+
+ +
+ + + + +
+ + + + diff --git a/public/videos/index.html b/public/videos/index.html new file mode 100644 index 0000000..2c2d5f8 --- /dev/null +++ b/public/videos/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + +