aboutsummaryrefslogtreecommitdiff
path: root/db/data.sql
blob: f1c426dd2ac49e13f56b2f9c2a1602a72e470762 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718

INSERT INTO entries (
    id,
    -- draft,
    title,
    body,
    created_at,
    updated_at
)
VALUES

(
    'd1bd1918-4cc3-425f-ad83-13f58300301a',
    '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',
    '2011-04-26 00:00:00',
    '2011-04-26 00:00:00'
)
,
(
    '6d011855-6b0d-4202-a243-4d9db9807f14',
    '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.',
    '2011-04-26 00:00:00',
    '2011-04-26 00:00:00'
)
,
(
    '045b62f8-6763-44e5-9859-976b5783725a',
    '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''

やった!',
    '2013-08-11 00:00:00',
    '2013-08-11 00:00:00'
)
,
(
    '4cc0c8a1-50a7-4896-9ff7-4bd1e5f93468',
    '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.',
    '2014-08-21 00:00:00',
    '2014-08-21 00:00:00'
)
,
(
    '7b9ab699-5cf6-4f3f-9ac8-b3cece0732a8',
    '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.',
    '2014-08-26 00:00:00',
    '2014-08-26 00:00:00'
)
,
(
    '8f681716-6eed-4f26-868c-f334377dfe12',
    '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).',
    '2014-11-13 00:00:00',
    '2014-11-13 00:00:00'
)
,
(
    '6e574a3a-b5bd-4457-afa6-9d41a5b4b3bf',
    '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!',
    '2015-03-20 00:00:00',
    '2015-03-20 00:00:00'
)
,
(
    '7d5c1e2f-f54f-471a-8cd7-e0c05abc3285',
    '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.',
    '2015-04-06 00:00:00',
    '2015-04-06 00:00:00'
)
,
(
    '2a8620f0-1a88-4732-9386-8515f65ae671',
    '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

やった!',
    '2015-05-09 00:00:00',
    '2015-05-09 00:00:00'
)
,
(
    'b2fa3458-5457-4ade-8ce4-bd973bce7da5',
    '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',
    '2015-10-14 00:00:00',
    '2015-10-14 00:00:00'
)
,
(
    '28110e5f-fba9-47a2-9d0d-4658bb31e5ba',
    'Hello Markdown + MermaidJS!',
    '```mermaid
sequenceDiagram
    participant Alice
    participant Bob
    Alice->>John: Hello John, how are you?
    loop Healthcheck
        John->>John: Fight against hypochondria
    end
    Note right of John: Rational thoughts<br/>prevail...
    John-->>Alice: Great!
    John->>Bob: How about you?
    Bob-->>John: Jolly good!
```',
    '2023-04-12 18:20:35.031413',
    '2023-04-12 18:20:35.031413'
)

;