<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Farooq's</title><link>http://far.chickenkiller.com/</link><description>Recent content on far.chickenkiller.com</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>(C) Some rights are reserved under CC-BY-SA 4.0 for Farooq Karimi Zadeh</copyright><lastBuildDate>Fri, 27 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://far.chickenkiller.com/index.xml" rel="self" type="application/rss+xml"/><item><title>In the search for an e-paper tablet in 2026</title><link>http://far.chickenkiller.com/computing/in-the-search-for-an-e-paper-tablet-in-2026/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/computing/in-the-search-for-an-e-paper-tablet-in-2026/</guid><description>
&lt;h2 id="backlog">Backlog&lt;/h2>
&lt;p>I think it was like 2020 or 2019 when I learned about E-book readers. I&amp;rsquo;ve grown up with books. And I wanted to become a Computer Scientist. Back then, I bought a BOOX Poke Pro, a 6&amp;quot; Android e-book reader from BOOX. Afterwards, for the next one, I bought a BOOX Leaf which is bigger and 7&amp;quot;. And I still have this device at the time of writing this post. I wrote the experience I had with both Poke Pro and Leaf in pcworms, a Persian blog about computers and tech. You can find the post about Poke Pro here and the one about Leaf here.&lt;/p>
&lt;p>Like any other geek, I always wanted to tinker with what I had. For the first one, Poke Pro, I didn&amp;rsquo;t make any modification to the device. I used the stock OS and just installed few apps. I even didn&amp;rsquo;t try a custom launcher. One reason was the price. If I had brick it, I could not buy another one to replace it. The other reason was &lt;a href="https://en.wikipedia.org/wiki/KaiOS" target="_blank">KaiOS&lt;/a>.&lt;/p>
&lt;h2 id="the-need-for-e-paper-tablet">The need for e-paper tablet&lt;/h2>
&lt;p>From the start, I wan&amp;rsquo;t aiming for an &amp;ldquo;e-book reader&amp;rdquo; device. But rather for an &amp;ldquo;e-paper tablet&amp;rdquo;. That is, it&amp;rsquo;s just a tablet but with e-paper display rather than regular ones. That&amp;rsquo;s why I wanted an Android e-reader. Because I could install apps of me choice, and also browse the web.&lt;/p>
&lt;p>But I have to admit, it didn&amp;rsquo;t go well the way I wanted it to be. What I had in mind is that an e-paper tablet can do whatever a normal tablet can, excluding games and videos.&lt;/p>
&lt;p>That&amp;rsquo;s very much true in theory. But in practice, it&amp;rsquo;s much different:&lt;/p>
&lt;ol>
&lt;li>BOOX devices offer Android as the OS. Then you can install any app you want. But the fact is that with most apps, you won&amp;rsquo;t have the good experience like in normal tablets. Most Android apps aren&amp;rsquo;t meant to work on a display with a refresh rate of like 5Hz. Here FOSS really comes to the rescue.&lt;/li>
&lt;li>For a long time, BOOX devices had very limited RAM and also a low-end or mid-range processor. This has quite changed in the recent devices. But on Leaf from 2021 with only 2GB of RAM, I constantly had the problem where OOM kills one of the apps.&lt;/li>
&lt;li>BOOX devices are quire meant to be used for reading. And people don&amp;rsquo;t spend time reading 8 hours a day. If you use your device like a normal tablet, the small battery will drain quickly. So don&amp;rsquo;t get fooled by the marketing of &amp;ldquo;multi week battery life&amp;rdquo;. Leaf has got a 2000mAh battery. Before the battery gets weared, it could last like 2-3 days which is roughly just half a week.&lt;/li>
&lt;li>E-book reader devices usually come with monochrome e-paper display. Most of the time, they have black+white and 16 shades of gray. This, however, has changed recently. We have colour e-book readers with a very small price difference from their monochrome counterpart. For instance see &lt;a href="https://shop.boox.com/products/gocolor7" target="_blank">Boox Go 7&lt;/a>, &lt;a href="https://us.kobobooks.com/products/kobo-libra-colour?variant=41267371376710" target="_blank">Kobo Libra Colour&lt;/a> and &lt;a href="https://us.kobobooks.com/products/kobo-clara-colour?variant=43784716746822" target="_blank">Kobo Clara Colour&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>With all these, still me e-paper tablet has been very useful to browse the web, read Wikipedia, check Emails, ssh to somewhere in &lt;a href="https://termux.dev" target="_blank">Termux&lt;/a>, read blogs with &lt;a href="https://en.wikipedia.org/wiki/RSS" target="_blank">RSS&lt;/a> and sometimes write posts in this blog and more!&lt;/p>
&lt;h2 id="boox-the-only-real-player">BOOX, the only &amp;ldquo;real&amp;rdquo; player&lt;/h2>
&lt;p>The most important thing about BOOX e-book readers is the fact that they are not e-book readers. They are tablets with e-paper display. And therefore, you can do many stuff with them as you do with your tablet. Of course, you might not have the best experience with them as I have written above.&lt;/p>
&lt;p>Back then, the only &amp;ldquo;real&amp;rdquo; players in the market of Android e-paper tablets were Onyx BOOX and Likebook. Both terrible choices. And BOOX was the less terrible choice. Like many other corporations out there, BOOX also utilizes free and open source software in their devices without paying back. Labor, free of charge! However, from legal point of view, they are not required to &amp;ldquo;pay back&amp;rdquo; for permissively licenced software. But they do need to release the copyleft code, and despite several requests, they haven&amp;rsquo;t done so till now after so many years.&lt;/p>
&lt;p>This has put BOOX, like many other manufacturers, in a good position to exploit the market and customers to sell more and more devices. They stop providing software support for their devices after like 2 or 3 years. And they also don&amp;rsquo;t let the community provide software support. Not only they don&amp;rsquo;t release the Linux code used in their devices, but they also don&amp;rsquo;t officially allow custom ROM or OS on their devices.&lt;/p>
&lt;p>For instance, this BOOX Leaf I&amp;rsquo;ve got now has lost software support for so long. It&amp;rsquo;s a long time BOOX makes empty promises about releasing new firmware and OS version. But the fact is that they stop releasing anything after ~3 years.&lt;/p>
&lt;p>With all these, BOOX has been better than Likebook. The only manufacturers who produce e-paper tablets.&lt;/p>
&lt;h2 id="exploring-for-alternatives">Exploring for alternatives&lt;/h2>
&lt;p>From late 2025 onwards, I&amp;rsquo;ve been researching about alternative options to have an e-paper tablet, and not just an e-book reader. And something which either can have proper long term software support, and also a decent hardware like used in BOOX devices.&lt;/p>
&lt;p>As I did the exploring, I also contributed various stuff to postmarketOS wiki. First, I wanted to go to mainline BOOX Leaf which I currently have. But then realized, it&amp;rsquo;s best I stay in me own field, and just gather information and contribute to the documentations in the case someone else wanted to do it.&lt;/p>
&lt;p>Contacting Kobo and PocketBook, they allow custom OS on their devices as long as the user takes full responsibility. They both release the kernel code as public. And some Kobo devices are already well supported in mainline. On the other hand, a big problem is their hardware. Unfortunately, the SoCs used in Kobo and PocketBook devices are too weak to like browse the Web. But at least because we have kernel source code, there is a good chance we could use it to add mainline support to other e-paper devices such as BOOX.&lt;/p>
&lt;h2 id="pinenote">PineNote?&lt;/h2>
&lt;p>Some might ask why not PineNote? If you have already purchased hardware from Pine64, you might not be asking this question. There are various disadvantages about PineNote, or in general, Pine64 devices, which makes reasonable to think they are not in the market at all, not even the niche markets.&lt;/p>
&lt;ul>
&lt;li>The SoC used in PineNote is too old and as a result, it&amp;rsquo;ll be too slow. It&amp;rsquo;s 4x Cortex-A55 @ 1.8Ghz. Leaf which I own is octa core, and 4 of them are high performance Cortex-A7x cores.&lt;/li>
&lt;li>The e-paper display used in PineNote is also too old. It&amp;rsquo;s Carta 1000. Currently the last generation is Carta 1300. Carta 1300 offers better refresh rate, image quality and contrast.&lt;/li>
&lt;li>There is only a single version of PineNote, which is 10.3&amp;quot;. I personally look for 7&amp;quot; options. Some users also want 6&amp;quot; or even smaller devices. So there isn&amp;rsquo;t much of a choice in this regard.&lt;/li>
&lt;li>I&amp;rsquo;ve heard from some people, that Pine64 sometimes ships defected hardware. I don&amp;rsquo;t know if this is true or not. But indeed, this scares me. Especially given that I&amp;rsquo;m based in Iran and it&amp;rsquo;ll be nearly impossible to return the product and request a refund.&lt;/li>
&lt;/ul>
&lt;p>However, don&amp;rsquo;t get me wrong. They are doing a good service for the community so they can develop and build. You can find datasheet of almost all parts used in PineNote, and they also sell spare parts. So their devices make a very good development platform.&lt;/p>
&lt;h2 id="new-choices-as-of-2026">New choices as of 2026&lt;/h2>
&lt;p>Now in early 2026 while I write this post, there are so many new players producing e-book readers or e-paper tablets. Some of them run Android. For instance, Xiaomi has entered the market like few years ago. Of course, many of these are chinese manufacturers who have got a terrible history of not releasing the kernel source code.&lt;/p>
&lt;p>On the contrary, as the competetion in the market becomes harder, we could hope more attention will be paid to the open source community. And then perhaps we could see better situation for the users.&lt;/p>
&lt;h2 id="what-can-we-do">What can we do?&lt;/h2>
&lt;p>An e-paper tablet is no use without a good software ecosystem. This means everything, from the kernel to the shell to apps. A Linux distribution with mainline is a better choice for e-paper tablets comparing to Android as we could utilize the hardware more efficiently, and also extend battery life. A well-known fact about e-paper devices running Android is a shorter battery life.&lt;/p>
&lt;p>Also, Linux has a better chance of success on e-paper tablets than on mobile phones. You probably already know Linux Mobile is far from everyday driver for a vast majority of users, even if they are technical or power users. The two biggest challenges when mainlining a device are GPU and modem. Both of which are not really a thing in e-paper tablets. 2D acceleration can be for sure very useful. But 3D acceleration as well as video codecs have got no benefit as far as I know. And even without 2D GPU accelerated rendering, I think we could go very far with CPU rendering.&lt;/p>
&lt;p>Here are some ideas to improve the situation:&lt;/p>
&lt;ul>
&lt;li>Request kernel source code from manufacturers and possibly publish them. Some manufacturers release the kernel source code only based on individual users request. If you&amp;rsquo;ve got a device, give it a shot and then upload the kernel source code to some online code hosting like &lt;a href="https://codeberg.org" target="_blank">Codeberg&lt;/a>.&lt;/li>
&lt;li>Write apps which are optimized for e-paper. I&amp;rsquo;m planning to do so with Qt and Rust, so me app can be useful on both Android e-paper tablets and Linux ones in future.&lt;/li>
&lt;li>Write graphical shell optimized for e-paper&lt;/li>
&lt;li>Extract data such as firmwares and waveforms from your device and publish them online. For instance, I have extracted so many things from BOOX Leaf I&amp;rsquo;ve got.&lt;/li>
&lt;li>Contribute to the documentations about your device(s). Contribute to postmarketOS wiki(see below). So developers could use their valueable time only for developing, what most people, including me, cannot do.&lt;/li>
&lt;li>Donate e-book readers or e-paper tablets to mainline Linux developers. Or to &lt;a href="https://postmarketos.org/" target="_blank">postmarketOS&lt;/a>.&lt;/li>
&lt;li>Financially support mainline Linux developers or communities. Even small amounts of donations are better than nothing.&lt;/li>
&lt;li>Spread the word!&lt;/li>
&lt;/ul>
&lt;h2 id="links">Links&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://wiki.postmarketos.org/wiki/Category:Ebook_reader" target="_blank">Ebook reader category of postmarketOS wiki&lt;/a>. I&amp;rsquo;ve contributed to the wiki, and I will keep doing so.&lt;/li>
&lt;li>&lt;a href="https://github.com/plateaukao/einkbro/" target="_blank">EinkBro&lt;/a>: An Android browser, especialled created for e-paper devices&lt;/li>
&lt;li>&lt;a href="https://www.mobileread.com/" target="_blank">MobileRead&lt;/a>: A community of users interested in e-book readers and e-paper tablets. They&amp;rsquo;ve got a wiki, a forum and a news blog.&lt;/li>
&lt;/ul></description></item><item><title>Linkdump #1</title><link>http://far.chickenkiller.com/misc/linkdump1/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/misc/linkdump1/</guid><description>
&lt;p>So here comes the second linkdump, or really, the first one as I have started from 0!&lt;/p>
&lt;h2 id="software">Software&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/arcanorca/boids-in-the-blue" target="_blank">Boids in the Blue&lt;/a>: A very interesting KDE add-on which you can use as both your normal wallpaper and your SDDM lockscreen wallpaper. It&amp;rsquo;s an aquarium simulation, except that the fish will become nervous if your PC is under load! You can configure to monitor you CPU, GPU or both. I wanted something like this for a long long time. So I can realize when the computation task I have is finished. It&amp;rsquo;s useful if you compile huge codebases, do scientific computations, you have machine learning workflows or other compute intenstive tasks.&lt;/li>
&lt;li>&lt;a href="https://github.com/UmerCodez/DroidPad" target="_blank">DroidPad&lt;/a>: This Android app is really lovely! With DroidPad you can define gamepads, remote controllers or otherwise human inputs. And they send data using a variety of transports such as Classic Bluetooth, BLE, UDP and WebSocket among others. For instance, here is &lt;a href="https://github.com/Klixxy/ArduTank" target="_blank">ArduTank&lt;/a>, an RC car/robot with a WiFi enabled Arduino at its core. And it utilizes DroidPad as the remote control.&lt;/li>
&lt;/ul>
&lt;h2 id="hardware">Hardware&lt;/h2>
&lt;p>I have so many links in here about Ebook readers because I&amp;rsquo;m currently searching about them and &amp;ldquo;epaper&amp;rdquo; in general. The story fits in another blog post I have in draft.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://inkbook.eu" target="_blank">InkBook&lt;/a>: A manufacturer of Android ebook readers, both color and monochrome, sizes of 6&amp;quot; and 7.8&amp;quot;. They are in business for so long time.&lt;/li>
&lt;li>&lt;a href="https://pocketbook.ch" target="_blank">Pocketbook&lt;/a>: They also have been in business for a long time. And they allow custom OS on their devices while also releasing the kernel source codes.&lt;/li>
&lt;li>&lt;a href="https://www.xteink.com/" target="_blank">XTEINK&lt;/a>: A new player in the market of E-reader devices. The notable feature about XTEINK is that they produce small sub-100 USD 4.3&amp;quot; and 3.7&amp;quot; devices. Another important thing is that their devices use &lt;a href="https://www.espressif.com/en/products/socs/esp32" target="_blank">ESP32&lt;/a> as processor. Using ESP32 has got advantages and disadvantages. You get cheaper SoC(if we could call it one!), with lower power consumption and thus longer battery life. But on the software side you are very much limited. There are two big caveats which prevent me from considering XTEINK include lack of input and frontlight.. I have messaged them me comment. Let&amp;rsquo;s see if we&amp;rsquo;ll see some changes!&lt;/li>
&lt;/ul>
&lt;h2 id="articles">Articles&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.cnx-software.com/2026/02/09/linux-6-19-release-main-changes-arm-risc-v-and-mips-architectures/" target="_blank">Linux 6.19 release from CNX software&lt;/a>: I&amp;rsquo;m not sure how many others are interested in changes in the Linux kernel, but it&amp;rsquo;s something I want to always check out, among other OS kernels.&lt;/li>
&lt;li>&lt;a href="https://www.osnews.com/story/144352/the-official-unplanned-emergency-osnews-fundraiser/" target="_blank">The Official unplanned emergency OSNews fundraiser&lt;/a>: I&amp;rsquo;m not sure if you follow this guy or not. If you don&amp;rsquo;t, I do recommend his blog in your feed. Some people often say why such a website needs money. I can remind them of NFL(No Free Lunch) and further elaborate that the author of OSNews is a human, and has human needs like every other single human. If you see a news website not asking you for money, they are making money some other way, like ads or promotion. As I publish this linkdump, the fundraiser probably has ended. And unfortunately, I can&amp;rsquo;t donate meself either. But hey! At least I&amp;rsquo;m spreading the word. Maybe the next fundraiser(s)!&lt;/li>
&lt;li>&lt;a href="https://ploum.net/2026-02-11-do_not_apologize_for_replying_to_my_email.html" target="_blank">Do not apologize for replying late to my email from Ploum&lt;/a>: Very valueable tips about Email culture. I can&amp;rsquo;t agree more.&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Arianism" target="_blank">Arianism on English Wikipedia&lt;/a>: A Christian sect or doctrine which doesn&amp;rsquo;t believe in &lt;a href="https://en.wikipedia.org/wiki/Trinity" target="_blank">Trinity&lt;/a>. It went completely extinct around 6th or 7th century. In the modern ages, many people hold that government and religion should be separate, emphasizing religion should not influence government. However, studying history of Arianism and heavy influence of the Roman Empire teaches us an important lesson: That government shouldn&amp;rsquo;t influence religion, too!&lt;/li>
&lt;/ul>
&lt;h2 id="self-promotion">Self promotion&lt;/h2>
&lt;p>Yeah! Even while the streets smell blood, I have been making things:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://codeberg.org/farooqkz/halqe" target="_blank">halqe&lt;/a>: A simple and minimalistic &lt;a href="https://en.wikipedia.org/wiki/Webring" target="_blank">Webring&lt;/a> software written in Rust with zero external dependency and no usage of a DB. Except it requires an SSL enabled reverse proxy to work. It was written to launch a webring of Bitcoin Cash websites: &lt;a href="https://bchwebring.com" target="_blank">bchwebring.com&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>Linkdump #0</title><link>http://far.chickenkiller.com/misc/linkdump0/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/misc/linkdump0/</guid><description>
&lt;p>There is someone named Andreas who has got a &lt;a href="https://82mhz.net/" target="_blank">blog&lt;/a>. And he has some posts named &amp;ldquo;Linkdumps&amp;rdquo; which have a collection of links to interesting stuff he finds. Inspired from him, I&amp;rsquo;m doing the same. And this is the &amp;ldquo;0th&amp;rdquo; link dump. Linkdumps are going to be in the &amp;ldquo;Misc&amp;rdquo; category of my website. As they are not tied to specific branch of topic. As you see, me blog has articles about religion and math, too.&lt;/p>
&lt;h2 id="blog-posts-">Blog posts 📮&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://cheapskatesguide.org/articles/still-pre-tariff-prices.html" target="_blank">This is Probably Your Last Chance to Buy a New Computer in the US at Pre-Tariff Prices&lt;/a>. I&amp;rsquo;m not based in the US. But it seems things aren&amp;rsquo;t going very good for Americans. In this blog post, various advices about buying a computer are given. And also that after the Trump Tariffs, the prices will drastically rise.&lt;/li>
&lt;li>&lt;a href="https://lambdaland.org/posts/2025-06-24_reading_blogs/" target="_blank">Programmers and their Monospace blogs&lt;/a>. Here Ashton complains about style of some blogs of programmers. I can&amp;rsquo;t agree more with him.&lt;/li>
&lt;li>&lt;a href="https://lambdaland.org/posts/2025-05-13_real_programmers/" target="_blank">Real programmers&lt;/a>. Again from Ashton, he tells us about lost arts in the field of software development such as utilizing CLI tools.&lt;/li>
&lt;li>&lt;a href="https://lambdaland.org/posts/2022-07-04_kanren/" target="_blank">uKanren Reading&lt;/a>. Again from Ashton, he promotes an embedded logic programming language. I haven&amp;rsquo;t checked the paper. But it sounds interesting.&lt;/li>
&lt;li>&lt;a href="https://blog.bananahackers.net/farooqkz/saying-goodbye-to-kaios-and-to-chooj" target="_blank">Saying goodbye to KaiOS and chooj&lt;/a>. This is my own blog post. I&amp;rsquo;ve talked about why KaiOS is not a choice for me anymore.&lt;/li>
&lt;/ul>
&lt;h2 id="softwares-">Softwares 🧑🏽‍💻&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marginalia-search.com" target="_blank">Marginalia&lt;/a>: I fell in love with it when I found it. It&amp;rsquo;s an open source search engine with its own independent index. You won&amp;rsquo;t believe how many valuable content you could find with it which you cannot find using Google, Bing or DuckDuckGo. Also it tells you beforehand if the website has got tracking, ads or Javascript. Last, it also has got a tool to &amp;ldquo;explore&amp;rdquo; new websites.&lt;/li>
&lt;li>&lt;a href="https://asterinas.github.io" target="_blank">Asterinas&lt;/a>: Yet another Rust OS. But it&amp;rsquo;s not exactly an Operating System. Rather just a Linux compatible kernel.&lt;/li>
&lt;li>&lt;a href="https://www.feedflow.dev/" target="_blank">FeedFlow&lt;/a>: I tried many Feed Readers on me Android Ebook Reader and this turned out the best experience. I also requested features to add better support for Epaper. And the developer was nice enough to implement most of them!&lt;/li>
&lt;li>&lt;a href="https://github.com/phase1geo/Minder/" target="_blank">Minder&lt;/a>: I tried many FOSS mindmap softwares and this is the best I found with respect to UI/UX. Your taste might be difference. But I prefer good keyboard shortcuts and it&amp;rsquo;s clean UI.&lt;/li>
&lt;/ul>
&lt;h2 id="games-">Games 🎮&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://watabou.itch.io/pixel-dungeon" target="_blank">Pixel Dungeon&lt;/a>. Really cool and addictive game with pixel graphics. A &lt;a href="https://delta.chat" target="_blank">DeltaChat&lt;/a> community member has ported it to &lt;a href="https://github.com/ArcaneCircle/pixel-dungeon" target="_blank">WebXDC&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://github.com/mushware/adanaxis" target="_blank">Adanaxis&lt;/a>. A 4D space adventure single player game. Yeah 4D! Too bad the development is halted.&lt;/li>
&lt;/ul>
&lt;h2 id="books">Books&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://socialsci.libretexts.org/Bookshelves/Psychology/Introductory_Psychology/Introduction_to_Psychology_%28LibreTexts%29" target="_blank">Introduction to Psychology from LibreTexts&lt;/a>: Just started reading this book. Not me first psychology book. But the first one I read in English. It has explained the field well, and doesn&amp;rsquo;t talk too much :)&lt;/li>
&lt;/ul></description></item><item><title>Decompiling the GPL-violated Linux kernel using Evolutionary Algorithms</title><link>http://far.chickenkiller.com/computing/decompiling-the-kernel-using-ea/</link><pubDate>Fri, 12 Sep 2025 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/computing/decompiling-the-kernel-using-ea/</guid><description>
&lt;p>&lt;strong>TLDR&lt;/strong>: We want to decompile a binary code, into the &lt;em>byte equivalent&lt;/em> C code. We look at this from an optimization viewpoint. We have a generated C code(or AST) and we want to optimize it so when we compile it, it is equivalent to the binary code, byte by byte. And I think it&amp;rsquo;s better to use a population based optimization metaheuristic to do this. Such as Genetic Programming.&lt;/p>
&lt;h2 id="requirements-to-understand-this-post">Requirements to understand this post&lt;/h2>
&lt;p>The idea I&amp;rsquo;m writing about is very deep. You need to know the current problem we have about companies violating &lt;a href="https://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL&lt;/a> and not releasing the Linux kernel source code used in their devices. Then you need to know what an &lt;a href="https://en.wikipedia.org/wiki/Algorithm" target="_blank">Algorithm&lt;/a> is. What a &lt;a href="https://en.wikipedia.org/wiki/Heuristic" target="_blank">Heuristic&lt;/a> is. And what is the difference between them. And you also need to know what an &lt;a href="https://en.wikipedia.org/wiki/Optimization_problem" target="_blank">optimization problem&lt;/a> is. And what is our goal in these problems. After that, you need to know in this very specific optimization problem, we are not looking for &amp;ldquo;good enough&amp;rdquo; solutions unlike most other optimization problems. We are rather looking for the &amp;ldquo;perfect&amp;rdquo; solution, if we can find one.&lt;/p>
&lt;h2 id="backstory">Backstory&lt;/h2>
&lt;p>&lt;strong>Note:&lt;/strong> If you know about GPL violation which happens by not releasing the kernel source code, then you can skip this part.&lt;/p>
&lt;p>Linux, the kernel, has been spread like a virus. Various hardware companies around the globe need a software to talk to their hardware and then provide APIs for the higher level programs. So their hardware can be of use. This includes mobile phone and tablet manufacturers. Android has become the de facto standard Operating System for a vast majority of mobiles and tablets. And Android works with the Linux system calls. The only kernel which is usable and provides these system calls, is Linux itself. So manufacturers take Linux, do a small amount of work to add support for their devices, and then they can be usable.&lt;/p>
&lt;p>Linux is free and open source software with a very mature ecosystem. And by free, I mean both in the sense that it&amp;rsquo;s libre and that it&amp;rsquo;s zero cost(for them). It&amp;rsquo;s a great choice for companies so they won&amp;rsquo;t need to write a kernel from scratch. There are very few programmers who can write a kernel. Even less who also write standard, high quality, readable code. So that&amp;rsquo;s why they choose Linux. They get free dinner. They just need to bring spoon and fork to eat it.&lt;/p>
&lt;p>But Linux is under a copyleft licence, it&amp;rsquo;s called GPL. Not just that. It&amp;rsquo;s also strong copyleft. In theory, this means if I have a device which a modified version of the Linux kernel has been used in it, I have the right to have its source code. Note that this right &lt;em>is mine&lt;/em>. If you haven&amp;rsquo;t got such a device, you don&amp;rsquo;t have the right to the source code.&lt;/p>
&lt;p>However, like almost always, they teach you one thing in theory. And in practice, you need to forget about all of them.&lt;/p>
&lt;p>Since having the kernel source code is me right anyway, and they are not going to give it to me. I&amp;rsquo;m considering taking it meself. If we could somehow decompile the binary kernel code into the C code with &lt;strong>the same semantic&lt;/strong>, then we are in much better position and closer to mainline my device.&lt;/p>
&lt;h2 id="what-is-the-goal">What is the goal?&lt;/h2>
&lt;p>We have a kernel binary code extracted from me device. And we need to derive the &lt;em>readable&lt;/em> and &lt;em>idiomatic&lt;/em> C code which when compiled, it produces the same binary. The general term for this process is &lt;a href="https://en.wikipedia.org/wiki/Decompiler" target="_blank">&lt;em>decompilation&lt;/em>&lt;/a>. However, this very specific decompilation has also a very specific trait. It is &lt;em>byte equivalent decompilation&lt;/em>. That is, the C code we have, produces the same binary code as the binary code of the kernel we&amp;rsquo;ve got.&lt;/p>
&lt;p>Theoretically, we could also go for finding the semantically equivalent C code. However, last time I researched, checking semantic equivalency is a very complex problem. I think it was &lt;a href="https://en.wikipedia.org/wiki/NP-hardness" target="_blank">NP hard&lt;/a>. So we create less trouble for ourselves by checking for equivalence of either assembly code or byte code. We could also go for the IR, if possible.&lt;/p>
&lt;h2 id="how-do-we-achieve-it">How do we achieve it?&lt;/h2>
&lt;h3 id="the-short-answer">The short answer&lt;/h3>
&lt;p>I really don&amp;rsquo;t know. And I bet no one else does!&lt;/p>
&lt;h3 id="the-long-answer">The long answer&lt;/h3>
&lt;h3 id="time-needed">Time needed&lt;/h3>
&lt;p>This is a research idea, and an idea for long term. Research itself can be seen as an Optimization problem! This means that you don&amp;rsquo;t know if this entire region has got something as perfect as you want it to be. Or if it has got one, let&amp;rsquo;s say a maximum, where is it or how long will it take for you to reach it. It might be right next to you. But you might not know which direction. Or it might be far far away.&lt;/p>
&lt;h3 id="educated-guess-and-previous-related-work">Educated guess and previous related work&lt;/h3>
&lt;p>But we can make some plan and educated guesses. I&amp;rsquo;m not educated about decompiling nor about the kernel. But hey! It&amp;rsquo;s just another optimization problem! There is &lt;a href="https://www.cs.unm.edu/~eschulte/data/bed-full.pdf" target="_blank">a research paper&lt;/a> from few years ago which first coins the idea of &lt;em>byte equivalent decompiler&lt;/em> as far as I know. They just wanted to show &amp;ldquo;feasibility&amp;rdquo; from what I&amp;rsquo;ve realized. Their method &lt;em>could&lt;/em> decompile tiny(~20LoC) C programs. They had used &lt;a href="https://en.wikipedia.org/wiki/Evolutionary_algorithm" target="_blank">Evolutionary Algorithms&lt;/a> to reach this goal. And they hadn&amp;rsquo;t converted the binary to an IR.&lt;/p>
&lt;p>Their method is using a database of relevant C code. Then using an EA to search in this database to construct a C code which when compiled, matches to the binary code. There are many limitations. One is that the compiler, its version and the flags used &lt;strong>must be known&lt;/strong>. Also the paper assumed that the binary code can be constructed from their database of C code. In our case, this might not be entirely true.&lt;/p>
&lt;h3 id="generating-the-initial-population">Generating the initial population&lt;/h3>
&lt;p>Typically in EAs, the initial population is generated randomly. But here, we shouldn&amp;rsquo;t do that. We should instead use some (meta)heuristic to output some sloppy half correct C code. From which we generate our initial population.&lt;/p>
&lt;p>The topic of &lt;a href="https://arxiv.org/search/?query=neural&amp;#43;decompiler&amp;amp;searchtype=all&amp;amp;source=header" target="_blank">Neural Decompilers&lt;/a> has been hot among researchers. Recently, some employ Large Language Models to decompile. In whichever case, an important consideration is that if we want to use a neural model, it should&amp;rsquo;ve been trained on the kernel code. General models most likely won&amp;rsquo;t fit our purpose. And we shouldn&amp;rsquo;t focus too much on Neural Decompilers and forget everything else, considering &lt;a href="https://en.wikipedia.org/wiki/No_free_lunch_in_search_and_optimization" target="_blank">NFL theorem&lt;/a>.&lt;/p>
&lt;p>There are also other heuristics or algorithms to decompile a binary. Reported by the BED paper, using decompiled C code from another &amp;ldquo;traditional&amp;rdquo; decompiler helped a lot.&lt;/p>
&lt;h3 id="representing-our-c-code">Representing our C code&lt;/h3>
&lt;p>We probably have to use an AST as representative of the C code. It&amp;rsquo;s much more natural than working with C code directly. We could try to make our search space smaller by allowing only valid ASTs. For instance when a cross over or mutation is done, their outputs must be a valid C AST. There are other ways to limit search space. For instance, we could entirely remove some C features. I&amp;rsquo;m not advanced with C, but I think we could remove any loop other than &lt;code>while&lt;/code>. Also we could entirely let go of &lt;code>struct&lt;/code>s. We could then use some heuristic to detect where a bunch of pointers are actually a struct. Or where a while loop should&amp;rsquo;ve been a &lt;code>for&lt;/code> loop.&lt;/p>
&lt;h3 id="representing-the-binary-code">Representing the binary code&lt;/h3>
&lt;p>I have a feeling that the less layers between our Evolutionary Decompiler and the binary code, the better chance of success we&amp;rsquo;ll have. This means we should either use the Disassembled code, or the IR, if possible. If we could learn about the exact toolchain version, that goes a great way forward.&lt;/p>
&lt;h3 id="why-evolutionary">Why Evolutionary?&lt;/h3>
&lt;p>I have a feeling a population based metaheuristic is much better than a heuristic which travels one point at a time. However, it doesn&amp;rsquo;t necessarily have to be an EA. But one must consider that EAs have been in business as a population based metaheuristic for so long. Therefore different techniques are available and already researched.&lt;/p>
&lt;h3 id="making-the-c-code-readable">Making the C code readable&lt;/h3>
&lt;p>After we have a decompiled C code, it is most likely unreadable and very un-idiomatic. We could have another round to find appropriate names for the variables, mutate the code to become more readable, find names for the structs and functions and so on. We could use a Language model for this and use already existing code database. The BED paper itself has cited some papers on this.&lt;/p>
&lt;p>Also later, &lt;a href="https://en.wikipedia.org/wiki/Genetic_improvement_%28computer_science%29" target="_blank">Genetic Improvement&lt;/a> might be useful.&lt;/p>
&lt;h2 id="other-misc-notes">Other misc notes&lt;/h2>
&lt;p>I am thinking about mainlining me e-book reader. I have an Onyx Boox device. And the company actively refuses to release the kernel source code. But mainlining a recent enough Boox device might be easier than it seems:&lt;/p>
&lt;ul>
&lt;li>E-book reader devices use e-paper displays. And a vast majority of e-paper displays come from E-ink. There are other devices which use the same panel as me device. Like Kobo or Pocketbook. Kobo releases the kernel source code for the devices.&lt;/li>
&lt;li>Me Boox device uses a Snapdragon SoC. Snapdragon is quite well supported in mainline.&lt;/li>
&lt;li>An e-book reader device doesn&amp;rsquo;t the modem or the GPU to be working. Of course, mainlining the GPU can be very good if we could have 2D acceleration. But it is really not necessary, at least for me device which has got quite a good CPU.&lt;/li>
&lt;/ul>
&lt;h2 id="am-i-going-to-do-it">Am I going to do it?&lt;/h2>
&lt;p>I really would like to. But first I should finish me &lt;a href="https://codeberg.org/farooqkz/wakegp" target="_blank">wakegp&lt;/a> research and eat its fruits. Then I could think about another research project. In the case someone else was up to it, I would be glad and appreciate it.&lt;/p>
&lt;h2 id="edits">Edits&lt;/h2>
&lt;h3 id="12th-september-2025">12th September 2025&lt;/h3>
&lt;p>I posted this on &lt;a href="https://news.ycombinator.com/item?id=45219909#45220384" target="_blank">Hacker News&lt;/a>. Someone pointed out about checking semantic equivalency of 2 C programs. And they hinted that it is &lt;a href="https://en.wikipedia.org/wiki/Undecidable_problem" target="_blank">undecidable&lt;/a>. I&amp;rsquo;m not deep into these theories. I just knew that checking equivalency of two boolean functions is NP hard(or was it NP complete?). So it makes sense that the same for C code or functions should be harder. If we consider &lt;a href="https://en.wikipedia.org/wiki/Halting_problem" target="_blank">the halting problem&lt;/a>, and given that our C code has got loops, the equivalency would be a superset of the halting problem. And thus undecidable.&lt;/p></description></item><item><title>WakeGP 16th Augest 2025 Devlog</title><link>http://far.chickenkiller.com/computing/wakegp-16-aug-2025-devlog/</link><pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/computing/wakegp-16-aug-2025-devlog/</guid><description>
&lt;p>After so long time, I&amp;rsquo;m beginning to think that it&amp;rsquo;s too hard for Genetic Programming to do feature selection, feature discovery, constant discovery and solution discovery all at the same time. I believe most of my experiments were in waste. Also I am beginning to doubt if my feature extraction code, which I have just stolen from another project, works correctly.&lt;/p>
&lt;p>So what I&amp;rsquo;ve done? I&amp;rsquo;ve used PyTorch&amp;rsquo;s code for feature extraction(MelSpectogram). It outputs a CSV file, each line has got 280 floating point numbers. And now I&amp;rsquo;m experimenting with different ways for feature selection. I select 24 features among the 280 and see how well they perform.&lt;/p>
&lt;p>I have added &lt;code>-r&lt;/code> option to WakeGP with which you can specify how many runs do you want to go with the config you provided. So you can do &lt;code>wakegp -c config.toml -r 16&lt;/code> to do 16 runs with the same config. This is good because loading dataset, selecting features, loading configuration file and parsing it all happen only once. I also have added &lt;code>-t&lt;/code> with which you can tell WakeGP to do all experiments concurrently. It simply uses rayon&amp;rsquo;s &lt;code>par_iter&lt;/code> thing. The advantage is that it&amp;rsquo;ll utilize all my 24 cores of CPU, almost. If you don&amp;rsquo;t provide it, at some points like Selection, the code is sequential. When you do &lt;code>-t&lt;/code>, it does all 16 runs simultaneously which is faster. However, all the output logs will be mixed together. But that&amp;rsquo;s no problem. Because I can do like:&lt;/p>
&lt;pre tabindex="0">&lt;code>wakegp -c config.toml -r 16 -t | grep &amp;#39;Gen 600 &amp;#39; | awk &amp;#39;{ print $7 }&amp;#39;
&lt;/code>&lt;/pre>&lt;p>And then I will have fitness values of all of them. After which I can do a T test with another config to see which one perform better.&lt;/p>
&lt;p>For feature selection, I have written a small Python script to play with this. The script does runs, does T tests and then moves forward. I&amp;rsquo;m testing with Simulated Annealing and a simple greedy algorithm. I first started with a small population(around 16) and a low number of generations, like 32. There seemed to be progress. But when you actually do runs with a realistic number of generations like 400, you realize that the better set of features you&amp;rsquo;ve found is actually worse!&lt;/p>
&lt;p>So I have tried the same population size but with bigger number of generations(96). And now I have progress! I&amp;rsquo;m currently using just a simple hill climbing algorithm. And yeah I know it has got several disadvantages. But for now, I want to realize how many number of generations, and how many runs per features set is required.&lt;/p></description></item><item><title>Do I need a Lisp machine come back?</title><link>http://far.chickenkiller.com/computing/do-i-need-a-lisp-machine-comeback/</link><pubDate>Wed, 06 Aug 2025 10:05:52 +0330</pubDate><guid>http://far.chickenkiller.com/computing/do-i-need-a-lisp-machine-comeback/</guid><description>
&lt;p>One might say I&amp;rsquo;m too obsessed with &lt;a href="https://en.wikipedia.org/wiki/Lisp_%28programming_language%29" target="_blank">Lisp&lt;/a>. Or in general with &amp;ldquo;unconventional&amp;rdquo; things. Maybe I am. Or maybe dead technologies have got some buried gems which you cannot find in the modern world of computing.&lt;/p>
&lt;p>This story is about &lt;a href="https://codeberg.org/farooqkz/wakegp" target="_blank">WakeGP&lt;/a>. Few years ago, I wanted to start with Evolutionary Machine Learning, specifically Genetic Programming. So I started writing WakeGP software using Rust. And it&amp;rsquo;s been few months which I&amp;rsquo;m doing experiments using different parameters and algorithms to see which ones produce better results(e.g. better accuracy).&lt;/p>
&lt;p>My program uses &lt;a href="https://toml.io/en/" target="_blank">TOML&lt;/a> as the configuration file. It first loads the dataset as specified in the configuration, and through a process, finally produces train, test and validation datasets. Then the Genetic Programming run starts and after each generation, a line is printed to standard output to tell me about the last generation just passed. Something like this:&lt;/p>
&lt;pre tabindex="0">&lt;code>[000:00:16] Gen 600 avg/avg_ft/ft_div/avg_size/Z -/+ 62.5890/65.6710 0.641114 0.000420 694.9 0
&lt;/code>&lt;/pre>&lt;p>Finally when the end condition has happened, it optionally finds the best and the smallest individuals and evaluates them on the 3 datasets and then quits.&lt;/p>
&lt;p>Assuming that my algorithm works as it should, which itself is very questionable, I need to find the best &lt;a href="https://en.wikipedia.org/wiki/Hyperparameter_%28machine_learning%29" target="_blank">hyperparameters&lt;/a> which lead to best and smallest individuals, or at least the best ones. To find the best combination of hyperparameters, I need to do a lot of runs using each combination. Then finally I should do a &lt;a href="https://en.wikipedia.org/wiki/Welch%27s_t-test" target="_blank">T test&lt;/a> to find out which ones actually perform better.&lt;/p>
&lt;p>The current process is that I write a Python script which holds a list of combinations(see &lt;a href="http://far.chickenkiller.com/computing/wakegp-25-jul-2025-devlog/">my July devlog&lt;/a>). And it does a number of runs per each combination. I used to write shell scripts. But working with TOML files is not easy in shell. And also they are slower. But that&amp;rsquo;s not the end, I also have to write a &lt;a href="https://en.wikipedia.org/wiki/Systemd" target="_blank">systemd&lt;/a> service with which I can better manage the process and it&amp;rsquo;ll also start on boot, if for whatever reason, a reboot happens.&lt;/p>
&lt;p>When the experiments are done, I have to write another Python script to read all WakeGP logs, extract the numbers(fitness, accuracy and size), and do T tests to find out which ones perform the best. First a lower number of runs per combination are done. Some combinations fall way behind. Then I schedule a &amp;ldquo;second wave&amp;rdquo; to do more runs on the most fit combinations. I call these &amp;ldquo;best buckets&amp;rdquo;. Those are the combinations I don&amp;rsquo;t have enough data to prove one of them perform better than the other since $p$ value is large enough. But&amp;hellip; a Python script which extracts all data and does a large number of T tests is too slow. I can either install more headache on my mind by doing multi processing or use &lt;a href="https://en.wikipedia.org/wiki/PyPy" target="_blank">pypy&lt;/a> which is faster. But even pypy, while being tons faster, is not fast enough.&lt;/p>
&lt;p>Anyway, I do it with pypy, now I have a list of &amp;ldquo;bests&amp;rdquo;. I have to do a second wave of experiments. I have to change the runner script to read combinations from a text file instead of iterating over all combinations.&lt;/p>
&lt;p>Again I just get through it. I do the same for the next waves. Finally I decide to do experiments for a different set of hyperparameters. I have to copy the runner script, change it according to my need, write a new systemd unit file and do the same process again. Needless to say that I also have to write another Python script to extract the results because this time, I&amp;rsquo;m not looking at the fitness values, I&amp;rsquo;m rather looking at something else.&lt;/p>
&lt;p>I can try writing a more generalized Python script and even interact with systemd using it. But then I&amp;rsquo;ll have to spend 2-3 days to design and write such a thing, plus probably few more days to debug it whenever things go wrong like in edge cases. And it won&amp;rsquo;t be late before I realize the script is not general enough and I need to change it again. It greatly slows me down&amp;hellip;&lt;/p>
&lt;p>All these issues are there while I don&amp;rsquo;t need to change WakeGP code. Which written in Rust, it means each time I change the algorithm, I need to recompile it. And wait tens of seconds for it to finish. This story I&amp;rsquo;m narrating is just for the hyperparameters.&lt;/p>
&lt;p>There are also other problems. Like if I need my computer for something, I&amp;rsquo;ll have to either stop the runner service or change number of threads WakeGP uses. Both routes create multiple issues.&lt;/p>
&lt;p>For the first one, I have to remember to start it again. If I don&amp;rsquo;t and go home, I have lost few hours. I do it all the week and then I have to wait a week longer to get the experiment results. My mind has a limited random access memory!&lt;/p>
&lt;p>For the latter, I have to go down adding a configuration option to the runner script to somehow read thread count from some configuration file and revert thread count to original after a time frame. Heck no! I wrote it but it didn&amp;rsquo;t work well. And I didn&amp;rsquo;t have time to spend debugging things.&lt;/p>
&lt;p>If I want to do some small experiments. Like compare just two combinations, I can&amp;rsquo;t go for the runner script. I have to do it with &lt;a href="https://en.wikipedia.org/wiki/Unix_shell" target="_blank">POSIX shell&lt;/a> and the &lt;code>for&lt;/code> loop. It comes with tons of disadvantages, however with the advantage that initial investment is negligible.&lt;/p>
&lt;p>Now to summarize, there are multiple problems and things which I need here:&lt;/p>
&lt;ul>
&lt;li>I need to interact with systemd so the experiments will always run even if the computer reboots. Two common reasons are kernel updates and power outages. It could be nice if somehow power state of my PC was invisible to the programs.&lt;/li>
&lt;li>I need a mechanism to reduce resource usage of WakeGP when I need my CPU for something else. Like for compiling a program or doing another ad hoc WakeGP experiments.&lt;/li>
&lt;li>I need a shell/language combo which is fast and expressive enough to extract and process data. And at the same time it&amp;rsquo;s convenient if I want to do some ad hoc stuff. POSIX shell is certainly not a good choice for such these. It offers some tools which are useful. But then it lacks processing floating point numbers, doing T tests, and so on. Python is slow and is very inconvenient as a shell.&lt;/li>
&lt;li>I need a workspace which my changes to it persist across reboots and process terminate. Like I define a function for something. It should be there in the workspace next time I want to use it. If I close it and again open it, my things are already there.&lt;/li>
&lt;/ul>
&lt;p>Solution? It seems I&amp;rsquo;m looking for a &lt;a href="https://en.wikipedia.org/wiki/Lisp_machine" target="_blank">Lisp Machine&lt;/a>, or a &lt;a href="https://www.cliki.net/Lisp%20as%20a%20shell" target="_blank">Lisp shell&lt;/a> which changes are persistent and reboots or program terminates are invisible to it. Does such a thing exist? I don&amp;rsquo;t know.&lt;/p>
&lt;h3 id="edit-0">Edit 0&lt;/h3>
&lt;p>I talked about my needs in &lt;code>#lisp&lt;/code>, &lt;code>#commonlisp&lt;/code> and &lt;code>#sbcl&lt;/code> on &lt;a href="https://libera.chat/" target="_blank">LiberaChat&lt;/a> IRC network. And I got some keywords and information for further research. There is SBCL&amp;rsquo;s &lt;a href="https://www.sbcl.org/manual/#Saving-a-Core-Image" target="_blank">&lt;code>save-lisp-and-die&lt;/code>&lt;/a> which saves the current state into a core image and kills the process. You can load the image later and start from where you stopped. If you don&amp;rsquo;t want to kill the process, you can &lt;code>fork&lt;/code>, do &lt;code>save-lisp-and-die&lt;/code> on the fork and continue using your stuff.&lt;/p>
&lt;p>Quoting one of the folks in &lt;code>#sbcl&lt;/code>:&lt;/p>
&lt;blockquote>
&lt;p>years ago I had sbcl rigged up to fork &amp;amp; save-lisp-and-die when I logged out, then when I logged in again that saved image would start up again and it was like (almost) nothing happened. it was fun, but occasionally it would break and I&amp;rsquo;d have to start from a fresh image. Then I&amp;rsquo;d find out that my on-disk source code had diverged from what was in the image and struggle to bring things up properly again&lt;/p>&lt;/blockquote>
&lt;p>Other problems they mentioned was with library upgrades. &amp;ldquo;They aren&amp;rsquo;t designed to be hot upgraded&amp;rdquo; and also upgrading SBCL itself.&lt;/p>
&lt;p>The thing I&amp;rsquo;m looking for, seems to be &amp;ldquo;residential-style development&amp;rdquo;. Someone else added:&lt;/p>
&lt;blockquote>
&lt;p>Interlisp tried to do so. But such these have fallen out of flavor for so long in favor of file systems and databases. Maybe the reason was too much complexity.&lt;/p>&lt;/blockquote>
&lt;p>Finally, I got a &lt;a href="https://dl.acm.org/doi/pdf/10.1145/356744.356754" target="_blank">link&lt;/a> to Richard Stallman&amp;rsquo;s note on comparison between file based vs residential systems. Note that &lt;a href="https://en.wikipedia.org/wiki/Richard_Stallman" target="_blank">Richard Stallman&lt;/a> is one of the geeks/hackers who was working on the Lisp Machine at the MIT AI lab. And interestingly, one of the only two who didn&amp;rsquo;t join any company to commercialize Lisp Machines!&lt;/p>
&lt;h3 id="edit-1">Edit 1&lt;/h3>
&lt;p>&lt;a href="https://cr8r.gg/@amoroso@oldbytes.space" target="_blank">Paolo Amoroso&lt;/a> gave &lt;a href="https://interlisp.org/documentation/IRM.pdf#page=17" target="_blank">a link&lt;/a> to read more about &amp;ldquo;residential style developement&amp;rdquo; and Interlisp. And yeah there is &lt;a href="https://fosstodon.org/@interlisp" target="_blank">an Interlisp Mastodon account&lt;/a> too.&lt;/p></description></item><item><title>And she roasted Farooq</title><link>http://far.chickenkiller.com/misc/and-she-roasted-farooq/</link><pubDate>Sat, 02 Aug 2025 14:41:51 +0330</pubDate><guid>http://far.chickenkiller.com/misc/and-she-roasted-farooq/</guid><description>
&lt;p>It was me, a close friend and some acquaintances of mine and there she was. The conversation was going quite smoothly till&amp;hellip; it wasn&amp;rsquo;t smooth anymore. &amp;ldquo;So you are one true geek with extraordinary skills when it comes to computers&amp;rdquo; she said. &amp;ldquo;You have spent most of your life reading books, reading papers and tinkering with electronic stuff and then computers&amp;rdquo; she continued. And I thought &amp;ldquo;Another idol worshiper trying to find someone to worship&amp;rdquo;. Therefore I said &amp;ldquo;I hate it when someone thinks like I&amp;rsquo;m the Son of God, coming from heaven. And that I have extraordinary skills.&amp;rdquo; But I didn&amp;rsquo;t say these. Instead I said, &amp;ldquo;Sometimes people make some specific people too high and too great. But the reality is far from that.&amp;rdquo;&lt;/p>
&lt;p>And that was the moment I realized she is roasting me rather than doing compliments. &amp;ldquo;Oh I&amp;rsquo;m not admiring you. It&amp;rsquo;s not a compliment&amp;rdquo; she said and continued&amp;hellip;&lt;/p>
&lt;blockquote>
&lt;p>You&amp;rsquo;ve spent most of your life reading. That means that&amp;rsquo;s all you know. That&amp;rsquo;s all you can do. You are as good as a computer. And as dumb as one can be. You are bound to be slave of the others. Because you don&amp;rsquo;t have any social skills. Nor you know how to manage your money. All you know is how to write code, and how to read. And that&amp;rsquo;s all. You think you know so much. But you are one true ignorant. And you don&amp;rsquo;t know anything about human beings. Look how your body is. You would be a perfect pig to provide dinner for a few tens. But it won&amp;rsquo;t be healthy food. Because you don&amp;rsquo;t have muscles, you have only fat. And the moment someone pushes you a bit, you&amp;rsquo;ll drop on the ground like stone. You can barely move your meaty toes.&lt;/p>&lt;/blockquote>
&lt;p>It did hurt. However, I didn&amp;rsquo;t say a word. Just smiling. &amp;ldquo;Haha Farooq is now gonna say something to roast her real hard!&amp;rdquo; said one of the folks. However, I wasn&amp;rsquo;t gonna roast anyone nor defend myself. I replied &amp;ldquo;No roast. I think she speaks the truth. That&amp;rsquo;s probably who I am or who I&amp;rsquo;ve become.&amp;rdquo; then I continued &amp;ldquo;If you want to have some skill, you have to put time and effort to learn it. Be it coding skills, hacking skills or social skills. And I haven&amp;rsquo;t.&amp;rdquo;&lt;/p>
&lt;p>My reply was unexpected for everyone, the folks there and she who said that. If you spend all your time and effort on only a single aspect of the life, it is inevitable that you will lack some skills which are needed for everyone, including you. One is social skills. The other are general life skills. The story, is of course imaginary. But it could happen for me or some other geek. Or for future me if I take the wrong path.&lt;/p>
&lt;p>PS: I don&amp;rsquo;t know why is it a she. Is it wishful thinking? Who knows!&lt;/p></description></item><item><title>WakeGP 25 Jul 2025 Devlog</title><link>http://far.chickenkiller.com/computing/wakegp-25-jul-2025-devlog/</link><pubDate>Fri, 25 Jul 2025 10:05:52 +0330</pubDate><guid>http://far.chickenkiller.com/computing/wakegp-25-jul-2025-devlog/</guid><description>
&lt;p>Checking the project&amp;rsquo;s &lt;code>git log&lt;/code>, the first commit is in early 2023. And now at the time of writing this devlog, it&amp;rsquo;s mid 2025. 2.5 years since I started WakeGP research has passed. As the first research project, I chose something big. This, and at the same time the gray dog tying me hands, made this research take more than 2 years.&lt;/p>
&lt;p>The problem with gray dog ruling you is not just that you&amp;rsquo;ll have reduced work hours. But also that you&amp;rsquo;ll have lower concentration. And this could result in a negative impact. Various ridiculous bugs which I found in feature extraction. And those made all my 6 months(or more) of experiments, all in vein.&lt;/p>
&lt;p>The goal I have for WakeGP is training sequential programs which detect if a specific wake word has been spoken. And I&amp;rsquo;ve chosen Genetic Programming to achieve this goal. At the time of writing this log, I&amp;rsquo;ve done several experiments to realize so many times I had chosen the wrong route.&lt;/p>
&lt;p>First and most important, for a long time, I didn&amp;rsquo;t have an almost formal process to learn which direction should I take. That is you do like 500 runs for two setups and see which one will perform better. But there is a Persian proverb which says whenever you catch the fish, it&amp;rsquo;s fresh. I think in English they might say late is better than never.&lt;/p>
&lt;h2 id="light-quick-experiments">Light quick experiments&lt;/h2>
&lt;p>I did some experiments with a small fraction of the dataset. Like 800 data points for each class. These experiments included:&lt;/p>
&lt;ul>
&lt;li>Best values for combinations of &lt;code>register,coefficients&lt;/code> number. I found that &lt;code>r=8,coeff=20&lt;/code> is the best&lt;/li>
&lt;li>What to do with &amp;ldquo;overflow&amp;rdquo; and anormal numbers. In some data points and with some programs, the values of registers grow too big and become infinite. Then the output register&amp;rsquo;s value might become anormal, including &lt;code>NaN&lt;/code>. And then you can&amp;rsquo;t determine its sign, which is the prediction. I came to the conclusion that I let these anormalies happen. Then when the output is anormal, I define it as false prediction.&lt;/li>
&lt;li>Effect of my invented parsimony pressure method in combination with deletion mutation. The parameters are &lt;code>n&lt;/code> for my method, chance of mutation and deletions per mutation. That is, for each program to be mutated, how many instructions are affected. I came to the conclusion that a big chance of mutation, like over &lt;code>0.5&lt;/code>, with a small number of deletions per mutation and &lt;code>BestAndWorst = 4&lt;/code> have the best results with respect to both average size and fitness.&lt;/li>
&lt;li>Best value for FFT size. I found that a value from &lt;code>7000&lt;/code> to &lt;code>8000&lt;/code> yields the best for a sample rate of &lt;code>48000&lt;/code>&lt;/li>
&lt;li>Utility of &lt;code>Oversize&lt;/code> feature of WakeGP. This is still unknown. But it seems &lt;code>Oversize&lt;/code> causes the population to converge much faster when used with &lt;code>Tournment &amp;gt; 8&lt;/code>, &lt;code>Truncate&lt;/code> or &lt;code>Average&lt;/code> selection methods. And of course, it significantly grows the average size.&lt;/li>
&lt;li>Which instruction set performs the best.&lt;/li>
&lt;/ul>
&lt;p>Validity of these experiments are of great question:&lt;/p>
&lt;ul>
&lt;li>I&amp;rsquo;ve used only 800+800 data points for the train dataset. If I use a realistic value, like 10k, would I get the same results?&lt;/li>
&lt;li>Accuracy of these runs are around 80%. Are these data also valid when the programs become more accurate than 95% which is the project goal?&lt;/li>
&lt;/ul>
&lt;h2 id="heavy-experiments">Heavy experiments&lt;/h2>
&lt;p>I wrote a small Python script to test 1680 different combinations of parameters. What I included was number of registers, coefficients, constants, maximum size limit and FFT size. There were a total of ~90k runs.&lt;/p>
&lt;ul>
&lt;li>The values for &lt;code>register_cells&lt;/code> were &lt;code>{8, 16, 32, 64, 128}&lt;/code>&lt;/li>
&lt;li>The values for number of coefficients were &lt;code>{10, 20, 40, 80, 100, 120}&lt;/code>&lt;/li>
&lt;li>The values for FFT size were &lt;code>{1000, 2000, 4000, 7000, 8000, 12000}&lt;/code>&lt;/li>
&lt;li>The values for number of constants were &lt;code>{8, 16, 32, 64}&lt;/code>&lt;/li>
&lt;li>The values for size limit &lt;code>{512, 1024}&lt;/code>&lt;/li>
&lt;li>&lt;code>6000+1000&lt;/code> data point were used as the train dataset.&lt;/li>
&lt;/ul>
&lt;p>The best found combinations are:&lt;/p>
&lt;pre tabindex="0">&lt;code>reg.coeff.fft.const.size_limit
32.20.8000.32.1024
16.20.8000.16.1024
32.20.7000.32.1024
32.20.8000.8.1024
32.20.7000.16.1024
16.20.8000.32.1024
32.20.8000.16.1024
32.20.8000.64.1024
16.20.8000.8.1024
32.20.8000.32.1536
&lt;/code>&lt;/pre>&lt;p>All of these have got &lt;code>deletion_mutation_rate = 0.5&lt;/code>, &lt;code>deletions_per_mutation = 4&lt;/code> and &lt;code>parsimony = { BestAndWorst = 4 }&lt;/code>. As you can see, an FFT size of &lt;code>7000&lt;/code> to &lt;code>8000&lt;/code> yields the best results for this sample rate. And there is no combination with a limit of &lt;code>512&lt;/code> instructions. Also unlike what I concluded in my &amp;ldquo;light and quick&amp;rdquo; experiments, a number of 8 for registers wasn&amp;rsquo;t good.&lt;/p>
&lt;p>The last combination wasn&amp;rsquo;t part of the initial experiments. However, I tested a higher limit manually to see if I could get better fitness values. As you can see, a big number of constants is favored.&lt;/p>
&lt;p>So many questions remain unanswered:&lt;/p>
&lt;ul>
&lt;li>How many of the constants did programs use? When doing these experiments, the software didn&amp;rsquo;t have a feature to output this.&lt;/li>
&lt;li>How many of the coefficients, out of the 20, did the programs use? I tried doing feature selection at the same time.&lt;/li>
&lt;li>Would a bigger number for register cells yield better results? Like &lt;code>48&lt;/code>?&lt;/li>
&lt;li>How much are these size limits valid for higher accuracies?&lt;/li>
&lt;li>Did my method to control sizes, also handicap the programs to have lower accuracy?&lt;/li>
&lt;/ul>
&lt;h2 id="future-experiments">Future experiments&lt;/h2>
&lt;p>Today, some new features has been added to WakeGP, walking a new direction. First, the features and constants which the best found individual uses, are printed. Second, a new config, &lt;code>dataset_config.selected_features&lt;/code> which is an array of integers has been added. Combined, this allows testing different features. One can do like 200 runs. Then using the features which are commonly selected among best performing runs, we can then evolve programs to use only those specific features.&lt;/p>
&lt;p>Note that &lt;code>dataset_config.selected_features&lt;/code> is optional and as its positions suggests, it can be used with both &lt;code>from_wave&lt;/code> and &lt;code>from_csv&lt;/code>.&lt;/p></description></item><item><title>What kind of a God we have?</title><link>http://far.chickenkiller.com/religion/what-kind-of-a-god-we-have/</link><pubDate>Mon, 14 Jul 2025 08:29:49 +0330</pubDate><guid>http://far.chickenkiller.com/religion/what-kind-of-a-god-we-have/</guid><description>
&lt;p>In our small circle of Quran researchers, someone, named Aqil Suleimani was questioning our imaginations about God. That is, do we know God in Islam well? And does our definition of God, and what he does, match with Quran?&lt;/p>
&lt;blockquote>
&lt;p>Do we know God? Or maybe we have wrong assumptions? People say why does God let bad people do whatever they want and murder innocent people? Did Quran say God would prevent such people from killing, murdering and jailing?&lt;/p>&lt;/blockquote>
&lt;p>Then he asks a question. How does God decide who to save and who to let perish among believers and the Prophets?&lt;/p>
&lt;blockquote>
&lt;p>Why does God save Abraham from Fire? But he lets people saw Zechariah and kill him? Why did God help Muslims in &lt;a href="https://en.wikipedia.org/wiki/Battle_of_Badr" target="_blank">Badr&lt;/a> but did not help them in &lt;a href="https://en.wikipedia.org/wiki/Battle_of_Uhud" target="_blank">Uhud&lt;/a>? Why didn&amp;rsquo;t God save people in &lt;a href="https://en.wikipedia.org/wiki/People_of_the_Ditch" target="_blank">Ukhdud&lt;/a>?&lt;/p>&lt;/blockquote>
&lt;p>I think he is asking a good question. More examples from me, God lets people behead John. But then he rescues Jesus(according to &lt;a href="https://en.wikipedia.org/wiki/Jesus_in_Islam" target="_blank">the Islamic account&lt;/a>). He also saves Moses, Noah and their followers. But then he lets corrupt Jews kill several Prophets. We have some sayings from the Prophet Muhammad that God inspires 60 Prophets in a day and they kill them all. Or that God sends a Prophet in the morning, another one in the noon and finally another one in the evening and they kill them all. God does not save them. But according to the Old Testament account, he saves Elias and Daniel. And many many other examples.&lt;/p>
&lt;p>This leads us to a question:&lt;/p>
&lt;blockquote>
&lt;p>Among believers and the Prophets, who does God save and who he lets people kill them? And why? How does God decide who to save?&lt;/p>&lt;/blockquote></description></item><item><title>Links</title><link>http://far.chickenkiller.com/_pages/links/</link><pubDate>Thu, 10 Jul 2025 17:31:40 +0330</pubDate><guid>http://far.chickenkiller.com/_pages/links/</guid><description>
&lt;p>These are the interesting folks who I would like to mention them here with a link:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="gopher://lumidify.org">lumidify’s gopherhole&lt;/a>: He is almost at the same age as me. He doesn&amp;rsquo;t like bloated stuff like the Web and many softwares in today&amp;rsquo;s world. Last time I was with contact with him, he was creating a text editor with C.&lt;/li>
&lt;li>&lt;a href="https://chronovir.us/" target="_blank">Luxferre’s weblog&lt;/a>: Another hacker but much older than me. Dislikes bloated stuff and the founder of BananaHackers community.&lt;/li>
&lt;li>&lt;a href="https://strukturart.com" target="_blank">John David Deubl(strukturart)&lt;/a>: An Artist, Analogue photographer, poet and hardworking programmer. I always admired his constant distraction-free hardwork in my heart.&lt;/li>
&lt;li>&lt;a href="https://git.abscue.de/affe_null" target="_blank">Affe Null&lt;/a>: This hacker have done significant work and is a BananaHacker council member. You might know about &lt;a href="https://git.abscue.de/bananian/bananian" target="_blank">the port of Debian to 8110&lt;/a>, &lt;a href="https://git.abscue.de/obp/bananui/bananui" target="_blank">the shell for the same phone&lt;/a> and &lt;a href="https://git.abscue.de/affe_null/weeknd-toolbox" target="_blank">his toolbox for hacking Nokia 2780 flip&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://framagit.org/mskf1383" target="_blank">Muhammad Saleh Kamyab&lt;/a>: This boy is another young programmer. He has also interests in literature which is quite rare among programmers!&lt;/li>
&lt;li>&lt;a href="https://0x1eef.github.io" target="_blank">0x1eef’s blog&lt;/a>: This is blog of a systemd hater and a BSD lover and has related content.&lt;/li>
&lt;/ul>
&lt;p>These are me Persian blogs:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://persianbitcoincash.com" target="_blank">بیت‌کوین کش فارسی&lt;/a> Persian Bitcoin persianbitcoincash&lt;/li>
&lt;li>&lt;a href="https://blogfa.farooqkz.com" target="_blank">وبلاگ فارسی&lt;/a> Persian blog, non technical stuff&lt;/li>
&lt;/ul>
&lt;h2 id="webrings">Webrings&lt;/h2>
&lt;p>As of Feb 2026, I removed me blog from both webrings I was formerly a member. This is
due to the reason that many other websites in the rings don&amp;rsquo;t add (much) value
with regards to spread knowledge, nor they even follow some sane eye-friendly design.&lt;/p>
&lt;p>If you have webring suggestions for me, I welcome them. You can reach me using Email:&lt;/p>
&lt;pre tabindex="0">&lt;code>fkz on riseup net
&lt;/code>&lt;/pre></description></item><item><title>Projects</title><link>http://far.chickenkiller.com/_pages/projects/</link><pubDate>Thu, 10 Jul 2025 17:31:37 +0330</pubDate><guid>http://far.chickenkiller.com/_pages/projects/</guid><description>
&lt;h2 id="lead-developer">Lead developer&lt;/h2>
&lt;p>These are the projects which I have a lead. These include projects which the lead is solely on me, as well group lead.&lt;/p>
&lt;h3 id="one-time">One time&lt;/h3>
&lt;p>These are the one time projects which I wasn&amp;rsquo;t supposed to maintain them in the long term.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://notabug.org/bananaphone/fooplot" target="_blank">fooplot&lt;/a>(Javascript): A simple app for KaiOS to graph mathematical functions&lt;/li>
&lt;li>&lt;a href="https://notabug.org/bananaphone/talkingbot" target="_blank">Talking bot for KaiOS&lt;/a>(Vanilla Javascript): A talking(not chatting) bot toy app for KaiOS&lt;/li>
&lt;li>&lt;a href="https://notabug.org/bananaphone/vm-irc" target="_blank">VM-IRC&lt;/a>(Javascript, JQuery): A simple and minimal IRC client for KaiOS with limited functionality&lt;/li>
&lt;li>&lt;a href="https://notabug.org/bananaphone/simplequran" target="_blank">simplequran&lt;/a>(Vanilla Javascript): A very simple app to read the Holy Quran&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/drawlogo86" target="_blank">drawlogo86&lt;/a>(x86 Assembly): This program displays a 16x16 sprite(possibly your logo!) when you boot your storage.&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/KaiScr" target="_blank">KaiScr&lt;/a>(Python): Two small programs written in Python to record screen of a KaiOS 2.x device as well as watching a live stream of it&lt;/li>
&lt;li>&lt;a href="https://codeberg.org/farooqkz/msim" target="_blank">msim&lt;/a>(Common Lisp): A small program written in Common Lisp to simulate a simple Mafia/Werewolf game with presence of fool. Then it finds out how much of a winning chance do each of the teams and the fool have got.&lt;/li>
&lt;li>&lt;a href="https://github.com/farooqkz/stack-gp-test" target="_blank">stack-gp-test&lt;/a>(Rust): An example program, written in Rust, which solves a simple Symbolic Regression problem using Stack based Genetic Programming. Includes some text about Genetic Programming, Stack based Genetic Programming and the Symbolic Regression problem in general.&lt;/li>
&lt;/ul>
&lt;h3 id="maintained">Maintained&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/deltachat-bot/deltachat-loginbot" target="_blank">deltachat-loginbot&lt;/a>(Rust, Axum): Written with &lt;a href="https://rust-lang.org" target="_blank">Rust&lt;/a> and &lt;a href="https://github.com/tokio-rs/axum" target="_blank">axum&lt;/a>, it covers enough of &lt;a href="https://oauth.net" target="_blank">OAuth2&lt;/a> specification so that users of a &lt;a href="https://discourse.org" target="_blank">Discourse&lt;/a> instance can login with their &lt;a href="https://delta.chat" target="_blank">DeltaChat&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://codeberg.org/farooqkz/wakegp" target="_blank">wakegp&lt;/a>(Rust, rayon, cranelift): Trying to exploiting &lt;a href="https://en.wikipedia.org/wiki/Linear_genetic_programming" target="_blank">Linear Genetic Programming&lt;/a> to do wake word detection. As of early 2026, this research project is on hold till I get into a better situation.&lt;/li>
&lt;li>&lt;a href="https://codeberg.org/farooqkz/hugo-vitae" target="_blank">Vitae&lt;/a>(Javascript, Hugo): This is theme of this blog. When Benedikt gave up on maintaining the theme, I took over.&lt;/li>
&lt;li>&lt;a href="https://codeberg.org/farooqkz/halqe" target="_blank">halqe&lt;/a>(Rust, Axum): A simple and minimalistic webring software with zero external dependency except for a reverse proxy.&lt;/li>
&lt;li>&lt;a href="https://codeberg.org/Minetest-JMA-Group/jma-capturetheflag" target="_blank">JMA CTF&lt;/a>(Luanti/Minetest, Lua): After the main CTF server maintained by LandarVargan at the time was in severe lag, I joined JMA CTF. And soon I started contributing and then become a developer. Initially, I tried to contribute to both codebases at the same time. But then I realized it&amp;rsquo;s not feasible and I gave up on main CTF.&lt;/li>
&lt;/ul>
&lt;h3 id="not-maintained">Not maintained&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/farooqkz/KaiUIng" target="_blank">KaiUIng&lt;/a>(SASS, SCSS, CSS, InfernoJS, Typescript): A UI library for KaiOS. With &lt;a href="https://infernojs.org" target="_blank">Inferno&lt;/a> bindings.&lt;/li>
&lt;li>&lt;a href="https://github.com/farooqkz/chooj" target="_blank">chooj&lt;/a>(Typescript, InfernoJS, KaiOS): A &lt;a href="https://matrix.org" target="_blank">Matrix&lt;/a> client for &lt;a href="https://en.wikipedia.org/wiki/KaiOS" target="_blank">KaiOS&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/fobil" target="_blank">fobil&lt;/a>(Common Lisp): A simple static blog generator&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/mtbotter" target="_blank">mtbotter&lt;/a>(C++): A library to create &lt;a href="https://minetest.net" target="_blank">Minetest&lt;/a> bots. I don&amp;rsquo;t remember anything about it. If I wanted Minetest bots again, I would replicate the protocol implementation in Rust.&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/BHA" target="_blank">BHA&lt;/a>(Python): Bash History Analyzer&lt;/li>
&lt;li>&lt;a href="https://notabug.org/farooqkz/PotatoEgg" target="_blank">PotatoEgg&lt;/a>(Cherrypy, Python, Vanilla Javascript): A simple file manager but web based&lt;/li>
&lt;li>&lt;a href="https://github.com/farooqkz/chooj-pushgateway" target="_blank">chooj’s push-gateway&lt;/a>(Python, Flask): A Matrix client needs a push gateway server to deliever push notifications. The current version is more a prototype. For real world usage, I would change it or even rewrite it in Rust.&lt;/li>
&lt;li>&lt;a href="https://github.com/farooqkz/ctf-notify" target="_blank">ctf-notify&lt;/a>(Flask, Python, React, Javascript): A small web application to get current status of &lt;a href="https://ctf.rubenwardy.com" target="_blank">the Minetest CTF server&lt;/a> as well as getting notification when the desired setup(map/mode/online players) is being played.&lt;/li>
&lt;/ul>
&lt;h2 id="major-contributor">Major contributor&lt;/h2>
&lt;p>These are the projects I have contributed significant amount of code to them.&lt;/p>
&lt;h3 id="active">Active&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/deltachat/message-parser" target="_blank">message-parser&lt;/a>(Rust, nom): This is utilized to parse different portions of a text message in DeltaChat Desktop. We hope that in future, it could be utilized in other DeltaChat apps as well. I&amp;rsquo;m thinking I could even one day use it in chooj.&lt;/li>
&lt;/ul>
&lt;h3 id="past-contributor">Past contributor&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/deltachat/deltachat-desktop" target="_blank">DeltaChat Desktop&lt;/a>(Electron, Tauri, Typescript, React, SCSS, SASS): See &lt;a href="https://delta.chat" target="_blank">DeltaChat&lt;/a>. Utilizes a backend such as Electron or Tauri and a frontend written using React and Javascript.&lt;/li>
&lt;li>&lt;a href="https://github.com/MT-CTF" target="_blank">Minetest Capture the Flag aka main CTF&lt;/a>(Lua, Minetest/Luanti): I think my first contribution was somewhere around 2020-2021. Not so sure. Also read &lt;a href="http://far.chickenkiller.com/computer/evolution-of-minetest-ctf-game-over-years/">this post of mine&lt;/a> regarding the history of the game, as well as &lt;a href="https://blog.rubenwardy.com/2023/08/16/minetest-ctf-is-10/" target="_blank">this post from rubenwardy on his blog&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>No need to be online all the time</title><link>http://far.chickenkiller.com/computing/no-need-to-be-online-all-the-time/</link><pubDate>Tue, 14 May 2024 10:21:52 +0000</pubDate><guid>http://far.chickenkiller.com/computing/no-need-to-be-online-all-the-time/</guid><description>
&lt;p>Recently, a friend and coworker, &lt;a href="https://chaos.social/@hpk" target="_blank">Holger Krekel&lt;/a>, is making a series of micro posts on Mastodon about screens, online time and online experience.&lt;/p>
&lt;p>Even we only have little interactions, I feel Holger has some insightful ideas about using tech the healthy way.&lt;/p>
&lt;p>What I am talking about here, is about culture and health. Smart devices, like smart phones and PCs should be used in the right way. Otherwise, they will hurt us. And the way most people use these devices, they are very harmful.&lt;/p>
&lt;p>From some points of view, the people of the old like my Father have got an advantage to my generation. They don&amp;rsquo;t use technology much and they are away from both the benefits and the harms. My generation, however, use technology excessively. But the way they use it, often causes more harm than benefit.&lt;/p>
&lt;p>One of things which are really harmful to my concentration are notifications. These days our computers produce them, our smart phones produce them. And some of us even buy smart watches to have notifications on their wrist, too.&lt;/p>
&lt;p>I believe we don&amp;rsquo;t need to get notified about every single happening on social medias or in IMs. I believe notifications, both the pop up messages and the counter badges, are harmful for my concentration. That&amp;rsquo;s why I recommend getting rid of them while working. Here are a bunch of advises you might find useful:&lt;/p>
&lt;ul>
&lt;li>While working, set your phone to vibrate or even silence, and don&amp;rsquo;t receive notifications, big or small, going on your phone. An exception could be calls. I am usually fine receiving calls from family and friends. If I&amp;rsquo;m very busy, I reject and they know they should call me later. If they call rapidly, it&amp;rsquo;s probably something urgent.&lt;/li>
&lt;li>Don&amp;rsquo;t expose your phone number to any organization or in the public. This will lead spammers to you either calling or texting. The same could go for your Email address or social handles/IDs.&lt;/li>
&lt;li>Maybe opt for a feature phone. Note that a feature phone can be a dumbphone or a smart phone. A dumbphone by my definition has got only calling and texting features. It can&amp;rsquo;t connect to the Internet. But might be able to provide tethering for other devices. A smart feature phone has got a connection. But is limited. In past, you can opt for a &lt;a href="https://en.wikipedia.org/wiki/KaiOS" target="_blank">KaiOS&lt;/a> feature phone. Currently that&amp;rsquo;s only a thing if you are based in Africa or the US. You can read more why I chose a KaiOS phone over an Android phone in &lt;a href="https://blog.bananahackers.net/farooqkz/kaios-is-a-good-choice-for-you-if" target="_blank">this blog post on BananaHackers blog&lt;/a>. But as of 2025, I wouldn&amp;rsquo;t recommend KaiOS anymore.&lt;/li>
&lt;li>Disable any sort of notifications which aren&amp;rsquo;t urgent on your PC. It includes the counter badges, maybe the badges entirely and also the popup message. You have various methods depending on your PC configuration to opt out of receiving notifications for some time or at all. For instance on KDE Plasma, you can disable the notifications. Depending on your configuration you might also be able to disable them for like an hour.&lt;/li>
&lt;/ul>
&lt;p>All these advises are based on a single principle: You don&amp;rsquo;t need to be online all the time. You don&amp;rsquo;t need to receive notifications all the time. And don&amp;rsquo;t worry, if someone had a life or death situation, they will call you!&lt;/p>
&lt;p>Also as a bonus for reaching end of the post, if the web was more local first, it could be really cool. You could disconnect, have some peace and concentration. Then again connect when you want to do a &lt;code>git push&lt;/code> or comment on some PR.&lt;/p></description></item><item><title>How to run something periodically in Minetest</title><link>http://far.chickenkiller.com/computing/how-to-run-something-every-60-seconds-in-minetest/</link><pubDate>Sat, 04 May 2024 19:47:13 +0330</pubDate><guid>http://far.chickenkiller.com/computing/how-to-run-something-every-60-seconds-in-minetest/</guid><description>
&lt;p>This is a quick note to show how to run something periodically in Minetest. What you want to use
is &lt;code>globalstep&lt;/code>. With &lt;code>minetest.register_globalstep(function(dtime))&lt;/code> you can run a function every step of the server
which is usually 0.1&lt;/p>
&lt;p>To achieve this goal, you need a variable to watch over time, decrease or increase it on every call of the globalstep and
finally when it reaches some condition, execute the actual code. It will be something like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-lua" data-lang="lua">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">local&lt;/span> timer &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">60&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>minetest.register_globalstep(&lt;span style="color:#66d9ef">function&lt;/span>(dtime)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> timer &lt;span style="color:#f92672">=&lt;/span> timer &lt;span style="color:#f92672">-&lt;/span> dtime
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> timer &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0.0&lt;/span> &lt;span style="color:#66d9ef">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> minetest.chat_send_all(&lt;span style="color:#e6db74">&amp;#34;a minute has passed!&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> timer &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">60&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>A God who does not care</title><link>http://far.chickenkiller.com/religion/a-god-who-does-not-care/</link><pubDate>Fri, 01 Dec 2023 10:52:21 +0000</pubDate><guid>http://far.chickenkiller.com/religion/a-god-who-does-not-care/</guid><description>
&lt;p>There are many doctrines which suggest there is a god but one who does not
care about his servants and that they worship him or not. Here, I want to argue why we cannot make such an assumption. As the assumption is equal to the assumption which in it there is no god at all.&lt;/p>
&lt;ol>
&lt;li>Here, we are interested in the outcomes which come from God.&lt;/li>
&lt;li>There is an outcome if God cares.&lt;/li>
&lt;li>If there is a God and he does not care, the outcome is zero.&lt;/li>
&lt;li>If there is no God, outcome is again zero.&lt;/li>
&lt;li>If there is a God who cares, there is some outcome. That is, this God punishes or rewards based on deeds.&lt;/li>
&lt;li>Assumption about that God doesn&amp;rsquo;t exist is equal to that God exists but does not care.&lt;/li>
&lt;/ol>
&lt;p>Obviously, a god who cares does something and therefore, because of his deed about his servants, there is an outcome, positive or negative.&lt;/p></description></item><item><title>A note about Epaper monitors</title><link>http://far.chickenkiller.com/computing/a-note-about-epaper-monitors/</link><pubDate>Fri, 06 Oct 2023 10:21:52 +0000</pubDate><guid>http://far.chickenkiller.com/computing/a-note-about-epaper-monitors/</guid><description>
&lt;p>If you are not already familiar with epaper, it&amp;rsquo;s a display technology which does not emit light and has got a lower refresh rate. Another very important and interesting characteristic of an epaper display is that it needs power only when refreshing. This means you can disconnect power from an epaper display and it will show the last image forever. Though not refreshing them for long will hurt their health.&lt;/p>
&lt;p>Epaper displays are widely used in ebook reader tablets to offer an eyestrain-free reading experience. These days there are lots of epaper tablets in different sizes, forms, with different hardwares and so on. I have got a BOOX Leaf which is a 7&amp;quot; epaper tablet from &lt;a href="https://boox.com" target="_blank">BOOX&lt;/a> company. It runs Android 10 and I am using it right now to write this post in &lt;a href="https://termux.com" target="_blank">Termux&lt;/a> using &lt;a href="https://github.com/neovim/neovim" target="_blank">neovim&lt;/a>.&lt;/p>
&lt;p>Additionally, you can buy cheap individual display modules or panels from black and white to multi colour with different refresh rates. &lt;a href="https://www.waveshare.com/" target="_blank">Waveshare&lt;/a> is one selling a diverse variety of them.&lt;/p>
&lt;p>As the writing experience is very good on the tablet with a Bluetooth keyboard connected, I was tempted to buy an epaper monitor. BOOX already has got two epaper monitors in sizes of 13.3&amp;quot; and 25.3&amp;quot;. However second thoughts and some research imply that experience on epaper monitors won&amp;rsquo;t be as good as on tablets.&lt;/p>
&lt;p>LinusTechTips Youtube channel did a review of an epaper monitor from &lt;a href="https://dasung.com" target="_blank">Dasung&lt;/a>. I agree LTT is not a good source of correct and accurate information but at least I could watch the video to see how the monitor performs. And I noticed it does not perform well, which is unfortunate. Plus I don&amp;rsquo;t know about any epaper monitor which is in colour. Though there are some colour epaper tablets from BOOX which run Android and videos show they don&amp;rsquo;t perform bad.&lt;/p>
&lt;p>A good guess to explain the difference in the quality of experience would be that an epaper monitor just receives the video signals and it can&amp;rsquo;t produce a high quality representation on the epaper panel. But in a tablet the display and the rest of system are closely integrated. It also might be possible that with a different GPU or driver, we could get good quality images from epaper monitors.&lt;/p>
&lt;p>A good experiment to see if the latter is possible, would be using a Linux host with a custom display driver and a cheap epaper display from Waveshare or other resellers plus a MCU.&lt;/p></description></item><item><title>Machine Learning is not (only) Neural Network</title><link>http://far.chickenkiller.com/computing/machine-learning-is-not-neural-network/</link><pubDate>Tue, 11 Jul 2023 17:09:08 +0330</pubDate><guid>http://far.chickenkiller.com/computing/machine-learning-is-not-neural-network/</guid><description>
&lt;p>In the recent years, Neural Networks and their applications have grown significantly. And we have a huge -not yet ending- enthusiasm for them.
Historically, NNs were abandoned after a period of enthusiasm and several interesting researches.
But after sometime, perhaps after computers were more capable, they returned back to the game.
Nowadays, most people who are in touch with technology stuff probably imagine Machine Learning means Neural Networks.&lt;/p>
&lt;h2 id="what-are-anns">What are ANNs?&lt;/h2>
&lt;p>To answer this question, we first need to understand what a &amp;ldquo;neuron&amp;rdquo; is and only after that,
we can understand the whole concept which is a network formed by these small units.
From a math nerd point of view, a neuron is a function which takes a vector(array) of real numbers,
computes each of them with another real named &amp;ldquo;weight&amp;rdquo; and will output 1 only if
the sum of these multiplications is greater than a threshold:&lt;/p>
&lt;p>$$
f(X) = \begin{cases}
1, &amp;amp;\text{if } b + \sum_{i=1}^{n}{X_i . w_i} \gt 0 \\
0, &amp;amp;\text{if } \text{otherwise}
\end{cases}
$$&lt;/p>
&lt;p>If the mathematical representation is not appealing, a neuron is simply a machine which takes some numbers,
multiplies each of them with another number, the weight. Then sums it up with a number named &amp;ldquo;bias&amp;rdquo;
or $b$. And then only if the sum is greater than a threshold, the machine will turn on and output $1$.
Otherwise, the machine will stay off and won&amp;rsquo;t output anything. Or will output $0$.
Strictly speaking, each of these machines uses an &amp;ldquo;Activation Function&amp;rdquo;
and &lt;a href="https://en.wikipedia.org/wiki/Step_function" target="_blank">the step function&lt;/a>
is just one of the choices we have for our neuron.&lt;/p>
&lt;p>Now an ANN, is more than one of these &amp;ldquo;machines&amp;rdquo;. The first neuron gets fed from our input and sends its output to the input of the next neuron.
Then the next neuron does the same job but with probably different &amp;ldquo;weights&amp;rdquo; and will give its output to the next till we reach the &amp;ldquo;output&amp;rdquo; neuron which we get our output from.&lt;/p>
&lt;p>In actual implementations, usually we have several layers of
these neurons. With each layer getting its input from the previous
layer and feeding its output to the next one(Except, obviously, the input and output layers).&lt;/p>
&lt;p>&lt;figure>
&lt;img src="https://upload.wikimedia.org/wikipedia/commons/0/00/Multi-Layer_Neural_Network-Vector-Blank.svg" alt="A two layer ANN" />
&lt;/figure>&lt;/p>
&lt;p>&lt;!-- raw HTML omitted -->This picture is from the WikiMedia user &lt;a href="https://commons.wikimedia.org/wiki/File:Multi-Layer_Neural_Network-Vector-Blank.svg" target="_blank">Offnfopt&lt;/a>&lt;!-- raw HTML omitted -->&lt;/p>
&lt;p>Now, if we choose the weights and the network architecture correctly,
we can get our network to do a certain task for us.
For example we want our network to distinguish input photos,
dog or cat. This is a binary classification problem Machine Learning which NNs can solve for us if we happen to find the right weights and structure for our network.&lt;/p>
&lt;p>The process of finding these &amp;ldquo;weights&amp;rdquo;
or possibly even the structure itself,
is called &amp;ldquo;training&amp;rdquo;. In ML and in general,
the process of finding the optimum model and/or parameters which suits our problem
is called that. In the case of an NN, the model is formed by its architecture and weights of each neuron.&lt;/p>
&lt;h2 id="what-is-the-problem-of-anns">What is the problem of ANNs?&lt;/h2>
&lt;p>TL;DR, &amp;ldquo;Performance&amp;rdquo;.&lt;/p>
&lt;p>Here comes my personal beliefs.&lt;/p>
&lt;p>The idea is very interesting and it is amazing that this computation machine is
Turing Complete.&lt;/p>
&lt;p>But these interesting machines, are very inefficient the way we get them to work.
Most of the time, we &amp;ldquo;emulate&amp;rdquo; the NNs on our computers both for training and usage.
When we try to emulate stuff on something which it wasn&amp;rsquo;t optimized for it, we sacrifice performance,
and NNs are no exception.
The processors we use are meant to have a list of instructions and execute
them one by one and they are efficient when we use loops.&lt;/p>
&lt;p>&lt;del>There have been several tries to implement NNs as actual hardware.
But these are not widespread, yet.&lt;/del>&lt;/p>
&lt;p>Nowadays, there are NPUs and TPUs out there. But most of these we&amp;rsquo;ve got today are capable of
running only small models within a reasonable timeframe. If you want an NPU with good performance for
huge models, such as these LLMs out there, you ought to pay few thousand bucks. Let me know if I&amp;rsquo;m wrong, in the comments.&lt;/p>
&lt;h2 id="what-other-paradigms-of-ml-exist">What other paradigms of ML exist?&lt;/h2>
&lt;p>Several, actually. Decision Tree Classifiers, Support Vector Machines, Simulated Annealing when used to find an optimum model or program are all kinds of machine learning paradigms(or methods or techniques) which are not Neural Networks. I have decided to concentrate my research and studies on one of them:
Evolutionary Machine Learning and &lt;a href="https://en.wikipedia.org/wiki/Genetic_programming" target="_blank">Genetic Programming&lt;/a>.&lt;br>
In GP, we see the code as data and as our model to solve a problem.
I believe the idea was first formulated by &lt;a href="https://en.wikipedia.org/wiki/John_Koza" target="_blank">John Koza&lt;/a>
in his book. In plain, the idea is that we need to find a
program which does the job we have in mind. And we use techniques
inspired by Darwinian Evolution to find the optimal program.&lt;/p>
&lt;p>&lt;em>NOTE: Precisely, there were many who proposed evolving programs
to solve problems before Koza did. One of whom is the famous
Turing, the Father of Computer Science. However, to my knowledge,
it was Koza who first employed this technique to solve ML problems with it.&lt;/em>&lt;/p>
&lt;p>Let&amp;rsquo;s again talk about the binary classification problem.
Is a given photo, is the photo of a dog or a cat?
With ANNs, we have to simulate them on a computer to train them using
whatever learning method. And these days, you need to employ GPUs most of the time
if you want to do something non-trivial. After the training, your model is a network
structure and a set of weights and you have to simulate the model on the target machine.&lt;/p>
&lt;p>But with GP, our model is an actual computer program. We need to find a program which does our job good enough.
And to get to the right program, we use methods of &lt;a href="https://en.wikipedia.org/wiki/Natural_selection" target="_blank">Natural Selection&lt;/a>
and &amp;ldquo;survival of the most fit&amp;rdquo;&lt;/p>
&lt;p>There are several ways to represent these &amp;ldquo;programs&amp;rdquo;. Initially, Koza used
&lt;a href="https://en.wikipedia.org/wiki/Lisp_%28programming_language%29" target="_blank">Lisp&lt;/a> to accomplish
the goal. The feature Lisp had at that time which I believe no other language
had, was that the Lisp code could also be seen as and work with like some data.
Koza used Lisp &lt;a href="https://en.wikipedia.org/wiki/S-expression" target="_blank">S-expressions&lt;/a> to represent programs. This feature of Lisp is still quite unique among programming languages. (If you think Lisp is slow, see &lt;a href="https://www.lrde.epita.fr/~didier/research/publications/papers/verna.06.imecs.html" target="_blank">Didier Verna’s paper “How to make Lisp go faster than C?”&lt;/a>)
And he wrote programs, which were producing programs(or Lisp S-expressions),
to solve different tasks like evolving a multiplexer.&lt;/p>
&lt;p>The representation Koza chose is today known as
&amp;ldquo;Tree Genetic Programming&amp;rdquo;. After that, several other representations were proposed by
researchers which each are better suited for a specific class of tasks.
For example, Genetic Network Programming was proposed to solve the Artificial
Ant problem more efficient than the representation Koza
had used for the same problem. In this problem, we
need to program a machine, an artificial ant, which is looking for food in an area.
The location of food blocks is unknown. But we have several of these &amp;ldquo;ants&amp;rdquo; and each ant can mark
an area to guide other ants once it finds a food block. The goal is finding a strategy(or a program)
for all ants which maximizes the amount of food found in a constant period of time. Or alternatively, find a constant amount of food in minimum time.&lt;/p>
&lt;p>Another representation is Stack based Genetic Programming.
I have written a simple program to solve a Symbolic Regression problem
which is available on &lt;a href="https://github.com/farooqkz/stack-gp-test" target="_blank">a Github repository&lt;/a>. I&amp;rsquo;ve included
some small introduction about Stack GP and the problem my codes solves with it, as well.&lt;/p>
&lt;p>Finally, if you are interesting to learn more about Genetic Programming, I suggest you read &lt;a href="https://alfagroup.csail.mit.edu/sites/default/files/documents/2015%20Genetic%20Programming.%20James%20McDermott%20and%20Una-May%20O%27Reilly.%20Handbook%20of%20Computational%20Intelligence%2C%202015.pdf" target="_blank">this introduction&lt;/a>.&lt;/p></description></item><item><title>Evolution of Minetest CTF game over years</title><link>http://far.chickenkiller.com/computing/evolution-of-minetest-ctf-game-over-years/</link><pubDate>Tue, 20 Jun 2023 14:20:22 +0330</pubDate><guid>http://far.chickenkiller.com/computing/evolution-of-minetest-ctf-game-over-years/</guid><description>
&lt;p>Years ago, when I was in early highschool, I found Minetest CTF game. Back then, it was introduced by rubenwardy and it had only one map. Mainly because it was a FOSS project, and because contributions were welcome, over years people joined to help developing the game and as some contributors or developers left, some others appeared to replace them.&lt;/p>
&lt;blockquote>
&lt;p>I started development to create a game where players made countries and castles and fought each other. It would have been similar to persistent kingdoms today. At some point I switched to making CTF instead, with temporary maps rather than persistent, to make it easier to test the code. &amp;ndash;rubenwardy&lt;/p>&lt;/blockquote>
&lt;h3 id="2013-the-end-of-the-world-and-the-birthyear-of-minetest-ctf">2013, the end of the world and the birthyear of Minetest CTF&lt;/h3>
&lt;p>According to the &lt;a href="https://forum.minetest.net/viewtopic.php?t=6947" target="_blank">forum topic&lt;/a>, birthday of CTF should be somewhere in 2013. Rubenwardy created a modpack with which one could build team based PvP games like CTF. &lt;a href="https://github.com/MT-CTF/ctf_pvp_engine" target="_blank">The Github repository&lt;/a> is now archived as the code has been merged into &lt;a href="https://github.com/MT-CTF/capturetheflag" target="_blank">the main CTF repository&lt;/a>. Initially, the server was very small(regarding number of supported players which according to ruben was 14) and was hosted from rubenwardy&amp;rsquo;s home.&lt;/p>
&lt;h3 id="2015-2016">2015-2016&lt;/h3>
&lt;p>I joined the server to play the game sometime in 2016 I believe. The server was small, frequently laggy and was hosted by rubenwardy on DigitalOcean. There was only one map which we had to play over and over. Steel sword was the thing which was making players unkillable as the only other sword was stone sword! Shotgun was shooting a single bullet which could remove wood or stone blocks. My hobby was hiding in the trees and shooting the enemy base blocks down one by one!&lt;/p>
&lt;p>Who knows the name of that one map? :)&lt;/p>
&lt;h3 id="2017-2018-multiple-maps">2017-2018, multiple maps&lt;/h3>
&lt;p>We have multiple maps. Yes! We don&amp;rsquo;t have to play a single map over and over. And people are slowly starting to submit their own maps to the game. We also have got grenades and SMGs in game. The pro chest requirement is a few thousands of score.&lt;/p>
&lt;p>Additionally, &lt;a href="https://github.com/MT-CTF/capturetheflag/issues/134" target="_blank">I’ve suggested adding mobs to the game&lt;/a> and then people on Discord have made a &amp;ldquo;ADD MOBZ PLZ&amp;rdquo; emoji with as a symbol of non-sensible suggestion xD&lt;/p>
&lt;h3 id="2019-2020-classes-and-more-maps">2019-2020, classes and more maps&lt;/h3>
&lt;p>By introducing classes, players can choose to heal, to shoot or to charge with sword. We have new blocks like reinforced cobble to make our base defenses. There was a bug in which when you right click on many stones, a furnace form was showed. This bug has been fixed sometime in 2019. Also a map catalog is added and more maps are being proposed.&lt;/p>
&lt;h3 id="2021-2022">2021-2022&lt;/h3>
&lt;p>I see some commits from LoneWolfHT. People were formerly complaining about their teammates stealing their kills and now we have kill assists. And in this year, CTF v3.0 gets released which mainly introduces multiple modes!&lt;/p>
&lt;p>During this period, rubenwardy loses interest in developing the game and he wisely hands it over to LoneWolf/LandarVargan who later recruits another core developer, savilli.&lt;/p>
&lt;h3 id="2021-till-present">2021 till present&lt;/h3>
&lt;p>During this period, one of the core developers, savilli, has left. And we are pacing slower. However, we have got some new contributors some of which are youths. On the other hand, the player base is the largest of all these years and if we count other CTF servers like JMA and others, it is even bigger.&lt;/p>
&lt;h3 id="future">Future?&lt;/h3>
&lt;p>There are many things which slowly are being added to CTF. Including but not limited to &lt;a href="https://github.com/MT-CTF/capturetheflag/pull/1115" target="_blank">Flagwars mode&lt;/a> where the enemy touching your flag means end of game for your team. And &lt;a href="https://github.com/MT-CTF/capturetheflag/issues/1081" target="_blank">Domination mode&lt;/a> where one team has to conquer land till they can reach the enemy flag and steal it. I am also looking forward to verified player bots in game.&lt;/p></description></item><item><title>Me in Bandar Abbas programmers meeting</title><link>http://far.chickenkiller.com/misc/me-in-bandar-abbas-programmers-meeting/</link><pubDate>Fri, 26 May 2023 11:52:38 +0330</pubDate><guid>http://far.chickenkiller.com/misc/me-in-bandar-abbas-programmers-meeting/</guid><description>
&lt;p>This is a photo of people in a meeting for programmers in my city, Bandar Abbas. One face belongs to me and the other to some dead man. Other faces belong to other alive people.&lt;/p>
&lt;p>Unfortunately, this meeting and the level of attendants were very frustrating for me&amp;hellip;&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/photo-bandarabbas-programmers.jpg" alt="Bandar Abbas meeting of programmers" />
&lt;/figure>&lt;/p></description></item><item><title>About Farooq Karimi Zadeh</title><link>http://far.chickenkiller.com/_pages/about-me/</link><pubDate>Wed, 12 Apr 2023 21:49:16 +0330</pubDate><guid>http://far.chickenkiller.com/_pages/about-me/</guid><description>
&lt;h3 id="the-name">The name&lt;/h3>
&lt;p>My full name is Farooq Karimi Zadeh Shaquii. Farooq is my first name and that&amp;rsquo;s what I prefer people to call me with. Karimi Zadeh is my last name. And finally, Shaquii is the suffix and is the name of my Father&amp;rsquo;s town/homeland.&lt;/p>
&lt;h4 id="the-last-name">The last name&lt;/h4>
&lt;p>From a certain point of view, &amp;ldquo;X Zadeh&amp;rdquo; last names in Persian are like &amp;ldquo;XSon&amp;rdquo; in English. &amp;ldquo;X Zadeh&amp;rdquo; means we are descendants of &amp;ldquo;X&amp;rdquo;. In my childhood, when we were in the cemetery of our town, I tried finding my late grandfather&amp;rsquo;s grave, then his father, his grandfather and so on. Finally I found that one of our forefathers was named &amp;ldquo;Karim&amp;rdquo;. I couldn&amp;rsquo;t find Karim&amp;rsquo;s grave.&lt;/p>
&lt;h3 id="interests">Interests&lt;/h3>
&lt;ul>
&lt;li>Programming&lt;/li>
&lt;li>Computing&lt;/li>
&lt;li>Unconventional Computing. Including Cellular Automata, Neural Computing, Analog Computing and Ternary Computers&lt;/li>
&lt;li>Machine Learning&lt;/li>
&lt;li>Genetic Programming and Evolutionary Algorithms&lt;/li>
&lt;li>Abrahamic Religions&lt;/li>
&lt;li>Philosophy&lt;/li>
&lt;li>Logic(not just boolean!)&lt;/li>
&lt;li>Mathematics&lt;/li>
&lt;li>Electronics&lt;/li>
&lt;li>Decentralized systems. Including Fediverse, decentralized search engines and decentralized IMs&lt;/li>
&lt;/ul>
&lt;h3 id="contact">Contact&lt;/h3>
&lt;p>Best way is Email:&lt;/p>
&lt;pre tabindex="0">&lt;code>fkz riseup net
&lt;/code>&lt;/pre></description></item><item><title>You are not dumb</title><link>http://far.chickenkiller.com/misc/you-are-not-dumb/</link><pubDate>Mon, 10 Apr 2023 12:37:23 +0330</pubDate><guid>http://far.chickenkiller.com/misc/you-are-not-dumb/</guid><description>
&lt;p>It is common among some teenagers from 15 to 17 or so. They call themselves &amp;ldquo;dumb&amp;rdquo;, &amp;ldquo;idiot&amp;rdquo; and such these words. They think they are not worthy. To be honest, I had similar behaviors when I was a teenager. And now I know I was wrong.&lt;/p>
&lt;p>The reason I was considering myself an &amp;ldquo;idiot&amp;rdquo; was simply because my knowledge was very limited. And my learning process was super slow. But after years, I have come to this understanding that a slow but constant learning rate can have great effects after a few years. Actually, I believe a slow but long term and constant is much better than a super fast progress which sometimes comes and most of the time is absent. There is a proverb for this in Persian: The true traveller is the one who goes constantly slow rather than the one who doesn&amp;rsquo;t walk the way but sometimes does a quick run.&lt;/p>
&lt;p>The problem&amp;rsquo;s that these teenagers believe they are idiots because they can&amp;rsquo;t become the Master of one thing(for example some branch of Math or some programming language or any branch of science) in just a 24/7 effort.&lt;/p>
&lt;p>If you want to master something, you don&amp;rsquo;t need to move fast. You need to have constant and slow steps. You don&amp;rsquo;t need to push yourself too hard, just have small daily exercises and try to not miss a day. As a progammer, I tend to code or think about problems almost everyday. Even when I am with family, I sometimes think to the problems. Not just technical ones but also philosophical ones.&lt;/p>
&lt;p>If you want to master something, and you are a teenager around 15 or so now, it is a good time to start. But don&amp;rsquo;t expect to understand everything instantly. It is a fact that some concepts in science, need some effort and time to deeply understand them. And usually you can&amp;rsquo;t do it in half the time, your mind really needs to adapt itself to the new situation.&lt;/p>
&lt;h3 id="a-real-world-example">A real world example&lt;/h3>
&lt;p>A friend of mine, &lt;a href="https://github.com/b-simjoo" target="_blank">Behnam Simjoo&lt;/a>, is TA of a fundemental CS course in &lt;a href="https://hormozgan.ac.ir" target="_blank">Hormozgan University&lt;/a>. He and I been doing programming(and not Computer Science) for long since school. He always says those without programming background can&amp;rsquo;t have their mind adapted in just one semester(3-4 months) to think like a programmer. And the University is quite on the wrong track in asking them to pass this course in one semester. Needless to say that the way a considerable number of students in this country, perhaps a majority of them, are not even near the right track in choosing their academic branch which is mandatory from highschool.&lt;/p></description></item><item><title>Guide to live without glasses for broken eyes</title><link>http://far.chickenkiller.com/misc/guide-to-live-without-glasses-for-broken-eyes/</link><pubDate>Mon, 26 Dec 2022 12:48:48 +0000</pubDate><guid>http://far.chickenkiller.com/misc/guide-to-live-without-glasses-for-broken-eyes/</guid><description>
&lt;p>You wear glasses because your eyes are broken and without them you are more than half blind. You are like me. Now what will happen if your glasses get broken? This is a collection of small tips to do well till you get your new glasses.&lt;/p>
&lt;p>Also next time, you&amp;rsquo;ll want to keep backup glasses somewhere.&lt;/p>
&lt;h2 id="if-its-just-the-frame">If it&amp;rsquo;s just the frame&lt;/h2>
&lt;p>Now that&amp;rsquo;s good. It&amp;rsquo;s only the frame which is broken and the actual glasses are okay. Keep one of the glasses around and use that to look around. You&amp;rsquo;ll look dumb but it&amp;rsquo;s not something you should care about. The next time take better care of your glasses and keep a backup around so that this won&amp;rsquo;t come to happen.&lt;/p>
&lt;h2 id="if-its-not-just-the-frame">If it&amp;rsquo;s not just the frame&lt;/h2>
&lt;p>This is definitely not good. Use your mobile phone camera to take photos then use zoom in and zoom out to realize what is actually there. Honor the traffic lights and pass only when the lights are red for the cars.&lt;/p>
&lt;p>Also you probably want to pass the streets somewhere the cars&amp;rsquo; speed are much lower. If you find a traffic somewhere, that will be great.&lt;/p>
&lt;h2 id="other-tips">Other tips&lt;/h2>
&lt;p>Consider walking slower and with more attention to the world around. And watch out the shops&amp;rsquo; glass walls or doors. If you are unsure somewhere it is glass or thin air, use your hand to realize. Again, you will probably look dumb but it&amp;rsquo;s unavoidable and you will look dumber if crash into the glass.&lt;/p></description></item><item><title>Benchmarking Common Lisp, Rust, C and Python on ARM</title><link>http://far.chickenkiller.com/computing/benchmarking-common-lisp-rust-c-and-python-on-arm/</link><pubDate>Wed, 16 Nov 2022 14:19:59 +0330</pubDate><guid>http://far.chickenkiller.com/computing/benchmarking-common-lisp-rust-c-and-python-on-arm/</guid><description>
&lt;p>I have previously benchmarked &lt;a href="http://far.chickenkiller.com/computer/cpp-vs-common-lisp-performance/">C++ against Common Lisp&lt;/a> and the result was that unlike the common belief about Lisp, it can have performance which is almost as fast as C++. After that I did another benchmark for &lt;a href="http://far.chickenkiller.com/computer/py-c-rust-cl-benchmark/">computing fibonnaci series using Rust, Common Lisp, C and Python&lt;/a>. But both of these benchmarks were done on &lt;strong>x86_64&lt;/strong>. In this benchmark, I&amp;rsquo;m using the same codes from the last benchmark but run them on an ARM device instead. Unfortunately, my device is old and not ARM64 but still it can be of interest.&lt;/p>
&lt;p>At the time of writing this paragraph, I haven&amp;rsquo;t done any benchmark, yet. Nevertheless, I think the results from compiled languages should be more interesting. Because this benchmark shows how much these compilers are optimized for ARM. As for Rust, C and Common Lisp, they are directly compiled to machine&amp;rsquo;s native code. Regarding Common Lisp, this is true if we use something which does so. Because the language itself doesn&amp;rsquo;t require to be even compiled and it is up to the implemention to compile Common Lisp code or interpret it. Or that if it&amp;rsquo;s compiled, it is compiled to native code or some immediate language or that it requires a VM or not.&lt;/p>
&lt;p>For Rust, there is just one usable compiler which I am aware of. But for C and Common Lisp, there are more than one compiler which are both mature and compile to native code. So it would be useful if more than a single compiler is used.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/farooq-nanopi-neo-specs.png" alt="Farooq&amp;rsquo;s NanoPi NEO specs" />
&lt;/figure>&lt;/p>
&lt;p>As for C, I use clang and gcc which are available in Debian repositories. As for CL, one choice is definitely SBCL which is very famous for it&amp;rsquo;s performance and that it compiles to native code. But as I want to test with other CL implementations as well, I have to choose at least one other which compiles to native code, as well.&lt;/p>
&lt;p>Looking at the table on &lt;a href="https://www.cliki.net/Common&amp;#43;Lisp&amp;#43;implementation" target="_blank">this page on CLiki&lt;/a>, there is another choice: CCL. SBCL can be found in Debian repositories and as for CCL, a compiled Linux binary for ARM can be found in Github releases page.&lt;/p>
&lt;h2 id="common-lisp-untyped">Common Lisp untyped&lt;/h2>
&lt;h3 id="ccl">CCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time ./armcl --load fibo-safe.lisp
102334155
./armcl --load fibo-safe.lisp 7.39s user 0.04s system 100% cpu 7.420 total
&lt;/code>&lt;/pre>&lt;h3 id="sbcl">SBCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time sbcl --script ./fibo-safe.lisp
102334155sbcl --script ./fibo-safe.lisp 72.11s user 0.05s system 99% cpu 1:12.16 total
&lt;/code>&lt;/pre>&lt;p>It is very surprising that SBCL is this bad on ARM!&lt;/p>
&lt;h2 id="common-lisp-typed-with-no-safety">Common Lisp typed with no safety&lt;/h2>
&lt;h3 id="ccl-1">CCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time ./armcl --load fibo-unsafe.lisp
102334155
./armcl --load fibo-unsafe.lisp 5.05s user 0.04s system 100% cpu 5.086 total
&lt;/code>&lt;/pre>&lt;h3 id="sbcl-1">SBCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time sbcl --script ./fibo-unsafe.lisp
102334155sbcl --script ./fibo-unsafe.lisp 14.06s user 0.07s system 85% cpu 16.456 total
&lt;/code>&lt;/pre>&lt;h2 id="rust">Rust&lt;/h2>
&lt;pre tabindex="0">&lt;code>minetest:~:% time ./fibo
102334155
./fibo 1.50s user 0.00s system 99% cpu 1.504 total
&lt;/code>&lt;/pre>&lt;h2 id="python">Python&lt;/h2>
&lt;h3 id="pypy-37">Pypy 3.7&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time pypy3 fibo.py
102334155
pypy3 fibo.py 19.88s user 0.22s system 98% cpu 20.315 total
&lt;/code>&lt;/pre>&lt;h3 id="cpython-39">CPython 3.9&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% time python3 fibo.py
102334155
python3 fibo.py 287.57s user 0.04s system 100% cpu 4:47.61 total
&lt;/code>&lt;/pre>&lt;p>Impressive! Isn&amp;rsquo;t it?&lt;/p>
&lt;h2 id="c">C&lt;/h2>
&lt;h3 id="gcc">GCC&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% gcc -O2 fibo.c
minetest:~:% time ./a.out
102334155./a.out 1.63s user 0.01s system 99% cpu 1.639 total
&lt;/code>&lt;/pre>&lt;h3 id="clang">clang&lt;/h3>
&lt;pre tabindex="0">&lt;code>minetest:~:% clang -O2 fibo.c
minetest:~:% time ./a.out
102334155./a.out 1.33s user 0.00s system 99% cpu 1.333 total
&lt;/code>&lt;/pre>&lt;h2 id="summary-and-conclusion">Summary and conclusion&lt;/h2>
&lt;p>From fastest to slowest:&lt;/p>
&lt;ul>
&lt;li>C with clang: &lt;strong>1.33s&lt;/strong>&lt;/li>
&lt;li>Rust: &lt;strong>1.50s&lt;/strong>&lt;/li>
&lt;li>C with gcc: &lt;strong>1.64s&lt;/strong>&lt;/li>
&lt;li>CL typed CCL: &lt;strong>5.09s&lt;/strong>&lt;/li>
&lt;li>CL untyped CCL: &lt;strong>7.42s&lt;/strong>&lt;/li>
&lt;li>CL typed SBCL: &lt;strong>16.46s&lt;/strong>&lt;/li>
&lt;li>Python with pypy: &lt;strong>20.32s&lt;/strong>&lt;/li>
&lt;li>CL untyped SBCL: &lt;strong>72.16s&lt;/strong>&lt;/li>
&lt;li>Python with CPython: &lt;strong>287.61s&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>gcc is older than clang so it is not surprising that it outperforms clang on x86. But we see that on ARM the story is different.&lt;/p>
&lt;p>Among Lispers, SBCL is known for high performance. In my previous benchmarks on x86, we saw that if we use static typing and tell
the compiler to optimize for speed only, performance of Lisp can be compared to C. However it seems that SBCL hasn&amp;rsquo;t been optimized much for
ARM.&lt;/p>
&lt;p>A reasonable concern is that the SBCL from Debian repositories has such a problem. The SBCL I have is &lt;code>2.1.1&lt;/code> while &lt;a href="http://www.sbcl.org/platform-table.html" target="_blank">the platform table on SBCL website&lt;/a> says the latest version for ARMhf is &lt;code>1.4.11&lt;/code>.&lt;/p>
&lt;p>I&amp;rsquo;ve tried the binary from SBCL website for my ARM device and the results were interesting: &lt;strong>127s&lt;/strong> for untyped code and &lt;strong>14s&lt;/strong> for the typed one!&lt;/p>
&lt;p>Note that for all these languages, the Fibonnaci series is computed recursively. So this benchmark could &lt;em>only&lt;/em> show which one does the recursion better than the others. Another benchmark for testing arithmetic would be interesting, too.&lt;/p></description></item><item><title>Failed research: Generating vocal form of an English word with Genetic Algorithms</title><link>http://far.chickenkiller.com/computing/failed-research-generating-vocal-form-of-an-english-word-with-genetic-algorithms/</link><pubDate>Sat, 22 Oct 2022 10:15:37 +0330</pubDate><guid>http://far.chickenkiller.com/computing/failed-research-generating-vocal-form-of-an-english-word-with-genetic-algorithms/</guid><description>
&lt;p>I thought by using GAs and feeding individual waveforms to a Speech Recognition engine, I could generate vocal form of English word
&amp;ldquo;hello&amp;rdquo;. However after several tries, GAs don&amp;rsquo;t seem the right tool for the job.&lt;/p>
&lt;h2 id="code">Code&lt;/h2>
&lt;p>Code is on &lt;a href="https://github.com/farooqkz/hello_generator" target="_blank">a Github repository&lt;/a> and is written using Rust for high performance.&lt;/p>
&lt;h2 id="individual">Individual&lt;/h2>
&lt;p>Considering that human speech is just overlapping sine waves, each &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/individual.rs" target="_blank">Individual&lt;/a> is a set of &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/sinewave.rs" target="_blank">SineWaves&lt;/a>. To compute fitness of each individual,
first all the SineWaves each are converted to &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/waveform.rs" target="_blank">Waveforms&lt;/a> and after that the Waveforms are &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/waveform.rs#L14" target="_blank">mixed&lt;/a> and feed to &lt;a href="https://alphacephei.com/vosk/" target="_blank">Vosk&lt;/a> using a small English model. Then the distance of the result by Vosk with the target word is computed and returned as fitness. If nothing is detected, &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/consts.rs#L20" target="_blank">a default maximum distnace value&lt;/a> is returned.&lt;/p>
&lt;h3 id="sinewave">SineWave&lt;/h3>
&lt;p>Each Individual can have a number of SineWaves. The number is in &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/consts.rs#L2" target="_blank">a defined range&lt;/a> and is chosen randomly upon initializing. Each SineWave has 3 properties: start, length and frequency. Frequency of each sinewave is random within &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/consts.rs#L6" target="_blank">a range&lt;/a> as are start and length.&lt;/p>
&lt;h3 id="combination">Combination&lt;/h3>
&lt;p>Two individuals are combined using simple cross over: A random point is selected and waves are cloned to one of the two new childs, depending on that a wave is before the point or after it. &lt;a href="https://github.com/farooqkz/hello_generator/blob/master/src/individual.rs#L45" target="_blank">Here&lt;/a> is the combine method.&lt;/p>
&lt;h3 id="mutation">Mutation&lt;/h3>
&lt;p>Depending on mutation rate given by the user, a small number of individuals are mutated. These two ways are tested:&lt;/p>
&lt;ul>
&lt;li>Just reselecting frequency of each of the sinewaves within the defined range.&lt;/li>
&lt;li>Generating a new random sinewave and adding it to the set.&lt;/li>
&lt;/ul>
&lt;h2 id="tests-and-the-results">Tests and the results&lt;/h2>
&lt;p>Several tests has been done. With population from 50 to about 2000. First the fitness function was computed using two variables: distance of the recognized text from the target word and number of sinewaves in an individual. However the latter seemed irrevelant when nothing is detected at all. In the next tests, there was only one parameter for fitness: distance. However since nothing was yet recognized, it always remained constant and in it&amp;rsquo;s worst value.&lt;/p>
&lt;p>Frequencies of sinewaves were first within range of 20 to 20k. But then I changed it to the frequency of male voice which is a much more narrow range. Also with different number of sinewaves in an individual, tests were done.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>The right tool and method hasn&amp;rsquo;t been chosen for the job. With population from 50 upto 2000, nothing was detected. It is very improbable that something is detected just by combining sinewaves randomly which is done for population initialization. And when there is absolutely nothing to be detected, the fitness remains constant and GA can&amp;rsquo;t progress at all. Since it is not completely impossible, it &lt;em>might&lt;/em> be possible to have something with a population size of &lt;strong>really HUGE&lt;/strong>, like at least millions. But even in that case, this method is extremely inefficient.&lt;/p>
&lt;h2 id="next-steps">Next steps&lt;/h2>
&lt;p>Maybe using Genetic Programming which is a subset of Machine Learning, it is possible to evolve separate programs which generate sinewaves. Each program could generate a single phoneme and by mixing these, one word could be generated.&lt;/p></description></item><item><title>I've been looking for a mobile Linux device for a while and here's the conclusion</title><link>http://far.chickenkiller.com/computing/i-have-been-looking-for-a-mobile-linux-device/</link><pubDate>Sat, 13 Aug 2022 20:03:33 +0430</pubDate><guid>http://far.chickenkiller.com/computing/i-have-been-looking-for-a-mobile-linux-device/</guid><description>
&lt;p>For a long time, however not continous, I&amp;rsquo;ve been looking for a portable Linux device for geekish stuff like shell and programming as well as web browsing and maybe a bit chatting.&lt;/p>
&lt;p>I also wanted such a device to have very long battery life and a QWERTY keyboard so that typing will be convenient with it. When you are talking about battery life, you probably want your device to have ARM processor or if it&amp;rsquo;s x86, it must be Atom. Would you like Core i5 or Core i7 instead? Fine! then forget about long battery life.&lt;/p>
&lt;p>The screen also must be pretty small so that carrying it would be easy and a smaller screen would eat less battery per hour. But being too small will hurt your eyes reading the text. So an average of 6-7 inchs seems to be a balance between portability and ease on your eyes.&lt;/p>
&lt;p>So here are my trys. If you are too lazy to read, jump to &amp;ldquo;Conclusion&amp;rdquo;.&lt;/p>
&lt;h2 id="first-try-chromebooks">First try: Chromebooks&lt;/h2>
&lt;p>At the beginning I was considering chromebooks. They are cheap, many in small form factors such as 11-12inchs which is not perfect but at least not as big as 14-15. They also have ARM processors or lowend x86 ones such as Atom or Celeron.&lt;/p>
&lt;p>&lt;strong>But chromebooks were not my answer.&lt;/strong> Despite the hardware advantages of chromebooks and their cheap prices, they have a big disadvantage when it comes to a user like me which is Linux and hackability. It seems that there is no good Linux support for Chromebooks yet. Also it seems many of these chromebooks &lt;strong>come with locked bootloaders&lt;/strong>. A member of Linux room on Matrix suggested that I don&amp;rsquo;t try painful process of installation of Linux on such these devices. Last but not the least, they&amp;rsquo;ve got different and strange keyboards.&lt;/p>
&lt;h2 id="second-try-linux-arm-laptops">Second try: Linux ARM laptops&lt;/h2>
&lt;p>In the next step, I thought there might be some ARM Linux laptops which have small screen size and come for cheap. After trying some queries I&amp;rsquo;ve found only &lt;a href="https://www.pine64.org/pinebook/" target="_blank">Pinebook from Pine64&lt;/a> comes with a relatively small screen(11.6&amp;quot; according to spec).&lt;/p>
&lt;p>It seemed really cool and it was only 100 bucks!&lt;/p>
&lt;p>But after talking about it with folks in BananaHackers chatroom(in offtopic room), someone suggested that I don&amp;rsquo;t buy anything from them as they are known to ship damaged devices. Also people from &amp;ldquo;Rust offtopic&amp;rdquo; on Matrix told me the device is too slow.&lt;/p>
&lt;h2 id="third-try-diy-laptop-with-a-raspberry-pi">Third try: DIY laptop with a (Raspberry) Pi&lt;/h2>
&lt;p>This could be so complicated. But I could 3D print a case for a Pi, preferably a NanoPi with Armbian support and an HDMI port. After some search I&amp;rsquo;ve found a project on thingiverse. It would be both a cool and fun project and a small portable Linux device. &lt;strong>But people said it won&amp;rsquo;t be as good as I am thinking it will be&lt;/strong>&lt;/p>
&lt;h2 id="fourth-try-postmarketos">Fourth try: postmarketOS&lt;/h2>
&lt;p>I also found postmarketOS, an Operating System for mobile devices, mostly phones and tablets. But it seems for most devices, there is no good support for all hardware features. Or if there is, the device is not that cheap.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>It seems Android is the best, most supported and cheapest choice for me. Web browsing with the Android browser and Termux for shell stuff. I could connect a physical keyboard with OTG or Bluetooth as well. You can find cheap Lenovo tablets which come with Android 8. However, I chose something different: &lt;a href="https://shop.boox.com/collections/all/products/leaf" target="_blank">BOOX Leaf&lt;/a> so that it could save me from eye strain as well. I also could read papers and books on it without problem. It comes with an octa-core snapdragon, Android 10 and 2GB of Memory(RAM).&lt;/p></description></item><item><title>Give Back to the Community</title><link>http://far.chickenkiller.com/misc/give-back-to-the-community/</link><pubDate>Sun, 24 Jul 2022 16:57:04 +0430</pubDate><guid>http://far.chickenkiller.com/misc/give-back-to-the-community/</guid><description>
&lt;p>Since 2015, I started learning Python and migrated to Ubuntu from Windows. It was hard at the beginning but later when I learned how does it work, it became easy. At the same time, I became user of free softwares instead of propriety ones. I started using &lt;a href="http://www.libreoffice.org" target="_blank">LibreOffice&lt;/a> instead of MS Office and &lt;a href="https://minetest.net" target="_blank">Minetest&lt;/a> instead of Minecraft which I suppose now is Microsoft&amp;rsquo;s.&lt;/p>
&lt;p>In FOSS world, you usually don&amp;rsquo;t pay for the software you are using. When we say you don&amp;rsquo;t pay, this doesn&amp;rsquo;t mean only money. It also means you don&amp;rsquo;t sell your data to companies and then governments in exchange for service or software. Nor you see ads in FOSS most of the time, if not always. As a matter of fact, people or precisely programmers, develop these softwares in their free time as a hobby. Of course not all open source softwares work like this but most of them do. There is no direct benefit for the developers of Minetest for developing Minetest.&lt;/p>
&lt;p>Since I was about 9th grade, years ago, I&amp;rsquo;ve been playing CTF game on its server which back then was hosted and started by &lt;a href="https://rubenwardy.com/" target="_blank">rubenwardy&lt;/a> who is also a core developer of Minetest. The game in its early days was very basic but fun. The game is still on with a variety of new features. I am still playing the game on the server which is now hosted by LanderVargan(formerly LoneWolf).&lt;/p>
&lt;p>Recently, I thought of something: I am playing this game for a very long time and having fun with it. And for all players who play it, there are about just a handful who work on its development. Because of very low value of my local currency, Rial. I cannot donate and help with hosting but I am a programmer and can work on the development. Actually I think it is my responsibility to work on it not just because I have the skill but also because I&amp;rsquo;ve got the time to spend.&lt;/p>
&lt;p>For anyone reading my article I suggest you &amp;ldquo;give back&amp;rdquo; to the community who build a software which you use. If you have money, donate some. Preferably, on a regular basis. Even small amounts will help. And even if it doesn&amp;rsquo;t, it will bring warm feelings to the heart of developers so that they can see they&amp;rsquo;re not alone.&lt;/p>
&lt;p>If you&amp;rsquo;ve got the time, you can help with development, testing, documenting or helping other people with their problems with the software.&lt;/p>
&lt;p>If you&amp;rsquo;ve got no time nor money, still you can do something: Simply send a &amp;ldquo;Thank you&amp;rdquo; message to the developer(s). State in your email what you like about their software and that it has been useful for you. And possibly write about things like UI/UX which you dislike.&lt;/p>
&lt;p>As a summary, open source community driven softwares get what they need from their communities and we, are those who form their community.&lt;/p></description></item><item><title>Origin of Iron on Earth</title><link>http://far.chickenkiller.com/religion/origin-of-iron-on-earth/</link><pubDate>Tue, 21 Jun 2022 15:29:43 +0430</pubDate><guid>http://far.chickenkiller.com/religion/origin-of-iron-on-earth/</guid><description>
&lt;p>Some of the readers might wonder what is this post doing in the &amp;ldquo;Religion&amp;rdquo; categories of my website.
If you are one of those, you will get the answer of your question after reading this entire small post.&lt;/p>
&lt;p>According to &lt;a href="https://www.newscientist.com/article/dn27570-supernova-space-bullets-could-have-seeded-earths-iron-core/" target="_blank">some researches&lt;/a> the origin of Iron found on Earth is from the space out of Earth,
Mostly from stars which are near to their death.
The researches which a wide range of scientists have agreement upon, suggest that near the end of a star&amp;rsquo;s life, the star converts all its atoms to Oxygen and Carbon, and later Iron.
After that the star explodes, spreading all its atoms including iron ones into space, which later could form planets like our Earth.
Surprisingly, Quran tells us that God has &amp;ldquo;sent down&amp;rdquo; Iron in &lt;a href="https://quran.com/57/25" target="_blank">verse 57:25&lt;/a> which is in Hadid Surah/chapter which translated to English means Iron. Here&amp;rsquo;s the translation of the verse by Dr. Khattab:&lt;/p>
&lt;blockquote>
&lt;p>Indeed, We sent Our messengers with clear proofs, and with them We sent down the Scripture and the balance ˹of justice˺ so that people may administer justice. And We sent down iron with its great might, benefits for humanity, and means for Allah to prove who ˹is willing to˺ stand up for Him and His messengers without seeing Him. Surely Allah is All-Powerful, Almighty.&lt;/p>&lt;/blockquote>
&lt;p>One meaning of &amp;lsquo;Anzalna&amp;rsquo; in Arabic means &lt;code>giving&lt;/code> or &lt;code>favoring&lt;/code> but the other meaning is &lt;code>sending down something from the sky to earth or (probably) from up to down&lt;/code>.&lt;/p>
&lt;p>Indeed, one can find verses in Quran which suprises them, if they go deep enough.&lt;/p></description></item><item><title>Porn has good aspects, read why</title><link>http://far.chickenkiller.com/misc/porn-has-good-aspects-read-why/</link><pubDate>Sun, 15 May 2022 11:15:19 +0430</pubDate><guid>http://far.chickenkiller.com/misc/porn-has-good-aspects-read-why/</guid><description>
&lt;p>The title might be misleading. You won&amp;rsquo;t read here why &lt;a href="https://en.wikipedia.org/wiki/Pornography" target="_blank">Porn&lt;/a> is good. You&amp;rsquo;ll rather read what good aspects does Porn have.&lt;/p>
&lt;p>In my opinion, as son of a &lt;a href="https://en.wikipedia.org/wiki/Muslims" target="_blank">Muslim&lt;/a>(and not necessarily a Muslim),
everything which God has created has some good aspects greater than its bad aspects or God would not have
created it. It&amp;rsquo;s simple: All God wants is good and has the power to do
so(e.g. God is &lt;a href="https://en.wikipedia.org/wiki/Omnipotence" target="_blank">omnipotent&lt;/a>) and also the wisdom to do so.&lt;/p>
&lt;p>So what is the good aspect of Porn? Learning how to have sex with your wife?
Of course not! There are several articles in &lt;a href="https://en.wikipedia.org/wiki/Sexology" target="_blank">Sexology&lt;/a> as well as
&lt;a href="https://en.wikipedia.org/wiki/Psychology" target="_blank">Psychology&lt;/a> stating watching Porn has bad effects on one&amp;rsquo;s sexual life.&lt;/p>
&lt;p>As you probably know, different people in different situations have different behaviors. For example when I&amp;rsquo;m tired or had little sleep, at the end of the day you could make me angry easily yelling at you. As for Porn, when some groups of boys are watching Porn together(or at least pretending to it) and inviting others around to do so, you&amp;rsquo;ll have a chance to &lt;em>know&lt;/em> people. There are some who happily accept the invite and some who refuse it. You&amp;rsquo;ve got a chance to recognize those who refuse and don&amp;rsquo;t do dirty jobs.&lt;/p>
&lt;p>From this point of view, even existence of Satan/Devil seems good: You can test, ditinguish and recognize those who listen to Satan and those who refuse. And this might be an answer to &lt;a href="https://en.wikipedia.org/wiki/Problem_of_evil" target="_blank">the problem of Evil&lt;/a>.&lt;/p>
&lt;h4 id="a-comment">A comment&lt;/h4>
&lt;ul>
&lt;li>A friend commented that &amp;ldquo;Men watching porn together will lead to homosexuality&amp;rdquo;&lt;/li>
&lt;/ul></description></item><item><title>Converting PDF to Image in Python(the Right Way)</title><link>http://far.chickenkiller.com/computing/converting-pdf-to-image-in-python-the-right-way/</link><pubDate>Wed, 13 Apr 2022 19:00:32 +0430</pubDate><guid>http://far.chickenkiller.com/computing/converting-pdf-to-image-in-python-the-right-way/</guid><description>
&lt;p>If you use your favorite search engine to learn how to &amp;ldquo;convert pdf to image&amp;rdquo; in Python, you will find many websites like &lt;a href="https://www.geeksforgeeks.org/convert-pdf-to-image-using-python/" target="_blank">GeeksforGeeks&lt;/a> introducing &lt;a href="https://pypi.org/project/pdf2image/" target="_blank">pdf2image&lt;/a> to accomplish this goal.&lt;/p>
&lt;p>As you can in pdf2image&amp;rsquo;s PyPI page, it is just a wrapper around &lt;a href="https://manpage.me/?q=pdftoppm" target="_blank">pdftoppm&lt;/a> while &lt;code>pdftoppm&lt;/code> itself is part of poppler. Basically, pdf2image module invokes &lt;code>pdftoppm&lt;/code> with &lt;a href="https://docs.python.org/3/library/subprocess.html" target="_blank">subprocess&lt;/a> Python standard module which is for invoking subprocesses, controling them and capturing their output all from Python.&lt;/p>
&lt;p>So I was wondering, why not use the poppler C++ library itself to convert PDF file to Image?&lt;/p>
&lt;p>After some searching in &lt;a href="https://pypi.org" target="_blank">PyPI&lt;/a> I&amp;rsquo;ve found &lt;a href="https://pypi.org/project/python-poppler/" target="_blank">python-poppler&lt;/a> which is a wrapper around poppler C++ library which is for reading PDF files, extracting text from them and converting their pages to image file formats.&lt;/p>
&lt;p>Here I want to teach you how to use poppler from Python to convert the first page of a PDF to Image and save it somewhere in your &lt;code>/tmp/&lt;/code>.&lt;/p>
&lt;p>The zeroth step as always is installing the library:&lt;/p>
&lt;pre tabindex="0">&lt;code>pip3 install python-poppler --user
&lt;/code>&lt;/pre>&lt;p>python-poppler relies on poppler C++ library to function and is just a wrapper for that so you need to install it as well. Here I assume you already have it installed on your computer. But in the case it isn&amp;rsquo;t, you will find pip3 cursing you with errors!&lt;/p>
&lt;p>The first step is, of course, firing up the Python(3) thing and importing &lt;code>load_from_file&lt;/code> and &lt;code>PageRenderer&lt;/code>:&lt;/p>
&lt;pre tabindex="0">&lt;code>Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type &amp;#34;help&amp;#34;, &amp;#34;copyright&amp;#34;, &amp;#34;credits&amp;#34; or &amp;#34;license&amp;#34; for more information.
&amp;gt;&amp;gt;&amp;gt; from poppler import load_from_file, PageRenderer
&amp;gt;&amp;gt;&amp;gt;
&lt;/code>&lt;/pre>&lt;p>&lt;code>load_from_file&lt;/code> is used to load a PDF file from filesystem as it sounds.
And &lt;code>PageRenderer&lt;/code> is used to render a page of some PDF document into an image.&lt;/p>
&lt;p>In the case you need to load the PDF from bytes(e.g. when you are receiving it from network such as a web API which receives data from its clients) you must go with &lt;code>load_from_data&lt;/code>, instead(See &lt;a href="https://cbrunet.net/python-poppler/api/poppler.html#module-poppler" target="_blank">here&lt;/a>).&lt;/p>
&lt;p>Next you must load the PDF file with its name:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; document = load_from_file(&amp;#34;probability_cheatsheet.pdf&amp;#34;)
&lt;/code>&lt;/pre>&lt;p>Now &lt;code>document&lt;/code> is a &lt;a href="https://cbrunet.net/python-poppler/usage.html#working-with-documents" target="_blank">Document&lt;/a> object with which you can read its title or number of pages and many other properties:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; document.pages
10
&amp;gt;&amp;gt;&amp;gt; document.page_layout
&amp;lt;page_layout_enum.no_layout: 0&amp;gt;
&amp;gt;&amp;gt;&amp;gt; document.page_mode
&amp;lt;page_mode_enum.use_outlines: 1&amp;gt;
&amp;gt;&amp;gt;&amp;gt; document.producer
&amp;#39;pdfTeX-1.40.14&amp;#39;
&lt;/code>&lt;/pre>&lt;p>Next, you can create an instance of &lt;code>PageRenderer&lt;/code> and create an image of the first page:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; renderer = PageRenderer()
&amp;gt;&amp;gt;&amp;gt; page1 = document.create_page(0)
&amp;gt;&amp;gt;&amp;gt; renderer.
&amp;gt;&amp;gt;&amp;gt; img = renderer.render_page(page1)
&amp;gt;&amp;gt;&amp;gt; img
&amp;lt;poppler.image.Image object at 0x7f3652f44310&amp;gt;
&lt;/code>&lt;/pre>&lt;p>Now it is time to save the image as PNG:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; img.save(&amp;#34;/tmp/pc.png&amp;#34;, out_format=&amp;#34;png&amp;#34;)
True
&lt;/code>&lt;/pre>&lt;p>And voila! You&amp;rsquo;ve done that!&lt;/p></description></item><item><title>A benchmark between Python, C, Rust and Common Lisp for calculating fibonacci series</title><link>http://far.chickenkiller.com/computing/py-c-rust-cl-benchmark/</link><pubDate>Thu, 31 Mar 2022 17:12:35 +0430</pubDate><guid>http://far.chickenkiller.com/computing/py-c-rust-cl-benchmark/</guid><description>
&lt;p>A few years ago I did &lt;a href="http://far.chickenkiller.com/computer/cpp-vs-common-lisp-performance/">a benchmark between Common Lisp and C++&lt;/a>
and wrote pieces of code for determining if a number is prime or not. Unlike what most people usually think about Common Lisp,
it could be nearly as fast as C++ when you use the typed version of your code and disable safety stuff of SBCL.&lt;/p>
&lt;p>This time, I want to do another benchmark for computing the fibonnaci and I do it &lt;strong>without using loops and only with recursions&lt;/strong>. As an experienced Python developer knows, Python will fail for large inputs because there is a limitation on how many times a function can call itself.&lt;/p>
&lt;p>This benchmark will hopefully indicate which language is more optimized for recursion. Email me if you think I am wrong about this.&lt;/p>
&lt;h2 id="what-is-the-properties-of-the-host-system">What is the properties of the host system?&lt;/h2>
&lt;p>I have the same computer as I had when benchmarking C++ versus Common Lisp years ago except that I&amp;rsquo;ve added an extra 4GB Memory module. But for the sake of clearness I am putting my neofetch again:&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/farooqs-laptop-specs-1.png" alt="Specs of Farooq&amp;rsquo;s laptop" />
&lt;/figure>&lt;/p>
&lt;h2 id="python">Python&lt;/h2>
&lt;p>First let&amp;rsquo;s get our hands dirty with Python:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">fibo&lt;/span>(n: int):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> fibo(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> fibo(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> __name__ &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(fibo(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="python38">Python3.8&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:28:09]:~/py$ time python3.8 fibo.py
102334155
real 0m20.983s
user 0m20.906s
sys 0m0.028s
&lt;/code>&lt;/pre>&lt;h3 id="python310">Python3.10&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:34:55]:~/py$ time python3.10 fibo.py
102334155
real 0m23.500s
user 0m23.440s
sys 0m0.024s
&lt;/code>&lt;/pre>&lt;h3 id="pypy3">PyPy3&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:35:59]:~/py$ time pypy3 fibo.py
102334155
real 0m1.332s
user 0m1.282s
sys 0m0.028s
&lt;/code>&lt;/pre>&lt;h2 id="rust">Rust&lt;/h2>
&lt;p>Now I get my hand into Rust code:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-rs" data-lang="rs">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">fn&lt;/span> &lt;span style="color:#a6e22e">fibo&lt;/span>(n: &lt;span style="color:#66d9ef">u8&lt;/span>) -&amp;gt; &lt;span style="color:#66d9ef">u64&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> fibo(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> fibo(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">fn&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">println!&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">{}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, fibo(&lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="rustc-1550-without-optimization-flag-o">rustc 1.55.0 without optimization flag(&lt;code>-O&lt;/code>)&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:39:30]:~/rs$ time ./fibo
102334155
real 0m1.003s
user 0m0.998s
sys 0m0.004s
&lt;/code>&lt;/pre>&lt;h3 id="rustc-1550-with-optimization-flag-o">rustc 1.55.0 with optimization flag(&lt;code>-O&lt;/code>)&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:43:16]:~/rs$ time ./fibo
102334155
real 0m0.265s
user 0m0.260s
sys 0m0.005s
&lt;/code>&lt;/pre>&lt;h2 id="c">C&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fibo&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> n) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">fibo&lt;/span>(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">fibo&lt;/span>(n&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;%d&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">fibo&lt;/span>(&lt;span style="color:#ae81ff">40&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="clang-without-any-flag">clang without any flag&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:45:28]:~/c$ time ./a.out
102334155
real 0m0.510s
user 0m0.501s
sys 0m0.008s
&lt;/code>&lt;/pre>&lt;h3 id="gcc-without-any-flag">gcc without any flag&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:46:59]:~/c$ time ./a.out
102334155
real 0m0.482s
user 0m0.482s
sys 0m0.000s
&lt;/code>&lt;/pre>&lt;h3 id="clang-with--o2">clang with -O2&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:47:51]:~/c$ time ./a.out
102334155
real 0m0.257s
user 0m0.257s
sys 0m0.000s
&lt;/code>&lt;/pre>&lt;h3 id="gcc-with--o2">gcc with -O2&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:48:47]:~/c$ time ./a.out
102334155
real 0m0.230s
user 0m0.229s
sys 0m0.000s
&lt;/code>&lt;/pre>&lt;h2 id="common-lisp-untyped">Common Lisp untyped&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cl" data-lang="cl">&lt;span style="display:flex;">&lt;span>(defun fibo (n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">&amp;lt;=&lt;/span> n &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#a6e22e">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (fibo (&lt;span style="color:#a6e22e">1-&lt;/span> n))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (fibo (&lt;span style="color:#a6e22e">1-&lt;/span> (&lt;span style="color:#a6e22e">1-&lt;/span> n))))))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#a6e22e">write&lt;/span> (fibo &lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="sbcl">SBCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:51:50]:~/lisp$ time sbcl --script fibo.lisp
102334155
real 0m2.081s
user 0m1.986s
sys 0m0.031s
&lt;/code>&lt;/pre>&lt;h2 id="common-lisp-typed-with-no-safety">Common Lisp typed with no safety&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cl" data-lang="cl">&lt;span style="display:flex;">&lt;span>(declaim (&lt;span style="color:#66d9ef">optimize&lt;/span> (speed &lt;span style="color:#ae81ff">3&lt;/span>) (safety &lt;span style="color:#ae81ff">0&lt;/span>) (debug &lt;span style="color:#ae81ff">0&lt;/span>)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(defun fibo (n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">declare&lt;/span> (&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#66d9ef">fixnum&lt;/span> n))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">&amp;lt;=&lt;/span> n &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#a6e22e">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (fibo (&lt;span style="color:#a6e22e">1-&lt;/span> n))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (fibo (&lt;span style="color:#a6e22e">1-&lt;/span> (&lt;span style="color:#a6e22e">1-&lt;/span> n))))))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#a6e22e">write&lt;/span> (fibo &lt;span style="color:#ae81ff">40&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="sbcl-1">SBCL&lt;/h3>
&lt;pre tabindex="0">&lt;code>[17:55:57]:~/lisp$ time sbcl --script fibo.lisp
102334155
real 0m0.765s
user 0m0.696s
sys 0m0.008s
&lt;/code>&lt;/pre>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>In order from fastest to slowest:&lt;/p>
&lt;ul>
&lt;li>GCC with -O2: &lt;strong>0.230s&lt;/strong>&lt;/li>
&lt;li>clang with -O2: &lt;strong>0.257s&lt;/strong>&lt;/li>
&lt;li>Rust with optimization flag: &lt;strong>0.265s&lt;/strong>&lt;/li>
&lt;li>Common Lisp typed with SBCL: &lt;strong>0.765s&lt;/strong>&lt;/li>
&lt;li>PyPy3: &lt;strong>1.332s&lt;/strong>&lt;/li>
&lt;li>Common Lisp untyped with SBCL: &lt;strong>2.081s&lt;/strong>&lt;/li>
&lt;li>Python3.8: &lt;strong>20.983s&lt;/strong>&lt;/li>
&lt;/ul></description></item><item><title>Optimizing Infernojs Application for Performance</title><link>http://far.chickenkiller.com/computing/optimizing-infernojs-application-for-performance/</link><pubDate>Wed, 23 Feb 2022 12:53:55 +0330</pubDate><guid>http://far.chickenkiller.com/computing/optimizing-infernojs-application-for-performance/</guid><description>
&lt;p>InfernoJS, &lt;del>a fork of ReactJS for mobile,&lt;/del> is very high performance Javascript UI framework. It has good features of ReactJS, except big community and support of Facebook. But unlike ReactJS which has a very bad performance comparing to many other UI frameworks, InfernoJS is fast and small. You might want to use your favorite search engine to find the benchmarks related to this topic.&lt;/p>
&lt;p>You also might want to read &lt;strong>Why InfernoJS?&lt;/strong> section part of &lt;a href="https://blog.bananahackers.net/farooqkz/the-development-of-the-matrix-client-has-started" target="_blank">my post on BananaHackers blog&lt;/a> to read more why should you choose a framework, perhaps something like InfernoJS or ReactJS for your application instead of using no framework if your application or website is medium sized or big.&lt;/p>
&lt;p>Of course, performance is not everything but when you are writing for weak hardwares such as &lt;a href="https://en.wikipedia.org/wiki/KaiOS" target="_blank">KaiOS&lt;/a> devices with only 512MB or even less memory(RAM) and dual core weak processors, that&amp;rsquo;s when performance matters.&lt;/p>
&lt;p>This becomes even more important if you are writing an application which people would often use so it is wise to provide best possible user experience and one thing which matters now, is performance and thus longer battery life for users.&lt;/p>
&lt;p>Now enough of lecturing! Here goes the tips you would like to consider when using InfernoJS to provide best possible performance.&lt;/p>
&lt;p>I will update this post later and add more tips once I find more ways to optimize.&lt;/p>
&lt;h3 id="use-jsx-optimization-flags">Use JSX optimization flags&lt;/h3>
&lt;p>This is too obvious, I know. But let me remind you that you can further optimize your components using JSX flags such as &lt;code>$HasTextChildren&lt;/code>. There is a complete reference on InfernoJS website, &lt;a href="https://www.infernojs.org/docs/guides/optimizations" target="_blank">here&lt;/a>.&lt;/p>
&lt;p>For example this component here:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Name&lt;/span>({ &lt;span style="color:#a6e22e">firstname&lt;/span>, &lt;span style="color:#a6e22e">lastname&lt;/span> }) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">div&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">firstname&lt;/span>}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">lastname&lt;/span>}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/div&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Can be written like this which is more optimized:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Name&lt;/span>({ &lt;span style="color:#a6e22e">firstname&lt;/span>, &lt;span style="color:#a6e22e">lastname&lt;/span> }) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">div&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span> &lt;span style="color:#a6e22e">$HasTextChildren&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">firstname&lt;/span>}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span> &lt;span style="color:#a6e22e">$HasTextChildren&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">lastname&lt;/span>}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/div&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As you can see I have not written &lt;code>$HasNonKeyedChildren&lt;/code> for the &lt;code>&amp;lt;div&amp;gt;&lt;/code>. That&amp;rsquo;s because the compiler automatically does it for me whenever it can clearly see the children shape at compile time.&lt;/p>
&lt;p>I could also write &lt;code>Name&lt;/code> component like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">Name&lt;/span>({ &lt;span style="color:#a6e22e">firstname&lt;/span>, &lt;span style="color:#a6e22e">lastname&lt;/span> }) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">div&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span> &lt;span style="color:#a6e22e">$HasVNodeChildren&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">createTextVNode&lt;/span>(&lt;span style="color:#a6e22e">firstname&lt;/span>)}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#a6e22e">h3&lt;/span> &lt;span style="color:#a6e22e">$HasVNodeChildren&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>{&lt;span style="color:#a6e22e">createTextVNode&lt;/span>(&lt;span style="color:#a6e22e">lastname&lt;/span>)}&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/h3&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">/div&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>While this definitely will have better performance than writing no flags, it is ugly and has a bit worse performance comparing to &lt;code>$HasTextChildren&lt;/code>.&lt;/p>
&lt;p>The limitation about &lt;code>$HasTextChildren&lt;/code> is that you can use it only when the children is bare text. So you&amp;rsquo;ll have to go with &lt;code>$HasVNodeChildren&lt;/code> + &lt;code>createTextVnode()&lt;/code> sometimes; like when mixing text and other stuff together.&lt;/p>
&lt;h3 id="functional-components-are-faster-a-bit">Functional components are faster, a bit&lt;/h3>
&lt;p>In general, functional components are a bit faster than Class components. In Inferno you cannot use state with them and they&amp;rsquo;re stateless. This difference is usually only noticeable when you&amp;rsquo;ve got a LOT of them like thousands.&lt;/p>
&lt;h3 id="final-words">Final words&lt;/h3>
&lt;p>In this post I tried to share with you the knowledge I had about optimizing Inferno apps for performance. Do you know any other way? Let me know through comments!&lt;/p></description></item><item><title>Second Session of Hormozgan Free Software Group</title><link>http://far.chickenkiller.com/computing/second-session-of-hormozgan-free-software-group/</link><pubDate>Tue, 22 Feb 2022 17:45:29 +0330</pubDate><guid>http://far.chickenkiller.com/computing/second-session-of-hormozgan-free-software-group/</guid><description>
&lt;p>Yesterday, I was in the 2nd session of Hormozgan Free Software Group for people in Bandar Abbas, Hormozgan, Iran. It was a very good session and by the suggestion of my friend who was in the group, we played a simple Pythonic game.&lt;/p>
&lt;p>The game was about saying a Python module which is either builtin or at least familiar to all the members. We were four in a Circle and each had to say a name in a turn based basis. It was no surprise that the author had won the game having the most years of experience with Python; from 2015.&lt;/p>
&lt;p>The next game was a version of old hangman game except that a Python builtin callable was chosen. None of us could guess the word of one another and after that the time was over.&lt;/p>
&lt;p>I&amp;rsquo;ve been thinking of a web based version of the first game but it would have no point or fun since anyone participating in the game with a tab of their favourite browser could open another tab and search for whatever module in PyPI.&lt;/p>
&lt;p>These games and similar games about programming or computer science stuff could be played in other sessions too.&lt;/p></description></item><item><title>How to Study Quran?</title><link>http://far.chickenkiller.com/religion/how-to-study-quran/</link><pubDate>Sat, 12 Feb 2022 15:30:50 +0330</pubDate><guid>http://far.chickenkiller.com/religion/how-to-study-quran/</guid><description>
&lt;p>&lt;strong>Thanks to Narges Aalizadeh from Iran for reading and editing this post.&lt;/strong>&lt;/p>
&lt;p>Quran is a text and book which Muslims, followers of the one who claimed to be a prophet named Muhammad, believe about 1400 years ago it was sent down
to their prophet from Allah or God(the former is the special name for God in Arabic).&lt;/p>
&lt;p>In this post, I share my thoughts as an amateur Quran researcher for others in the hope that these notes would be useful for others. I have not got any certificate or anything from religious schools or whatever. I am a simple programmer(Python and Javascript mostly) who sometimes does some research on this text.&lt;/p>
&lt;p>Quran is like a deep ocean. If there is something in nature which can be compared to Quran, it would be a deep and big ocean.&lt;/p>
&lt;p>If you had pleasure to read a mathematics or computer science text, you would know that you may not understand a text by reading it once or twice. Sometimes even reading &lt;em>a lot&lt;/em> will not help. But when you you learn a mathematical concept in a chapter and read about it again in the other chapter, that&amp;rsquo;s what helps you understand it much better.&lt;/p>
&lt;p>Quran is not about CS or Mathematics but still a very deep text. To understand a sentence in Quran these tips can help:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Know the words. Every single word matters.&lt;/strong> A word may have multiple meanings in Arabic. Just like in English but sometimes worse, perhaps a lot worse. Also sometimes a word in Arabic can be so precise. Like there is a word in Arabic which means a number from 6 to 9(see the beginning of the Surah (or Chapter) Rome).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Read and research on similar ayat.&lt;/strong> There are topics which Quran talks about them in various places. For example it talks about story of Moses and the King of Egypt, Pharaoh, in multiple Surat such as Taha(20th Surah) and Jonah or Yunes which is the 10th Surah. Sometimes an ayah or a series of ayat explain what a single ayah does not. As an example you may not know what does 73:15 talk about just by reading this single ayah. E.g. Who was that messenger?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Read and research on Hadiths.&lt;/strong> There are topics which the Hadiths, Muhammad&amp;rsquo;s sayings and doings, explain about. It&amp;rsquo;s always good to do a text search on different Hadith books such as Sahih Bukhari or Sahih Muslim or other books.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Please email me any comment you have:&lt;/p>
&lt;pre tabindex="0">&lt;code>fkz at riseup dot net
&lt;/code>&lt;/pre></description></item><item><title>When a Quadratic equation does not have real roots</title><link>http://far.chickenkiller.com/math/when-a-quadratic-equation-does-not-have-real-roots/</link><pubDate>Mon, 17 Jan 2022 13:38:33 +0330</pubDate><guid>http://far.chickenkiller.com/math/when-a-quadratic-equation-does-not-have-real-roots/</guid><description>
&lt;p>For any equation as $ax^2 + bx + c = 0$ we have $b^2 - 4ac$ or $\Delta$ smaller than zero thus having no real roots if:&lt;/p>
&lt;ol>
&lt;li>$a, c &amp;gt; |b|$&lt;/li>
&lt;li>$a = b = c$&lt;/li>
&lt;li>$a = b$ and $c &amp;gt; b$ for any positive $b$. You can swap $a$ and $c$.&lt;/li>
&lt;/ol>
&lt;p>I have proved these but since it&amp;rsquo;s trivial, I did not write them here.&lt;/p></description></item><item><title>Using KaiScr for taking screenshots and screen mirroring for KaiOS/FFOS</title><link>http://far.chickenkiller.com/computing/using-kaiscr/</link><pubDate>Mon, 17 Jan 2022 13:30:24 +0330</pubDate><guid>http://far.chickenkiller.com/computing/using-kaiscr/</guid><description>
&lt;p>This video shows usage of my two scripts kailive.py and kaiscr.py. They&amp;rsquo;re hosted on &lt;a href="https://notabug.org/farooqkz/kaiscr" target="_blank">NotABug&lt;/a>&lt;/p>
&lt;p>The video is now on &lt;a href="https://peertube.linuxrocks.online/w/1mzy1A3qgFxVpTKmWmot6H" target="_blank">PeerTube&lt;/a> and &lt;a href="https://www.youtube.com/watch?v=59DsLyKeeUk" target="_blank">Youtube&lt;/a>&lt;/p></description></item><item><title>A math problem: enriching uranium!</title><link>http://far.chickenkiller.com/math/how-much-uranium/</link><pubDate>Mon, 17 Jan 2022 13:14:20 +0330</pubDate><guid>http://far.chickenkiller.com/math/how-much-uranium/</guid><description>
&lt;p>The uranium enriching process is a simple yet hard process. We want to reach 3.5% uranium and we only have got 0.7% uranium. To achieve this goal, we should feed the uranium to a centrifuge. For each 2 units of x% uranium which we feeds to the centrifuge, we gets 1 unit of (x-0.1)% and 1 unit of (x+0.1)% uranium. For example a unit of 0.6% and a unit of 0.8% for 2 units of 0.7%. 0.0% uranium will be discarded. Units are always positive integer and we cannot feed 1 unit of uranium, like to get two $ \frac{1}{2} $ unit.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/uranium-enriching.png" alt="Enriching uranium" />
&lt;/figure>&lt;/p>
&lt;p>So to reach 3.5% uranium, 3 questions get raised:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Will we be able to produce 3.5% uranium from $m$ units of 0.7% uranium?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>For $m$ units of 0.7% uranium how many units of 3.5% uranium can we produce?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If with some units of 0.7% uranium, we cannot produce at least a unit of 3.5% uranium, what is the richest which we can produce?&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>You can solve these questions either by your math skills or your coding skills. Good luck :)&lt;/p></description></item><item><title>C++ vs Common Lisp Performance</title><link>http://far.chickenkiller.com/computing/cpp-vs-common-lisp-performance/</link><pubDate>Mon, 17 Jan 2022 12:47:45 +0330</pubDate><guid>http://far.chickenkiller.com/computing/cpp-vs-common-lisp-performance/</guid><description>
&lt;p>After I read a small paper named &lt;a href="http://www.iaeng.org/IJCS/issues_v32/issue_4/IJCS_32_4_19.pdf" target="_blank">How to make Lisp go faster than C&lt;/a> I decided to do some small benchmarking myself with C++ and Common Lisp. For benchmarking I have written programs which find prime numbers from 2 up to 384460. All programs were run on my laptop with the following specs and properties:&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/farooqs-laptop-specs.png" alt="Specs of Farooq&amp;rsquo;s laptop" />
&lt;/figure>&lt;/p>
&lt;h4 id="c">C++&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">bool&lt;/span> &lt;span style="color:#a6e22e">isprime&lt;/span>(&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">long&lt;/span> n) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (n &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">long&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> n; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (n&lt;span style="color:#f92672">%&lt;/span>i &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) &lt;span style="color:#66d9ef">return&lt;/span> false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">unsigned&lt;/span> count &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">long&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">384460&lt;/span>; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (isprime(i)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> count&lt;span style="color:#f92672">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> count;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And the time this program took to find all prime numbers in the given range without optimizing(&lt;code>clang++ prime.cpp&lt;/code>):&lt;/p>
&lt;pre tabindex="0">&lt;code>real 1m2.907s
user 1m2.816s
sys 0m0.084s
&lt;/code>&lt;/pre>&lt;p>And with &lt;code>-O3&lt;/code> option:&lt;/p>
&lt;pre tabindex="0">&lt;code>real 0m54.604s
user 0m54.566s
sys 0m0.008s
&lt;/code>&lt;/pre>&lt;p>Also with &lt;code>-O2&lt;/code> option:&lt;/p>
&lt;pre tabindex="0">&lt;code>real 0m53.953s
user 0m53.953s
sys 0m0.000s
&lt;/code>&lt;/pre>&lt;h4 id="common-lisp-untyped">Common Lisp untyped&lt;/h4>
&lt;p>Code:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cl" data-lang="cl">&lt;span style="display:flex;">&lt;span>(defun isprime (n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">&amp;lt;&lt;/span> n &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (loop for i from &lt;span style="color:#ae81ff">2&lt;/span> to (&lt;span style="color:#a6e22e">1-&lt;/span> n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> when (&lt;span style="color:#a6e22e">zerop&lt;/span> (&lt;span style="color:#a6e22e">mod&lt;/span> n i))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> return &lt;span style="color:#66d9ef">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> finally
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (return &lt;span style="color:#66d9ef">t&lt;/span>))))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(defun main ()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (loop for i from &lt;span style="color:#ae81ff">2&lt;/span> to &lt;span style="color:#ae81ff">384460&lt;/span> &lt;span style="color:#a6e22e">count&lt;/span> (isprime i)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(main)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And the time it took:&lt;/p>
&lt;pre tabindex="0">&lt;code>real 2m0.889s
user 2m0.805s
sys 0m0.078s
&lt;/code>&lt;/pre>&lt;p>Common Lisp typed and optimized&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cl" data-lang="cl">&lt;span style="display:flex;">&lt;span>(declaim (&lt;span style="color:#66d9ef">optimize&lt;/span> (speed &lt;span style="color:#ae81ff">3&lt;/span>) (safety &lt;span style="color:#ae81ff">0&lt;/span>) (debug &lt;span style="color:#ae81ff">0&lt;/span>)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(defun isprime (n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">declare&lt;/span> (&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#66d9ef">fixnum&lt;/span> n))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">&amp;lt;&lt;/span> n &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (loop for i &lt;span style="color:#66d9ef">fixnum&lt;/span> from &lt;span style="color:#ae81ff">2&lt;/span> to (&lt;span style="color:#a6e22e">1-&lt;/span> n)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> when (&lt;span style="color:#a6e22e">zerop&lt;/span> (&lt;span style="color:#a6e22e">mod&lt;/span> n i))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> return &lt;span style="color:#66d9ef">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> finally
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (return &lt;span style="color:#66d9ef">t&lt;/span>))))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(defun main ()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (loop for i &lt;span style="color:#66d9ef">fixnum&lt;/span> from &lt;span style="color:#ae81ff">2&lt;/span> to &lt;span style="color:#ae81ff">384460&lt;/span> &lt;span style="color:#a6e22e">count&lt;/span> (isprime i)))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(main)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And the time it took:&lt;/p>
&lt;pre tabindex="0">&lt;code>real 0m59.837s
user 0m59.755s
sys 0m0.070s
&lt;/code>&lt;/pre>&lt;p>As you see according to these results CL typed and optimized code is a bit slower than the C++ version. However someone who helped me a lot in &lt;code>#clschool&lt;/code> on freenode reported that both C++ version and CL typed version ran in 21.6s.&lt;/p>
&lt;p>&lt;strong>NOTE: I used SBCL for both typed and untyped versions&lt;/strong>&lt;/p>
&lt;h4 id="thanks-to">Thanks to&lt;/h4>
&lt;ul>
&lt;li>People in #clschool who helped me&lt;/li>
&lt;li>Didier Verna for his good paper&lt;/li>
&lt;/ul></description></item><item><title>An Easy Way to Find Shell Servers Through Freenode</title><link>http://far.chickenkiller.com/computing/an-easy-way-to-find-shell-servers-through-freenode/</link><pubDate>Mon, 17 Jan 2022 12:33:26 +0330</pubDate><guid>http://far.chickenkiller.com/computing/an-easy-way-to-find-shell-servers-through-freenode/</guid><description>
&lt;p>&lt;strong>Update 2023 Auguest 04&lt;/strong>&lt;/p>
&lt;p>Someone reading this post in 2023 might wonder what is a shell server and what is it good for?&lt;/p>
&lt;p>A shell server, is a server with a Unix-like OS(usually Linux) which provides shell access to its users with ssh. You have an account on the server with which you can learn Unix commands, play around and learn programming. Shell servers usually have a community of their own of programming and Linux(or Unix-like) enthusiasts.&lt;/p>
&lt;p>Back then, they were usually providing a webspace, an email account, a shell account and some storage to keep all these. And you could run IRC bots on them. Nowadays, anyone can simply get free and fast hosting for their static website on providers like Github Pages, Gitlab Pages and so on. But back then, such these did not exist or were not widespread.&lt;/p>
&lt;p>A good question is that, are shell servers and account still relevant as of 2023?&lt;/p>
&lt;p>I am really unsure about this. But if you are on Windows and want to try some Linux or Unix CLI, shell servers can be a good choice to learn without having to download and launch Linux.&lt;/p>
&lt;p>Or if you are on Linux, you can try some FreeBSD commands on a FreeBSD shell server.&lt;/p>
&lt;hr>
&lt;p>Other than &lt;a href="http://shells.red-pill.eu/" target="_blank">this website&lt;/a> and your favorite search engine, there is another way to find shell servers. Connect to freenode(it&amp;rsquo;s an &lt;a href="https://en.wikipedia.org/wiki/IRC" target="_blank">IRC&lt;/a> network). Then type this command and press enter: &lt;code>/msg alis list *shells&lt;/code> It will send you a list of IRC channels their name ending with &amp;ldquo;shells&amp;rdquo;, not all of them are IRC channels of shell servers nor all of them are free(as in price).&lt;/p>
&lt;p>&lt;strong>Edit:&lt;/strong> Nowadays as of 2021 you might want to check &lt;a href="https://libera.chat" target="_blank">LiberaChat&lt;/a>, too.&lt;/p>
&lt;p>&lt;strong>Edit2:&lt;/strong> I forgot to mention &lt;a href="https://tildeverse.org" target="_blank">tildeverse&lt;/a> which lists many tildes, or shell servers. Note that some of these come with non-Linux Unix-likes like BSDs! (As of time of writing this, of course)&lt;/p>
&lt;p>&lt;figure>
&lt;img src="http://far.chickenkiller.com/finding-shell-servers-using-freenode.png" alt="Finding shell servers using freenode image" />
&lt;/figure>&lt;/p></description></item><item><title>2 years with a Jinn living inside me</title><link>http://far.chickenkiller.com/religion/2-years-with-a-jinn-living-inside-me/</link><pubDate>Mon, 17 Jan 2022 12:28:08 +0330</pubDate><guid>http://far.chickenkiller.com/religion/2-years-with-a-jinn-living-inside-me/</guid><description>
&lt;p>&lt;strong>Updated on 2023-07-16&lt;/strong>&lt;/p>
&lt;p>Oh Jinn? What is that? I think the best English translation for this Arabic word is “Demon”. But I am gonna use the Arabic word to make sure I refer to the one described in Islam. You might find it surprising that someone believes in something like this, which seems to be some legend from former ignorant people.&lt;/p>
&lt;p>As a fact, proving or disproving existence of such a thing is impossible. But as &lt;a href="https://en.wikipedia.org/wiki/Bertrand_Russell" target="_blank">Russell&lt;/a> argued in the 20th century, this does not allow us to believe in anything which its existence is impossible to disprove.&lt;/p>
&lt;p>However, this belief of me in Islam, make me get myself out of trouble. During the summer before 12nd grade, I was studying hard for Conquer, a big exam in Iran in which people go university through it, and everything was fine before something terrible happen to me: Suddenly and at once he was not able to study and code and sometimes not even plain reading.&lt;/p>
&lt;p>Also some other weird stuff happened to me at the same time. I had lost many functionallities of my body. The worst part was that I could not use my hand and fingers for typing, which is necessary for programming and writing which is necessary for mathematics.&lt;/p>
&lt;p>I messed school exams up and the more important exam which was Conquer as well. After about two years, I learned about healing through Quran and praying. I also learned about “Sihr”(Black magic) and “Hasad”(Envy). There are different kinds of Sihr and one of them is a Sihr which could ruin success of a successful person(for example a successful student) and turn them into someone with a lot of faults and no success. Hasad could have such an effect, too.&lt;/p>
&lt;p>I got a recipe from someone and listened to Quran reciting voice everyday. In the beginning listening to Quran was hard for me like a burden. Additionally, listening to Quran was making me angry wanting to break stuff or throw stuff away. I could listen to Quran without having any problem before this period. I was told, when I listen Quran, the Jinn who has possessed me gets pressured and so he/she pressures me to make me stop listening and I had to do the opposite.&lt;/p>
&lt;p>I listened to Quran till I got my ability for mind tasks like coding and math back. After this, I am highly confident if I ever disbelieve in Islam and in God.&lt;/p>
&lt;p>Thanks to God, then three people who gave me consults.&lt;/p></description></item><item><title>2^x+2^y=k</title><link>http://far.chickenkiller.com/math/2x-2y-k/</link><pubDate>Sun, 16 Jan 2022 21:49:16 +0330</pubDate><guid>http://far.chickenkiller.com/math/2x-2y-k/</guid><description>
&lt;p>2&lt;!-- raw HTML omitted -->x&lt;!-- raw HTML omitted --> + 2&lt;!-- raw HTML omitted -->y&lt;!-- raw HTML omitted --> = k where x, y and k are positive integers and k is a constant. The question&amp;rsquo;s that for different values of k how many solution does our equation have? For any odd k there is no solution and for positive powers of 2 there is one. We want a general solution for this equation.&lt;/p>
&lt;h3 id="solution-by-susam-pal">Solution by Susam Pal&lt;/h3>
&lt;p>We will take this fact for granted: Every positive integer can be uniquely expressed as the sum of distinct powers of 2. In other words, every positive integer has a unique binary representation.&lt;/p>
&lt;p>Now consider the case where x = y. Let m = x = y. Then k = 2&lt;!-- raw HTML omitted -->m&lt;!-- raw HTML omitted --> + 2&lt;!-- raw HTML omitted -->m&lt;!-- raw HTML omitted --> = 2&lt;!-- raw HTML omitted -->(m+1)&lt;!-- raw HTML omitted -->. Further, if k = 2&lt;!-- raw HTML omitted -->(m+1)&lt;!-- raw HTML omitted --> where m &amp;gt; 1, x = y = m is a solution. There cannot be a solution in which x != y because that would result in another binary representation of k apart from the existing representation of 2&lt;!-- raw HTML omitted -->(m+1)&lt;!-- raw HTML omitted --> which would contradict the uniqueness of the binary representation of k. Therefore there must be exactly 1 solution when k is a positive power of 2.&lt;/p>
&lt;p>Now consider the case where x != y. Let x = m and y = n. Then k = 2&lt;!-- raw HTML omitted -->m&lt;!-- raw HTML omitted --> + 2&lt;!-- raw HTML omitted -->n&lt;!-- raw HTML omitted --> = 2&lt;!-- raw HTML omitted -->n&lt;!-- raw HTML omitted --> + 2&lt;!-- raw HTML omitted -->m&lt;!-- raw HTML omitted -->. Thus both (x = m, y = n) and (x = n, y = m) are solutions. There cannot be a solution in which x = y because that would lead to k = 2&lt;!-- raw HTML omitted -->(x+1)&lt;!-- raw HTML omitted --> which violates the uniqueness of the binary representation of k. Also, there cannot be another solution in which either x or y does not belong to {m, n} because that would too violate the uniqueness of the binary representation of k. We conclude that there must be exactly 2 solutions when k is a sum of two distinct positive powers of 2.&lt;/p>
&lt;p>For any other positive integer k, no solutions are possible. We can show this by contradiction. Let k be such that it is neither a positive power of 2 nor a sum of two distinct positive powers of 2. If we assume that a solution exists for such k, then we have two positive integers x and y such that 2&lt;!-- raw HTML omitted -->x&lt;!-- raw HTML omitted --> + 2&lt;!-- raw HTML omitted -->y&lt;!-- raw HTML omitted --> = k. If x = y, it contradicts the fact that k is not a positive power of 2. If x != y, it contradicts the fact that k is a sum of two distinct positive powers of 2.&lt;/p>
&lt;p>Thus, we can conclude that the equation has exactly 1 solution when k is a positive power of 2, 2 solutions when k is a sum of two distinct positive powers of 2, no solutions otherwise.&lt;/p></description></item><item><title>I Hate Soccer</title><link>http://far.chickenkiller.com/misc/i-hate-soccer/</link><pubDate>Tue, 26 Jun 2018 19:24:10 +0430</pubDate><guid>http://far.chickenkiller.com/misc/i-hate-soccer/</guid><description>
&lt;p>&lt;strong>Updadted in Auguest of 2023&lt;/strong>&lt;/p>
&lt;p>I&amp;rsquo;m not talking about soccer itself but this business around soccer which is really awful. I hate it and I have got an ideology behind.&lt;/p>
&lt;p>Soccer players and other sport players get too much salary and fame(players of other sports probably get less) they don&amp;rsquo;t deserve. I think most people agree with this if not all. You can compare this to salaries of doctors rescuing you and your family or the farmer which you would die of hunger if they weren&amp;rsquo;t or a writer or a teacher.&lt;/p>
&lt;p>But why do players get so much? Simply, because people pay attention to them. Sport fans from one year or months before a game, buy tickets. And they are greedy to buy clothes of players, their ball, and other their stuff. A part of this money goes to players&amp;rsquo; bank accounts. another part goes to other people&amp;rsquo;s account participating in this business. So why do they get so much money? Because you give!&lt;/p>
&lt;p>Here, many may argue that they don&amp;rsquo;t spend money on these. And that they just watch or follow. This argument is not valid as you help them become more and more famous and thus, other people who want to spend money, get more attracted.&lt;/p>
&lt;p>&lt;em>NOTE: Unfortunately, players are not the only group who get a lot of wealth. Also actors and actresses receive too much money because of us. But now, it is world cup and that&amp;rsquo;s why I&amp;rsquo;ve written about soccer players instead of actors/actresses.&lt;/em>&lt;/p></description></item><item><title>Donate to Farooq</title><link>http://far.chickenkiller.com/_pages/donate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://far.chickenkiller.com/_pages/donate/</guid><description>
&lt;p>If you appreciate me open source works and you want to donate, I appreciate donations in the form of cryptocurrencies. Below are the addresses:&lt;/p>
&lt;pre tabindex="0">&lt;code>LTC: ltc1q2unurv0w7f7eswhykvswhfha22z6ptu3ys5r9s
BCH: qz7vlj53lq4qcp2h4gplga6rr0te0xpe7cztkwj2e5
&lt;/code>&lt;/pre></description></item></channel></rss>