diff options
-rw-r--r-- | db/data.sql | 686 | ||||
-rwxr-xr-x | tests.py | 112 |
2 files changed, 798 insertions, 0 deletions
diff --git a/db/data.sql b/db/data.sql new file mode 100644 index 0000000..b5d711b --- /dev/null +++ b/db/data.sql @@ -0,0 +1,686 @@ + +INSERT INTO posts ( + title, + body, + created_at, + updated_at +) +VALUES + +( + 'Succinct Description of UTF-8 Encoding', + 'UTF-8 is actually a pretty neat way to encode text. Its clever design leads to several interesting +properties. Notably of which, at least to me, is that all ASCII files are already UTF-8 encoded. + + Unicode code points | UTF-8 encoding (binary) + -------------------------------------------------------------- + 00-7F ( 7 bits) | 0tuvwxyz + 0080-07FF (11 bits) | 110pqrst 10uvwxyz + 0800-FFFF (16 bits) | 1110jklm 10npqrst 10uvwxyz + 010000-10FFFF (21 bits) | 11110efg 10hijklm 10npqrst 10uvwxyz', + TO_TIMESTAMP(1303776000)::DATE, + TO_TIMESTAMP(1303776000)::DATE +) +, +( + 'A Solid Breakdown of the Linux Font Rendering Stack', + '[This](https://freddie.witherden.org/pages/font-rasterisation "A Treatise on Font Rasterisation With an Emphasis on Free Software") +article saved me. Explains hinting and anti-aliasing quite well, also includes an excellent description of the Linux +font rendering stack.', + TO_TIMESTAMP(1303776000)::DATE, + TO_TIMESTAMP(1303776000)::DATE +) +, +( + 'gvim + ibus woes / building gvim from source', + 'My main development machine is running Ubuntu 12.04 and for a while now I''ve had issues with using gvim 7.3.x in +conjunction with ibus. Specifically upon starting gvim there''s a long start up latency (30s+) while the ibus daemon +is running. Shutdown the ibus daemon and gvim starts up near instantly. +[Here](https://bugs.launchpad.net/ubuntu/+source/vim/+bug/987707) is the ticket describing the issue in more +detail in [Launchpad](https://launchpad.net/) + +Yesterday vim 7.4 was just released and according to the aforementioned ticket the issue was resolved in 7.3.530. +Unfortunately neither vim 7.4 nor 7.3.530 are yet in the Ubuntu repos, so I decided to build 7.4 from source. +Along the way I''ll attempt to jot down some notes here for my future self. + +I didn''t know before I began, but gvim is actually built from the same source tree as vim source. Before we start, we''ll need +to make sure we have all the necessary development libraries required to build gvim. Ubuntu docs suggest the following +command should work -- I can''t say for sure as I had a lot of requisite development libraries installed as other projects +I''m working on depend on them as well. + + ~ $ sudo apt-get build-dep vim + +We''ll need mercurial to pull down the latest vim sources. I''m going to build the sources in my `~/working` directory. +Since I doubt I''ll need the repo metadata (the included `.hg` directory) so I''ll remove that to reclaim a little space. + + ~ $ sudo apt-get install mercurial + ~ $ cd ~/working/ + ~/working $ hg clone https://vim.googlecode.com/hg/ vim + ~/working $ cd vim + ~/working/vim $ du -sh + 139M . + ~/working/vim $ rm -rf .hg + ~/working/vim $ du -sh + 65M . + +Then to build, change into the `src` directory and run configure with the options below. I want to build with pretty +much all the features so I''ll go with the option `--with-features=huge`; optionally you can use tiny, small, normal, or big +instead; a breakdown of the differences is given [here](http://www.drchip.org/astronaut/vim/vimfeat.html). The options +of the form `--enable-XXXinterp` are support for vim plugins written in XXX. The `--enable-gui=gtk2` option is +obviously for gvim support. + + ~/working/vim $ cd src + ~/working/vim $ ./configure --with-features=huge --enable-rubyinterp \ + --enable-pythoninterp --enable-perlinterp \ + --enable-luainterp --enable-gui=gtk2 + +Once the configuration script runs without errors, we can then build with make. Note the `VMRUNTIMEDIR` variable passed +to make. This is the location of default system runtime director for vim plugins, docs, dictionaries, etc... for Ubuntu. + + ~/working/vim $ make VIMRUNTIMEDIR=/usr/share/vim/vim73 + +At this point one could optionally install vim on their system using the typical `make install` target. But +this feels dirty to me. Plus I prefer to keep all my development tools installed within my home directory. This makes migrating my +my development environment much less painful. So I''ll define an alias in my `~/.bashrc` and be good to go. + + ~/working/vim $ alias | grep gvim + alias gvim=''~/working/vim/src/vim -g -p'' + +やった!', + TO_TIMESTAMP(1376179200)::DATE, + TO_TIMESTAMP(1376179200)::DATE +) +, +( + 'Shell Wildcard Channel Attacks', + 'Using wildcards with a shell can open you up to channeling attacks (for example, sql injection is a type of channeling attack). +When using the `*` wildcard in particular in a directory containing argument-like-filenames (e.g. `-rf`) can lead to wild results. + +zum Beispiel: + + [root@defensecode public]# ls -al + total 20 + drwxrwxr-x. 5 leon leon 4096 Oct 28 17:04 . + drwx------. 22 leon leon 4096 Oct 28 16:15 .. + drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR1 + drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR2 + drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR3 + -rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file1.txt + -rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file2.txt + -rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file3.txt + -rw-rw-r--. 1 nobody nobody 0 Oct 28 16:38 -rf + + [root@defensecode public]# rm * + [root@defensecode public]# ls -al + total 8 + drwxrwxr-x. 2 leon leon 4096 Oct 28 17:05 . + drwx------. 22 leon leon 4096 Oct 28 16:15 .. + -rw-rw-r--. 1 nobody nobody 0 Oct 28 16:38 -rf + +Because `rm *` expands to: + + [user@defensecode WILD]$ rm DIR1 DIR2 DIR3 file1.txt file2.txt file3.txt -rf + +This type of attack used in conjunction with seemingly innocuous utilities like `tar` can lead to execution of arbitrary commands.', + TO_TIMESTAMP(1408579200)::DATE, + TO_TIMESTAMP(1408579200)::DATE +) +, +( + 'Debugging CGI / CGit', + 'I''ve been using CGit as a [git web front-end](http://bunkergate.org/cgit) for a bit now and just recently started +looking into customizing the root header. Assuming I''d have to hack the code to do so, I decided to pull down the source and build it. + + ~ $ git clone http://git.zx2c4.com/cgit/ + ~ $ cd cgit/ + ~/cgit $ make get-git && make + +After perusing +`cgit.c` and `ui-shared.c` I was pleasantly surprised to find I wouldn''t have to hack anything; it seems +that just about everything I wanted to change was configurable via the cgit config file (default: `/etc/cgitrc`). +For example for changing the root title and description, just set `root-title` and `root-desc`: + + ~ $ grep ''root'' /etc/cgitrc + root-title=bunkergate.org + root-desc=git repository browser + +This worked fine, but what about changing the logo? Just overwriting the `logo.png` in the resources directory should work, +but I want to use an animated gif. The file extension then would be technically incorrect, the worst kind of incorrect. Fortunately, it +too looks like this could be set with `logo` in `cgitrc` as well. But this didn''t seem to work. What''s going on? + +To run cgit from the CLI, simply do the following. HTML output is printed to stdout and errors are printed to stderr. +This will generate the root index content. + + ~/cgit $ CGIT_CONFIG="./cgitrc" ./cgit 1>stdout.html 2>stderr.log + +As an example, to see the content generated for a specific repo, do the following: + + ~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate" ./cgit 1>stdout.html 2>stderr.log + ~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate/tree/index.html" ./cgit 1>stdout.html 2>stderr.log + +It''s worth noting that this is probably a basic template for debugging any CGI. + +Setting `logo` in the configuration file +didn''t seem to have the desired effect. How can we see what''s going on? Simple, run it in GDB: + + ~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate/tree/index.html" gdb ./cgit + +So what was happening? Well after setting a watchpoint on `ctx.cfg.logo` I noticed something peculiar. The variable was getting set to +the value I expected, but then later it was getting set yet again to the undesired value. Turns out that the problem was that I had set +`logo` twice in the configuration file. Ugh.', + TO_TIMESTAMP(1409011200)::DATE, + TO_TIMESTAMP(1409011200)::DATE +) +, +( + 'Sideloading Nexus Devices with the Android SDK', + 'Android 5.0 "Lollipop" was released yesterday and I wanted to check it out on my Nexus 7 2013 WiFi tablet without having to wait for the update to be pushed. +I''ve done this several times with various Nexus devices now, but so infrequently that I always have to look up how to do it. So this time I''m taking +some notes. It should be noted that most of this information is just scraped from the `flash-all.{bat,sh}` included in the factory image. + +First off, Nexus factory images are listed [here](https://developers.google.com/android/nexus/images). Start off by pulling the proper +one down, verifying the integrity, and then extracting the tarball: + + ~ $ mkdir tmp && cd tmp && wget -q https://dl.google.com/dl/android/aosp/razor-lrx21p-factory-ba55c6ab.tgz + ~/tmp $ md5sum razor-lrx21p-factory-ba55c6ab.tgz + fd868b03bd00074dd7f70e31ad73b25a razor-lrx21p-factory-ba55c6ab.tgz + ~/tmp $ tar xf razor-lrx21p-factory-ba55c6ab.tgz + ~/tmp $ ls razor-lrx21p + bootloader-flo-flo-04.04.img flash-all.bat flash-all.sh flash-base.sh image-razor-lrx21p.zip + +To start the bootloader will need to be unlocked. This will wipe the data on the device, but once unlocked this is no longer an issue when flashing +in the future. Sideloading the image requires the [Android SDK platform tools](http://developer.android.com/tools/sdk/tools-notes.html). + +First thing''s first: get into the bootloader. Begin by plugging the tablet into the PC and verifying that it''s connected. + + ~/android-studio/sdk/platform-tools $ ./adb devices -l + List of devices attached + 0a16e983 device usb:1-1.2 product:razor model:Nexus_7 device:flo + +Now reboot into the bootloader: + + ~/android-studio/sdk/platform-tools $ ./adb reboot bootloader + +Once in the bootloader make sure the device is connected/detected: + + ~/android-studio/sdk/platform-tools $ sudo ./fastboot devices -l + 0a16e983 fastboot usb:1-1.2 + +If the bootloader is not already unlocked this will need to be done first (note: this wipes the device, so be sure to back things up beforehand). +Unlock the bootloader with the following command (follow the prompts on the device; it''ll warn about wiping the device clean): + + ~/android-studio/sdk/platform-tools $ sudo ./fastboot oem unlock + ... + (bootloader) Unlocking bootloader... + (bootloader) erasing userdata... + (bootloader) erasing userdata done + (bootloader) erasing cache... + (bootloader) erasing cache done + (bootloader) Unlocking bootloader done! + OKAY [ 65.559s] + finished. total time: 65.559s + +Now flash the bootloader image downloaded earlier: + + ~/android-studio/sdk/platform-tools $ sudo ./fastboot flash bootloader ~/tmp/razor-lrx21p/bootloader-flo-flo-04.04.img + sending ''bootloader'' (3911 KB)... + OKAY [ 0.192s] + writing ''bootloader''... + OKAY [ 1.936s] + finished. total time: 2.128s + +And reboot into the bootloader again: + + ~/android-studio/sdk/platform-tools $ sudo ./fastboot reboot-bootloader + rebooting into bootloader... + OKAY [ 0.006s] + finished. total time: 0.006s + +Next flash the zip image: + + ~/android-studio/sdk/platform-tools $ sudo ./fastboot -w update ~/tmp/razor-lrx21p/image-razor-lrx21p.zip + archive does not contain ''boot.sig'' + archive does not contain ''recovery.sig'' + archive does not contain ''system.sig'' + -------------------------------------------- + Bootloader Version...: FLO-04.04 + Baseband Version.....: none + Serial Number........: 0a16e983 + -------------------------------------------- + checking product... + OKAY [ 0.003s] + checking version-bootloader... + OKAY [ 0.004s] + sending ''boot'' (7154 KB)... + OKAY [ 0.347s] + writing ''boot''... + OKAY [ 0.420s] + sending ''recovery'' (7740 KB)... + OKAY [ 0.369s] + writing ''recovery''... + OKAY [ 0.297s] + erasing ''system''... + OKAY [ 1.510s] + sending ''system'' (799121 KB)... + OKAY [ 37.893s] + writing ''system''... + OKAY [ 35.392s] + erasing ''userdata''... + OKAY [ 23.679s] + formatting ''userdata'' partition... + Creating filesystem with parameters: + Size: 28856791040 + Block size: 4096 + Blocks per group: 32768 + Inodes per group: 8192 + Inode size: 256 + Journal blocks: 32768 + Label: + Blocks: 7045115 + Block groups: 215 + Reserved block group size: 1024 + Created filesystem with 11/1761280 inodes and 154578/7045115 blocks + sending ''userdata'' (139085 KB)... + writing ''userdata''... + OKAY [ 13.485s] + erasing ''cache''... + OKAY [ 0.406s] + formatting ''cache'' partition... + Creating filesystem with parameters: + Size: 587202560 + Block size: 4096 + Blocks per group: 32768 + Inodes per group: 7168 + Inode size: 256 + Journal blocks: 2240 + Label: + Blocks: 143360 + Block groups: 5 + Reserved block group size: 39 + Created filesystem with 11/35840 inodes and 4616/143360 blocks + sending ''cache'' (10984 KB)... + writing ''cache''... + OKAY [ 1.033s] + rebooting... + + finished. total time: 114.857s + +And now it''s finished. If the bootloader was already locked previously, then you can remove the `-w` flag in the last +command to avoid wiping the device (note: I''ve not tried this yet).', + TO_TIMESTAMP(1415836800)::DATE, + TO_TIMESTAMP(1415836800)::DATE +) +, +( + 'Flask Development on a Raspberry Pi', + 'Currently the [`flog`](http://bunkergate.org/git/flog "flog git repo") project requires lxml as a dependency. I had some issues pulling this in. + + ~ $ cd py_toy/ + ~/py_toy $ cat dependencies.txt + lxml + ~/py_toy $ virtualenv -p `which python3` venv + Already using interpreter /usr/bin/python3 + Using base prefix ''/usr'' + New python executable in venv/bin/python3 + Also creating executable in venv/bin/python + Installing setuptools, pip...done. + ~/py_toy $ . venv/bin/activate + (venv)~/py_toy $ time pip install -r dependencies.txt + [ output truncated ] + creating build/temp.linux-armv6l-3.4/src/lxml + + gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-3ikmlcvh/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.etree.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -w + + gcc: internal compiler error: Killed (program cc1) + + Please submit a full bug report, + + with preprocessed source if appropriate. + + See <https://github.com/archlinuxarm/PKGBUILDs/issues> for instructions. + + /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: ''bugtrack_url'' + + warnings.warn(msg) + + error: command ''gcc'' failed with exit status 4 + + ---------------------------------------- + Command "/root/py_toy/venv/bin/python3 -c "import setuptools, tokenize;__file__=''/tmp/pip-build-3ikmlcvh/lxml/setup.py'';exec(compile(getattr(tokenize, ''open'', open)(__file__).read().replace(''\r\n'', ''\n''), __file__, ''exec''))" install --record /tmp/pip-ytt52_hh-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/py_toy/venv/include/site/python3.4" failed with error code 1 in /tmp/pip-build-3ikmlcvh/lxml + + real 27m18.069s + user 26m55.390s + sys 0m11.620s + (venv)~/py_toy $ + +I was exhausting all 512 MB of memory. As a workaround, I temporarily employed a 512 MB swapfile on the SD card. + + (venv)~/py_toy $ sudo dd if=/dev/zero of=/swapfile bs=1M count=512 + 512+0 records in + 512+0 records out + 536870912 bytes (537 MB) copied, 132.228 s, 4.1 MB/s + (venv)~/py_toy $ sudo mkswap /swapfile + Setting up swapspace version 1, size = 524284 KiB + no label, UUID=c45c43c4-00dd-463b-a5ca-30ddeb0b102e + (venv)~/py_toy $ sudo chmod 600 /swapfile + (venv)~/py_toy $ sudo swapon /swapfile + (venv)~/py_toy $ time pip install -r dependencies.txt + Collecting lxml (from -r dependencies.txt (line 1)) + Using cached lxml-3.4.2.tar.gz + Building lxml version 3.4.2. + Building without Cython. + Using build configuration of libxslt 1.1.28 + Building against libxml2/libxslt in the following directory: /usr/lib + /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: ''bugtrack_url'' + warnings.warn(msg) + Installing collected packages: lxml + Running setup.py install for lxml + Building lxml version 3.4.2. + Building without Cython. + Using build configuration of libxslt 1.1.28 + Building against libxml2/libxslt in the following directory: /usr/lib + building ''lxml.etree'' extension + gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-8m8hfu47/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.etree.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -w + gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -L/usr/lib -L/usr/lib -lxslt -lexslt -lxml2 -lz -lm -lpython3.4m -o build/lib.linux-armv6l-3.4/lxml/etree.cpython-34m.so + building ''lxml.objectify'' extension + gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-8m8hfu47/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.objectify.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.objectify.o -w + gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro build/temp.linux-armv6l-3.4/src/lxml/lxml.objectify.o -L/usr/lib -L/usr/lib -lxslt -lexslt -lxml2 -lz -lm -lpython3.4m -o build/lib.linux-armv6l-3.4/lxml/objectify.cpython-34m.so + /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: ''bugtrack_url'' + warnings.warn(msg) + Successfully installed lxml-3.4.2 + + real 33m46.351s + user 32m43.210s + sys 0m16.700s + (venv)~/py_toy $ + +Success!', + TO_TIMESTAMP(1426824928)::DATE, + TO_TIMESTAMP(1426824928)::DATE +) +, +( + 'SSH Tunneling for Fun and Profit', + 'First, to test, set up temporary Python http server on the remote host: + + [user@remotehost ~]$ mkdir tmp && cd tmp + [user@remotehost tmp]$ echo "HELLO WORLD" > index.html + [user@remotehost tmp]$ python -m http.server 8080 # python3 + Serving HTTP on 0.0.0.0 port 8080 ... + [user@remotehost tmp]$ python -m SimpleHTTPServer 8080 #python2 + Serving HTTP on 0.0.0.0 port 8080 ... + + +Then on the localhost use ssh to set up a tunnel. Here port 8081 on the local machine will tunnel through to 8080 on the remote host: + + user@localhost ~ $ ssh -p 443 -f user@remotehost.com -L 8081:127.0.0.1:8080 -N + user@remotehost.com''s password: + +* `-p` for remote sshd port (default is 22). +* `-f` tells ssh to go into the background just before it executes the command. This is followed by the username and server you are logging into. +* The `-L` 8081:127.0.0.1:8080 is in the form of -L local-port:host:remote-port. Here the I''m using the loopback for the host, this refers to the remote host''s loopback interface. +* Finally the `-N` instructs OpenSSH to not execute a command on the remote system. + +Test the tunnel with telnet on local machine. + + user@localhost ~ $ telnet 127.0.0.1 8081 + Trying 127.0.0.1... + Connected to 127.0.0.1. + Escape character is ''^]''. + GET / + + HELLO WORLD + Connection closed by foreign host.', + TO_TIMESTAMP(1428316230)::DATE, + TO_TIMESTAMP(1428316230)::DATE +) +, +( + 'RPM Packaging Environment for an Arbitrary User', + 'Recently I had to roll my own package on CentOS 7. It''s been a while since I''ve done this and so I had to dig around online to remember how to set up an environment for packaging. So this time around I''ll jot down some notes. + +First thing''s first, to build as an arbitrary user we''ll need to set up a space for RPMs to be packaged in. Start by defining the location with this via the RPM Macro `_topdir`: + + [mcvady@centos7 ~]$ cat ~/.rpmmacros + %_topdir /home/mcvady/working/rpm + +Once set this value should be picked up immediately. Test the value from shell like so: + + [mcvady@centos7 ~]$ rpm --eval ''%_topdir'' + /home/mcvady/working/rpm + +Now create the RPM top-level directory: + + [mcvady@centos7 ~]$ mkdir -p `rpm --eval ''%_topdir''` # create RPM output directory + +Here''s a helper script I drop in `~/bin/` to flesh out the structure of the RPM packaging top-level directory (Note that `~/bin/` is automatically added to `$PATH` in the default `~/.bash_profile`): + + #!/bin/bash + + set -e + + RM_BIN="/usr/bin/rm" + RPM_BIN="/usr/bin/rpm" + MKDIR_BIN="/usr/bin/mkdir" + + rpmtopdir=`$RPM_BIN --eval ''%_topdir''` + + pushd $rpmtopdir 2>&1 > /dev/null + + $RM_BIN -rf BUILD/* + $RM_BIN -rf BUILDROOT/* + $RM_BIN -rf RPMS/* + $RM_BIN -rf SOURCES/* + $RM_BIN -rf SPECS/* + $RM_BIN -rf SRPMS/* + + $MKDIR_BIN -p BUILD + $MKDIR_BIN -p BUILDROOT + $MKDIR_BIN -p RPMS/x86_64 + $MKDIR_BIN -p SOURCES + $MKDIR_BIN -p SPECS + $MKDIR_BIN -p SRPMS + + popd 2>&1 > /dev/null + +And now to test that packaging works by packaging a project: + + [mcvady@centos7 ~]$ cd working/ + [mcvady@centos7 working]$ git clone http://git.bunkergate.org/chunker + Cloning into ''chunker''... + [mcvady@centos7 working]$ cd chunker/ + [mcvady@centos7 chunker]$ ./package.sh 0.9.1 + srcdir /home/mcvady/working/rpm/SOURCES + ~/working/chunker ~/working/chunker + rm -f chunker test-overflow test-cleanMarkerKeepLast test-handshake ./src/stats.o ./src/connection.o + -rw-rw-r-- mcvady/mcvady 3654 2015-05-13 15:59 chunker.spec + -rw-rw-r-- mcvady/mcvady 474 2015-05-13 15:59 INSTALL + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 lib/ + -rw-rw-r-- mcvady/mcvady 6551 2015-05-13 15:59 lib/dictionary.h + -rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz + -rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h + -rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a + -rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0 + -rw-rw-r-- mcvady/mcvady 2221 2015-05-13 15:59 makefile + -rwxrwxr-x mcvady/mcvady 1035 2015-05-13 15:59 package.sh + -rw-rw-r-- mcvady/mcvady 236 2015-05-13 15:59 README + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 src/ + -rwxrwxr-x mcvady/mcvady 3718 2015-05-13 15:59 src/chunker-init + -rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c + -rw-rw-r-- mcvady/mcvady 1066 2015-05-13 15:59 src/chunker.conf + -rw-rw-r-- mcvady/mcvady 2409 2015-05-13 15:59 src/chunker.h + -rwxrwxr-x mcvady/mcvady 2628 2015-05-13 15:59 src/chunker2s3.sh + -rw-rw-r-- mcvady/mcvady 98 2015-05-13 15:59 src/chunker_health-cron + -rwxrwxr-x mcvady/mcvady 969 2015-05-13 15:59 src/chunker_health.sh + -rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c + -rw-rw-r-- mcvady/mcvady 1325 2015-05-13 15:59 src/connection.h + -rw-rw-r-- mcvady/mcvady 5014 2015-05-13 15:59 src/stats.c + -rw-rw-r-- mcvady/mcvady 382 2015-05-13 15:59 src/stats.h + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 test/ + -rw-rw-r-- mcvady/mcvady 2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c + -rw-rw-r-- mcvady/mcvady 3159 2015-05-13 15:59 test/test-handshake.c + -rw-rw-r-- mcvady/mcvady 1923 2015-05-13 15:59 test/test-overflow.c + -rw-rw-r-- mcvady/mcvady 464 2015-05-13 15:59 TODO + ~/working/chunker + SPEC [/home/mcvady/working/rpm/SPECS/chunker_0.9.1.spec] + ~/working/rpm/SPECS ~/working/chunker + Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.FV0fiB + + umask 022 + + cd /home/mcvady/working/rpm/BUILD + + cd /home/mcvady/working/rpm/BUILD + + rm -rf chunker-0.9.1 + + /usr/bin/mkdir -p chunker-0.9.1 + + cd chunker-0.9.1 + + /usr/bin/gzip -dc /home/mcvady/working/rpm/SOURCES/chunker-0.9.1.tgz + + /usr/bin/tar -xvvf - + -rw-rw-r-- mcvady/mcvady 3654 2015-05-13 15:59 chunker.spec + -rw-rw-r-- mcvady/mcvady 474 2015-05-13 15:59 INSTALL + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 lib/ + -rw-rw-r-- mcvady/mcvady 6551 2015-05-13 15:59 lib/dictionary.h + -rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz + -rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h + -rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a + -rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0 + -rw-rw-r-- mcvady/mcvady 2221 2015-05-13 15:59 makefile + -rwxrwxr-x mcvady/mcvady 1035 2015-05-13 15:59 package.sh + -rw-rw-r-- mcvady/mcvady 236 2015-05-13 15:59 README + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 src/ + -rwxrwxr-x mcvady/mcvady 3718 2015-05-13 15:59 src/chunker-init + -rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c + -rw-rw-r-- mcvady/mcvady 1066 2015-05-13 15:59 src/chunker.conf + -rw-rw-r-- mcvady/mcvady 2409 2015-05-13 15:59 src/chunker.h + -rwxrwxr-x mcvady/mcvady 2628 2015-05-13 15:59 src/chunker2s3.sh + -rw-rw-r-- mcvady/mcvady 98 2015-05-13 15:59 src/chunker_health-cron + -rwxrwxr-x mcvady/mcvady 969 2015-05-13 15:59 src/chunker_health.sh + -rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c + -rw-rw-r-- mcvady/mcvady 1325 2015-05-13 15:59 src/connection.h + -rw-rw-r-- mcvady/mcvady 5014 2015-05-13 15:59 src/stats.c + -rw-rw-r-- mcvady/mcvady 382 2015-05-13 15:59 src/stats.h + drwxrwxr-x mcvady/mcvady 0 2015-05-13 15:59 test/ + -rw-rw-r-- mcvady/mcvady 2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c + -rw-rw-r-- mcvady/mcvady 3159 2015-05-13 15:59 test/test-handshake.c + -rw-rw-r-- mcvady/mcvady 1923 2015-05-13 15:59 test/test-overflow.c + -rw-rw-r-- mcvady/mcvady 464 2015-05-13 15:59 TODO + + STATUS=0 + + ''['' 0 -ne 0 '']'' + + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + + exit 0 + Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.MTVkPK + + umask 022 + + cd /home/mcvady/working/rpm/BUILD + + cd chunker-0.9.1 + + make chunker + gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o + gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o + gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser + + exit 0 + Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.BluP5U + + umask 022 + + cd /home/mcvady/working/rpm/BUILD + + ''['' /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 ''!='' / '']'' + + rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + ++ dirname /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + + mkdir -p /home/mcvady/working/rpm/BUILDROOT + + mkdir /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + + cd chunker-0.9.1 + + rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + + make PFX=/home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 install + gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o + gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o + gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser + install -m 775 chunker /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin + install -m 755 ./src/chunker-init /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc/init.d/chunker + install -m 644 ./src/chunker.conf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc + install -m 755 ./src/chunker2s3.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts + install -m 755 ./src/chunker_health.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts + install -m 644 ./src/chunker_health-cron /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts + + /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /home/mcvady/working/rpm/BUILD/chunker-0.9.1 + extracting debug info from /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin/chunker + dwz: Too few files for multifile optimization + /usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 1 CRC32s did match. + + /usr/lib/rpm/check-buildroot + + /usr/lib/rpm/redhat/brp-compress + + /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip + + /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 + + /usr/lib/rpm/redhat/brp-python-hardlink + + /usr/lib/rpm/redhat/brp-java-repack-jars + Processing files: chunker-0.9.1-1.el7.centos.x86_64 + Provides: chunker = 0.9.1-1.el7.centos chunker(x86-64) = 0.9.1-1.el7.centos config(chunker) = 0.9.1-1.el7.centos + Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh + Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 + Requires(pre): /bin/sh + Requires(post): /bin/sh + Requires(preun): /bin/sh + Requires(postun): /bin/sh + Requires: /bin/bash /bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.9)(64bit) rtld(GNU_HASH) + Processing files: chunker-debuginfo-0.9.1-1.el7.centos.x86_64 + Provides: chunker-debuginfo = 0.9.1-1.el7.centos chunker-debuginfo(x86-64) = 0.9.1-1.el7.centos + Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 + Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + Wrote: /home/mcvady/working/rpm/SRPMS/chunker-0.9.1-1.el7.centos.src.rpm + Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-0.9.1-1.el7.centos.x86_64.rpm + Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-debuginfo-0.9.1-1.el7.centos.x86_64.rpm + Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.vSpeIF + + umask 022 + + cd /home/mcvady/working/rpm/BUILD + + cd chunker-0.9.1 + + rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 + + exit 0 + ~/working/chunker + [mcvady@centos7 chunker]$ ls -Ahl chunker-0.9.1-1.el7.centos.x86_64.rpm + -rw-rw-r--. 1 mcvady mcvady 21K May 13 16:00 chunker-0.9.1-1.el7.centos.x86_64.rpm + +やった!', + TO_TIMESTAMP(1431212057)::DATE, + TO_TIMESTAMP(1431212057)::DATE +) +, +( + 'SQLite Cheat Sheet', + 'Some notes on using SQLite
+
+Opening a database
+
+ mcvady@b:/tmp$ sqlite3 sqlite.db
+
+Show tables
+
+ sqlite> .tables
+ seq name file
+ --- --------------- ----------------------------------------------------------
+ 0 main /tmp/sqlite.db
+ sqlite> .tables
+ acc globalblacklist purplemap
+ active_watchers grp re_grp
+ address htable rls_presentity
+ aliases imc_members rls_watchers
+ carrier_name imc_rooms sca_subscriptions
+ carrierfailureroute lcr_gw silo
+ carrierroute lcr_rule sip_trace
+ cpl lcr_rule_target speed_dial
+
+Describe a table
+
+ sqlite> .schema TABLENAME
+
+Create a table
+
+ sqlite> CREATE TABLE connection(connection_id BIGINT, username STRING);
+
+Insert into a table
+
+ sqlite> INSERT INTO connection (connection_id, username) VALUES (1, ''mcvady'');
+
+Dump output into a file
+
+ sqlite> .output SCHEMA_DUMP
+ sqlite> .schema
+
+Run SQL commands from file into a DB
+
+ $ sqlite3 sqlite3.db < schema.sql', + TO_TIMESTAMP(1444863580)::DATE, + TO_TIMESTAMP(1444863580)::DATE +) + +; diff --git a/tests.py b/tests.py new file mode 100755 index 0000000..384c304 --- /dev/null +++ b/tests.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +import json +import sys + +import requests + +BASE_URL = "http://localhost:8888" +POST_UUID = "2dc42f26-884e-4b10-abfb-4fd394aa9d62" +BAD_UUID = "00000000-0000-1111-0000-000000000000" +INVALID_UUID = "0" + + +def test_redirect(): + url = f"{BASE_URL}/asdf" + r = requests.get(url, allow_redirects=False) + + assert r.status_code == 301 + assert r.headers["Location"] == "/" + + +def test_html_get_post(): + url = f"{BASE_URL}/posts/{POST_UUID}" + r = requests.get(url) + assert r.status_code == 200 + text = r.text + assert "A Solid Breakdown of the Linux Font Rendering Stack" in text + assert "hinting and anti-aliasing" in text + + assert "Debugging CGI / CGit" not in text + + +def test_html_get_posts(): + url = f"{BASE_URL}/posts" + r = requests.get(url) + assert r.status_code == 200 + text = r.text + assert "A Solid Breakdown of the Linux Font Rendering Stack" in text + assert "hinting and anti-aliasing" in text + + assert "Debugging CGI / CGit" in text + + +def test_html_get_post_not_found(): + url = f"{BASE_URL}/posts/{BAD_UUID}" + r = requests.get(url) + assert r.status_code == 404 + text = r.text + + assert "Resource not found" in text + + url = f"{BASE_URL}/posts/{INVALID_UUID}" + r = requests.get(url) + assert r.status_code == 404 + text = r.text + + assert "Resource not found" in text + + +def test_json_get_post(): + url = f"{BASE_URL}/posts/{POST_UUID}" + r = requests.get(url, headers={"Accept": "application/json"}) + assert r.status_code == 200 + j = r.json() + post = j[0] + + assert len(j) == 1 + assert "A Solid Breakdown of the Linux Font Rendering Stack" == post["title"] + assert "hinting and anti-aliasing" in post["body"] + + +def test_json_get_posts(): + url = f"{BASE_URL}/posts" + r = requests.get(url, headers={"Accept": "application/json"}) + assert r.status_code == 200 + j = r.json() + + assert len(j) >= 1 + text = json.dumps(j) + assert "A Solid Breakdown of the Linux Font Rendering Stack" in text + assert "hinting and anti-aliasing" in text + + assert "Debugging CGI / CGit" in text + + +def test_json_get_post_not_found(): + url = f"{BASE_URL}/posts/{BAD_UUID}" + r = requests.get(url, headers={"Accept": "application/json"}) + assert r.status_code == 404 + j = r.json() + + assert "Resource not found" in j + + url = f"{BASE_URL}/posts/{INVALID_UUID}" + r = requests.get(url, headers={"Accept": "application/json"}) + assert r.status_code == 404 + j = r.json() + + assert "Resource not found" in j + + + +def main(): + for func in dir(sys.modules[__name__]): + if func.startswith("test_"): + globals()[func]() + + print("🏆 You're winner !") + + +if __name__ == "__main__": + main() |