aboutsummaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorMichael McVady <femtonaut@gmail.com>2023-01-05 13:24:22 -0600
committerMichael McVady <femtonaut@gmail.com>2023-01-05 13:24:22 -0600
commita3660adb90fd7c488f9d7baa0350bb4e2301ccb9 (patch)
treef4c9566bf1ec923c31b09b4b65b4bfb1943dc82f /db
parente4ca47cc71bb64d724db3479406d381edc9661bc (diff)
Add tests and test data
Diffstat (limited to 'db')
-rw-r--r--db/data.sql686
1 files changed, 686 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
+)
+
+;