<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on JOURNAL.ROBBI.MY</title><link>https://journal.robbi.my/tags/python/</link><description>Recent content in Python on JOURNAL.ROBBI.MY</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 30 Jun 2026 03:01:59 +0000</lastBuildDate><atom:link href="https://journal.robbi.my/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>Stop Saying Django Can’t Do Microservices—You’re Just Doing It Wrong</title><link>https://journal.robbi.my/indieweb/250712045545/</link><pubDate>Sat, 12 Jul 2025 04:55:45 +0800</pubDate><guid>https://journal.robbi.my/indieweb/250712045545/</guid><description>&lt;p&gt;Mirror:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://archive.ph/T8IER#selection-873.17-873.26"&gt;archive.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/2/https://medium.com/@Am_Issath/stop-saying-django-cant-do-microservices-you-re-just-doing-it-wrong-3af40b1af32d"&gt;wayback machine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>25 05 15 0425_swapps Django Cookiecutter</title><link>https://journal.robbi.my/indieweb/250515042559/</link><pubDate>Thu, 15 May 2025 04:25:59 +0800</pubDate><guid>https://journal.robbi.my/indieweb/250515042559/</guid><description>&lt;p&gt;Mirror:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://archive.ph/1N7zv"&gt;archive.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20250514202833/https://swapps.com/blog/how-to-create-a-django-application-using-cookiecutter/"&gt;wayback machine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python type hints: fix circular imports</title><link>https://journal.robbi.my/indieweb/240610060922/</link><pubDate>Mon, 10 Jun 2024 06:09:22 +0800</pubDate><guid>https://journal.robbi.my/indieweb/240610060922/</guid><description>&lt;p&gt;Mirror:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://archive.today/2024.06.09-221052/https://adamj.eu/tech/2021/05/13/python-type-hints-how-to-fix-circular-imports/"&gt;archive.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/2/https://adamj.eu/tech/2021/05/13/python-type-hints-how-to-fix-circular-imports/"&gt;wayback machine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>23 03 25 1138_ Pycon MY+KR Virtual Meetup</title><link>https://journal.robbi.my/indieweb/230325113905/</link><pubDate>Sat, 25 Mar 2023 11:39:05 +0800</pubDate><guid>https://journal.robbi.my/indieweb/230325113905/</guid><description/></item><item><title>Django logger (my personal favourite format)</title><link>https://journal.robbi.my/posts/230309102851/</link><pubDate>Thu, 09 Mar 2023 22:28:51 +0800</pubDate><guid>https://journal.robbi.my/posts/230309102851/</guid><description>&lt;p&gt;Personally, I do lot of programming using JAVA and &lt;code&gt;log4j&lt;/code&gt; is my favourite package that I use on my project.. but sometimes I also use PYTHON and been using DJANGO framework
because of it simplicity and easier to deploy.&lt;/p&gt;
&lt;p&gt;When I use DJANGO, I still prefer to have &lt;code&gt;logger&lt;/code&gt; on each of importance line of code (LoC) so I can trace back what actually happened when the code are executed.&lt;/p&gt;</description></item><item><title>Python 🐍 - active screen cursor movement</title><link>https://journal.robbi.my/posts/230303011110/</link><pubDate>Fri, 03 Mar 2023 13:11:10 +0800</pubDate><guid>https://journal.robbi.my/posts/230303011110/</guid><description>&lt;p&gt;Sometimes, I need to let the computer running so I can monitor &lt;code&gt;logs&lt;/code&gt; or make some application not goes to sleep.
So I use this python script to make random mouse movement and pressing some keyboard stroke on some interval of time.&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-header font-mono"&gt;
 &lt;span class="code-lang"&gt;python&lt;/span&gt;
 &lt;div class="code-window-controls"&gt;
 &lt;button class="code-copy" onclick="copyCode(this)" title="Copy to clipboard"&gt;📋 Copy&lt;/button&gt;
 &lt;span class="ctrl-min"&gt;&lt;/span&gt;
 &lt;span class="ctrl-max"&gt;&lt;/span&gt;
 &lt;span class="ctrl-close"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="code-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; time &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; random &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; rand
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; pynput.mouse &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; Controller &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; mouseController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; pynput.keyboard &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; Key, Controller, Listener
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; keyboard &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; keyb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# This function will move the cursor and &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# press &amp;#39;space&amp;#39; every couple of seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;active_cursor_mover&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; t&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouse &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; mouseController()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keyboard &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; Controller()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;while&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Random movements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; movedirX &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; rand&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;randint(&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;100&lt;/span&gt;, &lt;span style="color:#bd93f9"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; movedirY &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; rand&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;randint(&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;100&lt;/span&gt;, &lt;span style="color:#bd93f9"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouse&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;move(movedirX, movedirY)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keyboard&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;press(Key&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;space)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Every _ seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; t&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;sleep(&lt;span style="color:#bd93f9"&gt;2.0&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;-&lt;/span&gt; ((t&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;time() &lt;span style="color:#ff79c6"&gt;-&lt;/span&gt; start) &lt;span style="color:#ff79c6"&gt;%&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; active_cursor_mover()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You need 2 python package to make it run&lt;/p&gt;</description></item><item><title>Nenez9595 (bhgn 4)</title><link>https://journal.robbi.my/indieweb/210709043115/</link><pubDate>Fri, 09 Jul 2021 16:31:15 +0800</pubDate><guid>https://journal.robbi.my/indieweb/210709043115/</guid><description>&lt;p&gt;Bismillahirahmanirrahim..&lt;/p&gt;
&lt;p&gt;Alhamdulillah dengan izin Allah aku berjaya membuat salinan penuh laman blog (&lt;a href="https://nenez9595.blogspot.com"&gt;nenez9595.blogspot.com&lt;/a&gt;) Allahyarham pensyarah aku iaitu Prof Dr Hj Sazali. Boleh baca penulisan bahagian &lt;a href="https://journal.robbi.my/posts/nenez-part1"&gt;1&lt;/a&gt;, &lt;a href="https://journal.robbi.my/posts/nenez-part2"&gt;2&lt;/a&gt; dan &lt;a href="https://journal.robbi.my/posts/nenez-part3"&gt;3&lt;/a&gt; sekiranya berminat dengan perjalanan yang dah aku lalui sebelum berjaya buat salinan penuh laman blog beliau.&lt;/p&gt;
&lt;p&gt;Oleh sebab clone / mirror yang aku telah cuba dan buat tu hasil dia tak berapa cantik dan cun, maka aku fikir aku kene fix kan kod python yang aku buat waktu cubaan plan C yang aku ceritakan pada &lt;a href="https://journal.robbi.my/posts/nenez-part2"&gt;bahagian 2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Nenez9595 (bhgn 2)</title><link>https://journal.robbi.my/indieweb/210705122814/</link><pubDate>Mon, 05 Jul 2021 12:28:14 +0800</pubDate><guid>https://journal.robbi.my/indieweb/210705122814/</guid><description>&lt;p&gt;Assalamualaikum semua! Dalam &lt;a href="https://journal.robbi.my/posts/nenez-part1"&gt;cubaan pertama aku&lt;/a&gt;, aku try execute wget dan httrack pakai personal laptop tapi network aku tak cun disebabkan telco yang makan duit haram dengan men-FUD aku punya hotspot.&lt;/p&gt;
&lt;p&gt;Rosak plan A aku nih, payah la camginih! Penat weh!&lt;/p&gt;
&lt;p&gt;Tetiba aku teringat, aku ada sebijik server VPS yang aku guna untuk pacak bot-bots matrix, telegram dan IRC. So aku pun cepat-cepat SSH dan executed command dari sana.. hah! Ni la plan B aku tapi nampaknya take time jugak nak clone semua tu. Xpelah.. sambil aku tunggu hasilnya lebih baik aku buat plan C aku untuk stanby sekiranya plan B tak menjadi.&lt;/p&gt;</description></item><item><title>My FOSS contributions and rants on Feb-April 2021</title><link>https://journal.robbi.my/indieweb/210418031800/</link><pubDate>Sun, 18 Apr 2021 15:18:00 +0800</pubDate><guid>https://journal.robbi.my/indieweb/210418031800/</guid><description>&lt;p&gt;My rants and contributions to FOSS in Feb - April 2021&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Involve with Debian and joined &lt;a href="https://salsa.debian.org/groups/med-team/-/group_members?search=robbinespu"&gt;Debian Med teams&lt;/a&gt;, thank you Andreas Tille.&lt;/li&gt;
&lt;li&gt;I intend to help Steffen Möller to package &lt;a href="https://salsa.debian.org/med-team/python-scanpy"&gt;python-scanpy&lt;/a&gt; by fixing blocker and I end up packaging it missing dependencies which are &lt;a href="https://tracker.debian.org/pkg/python-sinfo"&gt;python-sinfo&lt;/a&gt; and &lt;a href="https://tracker.debian.org/pkg/python-stdlib-list"&gt;python-stdlib-list&lt;/a&gt; . Many thanks to who teach me how to packaging and &lt;a href="https://salsa.debian.org/nilesh"&gt;Nilesh Patra&lt;/a&gt; for sponsoring me. The work on scanpy still unfinished, there is still leftover to do. WIP.&lt;/li&gt;
&lt;li&gt;At same time I also send another ITP for &lt;a href="https://salsa.debian.org/med-team/python-scanorama"&gt;python-scanorama&lt;/a&gt;, it working but the unit test asking for another missing package called as &lt;code&gt;annoy&lt;/code&gt; from spotify and &lt;code&gt;fbcpa&lt;/code&gt; from facebook.&lt;/li&gt;
&lt;li&gt;Both missing package I able to rebuild locally but I not sending ITP yet. I send a &lt;a href="https://lists.debian.org/debian-python/2021/04/msg00006.html"&gt;request to Debian Python Team to join them&lt;/a&gt; and place both of this package under it.&lt;/li&gt;
&lt;li&gt;I still contribute to Fedora as QA and few stuff. Another point, recently (actually few month ago but nvm, just put here), Izhar aka Kagesenshi get highsugar and re-activate the local community (Fedora Malaysia) via discord. He also setup a new team called &lt;a href="https://fedoraproject.org/wiki/SIGs/DataEngineering"&gt;&lt;code&gt;Fedora Data Engineering SIG&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;After a while using and involve (contribute) with Fedora for fews years, I sometimes get a feel that Fedora and Red Hat moving so fast on everything and feel it not community oriented it more like leader oriented, take a look on something worth called as &amp;ldquo;flamewar&amp;rdquo; on &lt;a href="https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/5XPTWR5BESKCV52XQ22V3RALTPNO3ENP/"&gt;Fedora-devel list&lt;/a&gt; which debate on changes on &lt;code&gt;os-release&lt;/code&gt;.. check the Wiki &lt;a href="https://fedoraproject.org/wiki/Changes/Fedora_Linux_in_os-release"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is few&amp;rsquo;s more contribution but I not keep track it properly, will update when I remember it 🤪&lt;/p&gt;</description></item><item><title>Setup python 3.6 enviroment with virtualenv</title><link>https://journal.robbi.my/posts/190723090000/</link><pubDate>Tue, 23 Jul 2019 09:00:00 +0800</pubDate><guid>https://journal.robbi.my/posts/190723090000/</guid><description>&lt;p&gt;My wife ask me to convert few of PDF files to Excell spreadsheet. I did same thing last year by creating some small scripting program in python to do the conversion, but I don&amp;rsquo;t know where I put my code right now. Maybe lost during formating my laptop last year..haha &amp;#x1f61c;&lt;/p&gt;
&lt;p&gt;I am 懒 right now (guess what I wrote in hànzì) and I don&amp;rsquo;t remember how I did last time. Hahaha.. With my Google-fu skill, I found out DfTables offer free API for converting document to another format. Nice! &amp;#x1f62c;&lt;/p&gt;</description></item></channel></rss>