Posted on 2022-01-14
(Last modified on 2025-10-17)
| 2 minutes
| 371 words
Sometimes I want to change the status (i3status) of i3wm temporarily, but it seems that i3wm doesn't support it directly, although reloading the config for i3wm itself is a piece of cake (bindsym $mod+Shift+c reload in the config, or i3-msg -t command reload in the command line).
But this issue scratched my itch, and I swear that I must solve it today.
BTW, I'm improving my English by watching YouTube videos every single day; If you're also learning English, or any languages, LanguagePuppy can definitely help you. It's a Chrome extension I developed using Clojure. Check it out:
Posted on 2022-01-12
(Last modified on 2025-02-26)
| 2 minutes
| 327 words
So I'm trying to improve my English speaking skill by shadowing while watching TV episodes. The workflow before was to loop over video clips using mpv:
hit l to mark the start of the loop
play the video and wait for it to be at the end of the loop
hit l again to mark the end
Then mpv will loop over the clip, it basically works, but it's a bit hard and tedious to set the start and end precisely.
Note: watch my live coding session of this article:
Intro
If you've heard some rumors of Emacs that it has a very steep learning curve (or that Emacs makes a computer slow), you may be too scared to look at it. It indeed has some learning curve (learning anything does have one), but it isn't very steep. I learned this after getting my hands dirty with Emacs a few years ago.
Tag, a Tag object corresponds to an XML or HTML tag.
BeautifulSoup, the BeautifulSoup object represents the parsed document as a whole.
You can treat it like a special Tag.
It needs a parser to parse the document, a built-in parser is "html.parser", e.g. soup = BeautifulSoup("<html>a web page</html>", 'html.parser')
NavigableString, a string corresponds to a bit of text (as you see it in the browser) within a tag.
A NavigableString is just like a Python Unicode string, except that it also supports some of the features for navigating the tree and searching the tree.
As a practice, I managed to illustrate Clojure files using illustrate.clj, but my original idea was to annotate org-mode files of blogs. It's not uncommon that a blog post has some code snippets.
But it missed the feature until last night, as I wasn't sure how to implement it appropriately before and didn't have enough time.
For example, I may have an org-mode like this:
sum of two numbers:
#+begin_src clojure(+ 12)#+end_src
I want to have a result comment ((;; => 3)) after each top-level form after using illustrate.clj:
sum of two numbers:
Posted on 2021-08-07
(Last modified on 2025-10-17)
| 5 minutes
| 1002 words
To get my hands dirty with Clojure, I am trying to find or implement Clojure's string functions in the sense of Python. Python has powerful string APIs, and I also want to see how powerful Clojure could be in this field. That would be interesting.
As shown in the cheatsheet, Clojure has implemented most of them, and there are some that I have to implement myself, like title-case.
Along the way, I found it was a little cumbersome to append the evaluation result and the result of calling them, for example,
These days I like to write scripts for some tasks in Python instead of shell. One important reason I think that's because Python is powerful at string manipulation.
Recently I'm learning Clojure, and I'm trying to find similar ways in Clojure, one of them is s.title() for getting a title-cased version of a string. For example,
>>> ' Hello world'.title()
' Hello World'
How to do that in Clojure? To make the problem simple, let's assume that the input string only has letters and spaces, that is, [a-zA-Z ] in regex pattern.
Posted on 2021-07-22
(Last modified on 2021-09-19)
| 5 minutes
| 866 words
Python string APIs are powerful and concise, that is an important reason I use it to do a lot of scripting these days, join, split, strip, to name a few.
Since I am learning Clojure recently, I am wondering, how is string manipulation like in Clojure and how to implement equivalent ones?
I think it's an excellent opportunity to get familiar with Clojure. Before diving into the implementation, how to declare a multi-line string?
Posted on 2021-07-17
(Last modified on 2025-02-26)
| 4 minutes
| 780 words
I barely use notifications, but recently I think it's a valuable way to remind me things like helping me nurture habits, or to notify me of emergencies like a critically low laptop battery.
So I try to integrate notifications to org-mode and Emacs today.
The org-notify package from org-contrib (install it by (package-install 'org-contrib) ) could do this job easily before, so I first test it in the minibuffer with (org-notify "test").
I'm used to learning by practicing, so when I learned Clojure, I always kept an eye on chances to write code in it.
Scripting is an excellent field to practice, but the experience is not so good. On the one hand, it's too hacky to wrap Clojure code in a shell script with the shell bang. On the other hand, the startup time of JVM is too long to hurt the user experience.