From 1326534303d56a825befad6015a5b2cd0767eee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?= Date: Thu, 22 Jan 2015 23:05:35 +0100 Subject: [PATCH] Generate Pelican site --- .gitignore | 2 - CNAME | 1 - _config.yml | 4 - _layouts/post.html | 18 - .../.2013-08-17-creating-my-web.markdown.swo | Bin 12288 -> 0 bytes _posts/2013-08-17-creating-my-web.markdown | 31 -- ...22-Remove-git-files-with-globbing.markdown | 11 - .../2014-03-27-updating-eurolovemap.markdown | 94 ---- _posts/2014-09-23-publishing-in-pypi.markdown | 106 ----- _posts/2014-10-09-proxies.markdown | 67 --- _posts/2014-12-09-zotero.markdown | 78 ---- about/index.html | 27 -- archives.html | 154 +++++++ author/j-fernando-sanchez.html | 250 +++++++++++ authors.html | 142 ++++++ categories.html | 141 ++++++ category/misc.html | 250 +++++++++++ creating-my-web.html | 189 ++++++++ cv/index.html | 109 ----- favicon.ico | Bin 4286 -> 0 bytes feeds/all.atom.xml | 418 ++++++++++++++++++ feeds/misc.atom.xml | 418 ++++++++++++++++++ fonts/glyphiconshalflings-regular.eot | Bin 33358 -> 0 bytes fonts/glyphiconshalflings-regular.otf | Bin 18116 -> 0 bytes fonts/glyphiconshalflings-regular.svg | 175 -------- fonts/glyphiconshalflings-regular.ttf | Bin 32896 -> 0 bytes fonts/glyphiconshalflings-regular.woff | Bin 18944 -> 0 bytes index.html | 271 ++++++++++-- pages/about.html | 161 +++++++ pages/cv.html | 239 ++++++++++ pages/projects.html | 151 +++++++ pages/to-do.html | 174 ++++++++ projects/index.markdown | 18 - proxies-with-apache-and-python.html | 234 ++++++++++ publishing-in-pypi.html | 242 ++++++++++ remove-git-files-with-globbing.html | 155 +++++++ tag/apache.html | 175 ++++++++ tag/git.html | 162 +++++++ tag/github.html | 165 +++++++ tag/gunicorn.html | 154 +++++++ tag/heroku.html | 145 ++++++ tag/javascript.html | 167 +++++++ tag/nginx.html | 146 ++++++ tag/proxy.html | 154 +++++++ _layouts/default.html => tag/pypi.html | 82 ++-- tag/python.html | 192 ++++++++ tag/ruby.html | 147 ++++++ tag/starters.html | 147 ++++++ tag/uwsgi.html | 154 +++++++ tag/webdav.html | 146 ++++++ tag/zotero.html | 146 ++++++ tags.html | 153 +++++++ {css => theme/css}/cv-desktop.css | 0 {css => theme/css}/cv-medium.css | 0 {css => theme/css}/cv.css | 0 {css => theme/css}/main-desktop.bakup | 0 {css => theme/css}/main-desktop.css | 95 ++-- {css => theme/css}/main-medium.css | 44 -- {css => theme/css}/main-xs.css | 15 +- {css => theme/css}/main.css | 88 +++- theme/css/solarized-dark.css | 1 + theme/css/solarized.css | 69 +++ {css => theme/css}/syntax.css | 0 .../font-awesome}/css/font-awesome-ie7.css | 0 .../css/font-awesome-ie7.min.css | 0 .../font-awesome}/css/font-awesome.css | 0 .../font-awesome}/css/font-awesome.min.css | 0 .../font-awesome}/font/FontAwesome.otf | Bin .../font/fontawesome-webfont.eot | Bin .../font/fontawesome-webfont.svg | 0 .../font/fontawesome-webfont.ttf | Bin .../font/fontawesome-webfont.woff | Bin .../font-awesome}/less/bootstrap.less | 0 .../font-awesome}/less/core.less | 0 .../font-awesome}/less/extras.less | 0 .../font-awesome}/less/font-awesome-ie7.less | 0 .../font-awesome}/less/font-awesome.less | 0 .../font-awesome}/less/icons.less | 0 .../font-awesome}/less/mixins.less | 0 .../font-awesome}/less/path.less | 0 .../font-awesome}/less/variables.less | 0 .../font-awesome}/scss/_bootstrap.scss | 0 .../font-awesome}/scss/_core.scss | 0 .../font-awesome}/scss/_extras.scss | 0 .../font-awesome}/scss/_icons.scss | 0 .../font-awesome}/scss/_mixins.scss | 0 .../font-awesome}/scss/_path.scss | 0 .../font-awesome}/scss/_variables.scss | 0 .../font-awesome}/scss/font-awesome-ie7.scss | 0 .../font-awesome}/scss/font-awesome.scss | 0 {img => theme/img}/favicon-balkian.xcf | Bin {img => theme/img}/favicon.ico | Bin {img => theme/img}/favicon.png | Bin {img => theme/img}/favicon.xcf | Bin {img => theme/img}/favicon2.ico | Bin {img => theme/img}/favicon2.xcf | Bin {img => theme/img}/favicon3.ico | Bin {img => theme/img}/me.jpg | Bin {img => theme/img}/me.png | Bin {img => theme/img}/noise.jpg | Bin {img => theme/img}/noise2.png | Bin {img => theme/img}/noise3.png | Bin {img => theme/img}/noise4.png | Bin {js => theme/js}/jquery-2.0.2.min.js | 0 todo/index.html | 38 -- updating-eurolovemap.html | 261 +++++++++++ zotero.html | 254 +++++++++++ 107 files changed, 6690 insertions(+), 940 deletions(-) delete mode 100644 .gitignore delete mode 100644 CNAME delete mode 100644 _config.yml delete mode 100644 _layouts/post.html delete mode 100644 _posts/.2013-08-17-creating-my-web.markdown.swo delete mode 100644 _posts/2013-08-17-creating-my-web.markdown delete mode 100644 _posts/2013-08-22-Remove-git-files-with-globbing.markdown delete mode 100644 _posts/2014-03-27-updating-eurolovemap.markdown delete mode 100644 _posts/2014-09-23-publishing-in-pypi.markdown delete mode 100644 _posts/2014-10-09-proxies.markdown delete mode 100644 _posts/2014-12-09-zotero.markdown delete mode 100644 about/index.html create mode 100644 archives.html create mode 100644 author/j-fernando-sanchez.html create mode 100644 authors.html create mode 100644 categories.html create mode 100644 category/misc.html create mode 100644 creating-my-web.html delete mode 100644 cv/index.html delete mode 100644 favicon.ico create mode 100644 feeds/all.atom.xml create mode 100644 feeds/misc.atom.xml delete mode 100755 fonts/glyphiconshalflings-regular.eot delete mode 100644 fonts/glyphiconshalflings-regular.otf delete mode 100755 fonts/glyphiconshalflings-regular.svg delete mode 100755 fonts/glyphiconshalflings-regular.ttf delete mode 100755 fonts/glyphiconshalflings-regular.woff create mode 100644 pages/about.html create mode 100644 pages/cv.html create mode 100644 pages/projects.html create mode 100644 pages/to-do.html delete mode 100644 projects/index.markdown create mode 100644 proxies-with-apache-and-python.html create mode 100644 publishing-in-pypi.html create mode 100644 remove-git-files-with-globbing.html create mode 100644 tag/apache.html create mode 100644 tag/git.html create mode 100644 tag/github.html create mode 100644 tag/gunicorn.html create mode 100644 tag/heroku.html create mode 100644 tag/javascript.html create mode 100644 tag/nginx.html create mode 100644 tag/proxy.html rename _layouts/default.html => tag/pypi.html (50%) create mode 100644 tag/python.html create mode 100644 tag/ruby.html create mode 100644 tag/starters.html create mode 100644 tag/uwsgi.html create mode 100644 tag/webdav.html create mode 100644 tag/zotero.html create mode 100644 tags.html rename {css => theme/css}/cv-desktop.css (100%) rename {css => theme/css}/cv-medium.css (100%) rename {css => theme/css}/cv.css (100%) rename {css => theme/css}/main-desktop.bakup (100%) rename {css => theme/css}/main-desktop.css (89%) mode change 100755 => 100644 rename {css => theme/css}/main-medium.css (91%) rename {css => theme/css}/main-xs.css (95%) rename {css => theme/css}/main.css (56%) mode change 100755 => 100644 create mode 100644 theme/css/solarized-dark.css create mode 100644 theme/css/solarized.css rename {css => theme/css}/syntax.css (100%) rename {font-awesome => theme/font-awesome}/css/font-awesome-ie7.css (100%) rename {font-awesome => theme/font-awesome}/css/font-awesome-ie7.min.css (100%) rename {font-awesome => theme/font-awesome}/css/font-awesome.css (100%) rename {font-awesome => theme/font-awesome}/css/font-awesome.min.css (100%) rename {font-awesome => theme/font-awesome}/font/FontAwesome.otf (100%) rename {font-awesome => theme/font-awesome}/font/fontawesome-webfont.eot (100%) mode change 100755 => 100644 rename {font-awesome => theme/font-awesome}/font/fontawesome-webfont.svg (100%) mode change 100755 => 100644 rename {font-awesome => theme/font-awesome}/font/fontawesome-webfont.ttf (100%) mode change 100755 => 100644 rename {font-awesome => theme/font-awesome}/font/fontawesome-webfont.woff (100%) mode change 100755 => 100644 rename {font-awesome => theme/font-awesome}/less/bootstrap.less (100%) rename {font-awesome => theme/font-awesome}/less/core.less (100%) rename {font-awesome => theme/font-awesome}/less/extras.less (100%) rename {font-awesome => theme/font-awesome}/less/font-awesome-ie7.less (100%) rename {font-awesome => theme/font-awesome}/less/font-awesome.less (100%) rename {font-awesome => theme/font-awesome}/less/icons.less (100%) rename {font-awesome => theme/font-awesome}/less/mixins.less (100%) rename {font-awesome => theme/font-awesome}/less/path.less (100%) rename {font-awesome => theme/font-awesome}/less/variables.less (100%) rename {font-awesome => theme/font-awesome}/scss/_bootstrap.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_core.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_extras.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_icons.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_mixins.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_path.scss (100%) rename {font-awesome => theme/font-awesome}/scss/_variables.scss (100%) rename {font-awesome => theme/font-awesome}/scss/font-awesome-ie7.scss (100%) rename {font-awesome => theme/font-awesome}/scss/font-awesome.scss (100%) rename {img => theme/img}/favicon-balkian.xcf (100%) rename {img => theme/img}/favicon.ico (100%) rename {img => theme/img}/favicon.png (100%) rename {img => theme/img}/favicon.xcf (100%) rename {img => theme/img}/favicon2.ico (100%) rename {img => theme/img}/favicon2.xcf (100%) rename {img => theme/img}/favicon3.ico (100%) rename {img => theme/img}/me.jpg (100%) rename {img => theme/img}/me.png (100%) rename {img => theme/img}/noise.jpg (100%) rename {img => theme/img}/noise2.png (100%) rename {img => theme/img}/noise3.png (100%) rename {img => theme/img}/noise4.png (100%) rename {js => theme/js}/jquery-2.0.2.min.js (100%) delete mode 100644 todo/index.html create mode 100644 updating-eurolovemap.html create mode 100644 zotero.html diff --git a/.gitignore b/.gitignore deleted file mode 100644 index be6b1d7..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_site -*.swp diff --git a/CNAME b/CNAME deleted file mode 100644 index 1ed063d..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -balkian.com diff --git a/_config.yml b/_config.yml deleted file mode 100644 index ba6d9b6..0000000 --- a/_config.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Balkian's Log -pygments: true -paginate: 5 -markdown: kramdown diff --git a/_layouts/post.html b/_layouts/post.html deleted file mode 100644 index 41b4dec..0000000 --- a/_layouts/post.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default ---- -
- {{ page.previous.title }} - {{ page.next.title }} -
-
-

{{ page.title }}

- {{ page.date | date_to_string }} - {% for c in page.tags %} - {{ c }} - {% endfor %} -
- -
-{{ content }} -
diff --git a/_posts/.2013-08-17-creating-my-web.markdown.swo b/_posts/.2013-08-17-creating-my-web.markdown.swo deleted file mode 100644 index 7ce3b2b92be4428c3031ef1183a6b7208abce728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&x;&I6vrzPkwl|GStOobW(kvp?VjD8Kx9BcvS<_*K{p8@#GU?8-CaA~Rc%*w z#vw${deD=9gI+zU_$PRZAc*2c@svaU0S|twd&UKkcneWqvmd&r>Q%j}Pfx)v`{J#u zukX>ta4c}07Gmv%({J5fdq<2<3UQdpMn^g|zV88-ty`zn>;Vyd*ZY4?ILeh9#Zfs^ zkq+@(v~if2%0G_c(&VFq+E`~tJ6qf1VC%(T`(ltZGIC1iLA40xG7hV#nWbi~|1m2E zumLvE8#pD#JKJ0Sd3|t}o_qERi(vz7fDNz#Hoykh02^QfY~X)nz}3gZ2iWgp%RQf2 z-jDs|zWm5HHoykh02^QfY=8~00XDz}*Z><~18m@5Xdp_3h@TST7vTT@zxw>&PZ+pyC})eZyg4CUg>&^}H0qn0u9i|P1A@Fjj1RDgII6WARp!uCu~`lh;!+`# z8JX6RD! zQrzZtl%a~V#RQFfx0NXIq{yvu4K2N<+~qb#XKhwV{rW>8Zl5Em(?aD%2^^ifBi3Jf znd(MqOftNzHfi5fL%*1}_jljCvLA}B@1RiUhrVY+V7wqgt*WJgk6*v7qe|Wxh*W0% zL_XNJZTNIYxtca!_=IBVBq}X7pP@R|Qf=n4$=Z@^Ti2#>oub5~lB`yBEuEbRv2Q3! zQ_^ydcx-x;tg7mA(X~dDc|%Hf-lu)#>y%Q}$i$gufo3?$Oj(+_?P3z6Z%OTx(G$9k zE7;o$c6S56^1x()PZ7%ZTqv%ab_nsA(kTWizgoN>WLlWEp}$ELkW7_-m8)1(|Ke=~ zajVLd&g1Pjt)@8&cDsd4gZY#!J|@M6H*clvr%sAU=hB|V@9se$lE}&2G)meDSr;|V zi#v>NMK) requirements.txt -{% endhighlight %} - -Publishing 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](http://en.wikipedia.org/wiki/Caesar_cipher). -Please, don't use it for any serious application if you are concerned about being spammed. - -{% highlight python %} -def blur_email(email): - return "".join([chr(ord(i)+5) for i in email]) -{% endhighlight %} - -And this is the client side: - -{% highlight javascript %} -window.onload = function(){ - elems = document.getElementsByClassName('profile-email'); - for(var e in elems){ - var blur = elems[e].innerHTML; - var email = ""; - for(var s in blur){ - var a = blur.charCodeAt(s) - email = email+String.fromCharCode(a-5); - } - elems[e].innerHTML = email; - } -} -{% endhighlight %} - -Unfortunately, this approach does not hide your email from anyone using [PhantomJS](http://phantomjs.org/), [ZombieJS](http://zombie.labnotes.org/) 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. - -Generation of fake data ------------------------ -To test the contact section of the site, I wanted to populate it with fake data. -[Fake-Factory](https://github.com/joke2k/faker) is an amazing library that can generate fake data of almost any kind: emails, association names, acronyms... -It even lets you localise the results (get Spanish names, for instance) and generate factories for certain classes (à la Django). - -But I also wanted pictures, enter [Lorem Pixel](http://lorempixel.com/). -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. - -For instance, the picture below is served through Lorem Pixel. - -![This picture is generated with LoremIpsum](http://lorempixel.com/400/200/nightlife/) - -By the way, if you only want cat pictures, take a look at [Placekitten](http://placekitten.com/). -And for NSFW text, there's the [Samuel L. Jackson Ipsum](http://slipsum.com/) diff --git a/_posts/2014-09-23-publishing-in-pypi.markdown b/_posts/2014-09-23-publishing-in-pypi.markdown deleted file mode 100644 index 366f81f..0000000 --- a/_posts/2014-09-23-publishing-in-pypi.markdown +++ /dev/null @@ -1,106 +0,0 @@ ---- -layout: post -title: "Publishing in PyPi" -date: 2014-09-27 10:00:00 -tags: github python pypi ---- - -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. - -## 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 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 memorability over describing the functionality. - -## Create a .pypirc configuration file -{% highlight cfg %} -[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 } -{% endhighlight %} - -As you can see, you need to register both in the [main pypi repository](https://pypi.python.org/pypi?%3Aaction=register_form) and the [testing server](https://testpypi.python.org/pypi?%3Aaction=register_form). -The usernames and passwords might be different, that is up to you! - -## Prepare your package - -{% highlight raw %} -root-dir/ # Any name you want - setup.py - setup.cfg - LICENSE.txt - README.md - mypackage/ - __init__.py - foo.py - bar.py - baz.py -{% endhighlight %} - -### setup.cfg - -{% highlight cfg %} -[metadata] -description-file = README.md -{% endhighlight %} - -The markdown README is the _de facto_ standard in Github, but you can also use rST (reStructuredText), the standard in the python community. - -### setup.py - -{% highlight python %} -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 }', - author_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 = [], - ) -{% endhighlight %} - -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: - -``` -git tag {version} -m "{ Description of this tag/version}" -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: -``` -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](https://pypi.python.org/pypi/senpy) -``` -pip install senpy -``` diff --git a/_posts/2014-10-09-proxies.markdown b/_posts/2014-10-09-proxies.markdown deleted file mode 100644 index 5a3f81e..0000000 --- a/_posts/2014-10-09-proxies.markdown +++ /dev/null @@ -1,67 +0,0 @@ ---- -layout: post -title: "Proxies with Apache and python" -date: 2014-10-09 10:00:00 -tags: python apache proxy gunicorn uwsgi ---- - -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. - -## Gunicorn -{% highlight apache %} - - ProxyPass http://127.0.0.1:8888/myapp/ - ProxyPassReverse http://127.0.0.1:8888/myapp/ - RequestHeader set SCRIPT_NAME "/myapp/" - -{% endhighlight %} - -**Important**: *SCRIPT_NAME* and the end of *ProxyPass* URL **MUST BE THE SAME**. Otherwise, Gunicorn will fail miserably. - -Try it with: -{% highlight bash %} -venv/bin/gunicorn -w 4 -b 127.0.0.1:8888 --log-file - --access-logfile - wsgi:application -{% endhighlight %} - - -## UWSGI -This is a very simple configuration. I will try to upload one with more options for uwsgi (in a .ini file). - -{% highlight apache %} - - SetHandler uwsgi_handler - uWSGISocker 127.0.0.1:8888 - -{% endhighlight %} - -Try it with: - -{% highlight bash %} -uwsgi --socket 127.0.0.1:8888 -w wsgi:application -{% endhighlight %} - -### 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. -{% highlight ini %} -[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 -{% endhighlight %} diff --git a/_posts/2014-12-09-zotero.markdown b/_posts/2014-12-09-zotero.markdown deleted file mode 100644 index 0dd05bb..0000000 --- a/_posts/2014-12-09-zotero.markdown +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: post -title: "Zotero" -date: 2014-12-09 12:12:12 -tags: zotero webdav nginx apache ---- -[Zotero](https://www.zotero.org/) is an Open Source tool that lets you organise your bibliography, syncing it with the cloud. -Unlike other alternatives such as [Mendeley](http://www.mendeley.com), Zotero can upload the attachments and data to a private cloud via WebDav. - -If 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. - -## Setting up Apache - -First we need to install Apache: - - sudo apt-get install apache2 - -Change the head of "/etc/apache2/sites-enabled/000-default" to: - - - -Then, create a file /etc/apache2/sites-available/webdav: - - Alias /dav /home/webdav/dav - - 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 - - -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. - - 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: - - sudo a2enmod webdav - sudo a2enmod dav_fs - sudo a2ensite webdav - sudo service apache2 restart - -At this point everything should be working at http://\:880/dav/zotero - -## Setting 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: - - 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: - - sudo service nginx force-reload - -## Extras - -* [Zotero Reader](http://zoteroreader.com/) - HTML5 client -* [Zandy](https://github.com/ajlyon/zandy) - Android Open Source client diff --git a/about/index.html b/about/index.html deleted file mode 100644 index 28f2869..0000000 --- a/about/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -layout: default -title: About ---- -

This is me...

-

... I mean, my website

- -
-
    -
  • GNU/Linux Fanboy
  • -
  • Android User
  • -
  • Github Fan
  • -
  • StackOverflow Dependent
  • -
  • Music Lover
  • -
  • Films Lover
  • -
  • Usual Chatter
  • -
  • IT Person
  • -
  • Casual Gamer
  • -
  • Amateur Writer
  • -
  • Night Owl
  • -
  • Terminal User
  • -
  • Hobbyist Linguist
  • -
  • Amateur Coder
  • -
  • On-and-off Reader
  • -
  • Quote lover
  • -
-
diff --git a/archives.html b/archives.html new file mode 100644 index 0000000..d7fde68 --- /dev/null +++ b/archives.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

Archives for balkian.com

+ +
+
Tue 09 December 2014
+
Zotero
+
Thu 09 October 2014
+
Proxies with Apache and python
+
Sat 27 September 2014
+
Publishing in PyPi
+
Thu 27 March 2014
+
Updating EuroLoveMap
+
Thu 22 August 2013
+
Remove git files with globbing
+
Thu 22 August 2013
+
Creating my web
+
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/author/j-fernando-sanchez.html b/author/j-fernando-sanchez.html new file mode 100644 index 0000000..17ca434 --- /dev/null +++ b/author/j-fernando-sanchez.html @@ -0,0 +1,250 @@ + + + + + + <h2>Articles by J. Fernando Sánchez</h2> + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+
+

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 ...

+
+ Read more... +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... +
+

Remove git files with globbing

+ 2013-08-22 + git +
+
+

A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:

+
1
git rm --cached '\*\*.swp'
+
+
+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/authors.html b/authors.html new file mode 100644 index 0000000..66ef200 --- /dev/null +++ b/authors.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

Authors on balkian.com

+ + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/categories.html b/categories.html new file mode 100644 index 0000000..a56509a --- /dev/null +++ b/categories.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/category/misc.html b/category/misc.html new file mode 100644 index 0000000..502754b --- /dev/null +++ b/category/misc.html @@ -0,0 +1,250 @@ + + + + + + <h2>Articles in the misc category</h2> + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+
+

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 ...

+
+ Read more... +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... +
+

Remove git files with globbing

+ 2013-08-22 + git +
+
+

A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:

+
1
git rm --cached '\*\*.swp'
+
+
+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/creating-my-web.html b/creating-my-web.html new file mode 100644 index 0000000..428cffa --- /dev/null +++ b/creating-my-web.html @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+ +
+

Finally, I've 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.

+

But 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.

+

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 any +Javascript code in the page. Probably I will use some to add my +gists and +repositories, but we will see about +that.

+

I think the code speaks for itself, so you can check out my repository +on Github. You can +clone and deploy it easily like this:

+
1
+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: * 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

+ +
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/cv/index.html b/cv/index.html deleted file mode 100644 index c954eec..0000000 --- a/cv/index.html +++ /dev/null @@ -1,109 +0,0 @@ ---- -layout: default -title: "CV" -date: 2013-07-03 14:14:22 -categories: cv resume ---- - - - -
- - - -
- - - -

J. Fernando Sánchez

- -

- Email: -

-
- -
-

- I am a curious young engineer who happens to enjoy IT both as a career and as a hobby. - -

-
- -
- -
-
- -
Education
- - - -
-

Telecommunications Engineering Technical University of Madrid (UPM) - 2007-2012

-
- -
- -
Skills
-
-

Programming Languages

-

Used frequently: Python, Javascript/CoffeeScript, Bash/Shell, Java and Ruby

-

Also programmed in: PHP, C, C++, Objective C and Haskell

- -

Frameworks and libraries

-

Node.js, Django, Ruby on Rails, QT, GTK2, JASON, RDFLib, Weka

- -

Development tools

-

Git, Eclipse, Netbeans, Android SDK

- -

Others

-

Latex, XMPP, GIMP, Inkscape

- -

Social Skills

-

Working with and leading international teams. Presentation and communication skills: I conducted several presentations to audiences of ~100 people.

-
- -
- -
Experience
-
-

Graduate Research FellowIntelligent Systems Group (GSI) (GSI) - 2008-2012

-
    -
  • Worked with Agent and Semantic technologies
  • -
  • Conducted my master thesis: Design and Implementation of an Agent Architecture Based on Web Hooks
  • -
- -

IT CoordinatorEESTEC International - 2012-2013

-
    -
  • Coordinated the work of a small international IT Team
  • -
  • In charge of the administration of the IT infrastructure of EESTEC: Plone portal, Mailman mailing lists, etc.
  • -
- -

Oversight Committee MemberEESTEC International - 2012-2013

-
    -
  • Supervised the work of the International Board
  • -
-

Vice Chairman for External Affairs EESTEC International - 2012-2013

-
    -
  • Established connections with other Student Associations
  • -
  • Helped found new Observers (Local Groups)
  • -
  • Carried out International Board duties
  • -
-
- -
- - - - - - -
References
-
Available on request
- -
-
- -
- -
diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 6ff5c17bc94d433a15aaa82a6cf7378c11e882d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmcIoO>7%Q6rL6+5x-H}q$velDpBCTr9$xm3FW{EA#y{gw;nhk6;-H|wxo4Kt4bWo zg-Z~kLgG{*sGv|%0us4#y^Nd+P2lZoax=J>i?cpx0cQBFD#h=^q z!A~7Iulj-t{E&R9A~l^K%n^NSYinKjTCww>Ivs8pA0L;Ai3#T}wf@B+XPhSApG!+p zZ#JdUY)P?L>={b{4(_h87YYRdKT2Kmzjf=j8$%pt*v}kRYi+6N8ps#dEk>i!uxrAC zcOKxr>D67H;9g!{PRz|*m_xbQma?wFmCA<2!aMN_xa}T;k9{^ZCYQ^}!#l^UkC;g{ z@z!+RRCO<+jydp(<0e1!oz+zt*}E^6J9DEhFTQ?4o=(3ayPtSQ_B{2xOdkKttw%pk z=1>jR(CFx>N8fEC7Ns1-`Z&HlJ=c=6Khy+yocX>Y?|)mA6JOqz!xygg%>mftfE_Mu zgC2SExkxNOkFb62$EKXS(dg-iy$Ve3qcAV)h-vA&hd%wyY7b7BFG(Gk>$(=9eoc?S4#BUOyh^6YEj<^f3lH z%ICL7+2DEWliwT{V!)!J`*_29Qu6la3oa+N9sA;U z>th}F6xzP_x%_oRKhAuAe(8_XJ~r*}IhabNTrR*t+-vWA>c#-yn;-uwFCCte^yE=H zUvYfCKQr6;?Imxv)Rugu>mFcJVLSADU)_SC7pI z_M6Yq&wgY2sv8%uL&eddv8V&?uJ17Q&BD(Z zUmv;ji&R(zDdlJri#Q1&U?0~!L`%7bO(Kfplv@#IZe~AM}hb{W4?RY0! j!XIFF5!Z}K<&3$1-k5u)^ +balkian.comhttp://balkian.com/2014-12-09T12:12:12+01:00Zotero2014-12-09T12:12:12+01:00J. Fernando Sáncheztag:balkian.com,2014-12-09:zotero.html<p><a class="reference external" href="https://www.zotero.org/">Zotero</a> is an Open Source tool that lets +you organise your bibliography, syncing it with the cloud. Unlike other +alternatives such as <a class="reference external" href="http://www.mendeley.com">Mendeley</a>, Zotero can +upload the attachments and data to a private cloud via WebDav.</p> +<p>If 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.</p> +<div class="section" id="setting-up-apache"> +<h2>Setting up Apache</h2> +<p>First we need to install Apache:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>sudo apt-get install apache2 +</pre></div> +</td></tr></table><p>Change the head of &quot;/etc/apache2/sites-enabled/000-default&quot; to:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;VirtualHost</span> <span class="s">*:880</span><span class="nt">&gt;</span> +</pre></div> +</td></tr></table><p>Then, create a file /etc/apache2/sites-available/webdav:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13</pre></div></td><td class="code"><div class="highlight"><pre><span class="nb">Alias</span> <span class="sx">/dav</span> <span class="sx">/home/webdav/dav</span> +<span class="nt">&lt;Location</span> <span class="s">/dav</span><span class="nt">&gt;</span> + <span class="nb">Dav</span> <span class="k">on</span> + <span class="nb">Order</span> Allow,Deny + <span class="nb">Allow</span> from <span class="k">all</span> + <span class="nb">Dav</span> <span class="k">On</span> + <span class="nb">Options</span> +Indexes + <span class="nb">AuthType</span> Basic + <span class="nb">AuthName</span> DAV + <span class="nb">AuthBasicProvider</span> file + <span class="nb">AuthUserFile</span> <span class="sx">/home/webdav/.htpasswd</span> + <span class="nb">Require</span> valid-user +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p>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.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre>sudo adduser webdav +sudo htpasswd -c /home/webdav/.htpasswd webdav +sudo htpasswd /home/webdav/.htpasswd zotero +sudo mkdir -p /home/webdav/dav/zotero +</pre></div> +</td></tr></table><p>Enable the site and restart apache:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre>sudo a2enmod webdav +sudo a2enmod dav_fs +sudo a2ensite webdav +sudo service apache2 restart +</pre></div> +</td></tr></table><p>At this point everything should be working at +<a class="reference external" href="http:/">http:/</a>/&lt;your_host&gt;:880/dav/zotero</p> +</div> +<div class="section" id="setting-up-nginx"> +<h2>Setting up NGINX</h2> +<p>After the Apache side is working, we can use nginx as a proxy to get +cleaner URIs. In your desired site/location, add this:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5 +6 +7</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">location</span> <span class="s">/dav</span> <span class="p">{</span> + <span class="kn">client_max_body_size</span> <span class="s">20M</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$remote_addr</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span> + <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:880</span><span class="p">;</span> +<span class="p">}</span> +</pre></div> +</td></tr></table><p>Now just reload nginx:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>sudo service nginx force-reload +</pre></div> +</td></tr></table></div> +<div class="section" id="extras"> +<h2>Extras</h2> +<ul class="simple"> +<li><a class="reference external" href="http://zoteroreader.com/">Zotero Reader</a> - HTML5 client</li> +<li><a class="reference external" href="https://github.com/ajlyon/zandy">Zandy</a> - Android Open Source +client</li> +</ul> +</div> +Proxies with Apache and python2014-10-09T10:00:00+02:00J. Fernando Sáncheztag:balkian.com,2014-10-09:proxies-with-apache-and-python.html<p>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 <em>application</em>. Hence, wsgi:application.</p> +<div class="section" id="gunicorn"> +<h2>Gunicorn</h2> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;Location</span> <span class="s">/myapp/</span><span class="nt">&gt;</span> + <span class="nb">ProxyPass</span> http://127.0.0.1:8888/myapp/ + <span class="nb">ProxyPassReverse</span> http://127.0.0.1:8888/myapp/ + <span class="nb">RequestHeader</span> set SCRIPT_NAME <span class="s2">&quot;/myapp/&quot;</span> +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p><strong>Important</strong>: <em>SCRIPT_NAME</em> and the end of <em>ProxyPass</em> URL <strong>MUST BE +THE SAME</strong>. Otherwise, Gunicorn will fail miserably.</p> +<p>Try it with: +<tt class="docutils literal">bash venv/bin/gunicorn <span class="pre">-w</span> 4 <span class="pre">-b</span> 127.0.0.1:8888 <span class="pre">--log-file</span> - <span class="pre">--access-logfile</span> - wsgi:application</tt></p> +</div> +<div class="section" id="uwsgi"> +<h2>UWSGI</h2> +<p>This is a very simple configuration. I will try to upload one with more +options for uwsgi (in a .ini file).</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;Location</span> <span class="s">/myapp/</span><span class="nt">&gt;</span> + <span class="nb">SetHandler</span> uwsgi_handler + <span class="nb">uWSGISocker</span> <span class="m">127.0.0.1</span>:8888 +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p>Try it with:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>uwsgi --socket 127.0.0.1:8888 -w wsgi:application +</pre></div> +</td></tr></table><div class="section" id="extra-supervisor"> +<h3>Extra: Supervisor</h3> +<p>If everything went as expected, you can wrap your command in a +supervisor config file and let it handle the server for you.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">[unix_http_server]</span> +<span class="na">file</span><span class="o">=</span><span class="s">/tmp/myapp.sock ; path to your socket file</span> + +<span class="k">[supervisord]</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/supervisor.log</span> +<span class="na">childlogdir</span> <span class="o">=</span> <span class="s">%(here)s/logs/</span> + +<span class="k">[rpcinterface:supervisor]</span> +<span class="na">supervisor.rpcinterface_factory</span> <span class="o">=</span> <span class="s">supervisor.rpcinterface:make_main_rpcinterface</span> + +<span class="k">[supervisorctl]</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/supervisorctl.log</span> +<span class="na">serverurl</span><span class="o">=</span><span class="s">unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket</span> + +<span class="k">[program:myapp]</span> +<span class="na">command</span> <span class="o">=</span> <span class="s">venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 --log-file %(here)s/logs/gunicorn.log --access-logfile - wsgi:application</span> +<span class="na">directory</span> <span class="o">=</span> <span class="s">%(here)s</span> +<span class="na">environment</span> <span class="o">=</span> <span class="s">PATH=%(here)s/venv/bin/</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/myapp.log</span> +</pre></div> +</td></tr></table></div> +</div> +Publishing in PyPi2014-09-27T10:00:00+02:00J. Fernando Sáncheztag:balkian.com,2014-09-27:publishing-in-pypi.html<p>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.</p> +<div class="section" id="choose-a-fancy-name"> +<h2>Choose a fancy name</h2> +<p>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.</p> +<p>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.</p> +</div> +<div class="section" id="create-a-pypirc-configuration-file"> +<h2>Create a .pypirc configuration file</h2> +<pre class="code cfg literal-block"> +<span class="err">[distutils]</span> <span class="c1"># this tells distutils what package indexes you can push to</span> +<span class="na">index-servers</span> <span class="o">=</span><span class="s"> + pypi # the live PyPI + pypitest # test PyPI</span> + +<span class="err">[pypi]</span> <span class="c1"># authentication details for live PyPI</span> +<span class="na">repository</span> <span class="o">=</span> <span class="s">https://pypi.python.org/pypi</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">{ your_username }</span> +<span class="na">password</span> <span class="o">=</span> <span class="s">{ your_password } # not necessary</span> + +<span class="err">[pypitest]</span> <span class="c1"># authentication details for test PyPI</span> +<span class="na">repository</span> <span class="o">=</span> <span class="s">https://testpypi.python.org/pypi</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">{ your_username }</span> +</pre> +<p>As you can see, you need to register both in the <a class="reference external" href="https://pypi.python.org/pypi?%3Aaction=register_form">main pypi +repository</a> and +the <a class="reference external" href="https://testpypi.python.org/pypi?%3Aaction=register_form">testing +server</a>. +The usernames and passwords might be different, that is up to you!</p> +</div> +<div class="section" id="prepare-your-package"> +<h2>Prepare your package</h2> +<pre class="literal-block"> +root-dir/ # Any name you want + setup.py + setup.cfg + LICENSE.txt + README.md + mypackage/ + __init__.py + foo.py + bar.py + baz.py +</pre> +<div class="section" id="setup-cfg"> +<h3>setup.cfg</h3> +<pre class="code cfg literal-block"> +<span class="k">[metadata]</span> +<span class="na">description-file</span> <span class="o">=</span> <span class="s">README.md</span> +</pre> +<p>The markdown README is the <em>de facto</em> standard in Github, but you can +also use rST (reStructuredText), the standard in the python community.</p> +</div> +<div class="section" id="setup-py"> +<h3>setup.py</h3> +<p>{% highlight python %} 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 }', author_email = '{ email }', url = +'<a class="reference external" href="https://github.com">https://github.com</a>/{user}/{package}', # URL to the github repo +download_url = '<a class="reference external" href="https://github.com">https://github.com</a>/{user}/{repo}/tarball/{version}', +keywords = ['websockets', 'display', 'd3'], # list of keywords that +represent your package classifiers = [], ) {% endhighlight %}</p> +<p>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:</p> +<pre class="literal-block"> +git tag {version} -m &quot;{ Description of this tag/version}&quot; +git push --tags origin master +</pre> +</div> +</div> +<div class="section" id="push-to-the-testing-main-pypi-server"> +<h2>Push to the testing/main pypi server</h2> +<p>It is advisable that you try your package on the test repository and fix +any problems first. The process is simple: +<tt class="docutils literal">python setup.py register <span class="pre">-r</span> {pypitest/pypi} python setup.py sdist upload <span class="pre">-r</span> {pypitest/pypi}</tt></p> +<p>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: <a class="reference external" href="https://pypi.python.org/pypi/senpy">https://pypi.python.org/pypi/senpy</a> <tt class="docutils literal">pip install senpy</tt></p> +</div> +Updating EuroLoveMap2014-03-27T14:00:00+01:00J. Fernando Sáncheztag:balkian.com,2014-03-27:updating-eurolovemap.html<p>As part of the <a class="reference external" href="http://www.opener-project.org/2013/07/18/opener-hackathon-in-amsterdam/">OpeNER +hackathon</a> +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 &quot;overall feeling&quot; of each +country about each topic. Then, we used some fancy JavaScript to make +sense out of the raw information.</p> +<p>It didn't go too bad, it turns out <a class="reference external" href="http://eurosentiment.eu/wp-content/uploads/2013/07/BOLv9qnCIAAJEek.jpg">we +won</a>.</p> +<p>Now, it was time for a face-lift. I used this opportunity to play with +new technologies and improve it:</p> +<ul class="simple"> +<li>Using Flask, this time using python 3.3 and Bootstrap 3.0</li> +<li>Cool HTML5+JS cards (thanks to +<a class="reference external" href="http://pastetophone.com">pastetophone</a>)</li> +<li>Automatic generation of fake personal data to test the interface</li> +<li>Obfuscation of personal emails</li> +</ul> +<div class="section" id="publishing-a-python-3-app-on-heroku"> +<h2>Publishing a Python 3 app on Heroku</h2> +<p><a class="reference external" href="http://eurolovemap.herokuapp.com/">seen here</a></p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>mkvirtualenv -p /usr/bin/python3.3 eurolovemap +</pre></div> +</td></tr></table><p>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 +<a class="reference external" href="https://launchpad.net/~fkrull/+archive/deadsnakes">deadsnakes</a> ppa, +so I used python 3.3 instead, which works fine but is not officially +supported. Just create a file named <em>runtime.txt</em> in your project root, +with the python version you want to use:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>python-3.3.1 +</pre></div> +</td></tr></table><p>Don't forget to freeze your dependencies so Heroku can install them: +<tt class="docutils literal">bash pip freze &gt; requirements.txt</tt></p> +</div> +<div class="section" id="publishing-personal-emails"> +<h2>Publishing personal emails</h2> +<p>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 <a class="reference external" href="http://en.wikipedia.org/wiki/Caesar_cipher">Caesar +cipher</a>. Please, don't +use it for any serious application if you are concerned about being +spammed.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">def</span> <span class="nf">blur_email</span><span class="p">(</span><span class="n">email</span><span class="p">):</span> + <span class="k">return</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="mi">5</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">email</span><span class="p">])</span> +</pre></div> +</td></tr></table><p>And this is the client side:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12</pre></div></td><td class="code"><div class="highlight"><pre><span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> + <span class="nx">elems</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;profile-email&#39;</span><span class="p">);</span> + <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">e</span> <span class="k">in</span> <span class="nx">elems</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">blur</span> <span class="o">=</span> <span class="nx">elems</span><span class="p">[</span><span class="nx">e</span><span class="p">].</span><span class="nx">innerHTML</span><span class="p">;</span> + <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> + <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">s</span> <span class="k">in</span> <span class="nx">blur</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">blur</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span> + <span class="nx">email</span> <span class="o">=</span> <span class="nx">email</span><span class="o">+</span><span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">a</span><span class="o">-</span><span class="mi">5</span><span class="p">);</span> + <span class="p">}</span> + <span class="nx">elems</span><span class="p">[</span><span class="nx">e</span><span class="p">].</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">email</span><span class="p">;</span> + <span class="p">}</span> +<span class="p">}</span> +</pre></div> +</td></tr></table><p>Unfortunately, this approach does not hide your email from anyone using +<a class="reference external" href="http://phantomjs.org/">PhantomJS</a>, +<a class="reference external" href="http://zombie.labnotes.org/">ZombieJS</a> 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.</p> +</div> +<div class="section" id="generation-of-fake-data"> +<h2>Generation of fake data</h2> +<p>To test the contact section of the site, I wanted to populate it with +fake data. <a class="reference external" href="https://github.com/joke2k/faker">Fake-Factory</a> is an +amazing library that can generate fake data of almost any kind: emails, +association names, acronyms... It even lets you localise the results +(get Spanish names, for instance) and generate factories for certain +classes (à la Django).</p> +<p>But I also wanted pictures, enter <a class="reference external" href="http://lorempixel.com/">Lorem +Pixel</a>. 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.</p> +<p>For instance, the picture below is served through Lorem Pixel.</p> +<div class="figure"> +<img alt="This picture is generated with LoremIpsum" src="http://lorempixel.com/400/200/nightlife/" /> +<p class="caption">This picture is generated with LoremIpsum</p> +</div> +<p>By the way, if you only want cat pictures, take a look at +<a class="reference external" href="http://placekitten.com/">Placekitten</a>. And for NSFW text, there's +the <a class="reference external" href="http://slipsum.com/">Samuel L. Jackson Ipsum</a></p> +</div> +Remove git files with globbing2013-08-22T23:14:00+02:00J. Fernando Sáncheztag:balkian.com,2013-08-22:remove-git-files-with-globbing.html<p>A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>git rm --cached <span class="s1">&#39;\*\*.swp&#39;</span> +</pre></div> +</td></tr></table>Creating my web2013-08-22T14:14:22+02:00J. Fernando Sáncheztag:balkian.com,2013-08-22:creating-my-web.html<p>Finally, I've 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, +<a class="reference external" href="http://jekyllrb.com">Jekyll</a> will automatically generate static +pages for my posts every time I commit anything new to this repository.</p> +<p>But 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.</p> +<p>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 any +Javascript code in the page. Probably I will use some to add my +<a class="reference external" href="http://gist.github.com/balkian">gists</a> and +<a class="reference external" href="http://github.com/balkian">repositories</a>, but we will see about +that.</p> +<p>I think the code speaks for itself, so you can check out <a class="reference external" href="http://github.com/balkian/balkian.github.com">my repository +on Github</a>. You can +clone and deploy it easily like this:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3</pre></div></td><td class="code"><div class="highlight"><pre>git clone +https://github.com/balkian/balkian.github.com <span class="nb">cd </span>balkian.github.com +jekyll serve -w +</pre></div> +</td></tr></table><p>I will keep updating this post with information about: * 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</p> + \ No newline at end of file diff --git a/feeds/misc.atom.xml b/feeds/misc.atom.xml new file mode 100644 index 0000000..b54d072 --- /dev/null +++ b/feeds/misc.atom.xml @@ -0,0 +1,418 @@ + +balkian.comhttp://balkian.com/2014-12-09T12:12:12+01:00Zotero2014-12-09T12:12:12+01:00J. Fernando Sáncheztag:balkian.com,2014-12-09:zotero.html<p><a class="reference external" href="https://www.zotero.org/">Zotero</a> is an Open Source tool that lets +you organise your bibliography, syncing it with the cloud. Unlike other +alternatives such as <a class="reference external" href="http://www.mendeley.com">Mendeley</a>, Zotero can +upload the attachments and data to a private cloud via WebDav.</p> +<p>If 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.</p> +<div class="section" id="setting-up-apache"> +<h2>Setting up Apache</h2> +<p>First we need to install Apache:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>sudo apt-get install apache2 +</pre></div> +</td></tr></table><p>Change the head of &quot;/etc/apache2/sites-enabled/000-default&quot; to:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;VirtualHost</span> <span class="s">*:880</span><span class="nt">&gt;</span> +</pre></div> +</td></tr></table><p>Then, create a file /etc/apache2/sites-available/webdav:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13</pre></div></td><td class="code"><div class="highlight"><pre><span class="nb">Alias</span> <span class="sx">/dav</span> <span class="sx">/home/webdav/dav</span> +<span class="nt">&lt;Location</span> <span class="s">/dav</span><span class="nt">&gt;</span> + <span class="nb">Dav</span> <span class="k">on</span> + <span class="nb">Order</span> Allow,Deny + <span class="nb">Allow</span> from <span class="k">all</span> + <span class="nb">Dav</span> <span class="k">On</span> + <span class="nb">Options</span> +Indexes + <span class="nb">AuthType</span> Basic + <span class="nb">AuthName</span> DAV + <span class="nb">AuthBasicProvider</span> file + <span class="nb">AuthUserFile</span> <span class="sx">/home/webdav/.htpasswd</span> + <span class="nb">Require</span> valid-user +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p>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.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre>sudo adduser webdav +sudo htpasswd -c /home/webdav/.htpasswd webdav +sudo htpasswd /home/webdav/.htpasswd zotero +sudo mkdir -p /home/webdav/dav/zotero +</pre></div> +</td></tr></table><p>Enable the site and restart apache:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre>sudo a2enmod webdav +sudo a2enmod dav_fs +sudo a2ensite webdav +sudo service apache2 restart +</pre></div> +</td></tr></table><p>At this point everything should be working at +<a class="reference external" href="http:/">http:/</a>/&lt;your_host&gt;:880/dav/zotero</p> +</div> +<div class="section" id="setting-up-nginx"> +<h2>Setting up NGINX</h2> +<p>After the Apache side is working, we can use nginx as a proxy to get +cleaner URIs. In your desired site/location, add this:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5 +6 +7</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">location</span> <span class="s">/dav</span> <span class="p">{</span> + <span class="kn">client_max_body_size</span> <span class="s">20M</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$remote_addr</span><span class="p">;</span> + <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span> + <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:880</span><span class="p">;</span> +<span class="p">}</span> +</pre></div> +</td></tr></table><p>Now just reload nginx:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>sudo service nginx force-reload +</pre></div> +</td></tr></table></div> +<div class="section" id="extras"> +<h2>Extras</h2> +<ul class="simple"> +<li><a class="reference external" href="http://zoteroreader.com/">Zotero Reader</a> - HTML5 client</li> +<li><a class="reference external" href="https://github.com/ajlyon/zandy">Zandy</a> - Android Open Source +client</li> +</ul> +</div> +Proxies with Apache and python2014-10-09T10:00:00+02:00J. Fernando Sáncheztag:balkian.com,2014-10-09:proxies-with-apache-and-python.html<p>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 <em>application</em>. Hence, wsgi:application.</p> +<div class="section" id="gunicorn"> +<h2>Gunicorn</h2> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;Location</span> <span class="s">/myapp/</span><span class="nt">&gt;</span> + <span class="nb">ProxyPass</span> http://127.0.0.1:8888/myapp/ + <span class="nb">ProxyPassReverse</span> http://127.0.0.1:8888/myapp/ + <span class="nb">RequestHeader</span> set SCRIPT_NAME <span class="s2">&quot;/myapp/&quot;</span> +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p><strong>Important</strong>: <em>SCRIPT_NAME</em> and the end of <em>ProxyPass</em> URL <strong>MUST BE +THE SAME</strong>. Otherwise, Gunicorn will fail miserably.</p> +<p>Try it with: +<tt class="docutils literal">bash venv/bin/gunicorn <span class="pre">-w</span> 4 <span class="pre">-b</span> 127.0.0.1:8888 <span class="pre">--log-file</span> - <span class="pre">--access-logfile</span> - wsgi:application</tt></p> +</div> +<div class="section" id="uwsgi"> +<h2>UWSGI</h2> +<p>This is a very simple configuration. I will try to upload one with more +options for uwsgi (in a .ini file).</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre><span class="nt">&lt;Location</span> <span class="s">/myapp/</span><span class="nt">&gt;</span> + <span class="nb">SetHandler</span> uwsgi_handler + <span class="nb">uWSGISocker</span> <span class="m">127.0.0.1</span>:8888 +<span class="nt">&lt;/Location&gt;</span> +</pre></div> +</td></tr></table><p>Try it with:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>uwsgi --socket 127.0.0.1:8888 -w wsgi:application +</pre></div> +</td></tr></table><div class="section" id="extra-supervisor"> +<h3>Extra: Supervisor</h3> +<p>If everything went as expected, you can wrap your command in a +supervisor config file and let it handle the server for you.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">[unix_http_server]</span> +<span class="na">file</span><span class="o">=</span><span class="s">/tmp/myapp.sock ; path to your socket file</span> + +<span class="k">[supervisord]</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/supervisor.log</span> +<span class="na">childlogdir</span> <span class="o">=</span> <span class="s">%(here)s/logs/</span> + +<span class="k">[rpcinterface:supervisor]</span> +<span class="na">supervisor.rpcinterface_factory</span> <span class="o">=</span> <span class="s">supervisor.rpcinterface:make_main_rpcinterface</span> + +<span class="k">[supervisorctl]</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/supervisorctl.log</span> +<span class="na">serverurl</span><span class="o">=</span><span class="s">unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket</span> + +<span class="k">[program:myapp]</span> +<span class="na">command</span> <span class="o">=</span> <span class="s">venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 --log-file %(here)s/logs/gunicorn.log --access-logfile - wsgi:application</span> +<span class="na">directory</span> <span class="o">=</span> <span class="s">%(here)s</span> +<span class="na">environment</span> <span class="o">=</span> <span class="s">PATH=%(here)s/venv/bin/</span> +<span class="na">logfile</span> <span class="o">=</span> <span class="s">%(here)s/logs/myapp.log</span> +</pre></div> +</td></tr></table></div> +</div> +Publishing in PyPi2014-09-27T10:00:00+02:00J. Fernando Sáncheztag:balkian.com,2014-09-27:publishing-in-pypi.html<p>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.</p> +<div class="section" id="choose-a-fancy-name"> +<h2>Choose a fancy name</h2> +<p>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.</p> +<p>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.</p> +</div> +<div class="section" id="create-a-pypirc-configuration-file"> +<h2>Create a .pypirc configuration file</h2> +<pre class="code cfg literal-block"> +<span class="err">[distutils]</span> <span class="c1"># this tells distutils what package indexes you can push to</span> +<span class="na">index-servers</span> <span class="o">=</span><span class="s"> + pypi # the live PyPI + pypitest # test PyPI</span> + +<span class="err">[pypi]</span> <span class="c1"># authentication details for live PyPI</span> +<span class="na">repository</span> <span class="o">=</span> <span class="s">https://pypi.python.org/pypi</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">{ your_username }</span> +<span class="na">password</span> <span class="o">=</span> <span class="s">{ your_password } # not necessary</span> + +<span class="err">[pypitest]</span> <span class="c1"># authentication details for test PyPI</span> +<span class="na">repository</span> <span class="o">=</span> <span class="s">https://testpypi.python.org/pypi</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">{ your_username }</span> +</pre> +<p>As you can see, you need to register both in the <a class="reference external" href="https://pypi.python.org/pypi?%3Aaction=register_form">main pypi +repository</a> and +the <a class="reference external" href="https://testpypi.python.org/pypi?%3Aaction=register_form">testing +server</a>. +The usernames and passwords might be different, that is up to you!</p> +</div> +<div class="section" id="prepare-your-package"> +<h2>Prepare your package</h2> +<pre class="literal-block"> +root-dir/ # Any name you want + setup.py + setup.cfg + LICENSE.txt + README.md + mypackage/ + __init__.py + foo.py + bar.py + baz.py +</pre> +<div class="section" id="setup-cfg"> +<h3>setup.cfg</h3> +<pre class="code cfg literal-block"> +<span class="k">[metadata]</span> +<span class="na">description-file</span> <span class="o">=</span> <span class="s">README.md</span> +</pre> +<p>The markdown README is the <em>de facto</em> standard in Github, but you can +also use rST (reStructuredText), the standard in the python community.</p> +</div> +<div class="section" id="setup-py"> +<h3>setup.py</h3> +<p>{% highlight python %} 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 }', author_email = '{ email }', url = +'<a class="reference external" href="https://github.com">https://github.com</a>/{user}/{package}', # URL to the github repo +download_url = '<a class="reference external" href="https://github.com">https://github.com</a>/{user}/{repo}/tarball/{version}', +keywords = ['websockets', 'display', 'd3'], # list of keywords that +represent your package classifiers = [], ) {% endhighlight %}</p> +<p>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:</p> +<pre class="literal-block"> +git tag {version} -m &quot;{ Description of this tag/version}&quot; +git push --tags origin master +</pre> +</div> +</div> +<div class="section" id="push-to-the-testing-main-pypi-server"> +<h2>Push to the testing/main pypi server</h2> +<p>It is advisable that you try your package on the test repository and fix +any problems first. The process is simple: +<tt class="docutils literal">python setup.py register <span class="pre">-r</span> {pypitest/pypi} python setup.py sdist upload <span class="pre">-r</span> {pypitest/pypi}</tt></p> +<p>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: <a class="reference external" href="https://pypi.python.org/pypi/senpy">https://pypi.python.org/pypi/senpy</a> <tt class="docutils literal">pip install senpy</tt></p> +</div> +Updating EuroLoveMap2014-03-27T14:00:00+01:00J. Fernando Sáncheztag:balkian.com,2014-03-27:updating-eurolovemap.html<p>As part of the <a class="reference external" href="http://www.opener-project.org/2013/07/18/opener-hackathon-in-amsterdam/">OpeNER +hackathon</a> +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 &quot;overall feeling&quot; of each +country about each topic. Then, we used some fancy JavaScript to make +sense out of the raw information.</p> +<p>It didn't go too bad, it turns out <a class="reference external" href="http://eurosentiment.eu/wp-content/uploads/2013/07/BOLv9qnCIAAJEek.jpg">we +won</a>.</p> +<p>Now, it was time for a face-lift. I used this opportunity to play with +new technologies and improve it:</p> +<ul class="simple"> +<li>Using Flask, this time using python 3.3 and Bootstrap 3.0</li> +<li>Cool HTML5+JS cards (thanks to +<a class="reference external" href="http://pastetophone.com">pastetophone</a>)</li> +<li>Automatic generation of fake personal data to test the interface</li> +<li>Obfuscation of personal emails</li> +</ul> +<div class="section" id="publishing-a-python-3-app-on-heroku"> +<h2>Publishing a Python 3 app on Heroku</h2> +<p><a class="reference external" href="http://eurolovemap.herokuapp.com/">seen here</a></p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>mkvirtualenv -p /usr/bin/python3.3 eurolovemap +</pre></div> +</td></tr></table><p>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 +<a class="reference external" href="https://launchpad.net/~fkrull/+archive/deadsnakes">deadsnakes</a> ppa, +so I used python 3.3 instead, which works fine but is not officially +supported. Just create a file named <em>runtime.txt</em> in your project root, +with the python version you want to use:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>python-3.3.1 +</pre></div> +</td></tr></table><p>Don't forget to freeze your dependencies so Heroku can install them: +<tt class="docutils literal">bash pip freze &gt; requirements.txt</tt></p> +</div> +<div class="section" id="publishing-personal-emails"> +<h2>Publishing personal emails</h2> +<p>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 <a class="reference external" href="http://en.wikipedia.org/wiki/Caesar_cipher">Caesar +cipher</a>. Please, don't +use it for any serious application if you are concerned about being +spammed.</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">def</span> <span class="nf">blur_email</span><span class="p">(</span><span class="n">email</span><span class="p">):</span> + <span class="k">return</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="mi">5</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">email</span><span class="p">])</span> +</pre></div> +</td></tr></table><p>And this is the client side:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12</pre></div></td><td class="code"><div class="highlight"><pre><span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> + <span class="nx">elems</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;profile-email&#39;</span><span class="p">);</span> + <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">e</span> <span class="k">in</span> <span class="nx">elems</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">blur</span> <span class="o">=</span> <span class="nx">elems</span><span class="p">[</span><span class="nx">e</span><span class="p">].</span><span class="nx">innerHTML</span><span class="p">;</span> + <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> + <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">s</span> <span class="k">in</span> <span class="nx">blur</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">blur</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span> + <span class="nx">email</span> <span class="o">=</span> <span class="nx">email</span><span class="o">+</span><span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">a</span><span class="o">-</span><span class="mi">5</span><span class="p">);</span> + <span class="p">}</span> + <span class="nx">elems</span><span class="p">[</span><span class="nx">e</span><span class="p">].</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">email</span><span class="p">;</span> + <span class="p">}</span> +<span class="p">}</span> +</pre></div> +</td></tr></table><p>Unfortunately, this approach does not hide your email from anyone using +<a class="reference external" href="http://phantomjs.org/">PhantomJS</a>, +<a class="reference external" href="http://zombie.labnotes.org/">ZombieJS</a> 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.</p> +</div> +<div class="section" id="generation-of-fake-data"> +<h2>Generation of fake data</h2> +<p>To test the contact section of the site, I wanted to populate it with +fake data. <a class="reference external" href="https://github.com/joke2k/faker">Fake-Factory</a> is an +amazing library that can generate fake data of almost any kind: emails, +association names, acronyms... It even lets you localise the results +(get Spanish names, for instance) and generate factories for certain +classes (à la Django).</p> +<p>But I also wanted pictures, enter <a class="reference external" href="http://lorempixel.com/">Lorem +Pixel</a>. 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.</p> +<p>For instance, the picture below is served through Lorem Pixel.</p> +<div class="figure"> +<img alt="This picture is generated with LoremIpsum" src="http://lorempixel.com/400/200/nightlife/" /> +<p class="caption">This picture is generated with LoremIpsum</p> +</div> +<p>By the way, if you only want cat pictures, take a look at +<a class="reference external" href="http://placekitten.com/">Placekitten</a>. And for NSFW text, there's +the <a class="reference external" href="http://slipsum.com/">Samuel L. Jackson Ipsum</a></p> +</div> +Remove git files with globbing2013-08-22T23:14:00+02:00J. Fernando Sáncheztag:balkian.com,2013-08-22:remove-git-files-with-globbing.html<p>A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>git rm --cached <span class="s1">&#39;\*\*.swp&#39;</span> +</pre></div> +</td></tr></table>Creating my web2013-08-22T14:14:22+02:00J. Fernando Sáncheztag:balkian.com,2013-08-22:creating-my-web.html<p>Finally, I've 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, +<a class="reference external" href="http://jekyllrb.com">Jekyll</a> will automatically generate static +pages for my posts every time I commit anything new to this repository.</p> +<p>But 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.</p> +<p>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 any +Javascript code in the page. Probably I will use some to add my +<a class="reference external" href="http://gist.github.com/balkian">gists</a> and +<a class="reference external" href="http://github.com/balkian">repositories</a>, but we will see about +that.</p> +<p>I think the code speaks for itself, so you can check out <a class="reference external" href="http://github.com/balkian/balkian.github.com">my repository +on Github</a>. You can +clone and deploy it easily like this:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3</pre></div></td><td class="code"><div class="highlight"><pre>git clone +https://github.com/balkian/balkian.github.com <span class="nb">cd </span>balkian.github.com +jekyll serve -w +</pre></div> +</td></tr></table><p>I will keep updating this post with information about: * 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</p> + \ No newline at end of file diff --git a/fonts/glyphiconshalflings-regular.eot b/fonts/glyphiconshalflings-regular.eot deleted file mode 100755 index bd59ccd2d679a6fa594560d56120e5e6e98b2c3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33358 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 diff --git a/fonts/glyphiconshalflings-regular.svg b/fonts/glyphiconshalflings-regular.svg deleted file mode 100755 index 0fb4587..0000000 --- a/fonts/glyphiconshalflings-regular.svg +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/glyphiconshalflings-regular.ttf b/fonts/glyphiconshalflings-regular.ttf deleted file mode 100755 index c63c068feb1ac0de21fb7fe459fc8d0175028f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32896 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 T4y;kUO<052l5N*uMf(2$813#) diff --git a/fonts/glyphiconshalflings-regular.woff b/fonts/glyphiconshalflings-regular.woff deleted file mode 100755 index 4c778ffdc5fa2837359e171f35c5b410674cd3c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 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%0Aj9w_3|}8T~R?c=mXrZ{!OUY}Y4YKc7(y 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 -{% if paginator.total_pages > 0 %} + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ +
+ -{% endif %} -{% for post in paginator.posts %}
-

{{ post.title }}

- {{ post.date | date_to_string }} - {% for c in post.tags %} - {{ c }} - {% endfor %} +

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+
+

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 ...

+
+ Read more... +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... +
+

Remove git files with globbing

+ 2013-08-22 + git +
+
+

A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:

+
1
git rm --cached '\*\*.swp'
+
+
+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git
- {{ post.excerpt }} +

Finally, I've 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 ...

- Read more... -{% endfor %} + Read more... -{% if paginator.total_pages > 0 %} -{% endif %} +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/pages/about.html b/pages/about.html new file mode 100644 index 0000000..bf56e72 --- /dev/null +++ b/pages/about.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

This is me.... I mean, my website

+ +
+
    +
  • GNU/Linux Fanboy
  • +
  • Android User
  • +
  • Github Fan
  • +
  • StackOverflow Dependent
  • +
  • Music Lover
  • +
  • Films Lover
  • +
  • Usual Chatter
  • +
  • IT Person
  • +
  • Casual Gamer
  • +
  • Amateur Writer
  • +
  • Night Owl
  • +
  • Terminal User
  • +
  • Hobbyist Linguist
  • +
  • Amateur Coder
  • +
  • On-and-off Reader
  • +
  • Quote lover
  • +
+
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/pages/cv.html b/pages/cv.html new file mode 100644 index 0000000..4ef7e4a --- /dev/null +++ b/pages/cv.html @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

+ + +

+
+ + + +

J. Fernando Sánchez

+ +

+ Email: +

+
+ +
+

+ I am a curious young engineer who happens to enjoy IT both as a career and as a hobby. + +

+
+ +
+ +
+
+ +
Education
+ + + +
+

Telecommunications Engineering Technical University of Madrid (UPM) - 2007-2012

+
+ +
+ +
Skills
+
+

Programming Languages

+

Used frequently: Python, Javascript/CoffeeScript, Bash/Shell, Java and Ruby

+

Also programmed in: PHP, C, C++, Objective C and Haskell

+ +

Frameworks and libraries

+

Node.js, Django, Ruby on Rails, QT, GTK2, JASON, RDFLib, Weka

+ +

Development tools

+

Git, Eclipse, Netbeans, Android SDK

+ +

Others

+

Latex, XMPP, GIMP, Inkscape

+ +

Social Skills

+

Working with and leading international teams. Presentation and communication skills: I conducted several presentations to audiences of ~100 people.

+
+ +
+ +
Experience
+
+

Graduate Research FellowIntelligent Systems Group (GSI) (GSI) - 2008-2012

+
    +
  • Worked with Agent and Semantic technologies
  • +
  • Conducted my master thesis: Design and Implementation of an Agent Architecture Based on Web Hooks
  • +
+ +

IT CoordinatorEESTEC International - 2012-2013

+
    +
  • Coordinated the work of a small international IT Team
  • +
  • In charge of the administration of the IT infrastructure of EESTEC: Plone portal, Mailman mailing lists, etc.
  • +
+ +

Oversight Committee MemberEESTEC International - 2012-2013

+
    +
  • Supervised the work of the International Board
  • +
+

Vice Chairman for External Affairs EESTEC International - 2012-2013

+
    +
  • Established connections with other Student Associations
  • +
  • Helped found new Observers (Local Groups)
  • +
  • Carried out International Board duties
  • +
+
+ +
+ + + + + + +
References
+
Available on request
+ +
+
+ +
+ +
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/pages/projects.html b/pages/projects.html new file mode 100644 index 0000000..2a31dce --- /dev/null +++ b/pages/projects.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

Ongoing Projects

+
    +
  • 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.
  • +
  • Onyx: an ontology for emotion analysis that includes concepts from W3C's provenance.
  • +
  • Marl: I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C's provenance ontology.
  • +
  • EESTEC.net: the Plone based official portal of EESTEC. I fixed some bugs and implemented basic features. It's still an ongoing project.
  • +
+

Past Projects

+
    +
  • 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
  • +
+

For more information, checl my complete list of public repositories in Github.

+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/pages/to-do.html b/pages/to-do.html new file mode 100644 index 0000000..fce6c50 --- /dev/null +++ b/pages/to-do.html @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

Things To Do

+ +

This is intended as my public "todo.txt". Both to keep it accessible and to feel ashamed of the many things I leave undone: +

    +
  • PhD +
      +
    • Write my first workshop paper as main author
    • +
    • Write my first journal paper
    • +
    • Become a doctor!
    • +
    +
  • +
  • Technical +
      +
    • Write a NodeJS App. Maia [See ISSUES]
    • +
    • Write my first Django Application
    • +
    • Win my first Hackathon
    • +
    • Github repo with +100 stars
    • +
    +
  • +
  • Languages +
      +
    • English
    • +
    • Chinese
    • +
    • Greek
    • +
    • German
    • +
    • Esperanto
    • +
    +
  • +
  • Personal +
      +
    • Run a 10k
    • +
    • Blog regularly for a year
    • +
    +
  • +

+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/projects/index.markdown b/projects/index.markdown deleted file mode 100644 index ec9e90a..0000000 --- a/projects/index.markdown +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -title: "Projects" ---- - -Ongoing Projects -================ - * [Maia](http://github.com/gsi-upm/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. - * [Onyx](http://gsi.dit.upm.es/ontologies/onyx): an ontology for emotion analysis that includes concepts from W3C's provenance. - * [Marl](http://gsi.dit.upm.es/ontologies/marl): I updated this ontology, originally created by Adam Westerski, to make it compatible with the W3C's provenance ontology. - * [EESTEC.net](http://github.com/eestec/eestec.portal): the Plone based official portal of EESTEC. I fixed some bugs and implemented basic features. It's still an ongoing project. - - -Past Projects -============= - * [Hermes](http://github.com/balkian/hermes): one of my first projects, developed together with [David Pérez](cathan) 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](http://www.youtube.com/watch?v=KnEYahPD9z4) and [Part 2](http://www.youtube.com/watch?v=lQZldCTPEJc) - -For more information, checl my [complete list of public repositories in Github](http://github.com/balkian). diff --git a/proxies-with-apache-and-python.html b/proxies-with-apache-and-python.html new file mode 100644 index 0000000..1ccf57f --- /dev/null +++ b/proxies-with-apache-and-python.html @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+

Proxies with Apache and python

+ 2014-10-09 + python + apache + proxy + gunicorn + uwsgi +
+ +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0.1:8888/myapp/
+    ProxyPassReverse http://127.0.0.1:8888/myapp/
+    RequestHeader set SCRIPT_NAME "/myapp/"
+</Location>
+
+

Important: SCRIPT_NAME and the end of ProxyPass URL MUST BE +THE SAME. Otherwise, Gunicorn will fail miserably.

+

Try it with: +bash 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).

+
1
+2
+3
+4
<Location /myapp/>
+    SetHandler uwsgi_handler
+    uWSGISocker 127.0.0.1:8888
+</Location>
+
+

Try it with:

+
1
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.

+
 1
+ 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
+
+
+
+ +
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/publishing-in-pypi.html b/publishing-in-pypi.html new file mode 100644 index 0000000..c397497 --- /dev/null +++ b/publishing-in-pypi.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+ +
+

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.

+
+

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 +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 +memorability over describing the functionality.

+
+
+

Create a .pypirc configuration file

+
+[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!

+
+
+

Prepare your package

+
+root-dir/    # Any name you want
+    setup.py
+    setup.cfg
+    LICENSE.txt
+    README.md
+    mypackage/
+        __init__.py
+        foo.py
+        bar.py
+        baz.py
+
+
+

setup.cfg

+
+[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.

+
+
+

setup.py

+

{% highlight python %} 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 }', author_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 = [], ) {% endhighlight %}

+

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:

+
+git tag {version} -m "{ Description of this tag/version}"
+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: +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 pip install senpy

+
+ +
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/remove-git-files-with-globbing.html b/remove-git-files-with-globbing.html new file mode 100644 index 0000000..90c15f9 --- /dev/null +++ b/remove-git-files-with-globbing.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+

Remove git files with globbing

+ 2013-08-22 + git +
+ +
+

A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:

+
1
git rm --cached '\*\*.swp'
+
+
+
+
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/apache.html b/tag/apache.html new file mode 100644 index 0000000..fc81d7d --- /dev/null +++ b/tag/apache.html @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: apache

+ +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/git.html b/tag/git.html new file mode 100644 index 0000000..862002d --- /dev/null +++ b/tag/git.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: git

+ +
+

Remove git files with globbing

+ 2013-08-22 + git +
+
+

A simple trick. If you want to remove all the '.swp' files from a git +repository, just use:

+
1
git rm --cached '\*\*.swp'
+
+
+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/github.html b/tag/github.html new file mode 100644 index 0000000..7d13369 --- /dev/null +++ b/tag/github.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: github

+ +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+
+

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 ...

+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/gunicorn.html b/tag/gunicorn.html new file mode 100644 index 0000000..b7e4709 --- /dev/null +++ b/tag/gunicorn.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: gunicorn

+ + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/heroku.html b/tag/heroku.html new file mode 100644 index 0000000..3588223 --- /dev/null +++ b/tag/heroku.html @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: heroku

+ +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/javascript.html b/tag/javascript.html new file mode 100644 index 0000000..0349409 --- /dev/null +++ b/tag/javascript.html @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: javascript

+ +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/nginx.html b/tag/nginx.html new file mode 100644 index 0000000..f78d8e8 --- /dev/null +++ b/tag/nginx.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: nginx

+ +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/proxy.html b/tag/proxy.html new file mode 100644 index 0000000..f8e66f5 --- /dev/null +++ b/tag/proxy.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: proxy

+ + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/_layouts/default.html b/tag/pypi.html similarity index 50% rename from _layouts/default.html rename to tag/pypi.html index 4d1c78c..7df33e9 100644 --- a/_layouts/default.html +++ b/tag/pypi.html @@ -3,39 +3,46 @@ - {{ page.title }} + - + - + - - - - + + + +
- + - + \ No newline at end of file diff --git a/tag/python.html b/tag/python.html new file mode 100644 index 0000000..73fb511 --- /dev/null +++ b/tag/python.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: python

+ + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... +
+

Publishing in PyPi

+ 2014-09-27 + github + python + pypi +
+
+

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 ...

+
+ Read more... +
+

Updating EuroLoveMap

+ 2014-03-27 + javascript + python + heroku +
+
+

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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/ruby.html b/tag/ruby.html new file mode 100644 index 0000000..ead67cb --- /dev/null +++ b/tag/ruby.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: ruby

+ +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/starters.html b/tag/starters.html new file mode 100644 index 0000000..fcbb544 --- /dev/null +++ b/tag/starters.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: starters

+ +
+

Creating my web

+ 2013-08-22 + starters + javascript + ruby + github + git +
+
+

Finally, I've 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 ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/uwsgi.html b/tag/uwsgi.html new file mode 100644 index 0000000..bf350a8 --- /dev/null +++ b/tag/uwsgi.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: uwsgi

+ + +
+

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.

+
+

Gunicorn

+
1
+2
+3
+4
+5
<Location /myapp/>
+    ProxyPass http://127.0.0 ...
+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/webdav.html b/tag/webdav.html new file mode 100644 index 0000000..fca77cf --- /dev/null +++ b/tag/webdav.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: webdav

+ +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tag/zotero.html b/tag/zotero.html new file mode 100644 index 0000000..17fefac --- /dev/null +++ b/tag/zotero.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +

Entries tagged: zotero

+ +
+

Zotero

+ 2014-12-09 + zotero + webdav + nginx + apache +
+
+

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.

+

If you use nginx as your web server, know that even though it provides ...

+
+ Read more... + + +
+
+
+
+
+

+ J. Fernando Sánchez Rada | balkian +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+

+ Creative Commons A-SA-NC +

+
+
+ + + + + \ No newline at end of file diff --git a/tags.html b/tags.html new file mode 100644 index 0000000..7a0fe25 --- /dev/null +++ b/tags.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +

Tags for balkian.com

  • apache (2)
  • +
  • git (2)
  • +
  • github (2)
  • +
  • gunicorn (1)
  • +
  • heroku (1)
  • +
  • javascript (2)
  • +
  • nginx (1)
  • +
  • proxy (1)
  • +
  • pypi (1)
  • +
  • python (3)
  • +
  • ruby (1)
  • +
  • starters (1)
  • +
  • uwsgi (1)
  • +
  • webdav (1)
  • +
  • zotero (1)
  • +
    +
    +
    +
    +
    +

    + J. Fernando Sánchez Rada | balkian +

    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +

    + Creative Commons A-SA-NC +

    +
    +
    + + + + + \ No newline at end of file diff --git a/css/cv-desktop.css b/theme/css/cv-desktop.css similarity index 100% rename from css/cv-desktop.css rename to theme/css/cv-desktop.css diff --git a/css/cv-medium.css b/theme/css/cv-medium.css similarity index 100% rename from css/cv-medium.css rename to theme/css/cv-medium.css diff --git a/css/cv.css b/theme/css/cv.css similarity index 100% rename from css/cv.css rename to theme/css/cv.css diff --git a/css/main-desktop.bakup b/theme/css/main-desktop.bakup similarity index 100% rename from css/main-desktop.bakup rename to theme/css/main-desktop.bakup diff --git a/css/main-desktop.css b/theme/css/main-desktop.css old mode 100755 new mode 100644 similarity index 89% rename from css/main-desktop.css rename to theme/css/main-desktop.css index a884142..518c683 --- a/css/main-desktop.css +++ b/theme/css/main-desktop.css @@ -221,31 +221,6 @@ header { padding: 0; } -#headline { - margin: 0em; - font-size: 4em; - padding-left: 300px; - padding-top: 5px; - font-family: comfortaa; -} - -#headline a { - color: black; - padding: 0; - margin: 0; -} - -#headline a:hover { - color: white; - text-shadow: 1px 1px #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000; -} - - -#social { - margin: 0 auto; - padding: 0; -} - /*#social:after {*/ /*content: ".";*/ /*display: block;*/ @@ -283,16 +258,6 @@ header { z-index: 100; } -.entries dt { - font-weight: bold; - clear: both; - border-top: dashed 1px #CCC; -} -.entries dd { - float: right; - margin: 2px; -} - #navbar { font-size: 1.2em; padding-left: 300px; @@ -354,11 +319,6 @@ a { text-decoration: none; } -a:hover { - color: #FFF; - text-shadow: 1px 1px #069, -1px -1px 0 #069, 1px -1px 0 #069, -1px 1px 0 #069; -} - .label { font-family: comfortaa; border-radius: 10px 0px 0px 10px; @@ -397,7 +357,6 @@ a:hover { display:inline; width: 33.333%; } - @-webkit-keyframes toright { from { padding-left: 0px; @@ -420,6 +379,28 @@ a:hover { } } +@-webkit-keyframes toleft { + to { + left: -10px; + opacity: 1; + } + from { + left: 300px; + opacity: 0; + } +} + +@keyframes toleft { + to { + left: -10px; + opacity: 1; + } + from { + left: 300px; + opacity: 0; + } +} + @-webkit-keyframes appear{ to { opacity: 1; @@ -438,13 +419,33 @@ a:hover { } } +@-webkit-keyframes disappear{ + to { + visibility: hidden; + } + from { + visibility: show; + opacity: 1; + } +} + +@keyframes disappear{ + to { + opacity: 0; + } + from { + opacity: 1; + } +} + #subheadline { - -webkit-animation-name: toright; + position: absolute; + -webkit-animation-name: toleft; -webkit-animation-duration: 4s; -webkit-animation-iteration-count: 1; -webkit-animation-timing-function: linear; -webkit-animation-fill-mode: forwards; - animation-name: toright; + animation-name: toleft; animation-duration: 4s; animation-iteration-count: 1; animation-timing-function: linear; @@ -452,13 +453,13 @@ a:hover { } .disappear { - -webkit-animation-name: appear; - -webkit-animation-duration: 4s; + -webkit-animation-name: disappear; + -webkit-animation-duration: 3s; -webkit-animation-timing-function: linear; -webkit-animation-iteration-count: 1; -webkit-animation-fill-mode: forwards; - animation-name: appear; - animation-duration: 4s; + animation-name: disappear; + animation-duration: 3s; animation-iteration-count: 1; animation-timing-function: linear; animation-fill-mode: forwards; diff --git a/css/main-medium.css b/theme/css/main-medium.css similarity index 91% rename from css/main-medium.css rename to theme/css/main-medium.css index 073d374..dac0314 100644 --- a/css/main-medium.css +++ b/theme/css/main-medium.css @@ -217,39 +217,9 @@ header { } #headline { - margin: 0em; - font-size: 4em; padding-left: 20%;; - padding-top: 5px; - font-family: comfortaa; -} - -#headline a { - color: black; - padding: 0; - margin: 0; -} - -#headline a:hover { - color: white; - text-shadow: 2px 2px #000, -2px -2px 0 #000, 2px -2px 0 #000, -2px 2px 0 #000; -} - - -#social { - margin: 0 auto; - padding: 0; } -/*#social:after {*/ - /*content: ".";*/ - /*display: block;*/ - /*clear: both;*/ - /*visibility: hidden;*/ - /*line-height: 0;*/ - /*height: 0;*/ -/*}*/ - #social li { position: relative; list-style-type: none; @@ -278,15 +248,6 @@ header { z-index: 100; } -.entries dt { - font-weight: bold; - clear: both; - border-top: dashed 1px #CCC; -} -.entries dd { - float: right; - margin: 2px; -} #navbar { font-size: 1em; @@ -349,11 +310,6 @@ a { text-decoration: none; } -a:hover { - color: #FFF; - text-shadow: 1px 1px #069, -1px -1px 0 #069, 1px -1px 0 #069, -1px 1px 0 #069; -} - .label { font-family: comfortaa; border-radius: 10px 0px 0px 10px; diff --git a/css/main-xs.css b/theme/css/main-xs.css similarity index 95% rename from css/main-xs.css rename to theme/css/main-xs.css index d07881c..e2452f2 100644 --- a/css/main-xs.css +++ b/theme/css/main-xs.css @@ -10,7 +10,11 @@ #headline { position: relative; width: 100%; - margin: 0.5em; + font-size: 2em; + padding: 0.1em; + margin: 0.1em; + font-family: comfortaa; + overflow: auto; } #headline a { @@ -104,11 +108,6 @@ a { text-decoration: none; } -a:hover { - color: #FFF; - text-shadow: 1px 1px #069, -1px -1px 0 #069, 1px -1px 0 #069, -1px 1px 0 #069; -} - .navbar li.active a:hover { color: #c00; } @@ -182,3 +181,7 @@ footer { /*top: -50px;*/ z-index: 100; } + +.highlighttable { + width: 100%; +} diff --git a/css/main.css b/theme/css/main.css old mode 100755 new mode 100644 similarity index 56% rename from css/main.css rename to theme/css/main.css index 246553a..96fdcc1 --- a/css/main.css +++ b/theme/css/main.css @@ -61,13 +61,14 @@ body { padding-left: 0.5em; } -code { +.highlighttable { display: block; overflow: auto; + position: relative; background-color: #EEE; margin: 0 auto; width: 80%; - padding: 1.5em 2em; + padding: 0; border: dashed 1px #AAA; border-radius: 5px 0px 5px 5px; -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ @@ -75,6 +76,25 @@ code { box-sizing: border-box; /* Opera/IE 8+ */ } +.highlight { + /*background-color: #EEE;*/ + overflow: auto; + margin: 0; + padding: 0.5em; + position: relative; + overflow: auto; +} + +.code { + width: 100%; +} + +.linenos { + color: #AAA; + padding-right: 0.5em; + border-right: solid 1px #DDD; +} + #navbar { position: relative; padding: 0.5em; @@ -122,3 +142,67 @@ code { margin-left: auto; margin-right: auto } + +#headline { + position: relative; + margin: 0em; + font-size: 4em; + padding-left: 300px; + padding-top: 5px; + font-family: comfortaa; +} + +#headline a { + color: black; + padding: 0; + margin: 0; +} + +#headline a.inv { + font-size: 0.8em; + color: white; + text-shadow: 1px 1px #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000; +} + +#headline a:hover { + color: white; + text-shadow: 1px 1px #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000; +} + +#social { + margin: 0 auto; + padding: 0; +} + +.entries dt { + font-weight: bold; + clear: both; + border-top: dashed 1px #CCC; +} +.entries dd { + float: right; + margin: 2px; +} + +a:hover { + text-shadow: 0.5px 0.5px #CCC, -0.5px -0.5px 0 #CCC, 0.5px -0.5px 0 #CCC, -0.5px 0.5px 0 #CCC; +} + +.tag:hover * { + -webkit-transform: rotate(-4deg); + -moz-transform: rotate(-4deg); + transform: rotate(-4deg); + color: black; + text-shadow: none ; + transform-origin: 95% 50%; + -moz-transform-origin: 95% 50%; + -webkit-transform-origin: 95% 50%; +} + +.tag * { + display: inline-block; +} + +.hll { + background: yellow; +} diff --git a/theme/css/solarized-dark.css b/theme/css/solarized-dark.css new file mode 100644 index 0000000..20e3a35 --- /dev/null +++ b/theme/css/solarized-dark.css @@ -0,0 +1 @@ +.highlight{background-color:#073642;color:#93a1a1}.highlight .c{color:#586e75 !important;font-style:italic !important}.highlight .cm{color:#586e75 !important;font-style:italic !important}.highlight .cp{color:#586e75 !important;font-style:italic !important}.highlight .c1{color:#586e75 !important;font-style:italic !important}.highlight .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.highlight .err{color:#dc322f !important;background:none !important}.highlight .k{color:#cb4b16 !important}.highlight .o{color:#93a1a1 !important;font-weight:bold !important}.highlight .p{color:#93a1a1 !important}.highlight .ow{color:#2aa198 !important;font-weight:bold !important}.highlight .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.highlight .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.highlight .ge{color:#93a1a1 !important;font-style:italic !important}.highlight .gr{color:#aa0000}.highlight .gh{color:#586e75 !important}.highlight .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.highlight .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.highlight .go{color:#888888}.highlight .gp{color:#555555}.highlight .gs{color:#93a1a1 !important;font-weight:bold !important}.highlight .gu{color:#6c71c4 !important}.highlight .gt{color:#aa0000}.highlight .kc{color:#859900 !important;font-weight:bold !important}.highlight .kd{color:#268bd2 !important}.highlight .kp{color:#cb4b16 !important;font-weight:bold !important}.highlight .kr{color:#d33682 !important;font-weight:bold !important}.highlight .kt{color:#2aa198 !important}.highlight .n{color:#268bd2 !important}.highlight .na{color:#268bd2 !important}.highlight .nb{color:#859900 !important}.highlight .nc{color:#d33682 !important}.highlight .no{color:#b58900 !important}.highlight .ni{color:#800080}.highlight .nl{color:#859900 !important}.highlight .ne{color:#268bd2 !important;font-weight:bold !important}.highlight .nf{color:#268bd2 !important;font-weight:bold !important}.highlight .nn{color:#b58900 !important}.highlight .nt{color:#268bd2 !important;font-weight:bold !important}.highlight .nx{color:#b58900 !important}.highlight .bp{color:#999999}.highlight .vc{color:#008080}.highlight .vg{color:#268bd2 !important}.highlight .vi{color:#268bd2 !important}.highlight .nv{color:#268bd2 !important}.highlight .w{color:#bbbbbb}.highlight .mf{color:#2aa198 !important}.highlight .m{color:#2aa198 !important}.highlight .mh{color:#2aa198 !important}.highlight .mi{color:#2aa198 !important}.highlight .mo{color:#009999}.highlight .s{color:#2aa198 !important}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#2aa198 !important}.highlight .s2{color:#2aa198 !important}.highlight .se{color:#dc322f !important}.highlight .sh{color:#d14}.highlight .si{color:#268bd2 !important}.highlight .sx{color:#d14}.highlight .sr{color:#2aa198 !important}.highlight .s1{color:#2aa198 !important}.highlight .ss{color:#990073}.highlight .il{color:#009999}.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%} diff --git a/theme/css/solarized.css b/theme/css/solarized.css new file mode 100644 index 0000000..d93ef6e --- /dev/null +++ b/theme/css/solarized.css @@ -0,0 +1,69 @@ +.hll { background-color: #ffffcc } +.c { color: #586E75 } /* Comment */ +.err { color: #93A1A1 } /* Error */ +.g { color: #93A1A1 } /* Generic */ +.k { color: #859900 } /* Keyword */ +.l { color: #93A1A1 } /* Literal */ +.n { color: #93A1A1 } /* Name */ +.o { color: #859900 } /* Operator */ +.x { color: #CB4B16 } /* Other */ +.p { color: #93A1A1 } /* Punctuation */ +.cm { color: #586E75 } /* Comment.Multiline */ +.cp { color: #859900 } /* Comment.Preproc */ +.c1 { color: #586E75 } /* Comment.Single */ +.cs { color: #859900 } /* Comment.Special */ +.gd { color: #2AA198 } /* Generic.Deleted */ +.ge { color: #93A1A1; font-style: italic } /* Generic.Emph */ +.gr { color: #DC322F } /* Generic.Error */ +.gh { color: #CB4B16 } /* Generic.Heading */ +.gi { color: #859900 } /* Generic.Inserted */ +.go { color: #93A1A1 } /* Generic.Output */ +.gp { color: #93A1A1 } /* Generic.Prompt */ +.gs { color: #93A1A1; font-weight: bold } /* Generic.Strong */ +.gu { color: #CB4B16 } /* Generic.Subheading */ +.gt { color: #93A1A1 } /* Generic.Traceback */ +.kc { color: #CB4B16 } /* Keyword.Constant */ +.kd { color: #268BD2 } /* Keyword.Declaration */ +.kn { color: #859900 } /* Keyword.Namespace */ +.kp { color: #859900 } /* Keyword.Pseudo */ +.kr { color: #268BD2 } /* Keyword.Reserved */ +.kt { color: #DC322F } /* Keyword.Type */ +.ld { color: #93A1A1 } /* Literal.Date */ +.m { color: #2AA198 } /* Literal.Number */ +.s { color: #2AA198 } /* Literal.String */ +.na { color: #93A1A1 } /* Name.Attribute */ +.nb { color: #B58900 } /* Name.Builtin */ +.nc { color: #268BD2 } /* Name.Class */ +.no { color: #CB4B16 } /* Name.Constant */ +.nd { color: #268BD2 } /* Name.Decorator */ +.ni { color: #CB4B16 } /* Name.Entity */ +.ne { color: #CB4B16 } /* Name.Exception */ +.nf { color: #268BD2 } /* Name.Function */ +.nl { color: #93A1A1 } /* Name.Label */ +.nn { color: #93A1A1 } /* Name.Namespace */ +.nx { color: #93A1A1 } /* Name.Other */ +.py { color: #93A1A1 } /* Name.Property */ +.nt { color: #268BD2 } /* Name.Tag */ +.nv { color: #268BD2 } /* Name.Variable */ +.ow { color: #859900 } /* Operator.Word */ +.w { color: #93A1A1 } /* Text.Whitespace */ +.mf { color: #2AA198 } /* Literal.Number.Float */ +.mh { color: #2AA198 } /* Literal.Number.Hex */ +.mi { color: #2AA198 } /* Literal.Number.Integer */ +.mo { color: #2AA198 } /* Literal.Number.Oct */ +.sb { color: #586E75 } /* Literal.String.Backtick */ +.sc { color: #2AA198 } /* Literal.String.Char */ +.sd { color: #93A1A1 } /* Literal.String.Doc */ +.s2 { color: #2AA198 } /* Literal.String.Double */ +.se { color: #CB4B16 } /* Literal.String.Escape */ +.sh { color: #93A1A1 } /* Literal.String.Heredoc */ +.si { color: #2AA198 } /* Literal.String.Interpol */ +.sx { color: #2AA198 } /* Literal.String.Other */ +.sr { color: #DC322F } /* Literal.String.Regex */ +.s1 { color: #2AA198 } /* Literal.String.Single */ +.ss { color: #2AA198 } /* Literal.String.Symbol */ +.bp { color: #268BD2 } /* Name.Builtin.Pseudo */ +.vc { color: #268BD2 } /* Name.Variable.Class */ +.vg { color: #268BD2 } /* Name.Variable.Global */ +.vi { color: #268BD2 } /* Name.Variable.Instance */ +.il { color: #2AA198 } /* Literal.Number.Integer.Long */ diff --git a/css/syntax.css b/theme/css/syntax.css similarity index 100% rename from css/syntax.css rename to theme/css/syntax.css diff --git a/font-awesome/css/font-awesome-ie7.css b/theme/font-awesome/css/font-awesome-ie7.css similarity index 100% rename from font-awesome/css/font-awesome-ie7.css rename to theme/font-awesome/css/font-awesome-ie7.css diff --git a/font-awesome/css/font-awesome-ie7.min.css b/theme/font-awesome/css/font-awesome-ie7.min.css similarity index 100% rename from font-awesome/css/font-awesome-ie7.min.css rename to theme/font-awesome/css/font-awesome-ie7.min.css diff --git a/font-awesome/css/font-awesome.css b/theme/font-awesome/css/font-awesome.css similarity index 100% rename from font-awesome/css/font-awesome.css rename to theme/font-awesome/css/font-awesome.css diff --git a/font-awesome/css/font-awesome.min.css b/theme/font-awesome/css/font-awesome.min.css similarity index 100% rename from font-awesome/css/font-awesome.min.css rename to theme/font-awesome/css/font-awesome.min.css diff --git a/font-awesome/font/FontAwesome.otf b/theme/font-awesome/font/FontAwesome.otf similarity index 100% rename from font-awesome/font/FontAwesome.otf rename to theme/font-awesome/font/FontAwesome.otf diff --git a/font-awesome/font/fontawesome-webfont.eot b/theme/font-awesome/font/fontawesome-webfont.eot old mode 100755 new mode 100644 similarity index 100% rename from font-awesome/font/fontawesome-webfont.eot rename to theme/font-awesome/font/fontawesome-webfont.eot diff --git a/font-awesome/font/fontawesome-webfont.svg b/theme/font-awesome/font/fontawesome-webfont.svg old mode 100755 new mode 100644 similarity index 100% rename from font-awesome/font/fontawesome-webfont.svg rename to theme/font-awesome/font/fontawesome-webfont.svg diff --git a/font-awesome/font/fontawesome-webfont.ttf b/theme/font-awesome/font/fontawesome-webfont.ttf old mode 100755 new mode 100644 similarity index 100% rename from font-awesome/font/fontawesome-webfont.ttf rename to theme/font-awesome/font/fontawesome-webfont.ttf diff --git a/font-awesome/font/fontawesome-webfont.woff b/theme/font-awesome/font/fontawesome-webfont.woff old mode 100755 new mode 100644 similarity index 100% rename from font-awesome/font/fontawesome-webfont.woff rename to theme/font-awesome/font/fontawesome-webfont.woff diff --git a/font-awesome/less/bootstrap.less b/theme/font-awesome/less/bootstrap.less similarity index 100% rename from font-awesome/less/bootstrap.less rename to theme/font-awesome/less/bootstrap.less diff --git a/font-awesome/less/core.less b/theme/font-awesome/less/core.less similarity index 100% rename from font-awesome/less/core.less rename to theme/font-awesome/less/core.less diff --git a/font-awesome/less/extras.less b/theme/font-awesome/less/extras.less similarity index 100% rename from font-awesome/less/extras.less rename to theme/font-awesome/less/extras.less diff --git a/font-awesome/less/font-awesome-ie7.less b/theme/font-awesome/less/font-awesome-ie7.less similarity index 100% rename from font-awesome/less/font-awesome-ie7.less rename to theme/font-awesome/less/font-awesome-ie7.less diff --git a/font-awesome/less/font-awesome.less b/theme/font-awesome/less/font-awesome.less similarity index 100% rename from font-awesome/less/font-awesome.less rename to theme/font-awesome/less/font-awesome.less diff --git a/font-awesome/less/icons.less b/theme/font-awesome/less/icons.less similarity index 100% rename from font-awesome/less/icons.less rename to theme/font-awesome/less/icons.less diff --git a/font-awesome/less/mixins.less b/theme/font-awesome/less/mixins.less similarity index 100% rename from font-awesome/less/mixins.less rename to theme/font-awesome/less/mixins.less diff --git a/font-awesome/less/path.less b/theme/font-awesome/less/path.less similarity index 100% rename from font-awesome/less/path.less rename to theme/font-awesome/less/path.less diff --git a/font-awesome/less/variables.less b/theme/font-awesome/less/variables.less similarity index 100% rename from font-awesome/less/variables.less rename to theme/font-awesome/less/variables.less diff --git a/font-awesome/scss/_bootstrap.scss b/theme/font-awesome/scss/_bootstrap.scss similarity index 100% rename from font-awesome/scss/_bootstrap.scss rename to theme/font-awesome/scss/_bootstrap.scss diff --git a/font-awesome/scss/_core.scss b/theme/font-awesome/scss/_core.scss similarity index 100% rename from font-awesome/scss/_core.scss rename to theme/font-awesome/scss/_core.scss diff --git a/font-awesome/scss/_extras.scss b/theme/font-awesome/scss/_extras.scss similarity index 100% rename from font-awesome/scss/_extras.scss rename to theme/font-awesome/scss/_extras.scss diff --git a/font-awesome/scss/_icons.scss b/theme/font-awesome/scss/_icons.scss similarity index 100% rename from font-awesome/scss/_icons.scss rename to theme/font-awesome/scss/_icons.scss diff --git a/font-awesome/scss/_mixins.scss b/theme/font-awesome/scss/_mixins.scss similarity index 100% rename from font-awesome/scss/_mixins.scss rename to theme/font-awesome/scss/_mixins.scss diff --git a/font-awesome/scss/_path.scss b/theme/font-awesome/scss/_path.scss similarity index 100% rename from font-awesome/scss/_path.scss rename to theme/font-awesome/scss/_path.scss diff --git a/font-awesome/scss/_variables.scss b/theme/font-awesome/scss/_variables.scss similarity index 100% rename from font-awesome/scss/_variables.scss rename to theme/font-awesome/scss/_variables.scss diff --git a/font-awesome/scss/font-awesome-ie7.scss b/theme/font-awesome/scss/font-awesome-ie7.scss similarity index 100% rename from font-awesome/scss/font-awesome-ie7.scss rename to theme/font-awesome/scss/font-awesome-ie7.scss diff --git a/font-awesome/scss/font-awesome.scss b/theme/font-awesome/scss/font-awesome.scss similarity index 100% rename from font-awesome/scss/font-awesome.scss rename to theme/font-awesome/scss/font-awesome.scss diff --git a/img/favicon-balkian.xcf b/theme/img/favicon-balkian.xcf similarity index 100% rename from img/favicon-balkian.xcf rename to theme/img/favicon-balkian.xcf diff --git a/img/favicon.ico b/theme/img/favicon.ico similarity index 100% rename from img/favicon.ico rename to theme/img/favicon.ico diff --git a/img/favicon.png b/theme/img/favicon.png similarity index 100% rename from img/favicon.png rename to theme/img/favicon.png diff --git a/img/favicon.xcf b/theme/img/favicon.xcf similarity index 100% rename from img/favicon.xcf rename to theme/img/favicon.xcf diff --git a/img/favicon2.ico b/theme/img/favicon2.ico similarity index 100% rename from img/favicon2.ico rename to theme/img/favicon2.ico diff --git a/img/favicon2.xcf b/theme/img/favicon2.xcf similarity index 100% rename from img/favicon2.xcf rename to theme/img/favicon2.xcf diff --git a/img/favicon3.ico b/theme/img/favicon3.ico similarity index 100% rename from img/favicon3.ico rename to theme/img/favicon3.ico diff --git a/img/me.jpg b/theme/img/me.jpg similarity index 100% rename from img/me.jpg rename to theme/img/me.jpg diff --git a/img/me.png b/theme/img/me.png similarity index 100% rename from img/me.png rename to theme/img/me.png diff --git a/img/noise.jpg b/theme/img/noise.jpg similarity index 100% rename from img/noise.jpg rename to theme/img/noise.jpg diff --git a/img/noise2.png b/theme/img/noise2.png similarity index 100% rename from img/noise2.png rename to theme/img/noise2.png diff --git a/img/noise3.png b/theme/img/noise3.png similarity index 100% rename from img/noise3.png rename to theme/img/noise3.png diff --git a/img/noise4.png b/theme/img/noise4.png similarity index 100% rename from img/noise4.png rename to theme/img/noise4.png diff --git a/js/jquery-2.0.2.min.js b/theme/js/jquery-2.0.2.min.js similarity index 100% rename from js/jquery-2.0.2.min.js rename to theme/js/jquery-2.0.2.min.js diff --git a/todo/index.html b/todo/index.html deleted file mode 100644 index 586349c..0000000 --- a/todo/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: default -title: "To-Do" ---- -

    Things To Do

    -This is intended as my public "todo.txt". Both to keep it accessible and to feel ashamed of the many things I leave undone: -
      -
    • PhD -
        -
      • Write my first workshop paper as main author
      • -
      • Write my first journal paper
      • -
      • Become a doctor!
      • -
      -
    • -
    • Technical -
        -
      • Write a NodeJS App. Maia [See ISSUES]
      • -
      • Write my first Django Application
      • -
      • Win my first Hackathon
      • -
      • Github repo with +100 stars
      • -
      -
    • -
    • Languages -
        -
      • English
      • -
      • Chinese
      • -
      • Greek
      • -
      • German
      • -
      • Esperanto
      • -
      -
    • -
    • Personal -
        -
      • Run a 10k
      • -
      • Blog regularly for a year
      • -
      -
    • -
    diff --git a/updating-eurolovemap.html b/updating-eurolovemap.html new file mode 100644 index 0000000..17836a4 --- /dev/null +++ b/updating-eurolovemap.html @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + +
    +

    Updating EuroLoveMap

    + 2014-03-27 + javascript + python + heroku +
    + +
    +

    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 "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 +won.

    +

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

    +
      +
    • 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
    • +
    +
    +

    Publishing a Python 3 app on Heroku

    +

    seen here

    +
    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:

    +
    1
    python-3.3.1
    +
    +

    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 +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.

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

    And this is the client side:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    window.onload = function(){
    +     elems = document.getElementsByClassName('profile-email');
    +     for(var e in elems){
    +        var blur = elems[e].innerHTML;
    +        var email = "";
    +        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.

    +
    +
    +

    Generation 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... It even lets you localise the results +(get Spanish names, for instance) and generate factories for certain +classes (à la Django).

    +

    But 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.

    +

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

    +
    +This picture is generated with LoremIpsum +

    This picture is generated with LoremIpsum

    +
    +

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

    +
    + +
    +
    +
    +
    +
    +
    +

    + J. Fernando Sánchez Rada | balkian +

    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +

    + Creative Commons A-SA-NC +

    +
    +
    + + + + + \ No newline at end of file diff --git a/zotero.html b/zotero.html new file mode 100644 index 0000000..1e8b8ea --- /dev/null +++ b/zotero.html @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + +
    +

    Zotero

    + 2014-12-09 + zotero + webdav + nginx + apache +
    + +
    +

    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.

    +

    If 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.

    +
    +

    Setting up Apache

    +

    First we need to install Apache:

    +
    1
    sudo apt-get install apache2
    +
    +

    Change the head of "/etc/apache2/sites-enabled/000-default" to:

    +
    1
    <VirtualHost *:880>
    +
    +

    Then, create a file /etc/apache2/sites-available/webdav:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    Alias /dav /home/webdav/dav
    +<Location /dav>
    +    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
    +</Location>
    +
    +

    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.

    +
    1
    +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:

    +
    1
    +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://<your_host>:880/dav/zotero

    +
    +
    +

    Setting 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:

    +
    1
    +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:

    +
    1
    sudo service nginx force-reload
    +
    +
    +
    +

    Extras

    + +
    + +
    +
    +
    +
    +
    +
    +

    + J. Fernando Sánchez Rada | balkian +

    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +

    + Creative Commons A-SA-NC +

    +
    +
    + + + + + \ No newline at end of file