From 852756ddfb4ede33b54f315084387180b2cd08bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?= Date: Tue, 19 Jan 2021 12:35:27 +0100 Subject: [PATCH] rebuilding site Tue 19 Jan 2021 12:35:27 CET --- categories/index.xml | 8 +-- cheatsheet/index.xml | 12 ++--- cheatsheet/linux/index.html | 24 +++++++-- cheatsheet/page/1/index.html | 2 +- cheatsheet/python/index.html | 4 +- index.html | 6 +-- index.json | 2 +- index.xml | 22 ++++---- page/1/index.html | 2 +- page/2/index.html | 6 +-- page/index.xml | 8 +-- page/page/1/index.html | 2 +- page/todo/index.html | 36 ++++++------- post/2013-08-17-creating-my-web/index.html | 6 +-- .../index.html | 12 ++--- post/2014-09-23-publishing-to-pypi/index.html | 30 +++++------ post/2014-10-09-proxies/index.html | 4 +- post/2014-12-09-zotero/index.html | 2 +- post/2015-04-10-github-dotfiles/index.html | 2 +- post/2019-01-06-zigbee2mqtt/index.html | 54 +++++++++---------- post/index.html | 4 +- post/index.xml | 16 +++--- post/page/1/index.html | 2 +- post/page/2/index.html | 4 +- post/scripts/pxe.sh | 9 ++++ posts/index.xml | 8 +-- project/index.html | 4 +- sitemap.xml | 2 +- tags/apache/index.html | 2 +- tags/apache/index.xml | 10 ++-- tags/apache/page/1/index.html | 2 +- tags/arch/index.xml | 10 ++-- tags/arch/page/1/index.html | 2 +- tags/config/index.xml | 8 +-- tags/config/page/1/index.html | 2 +- tags/dotfiles/index.html | 2 +- tags/dotfiles/index.xml | 10 ++-- tags/dotfiles/page/1/index.html | 2 +- tags/emacs/index.xml | 8 +-- tags/emacs/page/1/index.html | 2 +- tags/git/index.html | 4 +- tags/git/index.xml | 12 ++--- tags/git/page/1/index.html | 2 +- tags/github/index.html | 4 +- tags/github/index.xml | 12 ++--- tags/github/page/1/index.html | 2 +- tags/gunicorn/index.html | 2 +- tags/gunicorn/index.xml | 10 ++-- tags/gunicorn/page/1/index.html | 2 +- tags/heroku/index.xml | 8 +-- tags/heroku/page/1/index.html | 2 +- tags/index.xml | 8 +-- tags/iot/index.html | 2 +- tags/iot/index.xml | 10 ++-- tags/iot/page/1/index.html | 2 +- tags/javascript/index.html | 2 +- tags/javascript/index.xml | 10 ++-- tags/javascript/page/1/index.html | 2 +- tags/linux/index.xml | 10 ++-- tags/linux/page/1/index.html | 2 +- tags/lisp/index.xml | 8 +-- tags/lisp/page/1/index.html | 2 +- tags/mqtt/index.html | 2 +- tags/mqtt/index.xml | 10 ++-- tags/mqtt/page/1/index.html | 2 +- tags/nginx/index.xml | 8 +-- tags/nginx/page/1/index.html | 2 +- tags/org/index.xml | 8 +-- tags/org/page/1/index.html | 2 +- tags/productivity/index.xml | 8 +-- tags/productivity/page/1/index.html | 2 +- tags/programming/index.xml | 10 ++-- tags/programming/page/1/index.html | 2 +- tags/proxy/index.html | 2 +- tags/proxy/index.xml | 10 ++-- tags/proxy/page/1/index.html | 2 +- tags/pypi/index.xml | 8 +-- tags/pypi/page/1/index.html | 2 +- tags/python/index.html | 2 +- tags/python/index.xml | 12 ++--- tags/python/page/1/index.html | 2 +- tags/rpi/index.xml | 8 +-- tags/rpi/page/1/index.html | 2 +- tags/ruby/index.html | 2 +- tags/ruby/index.xml | 10 ++-- tags/ruby/page/1/index.html | 2 +- tags/starters/index.html | 2 +- tags/starters/index.xml | 10 ++-- tags/starters/page/1/index.html | 2 +- tags/surface-go/index.xml | 8 +-- tags/surface-go/page/1/index.html | 2 +- tags/uwsgi/index.html | 2 +- tags/uwsgi/index.xml | 10 ++-- tags/uwsgi/page/1/index.html | 2 +- tags/webdav/index.xml | 8 +-- tags/webdav/page/1/index.html | 2 +- tags/zigbee/index.html | 2 +- tags/zigbee/index.xml | 10 ++-- tags/zigbee/page/1/index.html | 2 +- tags/zotero/index.xml | 8 +-- tags/zotero/page/1/index.html | 2 +- 101 files changed, 272 insertions(+), 391 deletions(-) create mode 100644 post/scripts/pxe.sh diff --git a/categories/index.xml b/categories/index.xml index 363bba9..1be3928 100644 --- a/categories/index.xml +++ b/categories/index.xml @@ -6,10 +6,6 @@ Recent content in Categories on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - \ No newline at end of file + diff --git a/cheatsheet/index.xml b/cheatsheet/index.xml index f60783b..f5a1436 100644 --- a/cheatsheet/index.xml +++ b/cheatsheet/index.xml @@ -6,11 +6,7 @@ Recent content in Cheatsheets on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Emacs /cheatsheet/emacs/ @@ -26,7 +22,7 @@ Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/linux/ - Black screen and LightDM doesn't unlock Add this to your /etc/lightdm/lightdm.conf file: + Black screen and LightDM doesn’t unlock Add this to your /etc/lightdm/lightdm.conf file: 1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. @@ -36,7 +32,7 @@ Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/python/ - Interesting libraries TQDM From tqdm's github repository: + Interesting libraries TQDM From tqdm’s github repository: tqdm means “progress” in Arabic (taqadum, تقدّم) and an abbreviation for “I love you so much” in Spanish (te quiero demasiado). @@ -52,4 +48,4 @@ - \ No newline at end of file + diff --git a/cheatsheet/linux/index.html b/cheatsheet/linux/index.html index 35aed1f..80cf2e1 100644 --- a/cheatsheet/linux/index.html +++ b/cheatsheet/linux/index.html @@ -56,7 +56,7 @@

Linux

-

Black screen and LightDM doesn't unlock

+

Black screen and LightDM doesn’t unlock

Add this to your /etc/lightdm/lightdm.conf file:

@@ -142,9 +142,9 @@ You use it like this:

If you save and exit, all commands are executed as a script, and it will be added to your history.

Source: https://shapeshed.com/unix-fc/

Prevent logoff from killing tmux sessions

-

Lately I've noticed that logging out of i3, intentionally or when i3 fails, would also kill any tmux or emacs sessions. +

Lately I’ve noticed that logging out of i3, intentionally or when i3 fails, would also kill any tmux or emacs sessions. This is extremely annoying.

-

This is caused by a new default in logind (systemd's login) to kill user process on logoff. +

This is caused by a new default in logind (systemd’s login) to kill user process on logoff. You can revert this setting in your logind.conf (/etc/systemd/logind.conf):

@@ -164,6 +164,20 @@ You can revert this setting in your logind.conf (/etc/systemd/logind.conf<

Source: https://unix.stackexchange.com/questions/490267/prevent-logoff-from-killing-tmux-session

+

Upload a temporary file

+

Sometimes you just need to copy/paste a file from a server, and copying from the terminal can be a hassle. +These two services are command-line “pastebins” just one curl away:

+
<command> | curl -F 'sprunge=<-' http://sprunge.us
+# OR
+<command> 2>&1 | curl -F 'f:1=<-' ix.io
+

Install Fortinet SSLVPN support for NetworkManager

+

UPM (Universidad Politécnica de Madrid) uses a propriatary VPN solution. +The instructions for GNU/Linux on their website involve downloading a specific client (.tar.gz) and manually running it. +That works, but it is kind of a hassle. +A much more convenient alternative is installing this NetworkManager plugin:

+
pacman -Sy networkmanager-fortisslvpn 
+# Or apt get install networkmanager-fortisslvpn 
+

Now you can simply add a new VPN connection in NetworkManager and manage it as you would any other connection.

@@ -173,9 +187,11 @@ You can revert this setting in your logind.conf (/etc/systemd/logind.conf<

Contents:

diff --git a/cheatsheet/page/1/index.html b/cheatsheet/page/1/index.html index 0783a2c..d9cd9be 100644 --- a/cheatsheet/page/1/index.html +++ b/cheatsheet/page/1/index.html @@ -1 +1 @@ -/cheatsheet/ \ No newline at end of file +/cheatsheet/ \ No newline at end of file diff --git a/cheatsheet/python/index.html b/cheatsheet/python/index.html index 5a05c4d..b59e93f 100644 --- a/cheatsheet/python/index.html +++ b/cheatsheet/python/index.html @@ -58,7 +58,7 @@

Interesting libraries

TQDM

-

From tqdm's github repository:

+

From tqdm’s github repository:

tqdm means “progress” in Arabic (taqadum, تقدّم) and an abbreviation for “I love you so much” in Spanish (te quiero demasiado).

@@ -74,7 +74,7 @@ diff --git a/index.html b/index.html index eaeaeb4..cf04d4d 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,7 @@ - + Balkian's site - Balkian's site @@ -92,7 +92,7 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you’re anything like me, you’re probably a sucker for IoT devices. For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. @@ -146,7 +146,7 @@ bars in the command line or in a jupyter notebook.

- Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . diff --git a/index.json b/index.json index f6f42b4..224e363 100644 --- a/index.json +++ b/index.json @@ -1 +1 @@ -[{"categories":null,"contents":"Believe it or not, Surface tablets have pretty good linux support, except for the webcams in newer models. These are some useful notes to get Ubuntu installed in your surface go, as of Summer 2019.\nInstalling the kernel 1 2 git clone --depth 1 https://github.com/jakeday/linux-surface.git ~/linux-surface cp -a ~/linux-surface /media/\u0026lt;your usb\u0026gt; 1 2 3 cp -a /media/\u0026lt;your usb\u0026gt;/linux-surface ~/ cd ~/linux-surface/ sudo sh setup.sh Booting ubuntu first Switch out of Windows S mode.\nBoot into the \u0026ldquo;Command Prompt\u0026rdquo;.\nFrom Windows go to \u0026ldquo;change advanced startup options\u0026rdquo; and select \u0026ldquo;restart now\u0026rdquo;.\nWhen it reboots, choose the \u0026ldquo;Troubleshoot\u0026rdquo; option, then choose the \u0026ldquo;Advanced options\u0026rdquo; option, and finally choose the \u0026ldquo;Command Prompt\u0026rdquo; option.\nAfter the device reboots, login to the command prompt and then you should see a terminal with X:\\windows\\system32\u0026gt;\nAt the prompt, check your UEFI entries:\n1 bcdedit /enum firmware Copy UEFI entry of \u0026ldquo;Windows Boot Manager\u0026rdquo; to create a new entry for Ubuntu: bcdedit /copy {bootmgr} /d \u0026ldquo;Ubuntu\u0026rdquo;\nCopy the printed GUID number including the braces {} using Ctrl+C\nSet file path for the new Ubuntu entry. Replace {guid} with the returned GUID of the previous command (Ctrl+V). bcdedit /set {guid} path \\EFI\\ubuntu\\grubx64.efi\nSet Ubuntu as the first/ entry in the boot sequence. Again replace {guid} with the returned GUID of the copy command.\n1 bcdedit /set {fwbootmgr} displayorder {guid} /addfirst Check your UEFI entries again: bcdedit /enum firmware You should see something like this:\n1 2 3 4 5 6 7 8 9 10 Firmware Boot Manager --------------------- identifier {fwbootmgr} displayorder {3510232e-f8eb-e811-95ce-9ecab3f9d1c4} {bootmgr} {2148799b-f8eb-e811-95ce-9ecab3f9d1c4} {312e8a67-c2f6-e811-95ce-3c1ab3f9d1de} {312e8a68-c2f6-e811-95ce-3c1ab3f9d1de} timeout 0 Make sure the GUID you copied is the first one listed in displayorder. Then type exit, turn off the PC and turn it back on. After this my surface go is automatically booting to the grub bootloader which lets me choose between Windows and Ubuntu but defaults to Ubuntu after ten seconds.\n","permalink":"/post/2019-05-01-surface-go/","tags":["linux","surface go","config"],"title":"Linux on the Microsoft Surface Go"},{"categories":null,"contents":"This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network.\nIf you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. To keep these (cheap Chinese) internet enabled devices away from your network and their respective cloud services, you'll probably want to set up a dedicated network in your router (more on this on a future post, maybe). Another disadvantage of WiFi devices is that they're relatively power hungry.\nA popular alternative is using ZigBee for communication. It is a dedicated protocol similar to bluetooth (BLE), with lower power requirements and bitrate.\nTake the (super cute) aqara cube as an example. It is a small cube that detects rotation on all of its axes, and tapping events. Here's a video:\n To connect to zigbee devices you will need a zigbee enabled gateway (a.k.a. hub), which connects to your WiFi network and your zigbee devices. Once again, this means adding an internet-enabled device to your home, and probably a couple of cloud services.\nAs an alternative, you can set up your own zigbee gateway, and control it to your home automation platform of choice (e.g. home assistant). We will cover how to set up a zigbee2mqtt gateway that is also connected to an MQTT server, so you can use MQTT to control your devices and get notifications.\nWhat you need:\n Aqara cube. CC2531 zigbee sniffer. CC-debugger. You will need to flash your sniffer. For that, you only need to follow the instructions from the zigbee2mqtt documentation.\nOnce you're done flashing, you're ready to set up the zigbee2mqtt server. For convenience, I wrote a simple docker-compose to deploy a zigbee2mqtt server and a test mosquitto server:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: \u0026#39;2.1\u0026#39; services: zigbee2mqtt: image: koenkk/zigbee2mqtt container_name: zigbee2mqtt restart: always volumes: - ./z2m-data/:/app/data/ devices: - \u0026#34;/dev/ttyACM0\u0026#34; networks: - hass mqtt: image: eclipse-mosquitto ports: - 1883:1883 - 9001:9001 networks: - hass volumes: - ./mosquitto.conf:/mosquitto/config/mosquitto.conf networks: hass: driver: overlay You can test your installation with:\n1 2 3 4 5 6 ❯ mosquitto_sub -h localhost -p 1883 -t \u0026#39;zigbee2mqtt/#\u0026#39; online {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:149,\u0026#34;action\u0026#34;:\u0026#34;rotate_right\u0026#34;,\u0026#34;angle\u0026#34;:12.8} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:141,\u0026#34;action\u0026#34;:\u0026#34;slide\u0026#34;,\u0026#34;side\u0026#34;:2} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:120} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:141,\u0026#34;action\u0026#34;:\u0026#34;wakeup\u0026#34;} zigbee2mqtt supports the following events for the aqara cube: shake, wakeup, fall, tap, slide, flip180, flip90, rotate_left and rotate_right. Every event has additional information, such as the sides involved, or the degrees turned.\nNow you are ready to set up home assistant support in zigbee2mqtt following this guide.\n","permalink":"/post/2019-01-06-zigbee2mqtt/","tags":["mqtt","iot","zigbee"],"title":"Controlling Zigbee devices with MQTT"},{"categories":null,"contents":"tqdm is a nice way to add progress bars in the command line or in a jupyter notebook.\n1 2 3 4 5 from tqdm import tqdm import time for i in tqdm(range(100)): time.sleep(1) ","permalink":"/post/2016-09-28-tqdm/","tags":["python"],"title":"Progress bars in python"},{"categories":null,"contents":"Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords.\nAs part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your .gitconfig file. This is cool and convenient, unless you happen to be publishing your .gitconfig file in a public repo.\nSo, how can you still share your gitconfig without sharing your password/token with the rest of the world? Since Git 1.7.0, you can include other files in your gitconfig.\n[include] path = ~/.gitconfig_secret And now, in your .gitconfig_secret file, you just have to add this:\n[github] user = balkian token = \u0026quot;\u0026lt; Your secret token \u0026gt;\u0026quot; ","permalink":"/post/2015-04-10-github-dotfiles/","tags":["github","git","dotfiles"],"title":"Sharing dotfiles"},{"categories":null,"contents":"Zotero is an Open Source tool that lets you organise your bibliography, syncing it with the cloud. Unlike other alternatives such as Mendeley, Zotero can upload the attachments and data to a private cloud via WebDav.\nIf you use nginx as your web server, know that even though it provides partial support for webdav, Zotero needs more than that. Hence, you will need another webdav server, and optionally let nginx proxy to it. This short post provides the basics to get that set-up working under Debian/Ubuntu.\nSetting up Apache First we need to install Apache:\n1 sudo apt-get install apache2 Change the head of \u0026ldquo;/etc/apache2/sites-enabled/000-default\u0026rdquo; to:\n1 \u0026lt;VirtualHost *:880\u0026gt; Then, create a file /etc/apache2/sites-available/webdav:\n1 2 3 4 5 6 7 8 9 10 11 12 13 Alias /dav /home/webdav/dav \u0026lt;Location /dav\u0026gt; Dav on Order Allow,Deny Allow from all Dav On Options +Indexes AuthType Basic AuthName DAV AuthBasicProvider file AuthUserFile /home/webdav/.htpasswd Require valid-user \u0026lt;/Location\u0026gt; Ideally, you want your webdav folders to be private, adding authentication to them. So you need to create the webdav and zotero users and add the passwords to an htpasswd file. Even though you could use a single user, since you will be configuring several clients with your credentials I encourage you to create the zotero user as well. This way you can always change the password for zotero without affecting any other application using webdav.\n1 2 3 4 sudo adduser webdav sudo htpasswd -c /home/webdav/.htpasswd webdav sudo htpasswd /home/webdav/.htpasswd zotero sudo mkdir -p /home/webdav/dav/zotero Enable the site and restart apache:\n1 2 3 4 sudo a2enmod webdav sudo a2enmod dav_fs sudo a2ensite webdav sudo service apache2 restart At this point everything should be working at http://\u0026lt;your_host\u0026gt;:880/dav/zotero\nSetting up NGINX After the Apache side is working, we can use nginx as a proxy to get cleaner URIs. In your desired site/location, add this:\n1 2 3 4 5 6 7 location /dav { client_max_body_size 20M; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:880; } Now just reload nginx:\n1 sudo service nginx force-reload Extras Zotero Reader - HTML5 client Zandy - Android Open Source client ","permalink":"/post/2014-12-09-zotero/","tags":["zotero","webdav","nginx","apache"],"title":"Zotero"},{"categories":null,"contents":"This is a quick note on proxying a local python application (e.g. flask) to a subdirectory in Apache. This assumes that the file wsgi.py contains a WSGI application with the name application. Hence, wsgi:application.\nGunicorn 1 2 3 4 5 \u0026lt;Location /myapp/\u0026gt; ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME \u0026#34;/myapp/\u0026#34; \u0026lt;/Location\u0026gt; Important: SCRIPT_NAME and the end of ProxyPass URL MUST BE THE SAME. Otherwise, Gunicorn will fail miserably.\nTry it with:\n1 venv/bin/gunicorn -w 4 -b 127.0.0.1:8888 --log-file - --access-logfile - wsgi:application UWSGI This is a very simple configuration. I will try to upload one with more options for uwsgi (in a .ini file).\n1 2 3 4 \u0026lt;Location /myapp/\u0026gt; SetHandler uwsgi_handler uWSGISocker 127.0.0.1:8888 \u0026lt;/Location\u0026gt; Try it with:\n1 uwsgi --socket 127.0.0.1:8888 -w wsgi:application Extra: Supervisor If everything went as expected, you can wrap your command in a supervisor config file and let it handle the server for you.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [unix_http_server] file=/tmp/myapp.sock ; path to your socket file [supervisord] logfile = %(here)s/logs/supervisor.log childlogdir = %(here)s/logs/ [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] logfile = %(here)s/logs/supervisorctl.log serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket [program:myapp] command = venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 --log-file %(here)s/logs/gunicorn.log --access-logfile - wsgi:application directory = %(here)s environment = PATH=%(here)s/venv/bin/ logfile = %(here)s/logs/myapp.log ","permalink":"/post/2014-10-09-proxies/","tags":["python","apache","proxy","gunicorn","uwsgi"],"title":"Proxies with Apache and python"},{"categories":null,"contents":"Developing a python module and publishing it on Github is cool, but most of the times you want others to download and use it easily. That is the role of PyPi, the python package repository. In this post I show you how to publish your package in less than 10 minutes.\nChoose a fancy name If you haven't done so yet, take a minute or two to think about this. To publish on PyPi you need a name for your package that isn't taken. What's more, a catchy and unique name will help people remember your module and feel more inclined to at least try it.\nThe package name should hint what your module does, but that's not always the case. That's your call. I personally put uniqueness and memorability over describing the functionality.\nCreate a .pypirc configuration file 1 2 3 4 5 6 7 8 9 10 11 12 13 [distutils] # this tells distutils what package indexes you can push to index-servers =pypi # the live PyPI pypitest # test PyPI [pypi] # authentication details for live PyPI repository = https://pypi.python.org/pypi username = { your_username } password = { your_password } # not necessary [pypitest] # authentication details for test PyPI repository = https://testpypi.python.org/pypi username = { your_username } As you can see, you need to register both in the main pypi repository and the testing server. The usernames and passwords might be different, that is up to you!\nPrepare your package This should be the structure:\nroot-dir/ # Any name you want setup.py setup.cfg LICENSE.txt README.md mypackage/ __init__.py foo.py bar.py baz.py setup.cfg 1 2 [metadata] description-file = README.md The markdown README is the de facto standard in Github, but you can also use rST (reStructuredText), the standard in the python community.\nsetup.py 1 2 3 4 5 6 7 8 9 10 11 12 from distutils.core import setup setup(name = \u0026#39;mypackage\u0026#39;, packages = [\u0026#39;mypackage\u0026#39;], # this must be the same as the name above version = \u0026#39;{ version }\u0026#39;, description = \u0026#39;{ description }\u0026#39;, author = \u0026#39;{ name }\u0026#39;, email = \u0026#39;{ email }\u0026#39;, url = \u0026#39;https://github.com/{user}/{package}\u0026#39;, # URL to the github repo download_url = \u0026#39;https://github.com/{user}/{repo}/tarball/{version}\u0026#39;, keywords = [\u0026#39;websockets\u0026#39;, \u0026#39;display\u0026#39;, \u0026#39;d3\u0026#39;], # list of keywords that represent your package classifiers = [], ) You might notice that the download_url points to a Github URL. We could host our package anywhere, but Github is a convenient option. To create the tarball and the zip packages, you only need to tag a tag in your repository and push it to github:\n1 2 git tag {version} -m \u0026#34;{ Description of this tag/version}\u0026#34; git push --tags origin master Push to the testing/main pypi server It is advisable that you try your package on the test repository and fix any problems first. The process is simple:\n1 python setup.py register -r {pypitest/pypi} python setup.py sdist upload -r {pypitest/pypi} If everything went as expected, you can now install your package through pip and browse your package's page. For instance, check my senpy package: https://pypi.python.org/pypi/senpy\n1 pip install senpy ","permalink":"/post/2014-09-23-publishing-to-pypi/","tags":["github","python","pypi"],"title":"Publishing on PyPi"},{"categories":null,"contents":"As part of the OpeNER hackathon we decided to build a prototype that would allow us to compare how different countries feel about several topics. We used the OpeNER pipeline to get the sentiment from a set of newspaper articles we gathered from media in several languages. Then we aggregated those articles by category and country (using the source of the article or the language it was written in), obtaining the \u0026ldquo;overall feeling\u0026rdquo; of each country about each topic. Then, we used some fancy JavaScript to make sense out of the raw information.\nIt didn't go too bad, it turns out we won.\nNow, it was time for a face-lift. I used this opportunity to play with new technologies and improve it:\n Using Flask, this time using python 3.3 and Bootstrap 3.0 Cool HTML5+JS cards (thanks to pastetophone) Automatic generation of fake personal data to test the interface Obfuscation of personal emails The result can be seen here.\nPublishing a Python 3 app on Heroku 1 mkvirtualenv -p /usr/bin/python3.3 eurolovemap Since Heroku uses python 2.7 by default, we have to tell it which version we want, although it supports python 3.4 as well. I couldn't get python 3.4 working using the deadsnakes ppa, so I used python 3.3 instead, which works fine but is not officially supported. Just create a file named runtime.txt in your project root, with the python version you want to use:\n1 python-3.3.1 Don't forget to freeze your dependencies so Heroku can install them: bash pip freze \u0026gt; requirements.txt\nPublishing personal emails There are really sophisticated and effective ways to obfuscate personal emails so that spammers cannot easily grab yours. However, this time I needed something really simple to hide our emails from the simplest form of crawlers. Most of the team are in academia somehow, so in the end all our emails are available in sites like Google Scholar. Anyway, nobody likes getting spammed so I settled for a custom Caesar cipher. Please, don't use it for any serious application if you are concerned about being spammed.\n1 2 def blur_email(email): return \u0026#34;\u0026#34;.join([chr(ord(i)+5) for i in email]) And this is the client side:\n1 2 3 4 5 6 7 8 9 10 11 12 window.onload = function(){ elems = document.getElementsByClassName(\u0026#39;profile-email\u0026#39;); for(var e in elems){ var blur = elems[e].innerHTML; var email = \u0026#34;\u0026#34;; for(var s in blur){ var a = blur.charCodeAt(s) email = email+String.fromCharCode(a-5); } elems[e].innerHTML = email; } } Unfortunately, this approach does not hide your email from anyone using PhantomJS, ZombieJS or similar. For that, other approaches like generating a picture with the address would be necessary. Nevertheless, it is overkill for a really simple ad-hoc application with custom formatting and just a bunch of emails that would easily be grabbed manually.\nGeneration of fake data To test the contact section of the site, I wanted to populate it with fake data. Fake-Factory is an amazing library that can generate fake data of almost any kind: emails, association names, acronyms\u0026hellip; It even lets you localise the results (get Spanish names, for instance) and generate factories for certain classes (à la Django).\nBut I also wanted pictures, enter Lorem Pixel. With its API you can generate pictures of almost any size, for different topics (e.g. nightlife, people) and with a custom text. You can even use an index, so it will always show the same picture.\nFor instance, the picture below is served through Lorem Pixel.\nBy the way, if you only want cat pictures, take a look at Placekitten. And for NSFW text, there's the Samuel L. Jackson Ipsum\n","permalink":"/post/2014-03-27-updating-eurolovemap/","tags":["javascript","python","heroku"],"title":"Updating EuroLoveMap"},{"categories":null,"contents":"A simple trick. If you want to remove all the \u0026lsquo;.swp\u0026rsquo; files from a git repository, just use:\n1 git rm --cached \u0026#39;**.swp\u0026#39; ","permalink":"/post/2013-08-22-remove-git-files-with-globbing/","tags":["git"],"title":"Remove git files with globbing"},{"categories":null,"contents":"I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository.\nBut Jekyll can be used independently, so if I ever choose to host the site myself, I can do it quite easily. Another thing that I liked about this approach is that the generated html files can be used in the future, and I will not need Jekyll to serve it. Jekyll is really simple and most of the things are written in plain html. That means that everything could be easily reused if I ever choose to change to another blogging framework (e.g. pelical). But, for the time being, I like the fact that Github takes care of the compilation as well, so I can simply modify or add files through the web interface should I need to.\nI hadn't played with HTML and CSS for a while now, so I also wanted to use this site as a playground. At some point, I realised I was doing mostly everything in plain HTML and CSS, and decided to keep it like that for as long as possible. As of this writing, I haven't included any Javascript code in the page. Probably I will use some to add my gists and repositories, but we will see about that.\nI think the code speaks for itself, so you can check out my repository on Github. You can clone and deploy it easily like this:\n1 2 3 git clone https://github.com/balkian/balkian.github.com cd balkian.github.com jekyll serve -w I will keep updating this post with information about:\n Some Jekyll plugins that might be useful What CSS tricks I learnt The webfonts I used The badge on the left side of the page ","permalink":"/post/2013-08-17-creating-my-web/","tags":["starters","javascript","ruby","github","git"],"title":"Creating my web"},{"categories":null,"contents":"Show plain text version 1 (font-lock-mode) ","permalink":"/cheatsheet/emacs/","tags":["emacs","org","productivity","lisp"],"title":"Emacs"},{"categories":null,"contents":"Ongoing Projects Senpy: a framework for semantic sentiment and emotion analysis services. Soil: an agent-based simulator for social networks based on nx-sim and networkx. Onyx: an ontology for emotion analysis that includes concepts from W3C's provenance. Past Projects Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C's provenance ontology. Hermes: one of my first projects, developed together with David Pérez as the special custom assignment in one of our courses. Hermes is an affective bot designed to mimic the behavour of humans. It included a plug-in system for its sensors and actuators. The information from its sensors changed its emotional state, which was shown via its actuators. Among others, it could fetch inforation from Twitter or its host system and change the expressions of an external Face made with servo motors or speak via its Text-To-Speech software. For instance, it could detect it was running out of battery, showing a sad face and sending an alerting tweet. You can see it in action in these two youtube videos: Part 1 and Part 2. Maia: the Modular Architecture for Intelligent Agents is an evented agent architecture that aims to update the classical frameworks for intelligent agents with the concepts emerged from the Live Web. EESTEC.net: the Plone based official portal of EESTEC. It has been my first and only experience with Plone. I fixed some bugs and implemented basic features. For more information, check my list of public repositories in Github.\n","permalink":"/project/","tags":null,"title":"Index of projects"},{"categories":null,"contents":"Black screen and LightDM doesn't unlock Add this to your /etc/lightdm/lightdm.conf file:\n1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. You use it like this:\nList previous commands\n1 2 3 4 5 $ fc -l 10259 nvim deploy.sh 10260* cd .. 10261* nvim content/cheatsheet/linux.md 10262 cd List commands with date (in zsh)\n1 2 3 4 5 $ fc -ld 10260* 19:38 cd .. 10261* 19:38 nvim content/cheatsheet/linux.md 10262 19:40 cd 10263 19:40 fc -l You can add the date too:\n1 2 3 4 $ fc -fld 10262 1/10/2019 19:40 cd 10263 1/10/2019 19:40 fc -l 10264 1/10/2019 19:40 fc -ld You can edit a range of commands\n1 $ fc 10262 10264 The range can be relative to the current position, so the previous command is equivalent to:\n1 $ fc -3 -1 If you save and exit, all commands are executed as a script, and it will be added to your history.\nSource: https://shapeshed.com/unix-fc/\nPrevent logoff from killing tmux sessions Lately I've noticed that logging out of i3, intentionally or when i3 fails, would also kill any tmux or emacs sessions. This is extremely annoying.\nThis is caused by a new default in logind (systemd's login) to kill user process on logoff. You can revert this setting in your logind.conf (/etc/systemd/logind.conf):\n1 KillUserProcesses=no Or only for a specific process (e.g., tmux):\n1 systemd-run --scope --user tmux Source: https://unix.stackexchange.com/questions/490267/prevent-logoff-from-killing-tmux-session\n","permalink":"/cheatsheet/linux/","tags":["linux","arch"],"title":"Linux"},{"categories":null,"contents":"Interesting libraries TQDM From tqdm's github repository:\n tqdm means \u0026ldquo;progress\u0026rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for \u0026ldquo;I love you so much\u0026rdquo; in Spanish (te quiero demasiado).\n ","permalink":"/cheatsheet/python/","tags":["python","programming"],"title":"Python"},{"categories":null,"contents":"HDMI flickering Avoid HDMI flickering/intermittent blanking on RPI with a 1400x1050 VGA monitor.\n1 2 3 4 5 6 hdmi_drive=2 hdmi_group=2 hdmi_mode=42 disable_overscan=1 config_hdmi_boost=7 ","permalink":"/cheatsheet/rpi/","tags":["rpi"],"title":"Raspberry Pi"},{"categories":null,"contents":"This file exists solely to respond to /search URL with the related search layout template.\nNo content shown here is rendered, all content is based in the template layouts/page/search.html\nSetting a very low sitemap priority will tell search engines this is not important content.\nThis implementation uses Fusejs, jquery and mark.js\nInitial setup Search depends on additional output content type of JSON in config.toml ``` [outputs] home = [\u0026ldquo;HTML\u0026rdquo;, \u0026ldquo;JSON\u0026rdquo;] ```\nSearching additional fileds To search additional fields defined in front matter, you must add it in 2 places.\nEdit layouts/_default/index.JSON This exposes the values in /index.json i.e. add category ``` \u0026hellip; \u0026ldquo;contents\u0026rdquo;:{{ .Content | plainify | jsonify }} {{ if .Params.tags }}, \u0026ldquo;tags\u0026rdquo;:{{ .Params.tags | jsonify }}{{end}}, \u0026ldquo;categories\u0026rdquo; : {{ .Params.categories | jsonify }}, \u0026hellip; ```\nEdit fuse.js options to Search static/js/search.js ``` keys: [ \u0026ldquo;title\u0026rdquo;, \u0026ldquo;contents\u0026rdquo;, \u0026ldquo;tags\u0026rdquo;, \u0026ldquo;categories\u0026rdquo; ] ```\n ${title} ${snippet}\n ","permalink":"/search/","tags":null,"title":"Search Results"},{"categories":null,"contents":"PhD Write my first workshop paper as main author Write my first journal paper Write my first book chapter Chair a W3C Community Group Collaborate on a W3C recommendation Become a doctor! Technical Write a NodeJS App. Maia [See ISSUES] Write my first Django Application Develop a distributed LibP2P golang application Github repo with +100 stars Build a custom LineageOS image Languages English Chinese Greek German Esperanto Personal Run a 10k Blog regularly for a year ","permalink":"/page/todo/","tags":null,"title":"To-do"}] \ No newline at end of file +[{"categories":null,"contents":"Believe it or not, Surface tablets have pretty good linux support, except for the webcams in newer models. These are some useful notes to get Ubuntu installed in your surface go, as of Summer 2019.\nInstalling the kernel 1 2 git clone --depth 1 https://github.com/jakeday/linux-surface.git ~/linux-surface cp -a ~/linux-surface /media/\u0026lt;your usb\u0026gt; 1 2 3 cp -a /media/\u0026lt;your usb\u0026gt;/linux-surface ~/ cd ~/linux-surface/ sudo sh setup.sh Booting ubuntu first Switch out of Windows S mode.\nBoot into the \u0026ldquo;Command Prompt\u0026rdquo;.\nFrom Windows go to \u0026ldquo;change advanced startup options\u0026rdquo; and select \u0026ldquo;restart now\u0026rdquo;.\nWhen it reboots, choose the \u0026ldquo;Troubleshoot\u0026rdquo; option, then choose the \u0026ldquo;Advanced options\u0026rdquo; option, and finally choose the \u0026ldquo;Command Prompt\u0026rdquo; option.\nAfter the device reboots, login to the command prompt and then you should see a terminal with X:\\windows\\system32\u0026gt;\nAt the prompt, check your UEFI entries:\n1 bcdedit /enum firmware Copy UEFI entry of \u0026ldquo;Windows Boot Manager\u0026rdquo; to create a new entry for Ubuntu: bcdedit /copy {bootmgr} /d \u0026ldquo;Ubuntu\u0026rdquo;\nCopy the printed GUID number including the braces {} using Ctrl+C\nSet file path for the new Ubuntu entry. Replace {guid} with the returned GUID of the previous command (Ctrl+V). bcdedit /set {guid} path \\EFI\\ubuntu\\grubx64.efi\nSet Ubuntu as the first/ entry in the boot sequence. Again replace {guid} with the returned GUID of the copy command.\n1 bcdedit /set {fwbootmgr} displayorder {guid} /addfirst Check your UEFI entries again: bcdedit /enum firmware You should see something like this:\n1 2 3 4 5 6 7 8 9 10 Firmware Boot Manager --------------------- identifier {fwbootmgr} displayorder {3510232e-f8eb-e811-95ce-9ecab3f9d1c4} {bootmgr} {2148799b-f8eb-e811-95ce-9ecab3f9d1c4} {312e8a67-c2f6-e811-95ce-3c1ab3f9d1de} {312e8a68-c2f6-e811-95ce-3c1ab3f9d1de} timeout 0 Make sure the GUID you copied is the first one listed in displayorder. Then type exit, turn off the PC and turn it back on. After this my surface go is automatically booting to the grub bootloader which lets me choose between Windows and Ubuntu but defaults to Ubuntu after ten seconds.\n","permalink":"/post/2019-05-01-surface-go/","tags":["linux","surface go","config"],"title":"Linux on the Microsoft Surface Go"},{"categories":null,"contents":"This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network.\nIf you\u0026rsquo;re anything like me, you\u0026rsquo;re probably a sucker for IoT devices. For a long time, I\u0026rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them. To keep these (cheap Chinese) internet enabled devices away from your network and their respective cloud services, you\u0026rsquo;ll probably want to set up a dedicated network in your router (more on this on a future post, maybe). Another disadvantage of WiFi devices is that they\u0026rsquo;re relatively power hungry.\nA popular alternative is using ZigBee for communication. It is a dedicated protocol similar to bluetooth (BLE), with lower power requirements and bitrate.\nTake the (super cute) aqara cube as an example. It is a small cube that detects rotation on all of its axes, and tapping events. Here\u0026rsquo;s a video:\n To connect to zigbee devices you will need a zigbee enabled gateway (a.k.a. hub), which connects to your WiFi network and your zigbee devices. Once again, this means adding an internet-enabled device to your home, and probably a couple of cloud services.\nAs an alternative, you can set up your own zigbee gateway, and control it to your home automation platform of choice (e.g. home assistant). We will cover how to set up a zigbee2mqtt gateway that is also connected to an MQTT server, so you can use MQTT to control your devices and get notifications.\nWhat you need:\n Aqara cube. CC2531 zigbee sniffer. CC-debugger. You will need to flash your sniffer. For that, you only need to follow the instructions from the zigbee2mqtt documentation.\nOnce you\u0026rsquo;re done flashing, you\u0026rsquo;re ready to set up the zigbee2mqtt server. For convenience, I wrote a simple docker-compose to deploy a zigbee2mqtt server and a test mosquitto server:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: \u0026#39;2.1\u0026#39; services: zigbee2mqtt: image: koenkk/zigbee2mqtt container_name: zigbee2mqtt restart: always volumes: - ./z2m-data/:/app/data/ devices: - \u0026#34;/dev/ttyACM0\u0026#34; networks: - hass mqtt: image: eclipse-mosquitto ports: - 1883:1883 - 9001:9001 networks: - hass volumes: - ./mosquitto.conf:/mosquitto/config/mosquitto.conf networks: hass: driver: overlay You can test your installation with:\n1 2 3 4 5 6 ❯ mosquitto_sub -h localhost -p 1883 -t \u0026#39;zigbee2mqtt/#\u0026#39; online {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:149,\u0026#34;action\u0026#34;:\u0026#34;rotate_right\u0026#34;,\u0026#34;angle\u0026#34;:12.8} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:141,\u0026#34;action\u0026#34;:\u0026#34;slide\u0026#34;,\u0026#34;side\u0026#34;:2} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:120} {\u0026#34;battery\u0026#34;:17,\u0026#34;voltage\u0026#34;:2925,\u0026#34;linkquality\u0026#34;:141,\u0026#34;action\u0026#34;:\u0026#34;wakeup\u0026#34;} zigbee2mqtt supports the following events for the aqara cube: shake, wakeup, fall, tap, slide, flip180, flip90, rotate_left and rotate_right. Every event has additional information, such as the sides involved, or the degrees turned.\nNow you are ready to set up home assistant support in zigbee2mqtt following this guide.\n","permalink":"/post/2019-01-06-zigbee2mqtt/","tags":["mqtt","iot","zigbee"],"title":"Controlling Zigbee devices with MQTT"},{"categories":null,"contents":"tqdm is a nice way to add progress bars in the command line or in a jupyter notebook.\n1 2 3 4 5 from tqdm import tqdm import time for i in tqdm(range(100)): time.sleep(1) ","permalink":"/post/2016-09-28-tqdm/","tags":["python"],"title":"Progress bars in python"},{"categories":null,"contents":"Today\u0026rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords.\nAs part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your .gitconfig file. This is cool and convenient, unless you happen to be publishing your .gitconfig file in a public repo.\nSo, how can you still share your gitconfig without sharing your password/token with the rest of the world? Since Git 1.7.0, you can include other files in your gitconfig.\n[include] path = ~/.gitconfig_secret And now, in your .gitconfig_secret file, you just have to add this:\n[github] user = balkian token = \u0026quot;\u0026lt; Your secret token \u0026gt;\u0026quot; ","permalink":"/post/2015-04-10-github-dotfiles/","tags":["github","git","dotfiles"],"title":"Sharing dotfiles"},{"categories":null,"contents":"Zotero is an Open Source tool that lets you organise your bibliography, syncing it with the cloud. Unlike other alternatives such as Mendeley, Zotero can upload the attachments and data to a private cloud via WebDav.\nIf you use nginx as your web server, know that even though it provides partial support for webdav, Zotero needs more than that. Hence, you will need another webdav server, and optionally let nginx proxy to it. This short post provides the basics to get that set-up working under Debian/Ubuntu.\nSetting up Apache First we need to install Apache:\n1 sudo apt-get install apache2 Change the head of \u0026ldquo;/etc/apache2/sites-enabled/000-default\u0026rdquo; to:\n1 \u0026lt;VirtualHost *:880\u0026gt; Then, create a file /etc/apache2/sites-available/webdav:\n1 2 3 4 5 6 7 8 9 10 11 12 13 Alias /dav /home/webdav/dav \u0026lt;Location /dav\u0026gt; Dav on Order Allow,Deny Allow from all Dav On Options +Indexes AuthType Basic AuthName DAV AuthBasicProvider file AuthUserFile /home/webdav/.htpasswd Require valid-user \u0026lt;/Location\u0026gt; Ideally, you want your webdav folders to be private, adding authentication to them. So you need to create the webdav and zotero users and add the passwords to an htpasswd file. Even though you could use a single user, since you will be configuring several clients with your credentials I encourage you to create the zotero user as well. This way you can always change the password for zotero without affecting any other application using webdav.\n1 2 3 4 sudo adduser webdav sudo htpasswd -c /home/webdav/.htpasswd webdav sudo htpasswd /home/webdav/.htpasswd zotero sudo mkdir -p /home/webdav/dav/zotero Enable the site and restart apache:\n1 2 3 4 sudo a2enmod webdav sudo a2enmod dav_fs sudo a2ensite webdav sudo service apache2 restart At this point everything should be working at http://\u0026lt;your_host\u0026gt;:880/dav/zotero\nSetting up NGINX After the Apache side is working, we can use nginx as a proxy to get cleaner URIs. In your desired site/location, add this:\n1 2 3 4 5 6 7 location /dav { client_max_body_size 20M; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:880; } Now just reload nginx:\n1 sudo service nginx force-reload Extras Zotero Reader - HTML5 client Zandy - Android Open Source client ","permalink":"/post/2014-12-09-zotero/","tags":["zotero","webdav","nginx","apache"],"title":"Zotero"},{"categories":null,"contents":"This is a quick note on proxying a local python application (e.g. flask) to a subdirectory in Apache. This assumes that the file wsgi.py contains a WSGI application with the name application. Hence, wsgi:application.\nGunicorn 1 2 3 4 5 \u0026lt;Location /myapp/\u0026gt; ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME \u0026#34;/myapp/\u0026#34; \u0026lt;/Location\u0026gt; Important: SCRIPT_NAME and the end of ProxyPass URL MUST BE THE SAME. Otherwise, Gunicorn will fail miserably.\nTry it with:\n1 venv/bin/gunicorn -w 4 -b 127.0.0.1:8888 --log-file - --access-logfile - wsgi:application UWSGI This is a very simple configuration. I will try to upload one with more options for uwsgi (in a .ini file).\n1 2 3 4 \u0026lt;Location /myapp/\u0026gt; SetHandler uwsgi_handler uWSGISocker 127.0.0.1:8888 \u0026lt;/Location\u0026gt; Try it with:\n1 uwsgi --socket 127.0.0.1:8888 -w wsgi:application Extra: Supervisor If everything went as expected, you can wrap your command in a supervisor config file and let it handle the server for you.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [unix_http_server] file=/tmp/myapp.sock ; path to your socket file [supervisord] logfile = %(here)s/logs/supervisor.log childlogdir = %(here)s/logs/ [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] logfile = %(here)s/logs/supervisorctl.log serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket [program:myapp] command = venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 --log-file %(here)s/logs/gunicorn.log --access-logfile - wsgi:application directory = %(here)s environment = PATH=%(here)s/venv/bin/ logfile = %(here)s/logs/myapp.log ","permalink":"/post/2014-10-09-proxies/","tags":["python","apache","proxy","gunicorn","uwsgi"],"title":"Proxies with Apache and python"},{"categories":null,"contents":"Developing a python module and publishing it on Github is cool, but most of the times you want others to download and use it easily. That is the role of PyPi, the python package repository. In this post I show you how to publish your package in less than 10 minutes.\nChoose a fancy name If you haven\u0026rsquo;t done so yet, take a minute or two to think about this. To publish on PyPi you need a name for your package that isn\u0026rsquo;t taken. What\u0026rsquo;s more, a catchy and unique name will help people remember your module and feel more inclined to at least try it.\nThe package name should hint what your module does, but that\u0026rsquo;s not always the case. That\u0026rsquo;s your call. I personally put uniqueness and memorability over describing the functionality.\nCreate a .pypirc configuration file 1 2 3 4 5 6 7 8 9 10 11 12 13 [distutils] # this tells distutils what package indexes you can push to index-servers =pypi # the live PyPI pypitest # test PyPI [pypi] # authentication details for live PyPI repository = https://pypi.python.org/pypi username = { your_username } password = { your_password } # not necessary [pypitest] # authentication details for test PyPI repository = https://testpypi.python.org/pypi username = { your_username } As you can see, you need to register both in the main pypi repository and the testing server. The usernames and passwords might be different, that is up to you!\nPrepare your package This should be the structure:\nroot-dir/ # Any name you want setup.py setup.cfg LICENSE.txt README.md mypackage/ __init__.py foo.py bar.py baz.py setup.cfg 1 2 [metadata] description-file = README.md The markdown README is the de facto standard in Github, but you can also use rST (reStructuredText), the standard in the python community.\nsetup.py 1 2 3 4 5 6 7 8 9 10 11 12 from distutils.core import setup setup(name = \u0026#39;mypackage\u0026#39;, packages = [\u0026#39;mypackage\u0026#39;], # this must be the same as the name above version = \u0026#39;{ version }\u0026#39;, description = \u0026#39;{ description }\u0026#39;, author = \u0026#39;{ name }\u0026#39;, email = \u0026#39;{ email }\u0026#39;, url = \u0026#39;https://github.com/{user}/{package}\u0026#39;, # URL to the github repo download_url = \u0026#39;https://github.com/{user}/{repo}/tarball/{version}\u0026#39;, keywords = [\u0026#39;websockets\u0026#39;, \u0026#39;display\u0026#39;, \u0026#39;d3\u0026#39;], # list of keywords that represent your package classifiers = [], ) You might notice that the download_url points to a Github URL. We could host our package anywhere, but Github is a convenient option. To create the tarball and the zip packages, you only need to tag a tag in your repository and push it to github:\n1 2 git tag {version} -m \u0026#34;{ Description of this tag/version}\u0026#34; git push --tags origin master Push to the testing/main pypi server It is advisable that you try your package on the test repository and fix any problems first. The process is simple:\n1 python setup.py register -r {pypitest/pypi} python setup.py sdist upload -r {pypitest/pypi} If everything went as expected, you can now install your package through pip and browse your package\u0026rsquo;s page. For instance, check my senpy package: https://pypi.python.org/pypi/senpy\n1 pip install senpy ","permalink":"/post/2014-09-23-publishing-to-pypi/","tags":["github","python","pypi"],"title":"Publishing on PyPi"},{"categories":null,"contents":"As part of the OpeNER hackathon we decided to build a prototype that would allow us to compare how different countries feel about several topics. We used the OpeNER pipeline to get the sentiment from a set of newspaper articles we gathered from media in several languages. Then we aggregated those articles by category and country (using the source of the article or the language it was written in), obtaining the \u0026ldquo;overall feeling\u0026rdquo; of each country about each topic. Then, we used some fancy JavaScript to make sense out of the raw information.\nIt didn\u0026rsquo;t go too bad, it turns out we won.\nNow, it was time for a face-lift. I used this opportunity to play with new technologies and improve it:\n Using Flask, this time using python 3.3 and Bootstrap 3.0 Cool HTML5+JS cards (thanks to pastetophone) Automatic generation of fake personal data to test the interface Obfuscation of personal emails The result can be seen here.\nPublishing a Python 3 app on Heroku 1 mkvirtualenv -p /usr/bin/python3.3 eurolovemap Since Heroku uses python 2.7 by default, we have to tell it which version we want, although it supports python 3.4 as well. I couldn\u0026rsquo;t get python 3.4 working using the deadsnakes ppa, so I used python 3.3 instead, which works fine but is not officially supported. Just create a file named runtime.txt in your project root, with the python version you want to use:\n1 python-3.3.1 Don\u0026rsquo;t forget to freeze your dependencies so Heroku can install them: bash pip freze \u0026gt; requirements.txt\nPublishing personal emails There are really sophisticated and effective ways to obfuscate personal emails so that spammers cannot easily grab yours. However, this time I needed something really simple to hide our emails from the simplest form of crawlers. Most of the team are in academia somehow, so in the end all our emails are available in sites like Google Scholar. Anyway, nobody likes getting spammed so I settled for a custom Caesar cipher. Please, don\u0026rsquo;t use it for any serious application if you are concerned about being spammed.\n1 2 def blur_email(email): return \u0026#34;\u0026#34;.join([chr(ord(i)+5) for i in email]) And this is the client side:\n1 2 3 4 5 6 7 8 9 10 11 12 window.onload = function(){ elems = document.getElementsByClassName(\u0026#39;profile-email\u0026#39;); for(var e in elems){ var blur = elems[e].innerHTML; var email = \u0026#34;\u0026#34;; for(var s in blur){ var a = blur.charCodeAt(s) email = email+String.fromCharCode(a-5); } elems[e].innerHTML = email; } } Unfortunately, this approach does not hide your email from anyone using PhantomJS, ZombieJS or similar. For that, other approaches like generating a picture with the address would be necessary. Nevertheless, it is overkill for a really simple ad-hoc application with custom formatting and just a bunch of emails that would easily be grabbed manually.\nGeneration of fake data To test the contact section of the site, I wanted to populate it with fake data. Fake-Factory is an amazing library that can generate fake data of almost any kind: emails, association names, acronyms\u0026hellip; It even lets you localise the results (get Spanish names, for instance) and generate factories for certain classes (à la Django).\nBut I also wanted pictures, enter Lorem Pixel. With its API you can generate pictures of almost any size, for different topics (e.g. nightlife, people) and with a custom text. You can even use an index, so it will always show the same picture.\nFor instance, the picture below is served through Lorem Pixel.\nBy the way, if you only want cat pictures, take a look at Placekitten. And for NSFW text, there\u0026rsquo;s the Samuel L. Jackson Ipsum\n","permalink":"/post/2014-03-27-updating-eurolovemap/","tags":["javascript","python","heroku"],"title":"Updating EuroLoveMap"},{"categories":null,"contents":"A simple trick. If you want to remove all the \u0026lsquo;.swp\u0026rsquo; files from a git repository, just use:\n1 git rm --cached \u0026#39;**.swp\u0026#39; ","permalink":"/post/2013-08-22-remove-git-files-with-globbing/","tags":["git"],"title":"Remove git files with globbing"},{"categories":null,"contents":"I\u0026rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository.\nBut Jekyll can be used independently, so if I ever choose to host the site myself, I can do it quite easily. Another thing that I liked about this approach is that the generated html files can be used in the future, and I will not need Jekyll to serve it. Jekyll is really simple and most of the things are written in plain html. That means that everything could be easily reused if I ever choose to change to another blogging framework (e.g. pelical). But, for the time being, I like the fact that Github takes care of the compilation as well, so I can simply modify or add files through the web interface should I need to.\nI hadn\u0026rsquo;t played with HTML and CSS for a while now, so I also wanted to use this site as a playground. At some point, I realised I was doing mostly everything in plain HTML and CSS, and decided to keep it like that for as long as possible. As of this writing, I haven\u0026rsquo;t included any Javascript code in the page. Probably I will use some to add my gists and repositories, but we will see about that.\nI think the code speaks for itself, so you can check out my repository on Github. You can clone and deploy it easily like this:\n1 2 3 git clone https://github.com/balkian/balkian.github.com cd balkian.github.com jekyll serve -w I will keep updating this post with information about:\n Some Jekyll plugins that might be useful What CSS tricks I learnt The webfonts I used The badge on the left side of the page ","permalink":"/post/2013-08-17-creating-my-web/","tags":["starters","javascript","ruby","github","git"],"title":"Creating my web"},{"categories":null,"contents":"Show plain text version 1 (font-lock-mode) ","permalink":"/cheatsheet/emacs/","tags":["emacs","org","productivity","lisp"],"title":"Emacs"},{"categories":null,"contents":"Ongoing Projects Senpy: a framework for semantic sentiment and emotion analysis services. Soil: an agent-based simulator for social networks based on nx-sim and networkx. Onyx: an ontology for emotion analysis that includes concepts from W3C\u0026rsquo;s provenance. Past Projects Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C\u0026rsquo;s provenance ontology. Hermes: one of my first projects, developed together with David Pérez as the special custom assignment in one of our courses. Hermes is an affective bot designed to mimic the behavour of humans. It included a plug-in system for its sensors and actuators. The information from its sensors changed its emotional state, which was shown via its actuators. Among others, it could fetch inforation from Twitter or its host system and change the expressions of an external Face made with servo motors or speak via its Text-To-Speech software. For instance, it could detect it was running out of battery, showing a sad face and sending an alerting tweet. You can see it in action in these two youtube videos: Part 1 and Part 2. Maia: the Modular Architecture for Intelligent Agents is an evented agent architecture that aims to update the classical frameworks for intelligent agents with the concepts emerged from the Live Web. EESTEC.net: the Plone based official portal of EESTEC. It has been my first and only experience with Plone. I fixed some bugs and implemented basic features. For more information, check my list of public repositories in Github.\n","permalink":"/project/","tags":null,"title":"Index of projects"},{"categories":null,"contents":"Black screen and LightDM doesn\u0026rsquo;t unlock Add this to your /etc/lightdm/lightdm.conf file:\n1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. You use it like this:\nList previous commands\n1 2 3 4 5 $ fc -l 10259 nvim deploy.sh 10260* cd .. 10261* nvim content/cheatsheet/linux.md 10262 cd List commands with date (in zsh)\n1 2 3 4 5 $ fc -ld 10260* 19:38 cd .. 10261* 19:38 nvim content/cheatsheet/linux.md 10262 19:40 cd 10263 19:40 fc -l You can add the date too:\n1 2 3 4 $ fc -fld 10262 1/10/2019 19:40 cd 10263 1/10/2019 19:40 fc -l 10264 1/10/2019 19:40 fc -ld You can edit a range of commands\n1 $ fc 10262 10264 The range can be relative to the current position, so the previous command is equivalent to:\n1 $ fc -3 -1 If you save and exit, all commands are executed as a script, and it will be added to your history.\nSource: https://shapeshed.com/unix-fc/\nPrevent logoff from killing tmux sessions Lately I\u0026rsquo;ve noticed that logging out of i3, intentionally or when i3 fails, would also kill any tmux or emacs sessions. This is extremely annoying.\nThis is caused by a new default in logind (systemd\u0026rsquo;s login) to kill user process on logoff. You can revert this setting in your logind.conf (/etc/systemd/logind.conf):\n1 KillUserProcesses=no Or only for a specific process (e.g., tmux):\n1 systemd-run --scope --user tmux Source: https://unix.stackexchange.com/questions/490267/prevent-logoff-from-killing-tmux-session\nUpload a temporary file Sometimes you just need to copy/paste a file from a server, and copying from the terminal can be a hassle. These two services are command-line \u0026ldquo;pastebins\u0026rdquo; just one curl away:\n\u0026lt;command\u0026gt; | curl -F 'sprunge=\u0026lt;-' http://sprunge.us # OR \u0026lt;command\u0026gt; 2\u0026gt;\u0026amp;1 | curl -F 'f:1=\u0026lt;-' ix.io Install Fortinet SSLVPN support for NetworkManager UPM (Universidad Politécnica de Madrid) uses a propriatary VPN solution. The instructions for GNU/Linux on their website involve downloading a specific client (.tar.gz) and manually running it. That works, but it is kind of a hassle. A much more convenient alternative is installing this NetworkManager plugin:\npacman -Sy networkmanager-fortisslvpn # Or apt get install networkmanager-fortisslvpn Now you can simply add a new VPN connection in NetworkManager and manage it as you would any other connection.\n","permalink":"/cheatsheet/linux/","tags":["linux","arch"],"title":"Linux"},{"categories":null,"contents":"Interesting libraries TQDM From tqdm\u0026rsquo;s github repository:\n tqdm means \u0026ldquo;progress\u0026rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for \u0026ldquo;I love you so much\u0026rdquo; in Spanish (te quiero demasiado).\n ","permalink":"/cheatsheet/python/","tags":["python","programming"],"title":"Python"},{"categories":null,"contents":"HDMI flickering Avoid HDMI flickering/intermittent blanking on RPI with a 1400x1050 VGA monitor.\n1 2 3 4 5 6 hdmi_drive=2 hdmi_group=2 hdmi_mode=42 disable_overscan=1 config_hdmi_boost=7 ","permalink":"/cheatsheet/rpi/","tags":["rpi"],"title":"Raspberry Pi"},{"categories":null,"contents":"This file exists solely to respond to /search URL with the related search layout template.\nNo content shown here is rendered, all content is based in the template layouts/page/search.html\nSetting a very low sitemap priority will tell search engines this is not important content.\nThis implementation uses Fusejs, jquery and mark.js\nInitial setup Search depends on additional output content type of JSON in config.toml ``` [outputs] home = [\u0026ldquo;HTML\u0026rdquo;, \u0026ldquo;JSON\u0026rdquo;] ```\nSearching additional fileds To search additional fields defined in front matter, you must add it in 2 places.\nEdit layouts/_default/index.JSON This exposes the values in /index.json i.e. add category ``` \u0026hellip; \u0026ldquo;contents\u0026rdquo;:{{ .Content | plainify | jsonify }} {{ if .Params.tags }}, \u0026ldquo;tags\u0026rdquo;:{{ .Params.tags | jsonify }}{{end}}, \u0026ldquo;categories\u0026rdquo; : {{ .Params.categories | jsonify }}, \u0026hellip; ```\nEdit fuse.js options to Search static/js/search.js ``` keys: [ \u0026ldquo;title\u0026rdquo;, \u0026ldquo;contents\u0026rdquo;, \u0026ldquo;tags\u0026rdquo;, \u0026ldquo;categories\u0026rdquo; ] ```\n ${title} ${snippet}\n ","permalink":"/search/","tags":null,"title":"Search Results"},{"categories":null,"contents":"PhD Write my first workshop paper as main author Write my first journal paper Write my first book chapter Chair a W3C Community Group Collaborate on a W3C recommendation Become a doctor! Technical Write a NodeJS App. Maia [See ISSUES] Write my first Django Application Develop a distributed LibP2P golang application Github repo with +100 stars Build a custom LineageOS image Languages English Chinese Greek German Esperanto Personal Run a 10k Blog regularly for a year ","permalink":"/page/todo/","tags":null,"title":"To-do"}] \ No newline at end of file diff --git a/index.xml b/index.xml index dd03ced..b7f7206 100644 --- a/index.xml +++ b/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 Linux on the Microsoft Surface Go /post/2019-05-01-surface-go/ @@ -29,7 +25,7 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su /post/2019-01-06-zigbee2mqtt/ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you&rsquo;re anything like me, you&rsquo;re probably a sucker for IoT devices. For a long time, I&rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them. @@ -48,7 +44,7 @@ If you're anything like me, you're probably a sucker for IoT devices. Fo Fri, 10 Apr 2015 17:47:00 +0000 /post/2015-04-10-github-dotfiles/ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today&rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -85,7 +81,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> @@ -125,7 +121,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. @@ -143,7 +139,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Mon, 01 Jan 0001 00:00:00 +0000 /project/ - Ongoing Projects Senpy: a framework for semantic sentiment and emotion analysis services. Soil: an agent-based simulator for social networks based on nx-sim and networkx. Onyx: an ontology for emotion analysis that includes concepts from W3C's provenance. Past Projects Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C's provenance ontology. + Ongoing Projects Senpy: a framework for semantic sentiment and emotion analysis services. Soil: an agent-based simulator for social networks based on nx-sim and networkx. Onyx: an ontology for emotion analysis that includes concepts from W3C&rsquo;s provenance. Past Projects Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C&rsquo;s provenance ontology. @@ -152,7 +148,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/linux/ - Black screen and LightDM doesn't unlock Add this to your /etc/lightdm/lightdm.conf file: + Black screen and LightDM doesn&rsquo;t unlock Add this to your /etc/lightdm/lightdm.conf file: 1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. @@ -162,7 +158,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/python/ - Interesting libraries TQDM From tqdm's github repository: + Interesting libraries TQDM From tqdm&rsquo;s github repository: tqdm means &ldquo;progress&rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for &ldquo;I love you so much&rdquo; in Spanish (te quiero demasiado). @@ -199,4 +195,4 @@ This implementation uses Fusejs, jquery and mark. - \ No newline at end of file + diff --git a/page/1/index.html b/page/1/index.html index 6926291..7a1d5b2 100644 --- a/page/1/index.html +++ b/page/1/index.html @@ -1 +1 @@ -/ \ No newline at end of file +/ \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index 75b4586..394356e 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -1,7 +1,7 @@ - + Balkian's site - Balkian's site @@ -91,7 +91,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location>
@@ -183,7 +183,7 @@ repository, just use:

- I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/page/index.xml b/page/index.xml index 49173cc..111b5f4 100644 --- a/page/index.xml +++ b/page/index.xml @@ -6,11 +6,7 @@ Recent content in Pages on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. To-do /page/todo/ @@ -21,4 +17,4 @@ - \ No newline at end of file + diff --git a/page/page/1/index.html b/page/page/1/index.html index b19c856..2af228d 100644 --- a/page/page/1/index.html +++ b/page/page/1/index.html @@ -1 +1 @@ -/page/ \ No newline at end of file +/page/ \ No newline at end of file diff --git a/page/todo/index.html b/page/todo/index.html index e2278ce..d2d846d 100644 --- a/page/todo/index.html +++ b/page/todo/index.html @@ -56,33 +56,33 @@

PhD

    -
  • Write my first workshop paper as main author
  • -
  • Write my first journal paper
  • -
  • Write my first book chapter
  • -
  • Chair a W3C Community Group
  • -
  • Collaborate on a W3C recommendation
  • -
  • Become a doctor!
  • +
  • Write my first workshop paper as main author
  • +
  • Write my first journal paper
  • +
  • Write my first book chapter
  • +
  • Chair a W3C Community Group
  • +
  • Collaborate on a W3C recommendation
  • +
  • Become a doctor!

Technical

    -
  • Write a NodeJS App. Maia [See ISSUES]
  • -
  • Write my first Django Application
  • -
  • Develop a distributed LibP2P golang application
  • -
  • Github repo with +100 stars
  • -
  • Build a custom LineageOS image
  • +
  • Write a NodeJS App. Maia [See ISSUES]
  • +
  • Write my first Django Application
  • +
  • Develop a distributed LibP2P golang application
  • +
  • Github repo with +100 stars
  • +
  • Build a custom LineageOS image

Languages

    -
  • English
  • -
  • Chinese
  • -
  • Greek
  • -
  • German
  • -
  • Esperanto
  • +
  • English
  • +
  • Chinese
  • +
  • Greek
  • +
  • German
  • +
  • Esperanto

Personal

    -
  • Run a 10k
  • -
  • Blog regularly for a year
  • +
  • Run a 10k
  • +
  • Blog regularly for a year
diff --git a/post/2013-08-17-creating-my-web/index.html b/post/2013-08-17-creating-my-web/index.html index feb2e69..99341ea 100644 --- a/post/2013-08-17-creating-my-web/index.html +++ b/post/2013-08-17-creating-my-web/index.html @@ -69,7 +69,7 @@

-

I've finally decided to set up a decent personal page. I have settled +

I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, @@ -84,10 +84,10 @@ everything could be easily reused if I ever choose to change to another blogging framework (e.g. pelical). But, for the time being, I like the fact that Github takes care of the compilation as well, so I can simply modify or add files through the web interface should I need to.

-

I hadn't played with HTML and CSS for a while now, so I also wanted to +

I hadn’t played with HTML and CSS for a while now, so I also wanted to use this site as a playground. At some point, I realised I was doing mostly everything in plain HTML and CSS, and decided to keep it like -that for as long as possible. As of this writing, I haven't included +that for as long as possible. As of this writing, I haven’t included any Javascript code in the page. Probably I will use some to add my gists and repositories, but we will see about that.

diff --git a/post/2014-03-27-updating-eurolovemap/index.html b/post/2014-03-27-updating-eurolovemap/index.html index f93fd4c..0bef7e3 100644 --- a/post/2014-03-27-updating-eurolovemap/index.html +++ b/post/2014-03-27-updating-eurolovemap/index.html @@ -75,7 +75,7 @@ articles by category and country (using the source of the article or the language it was written in), obtaining the “overall feeling” of each country about each topic. Then, we used some fancy JavaScript to make sense out of the raw information.

-

It didn't go too bad, it turns out we +

It didn’t go too bad, it turns out we won.

Now, it was time for a face-lift. I used this opportunity to play with new technologies and improve it:

@@ -97,7 +97,7 @@ new technologies and improve it:

Since Heroku uses python 2.7 by default, we have to tell it which -version we want, although it supports python 3.4 as well. I couldn't +version we want, although it supports python 3.4 as well. I couldn’t get python 3.4 working using the deadsnakes ppa, so I used python 3.3 instead, which works fine but is not officially @@ -111,7 +111,7 @@ with the python version you want to use:

python-3.3.1
 
-

Don't forget to freeze your dependencies so Heroku can install them: +

Don’t forget to freeze your dependencies so Heroku can install them: bash pip freze > requirements.txt

Publishing personal emails

There are really sophisticated and effective ways to obfuscate personal @@ -120,7 +120,7 @@ needed something really simple to hide our emails from the simplest form of crawlers. Most of the team are in academia somehow, so in the end all our emails are available in sites like Google Scholar. Anyway, nobody likes getting spammed so I settled for a custom Caesar -cipher. Please, don't use +cipher. Please, don’t use it for any serious application if you are concerned about being spammed.

@@ -129,7 +129,7 @@ it for any serious application if you are concerned about being spammed.

def blur_email(email):
-    return "".join([chr(ord(i)+5) for i in email])
+    return "".join([chr(ord(i)+5) for i in email])
 

And this is the client side:

@@ -184,7 +184,7 @@ an index, so it will always show the same picture.

For instance, the picture below is served through Lorem Pixel.

By the way, if you only want cat pictures, take a look at -Placekitten. And for NSFW text, there's the +Placekitten. And for NSFW text, there’s the Samuel L. Jackson Ipsum

diff --git a/post/2014-09-23-publishing-to-pypi/index.html b/post/2014-09-23-publishing-to-pypi/index.html index 565cb62..207183a 100644 --- a/post/2014-09-23-publishing-to-pypi/index.html +++ b/post/2014-09-23-publishing-to-pypi/index.html @@ -70,12 +70,12 @@ of the times you want others to download and use it easily. That is the role of PyPi, the python package repository. In this post I show you how to publish your package in less than 10 minutes.

Choose a fancy name

-

If you haven't done so yet, take a minute or two to think about this. -To publish on PyPi you need a name for your package that isn't taken. -What's more, a catchy and unique name will help people remember your +

If you haven’t done so yet, take a minute or two to think about this. +To publish on PyPi you need a name for your package that isn’t taken. +What’s more, a catchy and unique name will help people remember your module and feel more inclined to at least try it.

-

The package name should hint what your module does, but that's not -always the case. That's your call. I personally put uniqueness and +

The package name should hint what your module does, but that’s not +always the case. That’s your call. I personally put uniqueness and memorability over describing the functionality.

Create a .pypirc configuration file

@@ -159,15 +159,15 @@ also use rST (reStructuredText), the standard in the python community.

from distutils.core import setup
 
-setup(name = 'mypackage',
-      packages = ['mypackage'], # this must be the same as the name above
-      version = '{ version }',
-      description = '{ description }',
-      author = '{ name }',
-      email = '{ email }',
-      url = 'https://github.com/{user}/{package}', # URL to the github repo
-      download_url = 'https://github.com/{user}/{repo}/tarball/{version}',
-      keywords = ['websockets', 'display', 'd3'], # list of keywords that represent your package
+setup(name = 'mypackage',
+      packages = ['mypackage'], # this must be the same as the name above
+      version = '{ version }',
+      description = '{ description }',
+      author = '{ name }',
+      email = '{ email }',
+      url = 'https://github.com/{user}/{package}', # URL to the github repo
+      download_url = 'https://github.com/{user}/{repo}/tarball/{version}',
+      keywords = ['websockets', 'display', 'd3'], # list of keywords that represent your package
       classifiers = [], )
 
@@ -197,7 +197,7 @@ any problems first. The process is simple:

If everything went as expected, you can now install your package through -pip and browse your package's page. For instance, check my senpy +pip and browse your package’s page. For instance, check my senpy package: https://pypi.python.org/pypi/senpy

diff --git a/post/2014-10-09-proxies/index.html b/post/2014-10-09-proxies/index.html index 9ca55d8..8a50cf5 100644 --- a/post/2014-10-09-proxies/index.html +++ b/post/2014-10-09-proxies/index.html @@ -86,7 +86,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location>

Important: SCRIPT_NAME and the end of ProxyPass URL MUST BE @@ -114,7 +114,7 @@ options for uwsgi (in a .ini file).

<Location /myapp/>
     SetHandler uwsgi_handler
     uWSGISocker 127.0.0.1:8888
-</Location>
+</Location>
 

Try it with:

diff --git a/post/2014-12-09-zotero/index.html b/post/2014-12-09-zotero/index.html index 98ef764..4355c87 100644 --- a/post/2014-12-09-zotero/index.html +++ b/post/2014-12-09-zotero/index.html @@ -125,7 +125,7 @@ Debian/Ubuntu.

AuthBasicProvider file AuthUserFile /home/webdav/.htpasswd Require valid-user -</Location> +</Location>

Ideally, you want your webdav folders to be private, adding diff --git a/post/2015-04-10-github-dotfiles/index.html b/post/2015-04-10-github-dotfiles/index.html index 4db2a62..82e2bf1 100644 --- a/post/2015-04-10-github-dotfiles/index.html +++ b/post/2015-04-10-github-dotfiles/index.html @@ -65,7 +65,7 @@

-

Today's post is half a quick note, half public shaming. In other words, +

Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords.

As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the diff --git a/post/2019-01-06-zigbee2mqtt/index.html b/post/2019-01-06-zigbee2mqtt/index.html index 105df7b..18d2ed3 100644 --- a/post/2019-01-06-zigbee2mqtt/index.html +++ b/post/2019-01-06-zigbee2mqtt/index.html @@ -68,18 +68,18 @@

This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network.

-

If you're anything like me, you're probably a sucker for IoT devices. -For a long time, I've been using WiFi-enabled lights, and Amazon dash +

If you’re anything like me, you’re probably a sucker for IoT devices. +For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. To keep these (cheap Chinese) internet enabled devices away from your network and their respective cloud services, -you'll probably want to set up a dedicated network in your router (more +you’ll probably want to set up a dedicated network in your router (more on this on a future post, maybe). Another disadvantage of WiFi devices -is that they're relatively power hungry.

+is that they’re relatively power hungry.

A popular alternative is using ZigBee for communication. It is a dedicated protocol similar to bluetooth (BLE), with lower power requirements and bitrate.

Take the (super cute) aqara cube as an example. It is a small cube that -detects rotation on all of its axes, and tapping events. Here's a +detects rotation on all of its axes, and tapping events. Here’s a video:

@@ -106,7 +106,7 @@ sniffer.

You will need to flash your sniffer. For that, you only need to follow the instructions from the zigbee2mqtt documentation.

-

Once you're done flashing, you're ready to set up the zigbee2mqtt +

Once you’re done flashing, you’re ready to set up the zigbee2mqtt server. For convenience, I wrote a simple docker-compose to deploy a zigbee2mqtt server and a test mosquitto server:

@@ -137,30 +137,30 @@ zigbee2mqtt server and a test mosquitto server:

24 -
version: '2.1'
-services:
-  zigbee2mqtt:
-    image: koenkk/zigbee2mqtt
-    container_name: zigbee2mqtt 
-    restart: always
-    volumes:
-      - ./z2m-data/:/app/data/
-    devices:
+
version: '2.1'
+services:
+  zigbee2mqtt:
+    image: koenkk/zigbee2mqtt
+    container_name: zigbee2mqtt 
+    restart: always
+    volumes:
+      - ./z2m-data/:/app/data/
+    devices:
       - "/dev/ttyACM0"
-    networks:
-        - hass
-  mqtt:
-    image: eclipse-mosquitto
-    ports:
+    networks:
+        - hass
+  mqtt:
+    image: eclipse-mosquitto
+    ports:
        - 1883:1883
        - 9001:9001 
-    networks:
-        - hass
-    volumes:
-      - ./mosquitto.conf:/mosquitto/config/mosquitto.conf
-networks:
-  hass:
-    driver: overlay
+    networks:
+        - hass
+    volumes:
+      - ./mosquitto.conf:/mosquitto/config/mosquitto.conf
+networks:
+  hass:
+    driver: overlay
 

You can test your installation with:

diff --git a/post/index.html b/post/index.html index 2a15267..4adc6e6 100644 --- a/post/index.html +++ b/post/index.html @@ -91,7 +91,7 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su
This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you’re anything like me, you’re probably a sucker for IoT devices. For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. @@ -145,7 +145,7 @@ bars in the command line or in a jupyter notebook.

- Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . diff --git a/post/index.xml b/post/index.xml index 25f54e0..f936088 100644 --- a/post/index.xml +++ b/post/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 Linux on the Microsoft Surface Go /post/2019-05-01-surface-go/ @@ -29,7 +25,7 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su /post/2019-01-06-zigbee2mqtt/ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you&rsquo;re anything like me, you&rsquo;re probably a sucker for IoT devices. For a long time, I&rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them.
@@ -48,7 +44,7 @@ If you're anything like me, you're probably a sucker for IoT devices. Fo Fri, 10 Apr 2015 17:47:00 +0000 /post/2015-04-10-github-dotfiles/ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today&rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -85,7 +81,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> @@ -125,8 +121,8 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/post/page/1/index.html b/post/page/1/index.html index 5887d0a..83b55b0 100644 --- a/post/page/1/index.html +++ b/post/page/1/index.html @@ -1 +1 @@ -/post/ \ No newline at end of file +/post/ \ No newline at end of file diff --git a/post/page/2/index.html b/post/page/2/index.html index 973d9d0..2257a3e 100644 --- a/post/page/2/index.html +++ b/post/page/2/index.html @@ -90,7 +90,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> @@ -182,7 +182,7 @@ repository, just use:

- I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/post/scripts/pxe.sh b/post/scripts/pxe.sh new file mode 100644 index 0000000..d51988b --- /dev/null +++ b/post/scripts/pxe.sh @@ -0,0 +1,9 @@ +#/bin/bash +USER=j +IFNAME=enp62s0u1u3 +BINARY=test.bin +ip address flush dev $IFNAME +ip address add 10.1.1.10/24 dev $IFNAME +dnsmasq -i $IFNAME --dhcp-range=10.1.1.50,10.1.1.100 \ + --dhcp-boot=$BINARY \ + --enable-tftp --tftp-root=/home/$USER/Downloads/pxe -d -u $USER -p0 -K --log-dhcp --bootp-dynamic diff --git a/posts/index.xml b/posts/index.xml index 1605ea5..971fefc 100644 --- a/posts/index.xml +++ b/posts/index.xml @@ -6,10 +6,6 @@ Recent content in Posts on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - \ No newline at end of file + diff --git a/project/index.html b/project/index.html index c8ce5b5..c8664a0 100644 --- a/project/index.html +++ b/project/index.html @@ -58,11 +58,11 @@
  • Senpy: a framework for semantic sentiment and emotion analysis services.
  • Soil: an agent-based simulator for social networks based on nx-sim and networkx.
  • -
  • Onyx: an ontology for emotion analysis that includes concepts from W3C's provenance.
  • +
  • Onyx: an ontology for emotion analysis that includes concepts from W3C’s provenance.

Past Projects

    -
  • Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C's provenance ontology.
  • +
  • Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C’s provenance ontology.
  • Hermes: one of my first projects, developed together with David Pérez as the special custom assignment in one of our courses. Hermes is an affective bot designed to mimic the behavour of humans. It included a plug-in system for its sensors and actuators. The information from its sensors changed its emotional state, which was shown via its actuators. Among others, it could fetch inforation from Twitter or its host system and change the expressions of an external Face made with servo motors or speak via its Text-To-Speech software. For instance, it could detect it was running out of battery, showing a sad face and sending an alerting tweet. You can see it in action in these two youtube videos: Part 1 and Part 2.
  • Maia: the Modular Architecture for Intelligent Agents is an evented agent architecture that aims to update the classical frameworks for intelligent agents with the concepts emerged from the Live Web.
  • EESTEC.net: the Plone based official portal of EESTEC. It has been my first and only experience with Plone. I fixed some bugs and implemented basic features.
  • diff --git a/sitemap.xml b/sitemap.xml index 2946d6f..3b056dc 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -250,4 +250,4 @@ /page/todo/ - \ No newline at end of file + diff --git a/tags/apache/index.html b/tags/apache/index.html index 6946c3e..ed544de 100644 --- a/tags/apache/index.html +++ b/tags/apache/index.html @@ -113,7 +113,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> diff --git a/tags/apache/index.xml b/tags/apache/index.xml index 049b093..4995b41 100644 --- a/tags/apache/index.xml +++ b/tags/apache/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Tue, 09 Dec 2014 12:12:12 +0000 - - - - + Tue, 09 Dec 2014 12:12:12 +0000 Zotero /post/2014-12-09-zotero/ @@ -45,11 +41,11 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> - \ No newline at end of file + diff --git a/tags/apache/page/1/index.html b/tags/apache/page/1/index.html index 9aba95e..f9ac2cd 100644 --- a/tags/apache/page/1/index.html +++ b/tags/apache/page/1/index.html @@ -1 +1 @@ -/tags/apache/ \ No newline at end of file +/tags/apache/ \ No newline at end of file diff --git a/tags/arch/index.xml b/tags/arch/index.xml index f80f70d..fd6daf6 100644 --- a/tags/arch/index.xml +++ b/tags/arch/index.xml @@ -6,20 +6,16 @@ Recent content in arch on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Linux /cheatsheet/linux/ Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/linux/ - Black screen and LightDM doesn't unlock Add this to your /etc/lightdm/lightdm.conf file: + Black screen and LightDM doesn&rsquo;t unlock Add this to your /etc/lightdm/lightdm.conf file: 1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. - \ No newline at end of file + diff --git a/tags/arch/page/1/index.html b/tags/arch/page/1/index.html index 97c0bbb..c44b261 100644 --- a/tags/arch/page/1/index.html +++ b/tags/arch/page/1/index.html @@ -1 +1 @@ -/tags/arch/ \ No newline at end of file +/tags/arch/ \ No newline at end of file diff --git a/tags/config/index.xml b/tags/config/index.xml index cc192f3..1b18819 100644 --- a/tags/config/index.xml +++ b/tags/config/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 Linux on the Microsoft Surface Go /post/2019-05-01-surface-go/ @@ -23,4 +19,4 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su - \ No newline at end of file + diff --git a/tags/config/page/1/index.html b/tags/config/page/1/index.html index b160f31..79a7f20 100644 --- a/tags/config/page/1/index.html +++ b/tags/config/page/1/index.html @@ -1 +1 @@ -/tags/config/ \ No newline at end of file +/tags/config/ \ No newline at end of file diff --git a/tags/dotfiles/index.html b/tags/dotfiles/index.html index 6b34f36..8a4cbbe 100644 --- a/tags/dotfiles/index.html +++ b/tags/dotfiles/index.html @@ -69,7 +69,7 @@ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . diff --git a/tags/dotfiles/index.xml b/tags/dotfiles/index.xml index f4d00a8..73560c0 100644 --- a/tags/dotfiles/index.xml +++ b/tags/dotfiles/index.xml @@ -7,20 +7,16 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Fri, 10 Apr 2015 17:47:00 +0000 - - - - + Fri, 10 Apr 2015 17:47:00 +0000 Sharing dotfiles /post/2015-04-10-github-dotfiles/ Fri, 10 Apr 2015 17:47:00 +0000 /post/2015-04-10-github-dotfiles/ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today&rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . - \ No newline at end of file + diff --git a/tags/dotfiles/page/1/index.html b/tags/dotfiles/page/1/index.html index d5410a5..1147229 100644 --- a/tags/dotfiles/page/1/index.html +++ b/tags/dotfiles/page/1/index.html @@ -1 +1 @@ -/tags/dotfiles/ \ No newline at end of file +/tags/dotfiles/ \ No newline at end of file diff --git a/tags/emacs/index.xml b/tags/emacs/index.xml index e019d2d..1d5c15e 100644 --- a/tags/emacs/index.xml +++ b/tags/emacs/index.xml @@ -6,11 +6,7 @@ Recent content in emacs on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Emacs /cheatsheet/emacs/ @@ -21,4 +17,4 @@ - \ No newline at end of file + diff --git a/tags/emacs/page/1/index.html b/tags/emacs/page/1/index.html index dc952aa..2452935 100644 --- a/tags/emacs/page/1/index.html +++ b/tags/emacs/page/1/index.html @@ -1 +1 @@ -/tags/emacs/ \ No newline at end of file +/tags/emacs/ \ No newline at end of file diff --git a/tags/git/index.html b/tags/git/index.html index f19c9d8..519d324 100644 --- a/tags/git/index.html +++ b/tags/git/index.html @@ -69,7 +69,7 @@ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -119,7 +119,7 @@ repository, just use:

    - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/tags/git/index.xml b/tags/git/index.xml index 181f63e..67778e6 100644 --- a/tags/git/index.xml +++ b/tags/git/index.xml @@ -7,18 +7,14 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Fri, 10 Apr 2015 17:47:00 +0000 - - - - + Fri, 10 Apr 2015 17:47:00 +0000 Sharing dotfiles /post/2015-04-10-github-dotfiles/ Fri, 10 Apr 2015 17:47:00 +0000 /post/2015-04-10-github-dotfiles/ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today&rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -38,8 +34,8 @@ As part of moving to emacs, I starting using the incredibly useful gh.el. When y Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/tags/git/page/1/index.html b/tags/git/page/1/index.html index 0432cba..4701ff5 100644 --- a/tags/git/page/1/index.html +++ b/tags/git/page/1/index.html @@ -1 +1 @@ -/tags/git/ \ No newline at end of file +/tags/git/ \ No newline at end of file diff --git a/tags/github/index.html b/tags/github/index.html index ad4c435..f058a48 100644 --- a/tags/github/index.html +++ b/tags/github/index.html @@ -69,7 +69,7 @@ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today’s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -114,7 +114,7 @@ As part of moving to emacs, I starting using the incredibly useful gh.el. When y - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/tags/github/index.xml b/tags/github/index.xml index 1d6c523..363dc23 100644 --- a/tags/github/index.xml +++ b/tags/github/index.xml @@ -7,18 +7,14 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Fri, 10 Apr 2015 17:47:00 +0000 - - - - + Fri, 10 Apr 2015 17:47:00 +0000 Sharing dotfiles /post/2015-04-10-github-dotfiles/ Fri, 10 Apr 2015 17:47:00 +0000 /post/2015-04-10-github-dotfiles/ - Today's post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. + Today&rsquo;s post is half a quick note, half public shaming. In other words, it is a reminder to be very careful with OAuth tokens and passwords. As part of moving to emacs, I starting using the incredibly useful gh.el. When you first use it, the extension saves either your password or an OAuth token in your . @@ -37,8 +33,8 @@ As part of moving to emacs, I starting using the incredibly useful gh.el. When y Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/tags/github/page/1/index.html b/tags/github/page/1/index.html index d99716f..4cd1dcf 100644 --- a/tags/github/page/1/index.html +++ b/tags/github/page/1/index.html @@ -1 +1 @@ -/tags/github/ \ No newline at end of file +/tags/github/ \ No newline at end of file diff --git a/tags/gunicorn/index.html b/tags/gunicorn/index.html index 85b97ec..19f6c36 100644 --- a/tags/gunicorn/index.html +++ b/tags/gunicorn/index.html @@ -90,7 +90,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> diff --git a/tags/gunicorn/index.xml b/tags/gunicorn/index.xml index ae68226..69a9cb8 100644 --- a/tags/gunicorn/index.xml +++ b/tags/gunicorn/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 09 Oct 2014 10:00:00 +0000 - - - - + Thu, 09 Oct 2014 10:00:00 +0000 Proxies with Apache and python /post/2014-10-09-proxies/ @@ -35,11 +31,11 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> - \ No newline at end of file + diff --git a/tags/gunicorn/page/1/index.html b/tags/gunicorn/page/1/index.html index 4edcf3b..57cef7f 100644 --- a/tags/gunicorn/page/1/index.html +++ b/tags/gunicorn/page/1/index.html @@ -1 +1 @@ -/tags/gunicorn/ \ No newline at end of file +/tags/gunicorn/ \ No newline at end of file diff --git a/tags/heroku/index.xml b/tags/heroku/index.xml index 0a3f604..cac8a22 100644 --- a/tags/heroku/index.xml +++ b/tags/heroku/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 27 Mar 2014 14:00:00 +0000 - - - - + Thu, 27 Mar 2014 14:00:00 +0000 Updating EuroLoveMap /post/2014-03-27-updating-eurolovemap/ @@ -22,4 +18,4 @@ - \ No newline at end of file + diff --git a/tags/heroku/page/1/index.html b/tags/heroku/page/1/index.html index b242aa6..413c684 100644 --- a/tags/heroku/page/1/index.html +++ b/tags/heroku/page/1/index.html @@ -1 +1 @@ -/tags/heroku/ \ No newline at end of file +/tags/heroku/ \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml index 11cc0fe..872dc21 100644 --- a/tags/index.xml +++ b/tags/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 config /tags/config/ @@ -274,4 +270,4 @@ - \ No newline at end of file + diff --git a/tags/iot/index.html b/tags/iot/index.html index d24269b..7c2f058 100644 --- a/tags/iot/index.html +++ b/tags/iot/index.html @@ -70,7 +70,7 @@ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you’re anything like me, you’re probably a sucker for IoT devices. For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. diff --git a/tags/iot/index.xml b/tags/iot/index.xml index b358b9b..267ec72 100644 --- a/tags/iot/index.xml +++ b/tags/iot/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sun, 06 Jan 2019 10:00:00 +0000 - - - - + Sun, 06 Jan 2019 10:00:00 +0000 Controlling Zigbee devices with MQTT /post/2019-01-06-zigbee2mqtt/ @@ -19,8 +15,8 @@ /post/2019-01-06-zigbee2mqtt/ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you&rsquo;re anything like me, you&rsquo;re probably a sucker for IoT devices. For a long time, I&rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them. - \ No newline at end of file + diff --git a/tags/iot/page/1/index.html b/tags/iot/page/1/index.html index 8b01d33..e4bc0de 100644 --- a/tags/iot/page/1/index.html +++ b/tags/iot/page/1/index.html @@ -1 +1 @@ -/tags/iot/ \ No newline at end of file +/tags/iot/ \ No newline at end of file diff --git a/tags/javascript/index.html b/tags/javascript/index.html index 154caa3..dbdd701 100644 --- a/tags/javascript/index.html +++ b/tags/javascript/index.html @@ -93,7 +93,7 @@ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/tags/javascript/index.xml b/tags/javascript/index.xml index 525f4b4..4797eaf 100644 --- a/tags/javascript/index.xml +++ b/tags/javascript/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 27 Mar 2014 14:00:00 +0000 - - - - + Thu, 27 Mar 2014 14:00:00 +0000 Updating EuroLoveMap /post/2014-03-27-updating-eurolovemap/ @@ -27,8 +23,8 @@ Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/tags/javascript/page/1/index.html b/tags/javascript/page/1/index.html index b891add..b37324f 100644 --- a/tags/javascript/page/1/index.html +++ b/tags/javascript/page/1/index.html @@ -1 +1 @@ -/tags/javascript/ \ No newline at end of file +/tags/javascript/ \ No newline at end of file diff --git a/tags/linux/index.xml b/tags/linux/index.xml index fef6f99..302cb02 100644 --- a/tags/linux/index.xml +++ b/tags/linux/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 Linux on the Microsoft Surface Go /post/2019-05-01-surface-go/ @@ -28,9 +24,9 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/linux/ - Black screen and LightDM doesn't unlock Add this to your /etc/lightdm/lightdm.conf file: + Black screen and LightDM doesn&rsquo;t unlock Add this to your /etc/lightdm/lightdm.conf file: 1 2 [LightDM] logind-check-graphical=true Edit previous commands fc is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with C-x C-e), it also allows you to edit and run several lines at the same time. - \ No newline at end of file + diff --git a/tags/linux/page/1/index.html b/tags/linux/page/1/index.html index 82150f6..d75b293 100644 --- a/tags/linux/page/1/index.html +++ b/tags/linux/page/1/index.html @@ -1 +1 @@ -/tags/linux/ \ No newline at end of file +/tags/linux/ \ No newline at end of file diff --git a/tags/lisp/index.xml b/tags/lisp/index.xml index 0ca6e3a..43097c6 100644 --- a/tags/lisp/index.xml +++ b/tags/lisp/index.xml @@ -6,11 +6,7 @@ Recent content in lisp on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Emacs /cheatsheet/emacs/ @@ -21,4 +17,4 @@ - \ No newline at end of file + diff --git a/tags/lisp/page/1/index.html b/tags/lisp/page/1/index.html index 1dbe46b..00e5e88 100644 --- a/tags/lisp/page/1/index.html +++ b/tags/lisp/page/1/index.html @@ -1 +1 @@ -/tags/lisp/ \ No newline at end of file +/tags/lisp/ \ No newline at end of file diff --git a/tags/mqtt/index.html b/tags/mqtt/index.html index 04ce975..1a5b6f3 100644 --- a/tags/mqtt/index.html +++ b/tags/mqtt/index.html @@ -70,7 +70,7 @@ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you’re anything like me, you’re probably a sucker for IoT devices. For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. diff --git a/tags/mqtt/index.xml b/tags/mqtt/index.xml index 332534e..6516357 100644 --- a/tags/mqtt/index.xml +++ b/tags/mqtt/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sun, 06 Jan 2019 10:00:00 +0000 - - - - + Sun, 06 Jan 2019 10:00:00 +0000 Controlling Zigbee devices with MQTT /post/2019-01-06-zigbee2mqtt/ @@ -19,8 +15,8 @@ /post/2019-01-06-zigbee2mqtt/ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you&rsquo;re anything like me, you&rsquo;re probably a sucker for IoT devices. For a long time, I&rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them. - \ No newline at end of file + diff --git a/tags/mqtt/page/1/index.html b/tags/mqtt/page/1/index.html index 4d4e1e2..ee4a855 100644 --- a/tags/mqtt/page/1/index.html +++ b/tags/mqtt/page/1/index.html @@ -1 +1 @@ -/tags/mqtt/ \ No newline at end of file +/tags/mqtt/ \ No newline at end of file diff --git a/tags/nginx/index.xml b/tags/nginx/index.xml index b5f3aca..e3696e7 100644 --- a/tags/nginx/index.xml +++ b/tags/nginx/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Tue, 09 Dec 2014 12:12:12 +0000 - - - - + Tue, 09 Dec 2014 12:12:12 +0000 Zotero /post/2014-12-09-zotero/ @@ -23,4 +19,4 @@ If you use nginx as your web server, know that even though it provides partial s - \ No newline at end of file + diff --git a/tags/nginx/page/1/index.html b/tags/nginx/page/1/index.html index 61faa4e..285c114 100644 --- a/tags/nginx/page/1/index.html +++ b/tags/nginx/page/1/index.html @@ -1 +1 @@ -/tags/nginx/ \ No newline at end of file +/tags/nginx/ \ No newline at end of file diff --git a/tags/org/index.xml b/tags/org/index.xml index 10ee139..5032558 100644 --- a/tags/org/index.xml +++ b/tags/org/index.xml @@ -6,11 +6,7 @@ Recent content in org on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Emacs /cheatsheet/emacs/ @@ -21,4 +17,4 @@ - \ No newline at end of file + diff --git a/tags/org/page/1/index.html b/tags/org/page/1/index.html index cca160a..a0f44cc 100644 --- a/tags/org/page/1/index.html +++ b/tags/org/page/1/index.html @@ -1 +1 @@ -/tags/org/ \ No newline at end of file +/tags/org/ \ No newline at end of file diff --git a/tags/productivity/index.xml b/tags/productivity/index.xml index 15f958a..d4d03d5 100644 --- a/tags/productivity/index.xml +++ b/tags/productivity/index.xml @@ -6,11 +6,7 @@ Recent content in productivity on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Emacs /cheatsheet/emacs/ @@ -21,4 +17,4 @@ - \ No newline at end of file + diff --git a/tags/productivity/page/1/index.html b/tags/productivity/page/1/index.html index 409e2ca..44ba0d8 100644 --- a/tags/productivity/page/1/index.html +++ b/tags/productivity/page/1/index.html @@ -1 +1 @@ -/tags/productivity/ \ No newline at end of file +/tags/productivity/ \ No newline at end of file diff --git a/tags/programming/index.xml b/tags/programming/index.xml index 3916a2d..f0a25c8 100644 --- a/tags/programming/index.xml +++ b/tags/programming/index.xml @@ -6,21 +6,17 @@ Recent content in programming on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Python /cheatsheet/python/ Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/python/ - Interesting libraries TQDM From tqdm's github repository: + Interesting libraries TQDM From tqdm&rsquo;s github repository: tqdm means &ldquo;progress&rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for &ldquo;I love you so much&rdquo; in Spanish (te quiero demasiado). - \ No newline at end of file + diff --git a/tags/programming/page/1/index.html b/tags/programming/page/1/index.html index 425c13b..f35bca8 100644 --- a/tags/programming/page/1/index.html +++ b/tags/programming/page/1/index.html @@ -1 +1 @@ -/tags/programming/ \ No newline at end of file +/tags/programming/ \ No newline at end of file diff --git a/tags/proxy/index.html b/tags/proxy/index.html index 9ae4f04..5713c08 100644 --- a/tags/proxy/index.html +++ b/tags/proxy/index.html @@ -90,7 +90,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> diff --git a/tags/proxy/index.xml b/tags/proxy/index.xml index cf9f8d3..ba3c5f0 100644 --- a/tags/proxy/index.xml +++ b/tags/proxy/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 09 Oct 2014 10:00:00 +0000 - - - - + Thu, 09 Oct 2014 10:00:00 +0000 Proxies with Apache and python /post/2014-10-09-proxies/ @@ -35,11 +31,11 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> - \ No newline at end of file + diff --git a/tags/proxy/page/1/index.html b/tags/proxy/page/1/index.html index 796882c..5fb3d8c 100644 --- a/tags/proxy/page/1/index.html +++ b/tags/proxy/page/1/index.html @@ -1 +1 @@ -/tags/proxy/ \ No newline at end of file +/tags/proxy/ \ No newline at end of file diff --git a/tags/pypi/index.xml b/tags/pypi/index.xml index 4de0af3..76fe9b0 100644 --- a/tags/pypi/index.xml +++ b/tags/pypi/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 27 Sep 2014 10:00:00 +0000 - - - - + Sat, 27 Sep 2014 10:00:00 +0000 Publishing on PyPi /post/2014-09-23-publishing-to-pypi/ @@ -22,4 +18,4 @@ - \ No newline at end of file + diff --git a/tags/pypi/page/1/index.html b/tags/pypi/page/1/index.html index ee9cf03..c1cc2d1 100644 --- a/tags/pypi/page/1/index.html +++ b/tags/pypi/page/1/index.html @@ -1 +1 @@ -/tags/pypi/ \ No newline at end of file +/tags/pypi/ \ No newline at end of file diff --git a/tags/python/index.html b/tags/python/index.html index fc1e5c8..82f69ce 100644 --- a/tags/python/index.html +++ b/tags/python/index.html @@ -124,7 +124,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> diff --git a/tags/python/index.xml b/tags/python/index.xml index f034dc4..3fbb232 100644 --- a/tags/python/index.xml +++ b/tags/python/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Wed, 28 Sep 2016 18:47:00 +0000 - - - - + Wed, 28 Sep 2016 18:47:00 +0000 Progress bars in python /post/2016-09-28-tqdm/ @@ -45,7 +41,7 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> @@ -75,10 +71,10 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a Mon, 01 Jan 0001 00:00:00 +0000 /cheatsheet/python/ - Interesting libraries TQDM From tqdm's github repository: + Interesting libraries TQDM From tqdm&rsquo;s github repository: tqdm means &ldquo;progress&rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for &ldquo;I love you so much&rdquo; in Spanish (te quiero demasiado). - \ No newline at end of file + diff --git a/tags/python/page/1/index.html b/tags/python/page/1/index.html index e3477ba..c7a41cc 100644 --- a/tags/python/page/1/index.html +++ b/tags/python/page/1/index.html @@ -1 +1 @@ -/tags/python/ \ No newline at end of file +/tags/python/ \ No newline at end of file diff --git a/tags/rpi/index.xml b/tags/rpi/index.xml index d6f3a54..bca55ba 100644 --- a/tags/rpi/index.xml +++ b/tags/rpi/index.xml @@ -6,11 +6,7 @@ Recent content in rpi on Balkian's site Hugo -- gohugo.io en-us - This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - - - - + This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Raspberry Pi /cheatsheet/rpi/ @@ -22,4 +18,4 @@ - \ No newline at end of file + diff --git a/tags/rpi/page/1/index.html b/tags/rpi/page/1/index.html index 91e06cd..9b84ddf 100644 --- a/tags/rpi/page/1/index.html +++ b/tags/rpi/page/1/index.html @@ -1 +1 @@ -/tags/rpi/ \ No newline at end of file +/tags/rpi/ \ No newline at end of file diff --git a/tags/ruby/index.html b/tags/ruby/index.html index f787f1b..bd08ffe 100644 --- a/tags/ruby/index.html +++ b/tags/ruby/index.html @@ -73,7 +73,7 @@ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/tags/ruby/index.xml b/tags/ruby/index.xml index 4402e76..4559163 100644 --- a/tags/ruby/index.xml +++ b/tags/ruby/index.xml @@ -7,19 +7,15 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 22 Aug 2013 14:14:22 +0000 - - - - + Thu, 22 Aug 2013 14:14:22 +0000 Creating my web /post/2013-08-17-creating-my-web/ Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/tags/ruby/page/1/index.html b/tags/ruby/page/1/index.html index e1d1435..c75d1b9 100644 --- a/tags/ruby/page/1/index.html +++ b/tags/ruby/page/1/index.html @@ -1 +1 @@ -/tags/ruby/ \ No newline at end of file +/tags/ruby/ \ No newline at end of file diff --git a/tags/starters/index.html b/tags/starters/index.html index f65a47c..de61051 100644 --- a/tags/starters/index.html +++ b/tags/starters/index.html @@ -73,7 +73,7 @@ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I’ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. diff --git a/tags/starters/index.xml b/tags/starters/index.xml index d8b3e58..8f39d02 100644 --- a/tags/starters/index.xml +++ b/tags/starters/index.xml @@ -7,19 +7,15 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 22 Aug 2013 14:14:22 +0000 - - - - + Thu, 22 Aug 2013 14:14:22 +0000 Creating my web /post/2013-08-17-creating-my-web/ Thu, 22 Aug 2013 14:14:22 +0000 /post/2013-08-17-creating-my-web/ - I've finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. + I&rsquo;ve finally decided to set up a decent personal page. I have settled for github-pages because I like the idea of keeping my site in a repository and having someone else host and deploy it for me. The site will be really simple, mostly static files. Thanks to Github, Jekyll will automatically generate static pages for my posts every time I commit anything new to this repository. - \ No newline at end of file + diff --git a/tags/starters/page/1/index.html b/tags/starters/page/1/index.html index efd305f..92ab479 100644 --- a/tags/starters/page/1/index.html +++ b/tags/starters/page/1/index.html @@ -1 +1 @@ -/tags/starters/ \ No newline at end of file +/tags/starters/ \ No newline at end of file diff --git a/tags/surface-go/index.xml b/tags/surface-go/index.xml index c357da6..75f8197 100644 --- a/tags/surface-go/index.xml +++ b/tags/surface-go/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sat, 01 Jun 2019 00:00:01 +0000 - - - - + Sat, 01 Jun 2019 00:00:01 +0000 Linux on the Microsoft Surface Go /post/2019-05-01-surface-go/ @@ -23,4 +19,4 @@ These are some useful notes to get Ubuntu installed in your surface go, as of Su - \ No newline at end of file + diff --git a/tags/surface-go/page/1/index.html b/tags/surface-go/page/1/index.html index 100befc..f841c90 100644 --- a/tags/surface-go/page/1/index.html +++ b/tags/surface-go/page/1/index.html @@ -1 +1 @@ -/tags/surface-go/ \ No newline at end of file +/tags/surface-go/ \ No newline at end of file diff --git a/tags/uwsgi/index.html b/tags/uwsgi/index.html index e18d22c..b7d971c 100644 --- a/tags/uwsgi/index.html +++ b/tags/uwsgi/index.html @@ -90,7 +90,7 @@ a WSGI application with the name application. Hence, wsgi:application.< ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME "/myapp/" -</Location> +</Location> diff --git a/tags/uwsgi/index.xml b/tags/uwsgi/index.xml index 77675f1..f5a30ad 100644 --- a/tags/uwsgi/index.xml +++ b/tags/uwsgi/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Thu, 09 Oct 2014 10:00:00 +0000 - - - - + Thu, 09 Oct 2014 10:00:00 +0000 Proxies with Apache and python /post/2014-10-09-proxies/ @@ -35,11 +31,11 @@ a WSGI application with the name <em>application</em>. Hence, wsgi:a ProxyPass http://127.0.0.1:8888/myapp/ ProxyPassReverse http://127.0.0.1:8888/myapp/ RequestHeader set SCRIPT_NAME <span style="color:#e6db74">&#34;/myapp/&#34;</span> -<span style="color:#f92672">&lt;/Location</span><span style="color:#e6db74"></span><span style="color:#f92672">&gt;</span> +<span style="color:#f92672">&lt;/Location&gt;</span> </code></pre></td></tr></table> </div> </div> - \ No newline at end of file + diff --git a/tags/uwsgi/page/1/index.html b/tags/uwsgi/page/1/index.html index b5adf63..12849e3 100644 --- a/tags/uwsgi/page/1/index.html +++ b/tags/uwsgi/page/1/index.html @@ -1 +1 @@ -/tags/uwsgi/ \ No newline at end of file +/tags/uwsgi/ \ No newline at end of file diff --git a/tags/webdav/index.xml b/tags/webdav/index.xml index 0f243e9..5896165 100644 --- a/tags/webdav/index.xml +++ b/tags/webdav/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Tue, 09 Dec 2014 12:12:12 +0000 - - - - + Tue, 09 Dec 2014 12:12:12 +0000 Zotero /post/2014-12-09-zotero/ @@ -23,4 +19,4 @@ If you use nginx as your web server, know that even though it provides partial s - \ No newline at end of file + diff --git a/tags/webdav/page/1/index.html b/tags/webdav/page/1/index.html index e4eb112..04d8257 100644 --- a/tags/webdav/page/1/index.html +++ b/tags/webdav/page/1/index.html @@ -1 +1 @@ -/tags/webdav/ \ No newline at end of file +/tags/webdav/ \ No newline at end of file diff --git a/tags/zigbee/index.html b/tags/zigbee/index.html index 4630efd..80d09c3 100644 --- a/tags/zigbee/index.html +++ b/tags/zigbee/index.html @@ -70,7 +70,7 @@ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you’re anything like me, you’re probably a sucker for IoT devices. For a long time, I’ve been using WiFi-enabled lights, and Amazon dash buttons to control them. diff --git a/tags/zigbee/index.xml b/tags/zigbee/index.xml index fa8abaf..543de0d 100644 --- a/tags/zigbee/index.xml +++ b/tags/zigbee/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Sun, 06 Jan 2019 10:00:00 +0000 - - - - + Sun, 06 Jan 2019 10:00:00 +0000 Controlling Zigbee devices with MQTT /post/2019-01-06-zigbee2mqtt/ @@ -19,8 +15,8 @@ /post/2019-01-06-zigbee2mqtt/ This is a short tutorial on connecting a zigbee device (an Aqara cube) to an MQTT server, so you can control your zigbee devices from the network. -If you're anything like me, you're probably a sucker for IoT devices. For a long time, I've been using WiFi-enabled lights, and Amazon dash buttons to control them. +If you&rsquo;re anything like me, you&rsquo;re probably a sucker for IoT devices. For a long time, I&rsquo;ve been using WiFi-enabled lights, and Amazon dash buttons to control them. - \ No newline at end of file + diff --git a/tags/zigbee/page/1/index.html b/tags/zigbee/page/1/index.html index d0763ee..04eea1c 100644 --- a/tags/zigbee/page/1/index.html +++ b/tags/zigbee/page/1/index.html @@ -1 +1 @@ -/tags/zigbee/ \ No newline at end of file +/tags/zigbee/ \ No newline at end of file diff --git a/tags/zotero/index.xml b/tags/zotero/index.xml index 09867f3..c1f43ca 100644 --- a/tags/zotero/index.xml +++ b/tags/zotero/index.xml @@ -7,11 +7,7 @@ Hugo -- gohugo.io en-us This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - Tue, 09 Dec 2014 12:12:12 +0000 - - - - + Tue, 09 Dec 2014 12:12:12 +0000 Zotero /post/2014-12-09-zotero/ @@ -23,4 +19,4 @@ If you use nginx as your web server, know that even though it provides partial s - \ No newline at end of file + diff --git a/tags/zotero/page/1/index.html b/tags/zotero/page/1/index.html index 8a16825..69c73ba 100644 --- a/tags/zotero/page/1/index.html +++ b/tags/zotero/page/1/index.html @@ -1 +1 @@ -/tags/zotero/ \ No newline at end of file +/tags/zotero/ \ No newline at end of file