Expat-IT Tech Bits

Home

Contact

Links

Search this site:

Categories:

/ (287)
  Admin/ (122)
    Apache/ (10)
      HTTPS-SSL/ (4)
      PHP/ (3)
      performance/ (2)
    Cherokee/ (1)
    LAN/ (4)
    LVM/ (6)
    Monitoring/ (2)
      munin/ (2)
    SSH/ (6)
    SSL/ (1)
    Samba/ (1)
    VPN-options/ (6)
      OpenVPN/ (1)
      SSH-Proxy/ (3)
      Tinc/ (1)
      sshuttle/ (1)
    backups/ (17)
      SpiderOak/ (1)
      backuppc/ (5)
      dirvish/ (1)
      misc/ (6)
      rdiff-backup/ (1)
      rsync/ (1)
      unison/ (2)
    commandLine/ (24)
      files/ (8)
      misc/ (10)
      network/ (6)
    crontab/ (1)
    databases/ (15)
      MSSQL/ (2)
      MySQL/ (8)
      Oracle/ (3)
      PostgreSQL/ (1)
    dynamicDNS/ (2)
    email/ (11)
      Dovecot/ (1)
      deliverability/ (1)
      misc/ (1)
      postfix/ (7)
      puppet/ (1)
    iptables/ (3)
    tripwire/ (1)
    virtualization/ (9)
      VMware/ (1)
      virtualBox/ (8)
  Coding/ (14)
    bash/ (1)
    gdb/ (1)
    git/ (3)
    php/ (5)
    python/ (4)
      Django/ (2)
  Education/ (1)
  Hosting/ (27)
    Amazon/ (18)
      EBS/ (3)
      EC2/ (10)
      S3/ (1)
      commandline/ (4)
    Godaddy/ (2)
    NearlyFreeSpeech/ (3)
    Rackspace/ (1)
    vpslink/ (3)
  Linux/ (30)
    Android/ (1)
    Awesome/ (3)
    CPUfreq/ (1)
    China/ (2)
    Debian/ (8)
      APT/ (3)
      WPA/ (1)
    audio/ (1)
    encryption/ (3)
    fonts/ (1)
    misc/ (6)
    remoteDesktop/ (1)
    router-bridge/ (3)
  SW/ (45)
    Micro$soft/ (1)
    browser/ (2)
      Chrome/ (1)
      Firefox/ (1)
    business/ (28)
      Drupal/ (9)
      KnowledgeTree/ (6)
      Redmine/ (2)
      SugarCRM/ (7)
      WebERP/ (2)
      WordPress/ (1)
      eGroupware/ (1)
    chat/ (1)
    email/ (1)
    fileSharing/ (2)
      btsync/ (1)
      mldonkey/ (1)
    graphics/ (2)
    research/ (2)
    website/ (6)
      blog/ (6)
        blosxom/ (3)
        rss2email/ (1)
        webgen/ (1)
  Security/ (15)
    IMchat/ (2)
    circumvention/ (2)
    cryptoCurrency/ (1)
    e-mail/ (4)
    greatFirewall/ (1)
    hacking/ (1)
    password/ (1)
    privacy/ (2)
    skype/ (1)
  Services/ (1)
    fileSharing/ (1)
  TechWriting/ (1)
  xHW/ (14)
    Lenovo/ (1)
    Motorola_A1200/ (2)
    Thinkpad_600e/ (1)
    Thinkpad_a21m/ (3)
    Thinkpad_i1300/ (1)
    Thinkpad_x24/ (1)
    USB_audio/ (1)
    scanner/ (1)
    wirelessCards/ (2)
  xLife/ (17)
    China/ (9)
      Beijing/ (5)
        OpenSource/ (3)
    Expatriation/ (1)
    Vietnam/ (7)

Archives:

  • 2016/07
  • 2016/05
  • 2016/02
  • 2016/01
  • 2015/12
  • 2015/11
  • 2015/06
  • 2015/01
  • 2014/12
  • 2014/11
  • 2014/10
  • 2014/09
  • 2014/07
  • 2014/04
  • 2014/02
  • 2014/01
  • 2013/12
  • 2013/10
  • 2013/08
  • 2013/07
  • 2013/06
  • 2013/05
  • 2013/04
  • 2013/02
  • 2013/01
  • 2012/12
  • 2012/10
  • 2012/09
  • 2012/08
  • 2012/07
  • 2012/06
  • 2012/05
  • 2012/04
  • 2012/03
  • 2012/01
  • 2011/12
  • 2011/11
  • 2011/10
  • 2011/09
  • 2011/08
  • 2011/07
  • 2011/06
  • 2011/05
  • 2011/04
  • 2011/02
  • 2010/12
  • 2010/11
  • 2010/10
  • 2010/09
  • 2010/08
  • 2010/07
  • 2010/06
  • 2010/05
  • 2010/04
  • 2010/03
  • 2010/02
  • 2010/01
  • 2009/12
  • 2009/11
  • 2009/10
  • 2009/09
  • 2009/08
  • 2009/07
  • 2009/06
  • 2009/05
  • 2009/04
  • 2009/03
  • 2009/02
  • 2009/01
  • 2008/12
  • 2008/11
  • 2008/10
  • 2008/09
  • Subscribe XML RSS Feed

    Creative Commons License
    This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
    PyBlosxom

    This site has no ads. To help with hosting, crypto donations are accepted:
    Bitcoin: 1JErV8ga9UY7wE8Bbf1KYsA5bkdh8n1Bxc
    Zcash: zcLYqtXYFEWHFtEfM6wg5eCV8frxWtZYkT8WyxvevzNC6SBgmqPS3tkg6nBarmzRzWYAurgs4ThkpkD5QgiSwxqoB7xrCxs

    Mon, 29 Jul 2013


    /Admin/commandLine/misc: Fingerprint a Public GPG Key

    This is particularly interesting in the context of RetroShare[1], and the prevention of Man-In-The-Middle (MITM) attacks:

    gpg --with-fingerprint file-containing-public-key.rsc

    Both sides of the key exchange should generate a fingerprint for both keys, and then compare the fingerprints over another communication channel (definitely NOT using RetroShare!).

    [1] http://retroshare.sourceforge.net/

    posted at: 02:42 | path: /Admin/commandLine/misc | permanent link to this entry

    Tue, 23 Jul 2013


    /Admin/commandLine/files: Find & process files & directories

    Find files ending in ".db", in and below the current directory:

    find . -name "*.db" -print | xargs /bin/ls -al
    find . -name "*.db" -print | xargs /bin/rm -f

    find . -name "*.mp3" -exec ls {} \;
    find . -name "*.mp3" -exec rm -f {} \; # remove files one at a time
    find . -name "*.mp3" -exec rm -f {} + # remove all files with one rm

    Files last modified more then thirty days ago, in a specified directory:

    find /home/userid/trash_* -mtime +30 -type f -exec rm -rf {} \;

    Remove empty directories:

    find /path/to/base/directory -type d -empty -delete

    Find files with a particular name:

    find . -type f -name "*unison.tmp-bad" -exec ls -alht {} \; | less

    Calculate the size of files found by "find":

    find . -type f -name "*unison.tmp-bad" -exec ls -l {} \; | awk '{ s+=$5 } END { print s }'

    posted at: 01:16 | path: /Admin/commandLine/files | permanent link to this entry

    Sun, 21 Jul 2013


    /Admin/commandLine/misc: Resuscitating A Damaged Hard Disk

    So my laptop received a pretty hard knock while being turned on, and a part of the disk was destroyed. Having gotten everything I could off the thing (I did not lose anything important) my thoughts now turn to "can I fix it". It is, after all, a newish 500G disk with a non-trivial price tag. Let's try:

    First put the thing in a USB enclosure, hook it up, and use your favorite partition editor to divide it into several partitions (I chose five 100G partitions). Then start testing the partitions one by one, with a read/write test, ie.:

    e2fsck -k -c -c /dev/sdb1
    dumpe2fs -b /dev/sdb1

    Remove any partitions that have errors. Then install Debian in the ones that are left, using LVM to stitch them all together. Wish me luck....

    posted at: 08:58 | path: /Admin/commandLine/misc | permanent link to this entry

    Thu, 18 Jul 2013


    /SW/business/Drupal: Drupal: How to Delete Users Without Content

    I run a community Drupal 6 site that allows anyone to register, and my MySQL dumps were starting to get pretty big. I just reduced the number of users from 105,121 to 98 by deleting all users who had contributed no content or comments. There seems to be no easy way to do this, so here is my way. It is a little complicated:

    mysql> select users.mail, node.title from users, node where users.uid=node.uid;

    will list all users with content, ie. a Drupal "node".

    mysql> select * from users where users.mail not in (select users.mail from users, node where users.uid=node.uid)

    will list all users WITHOUT content.

    mysql> select users.mail, comments.subject from users, comments where users.uid=comments.uid;

    will list all users who have made a comment, and....

    mysql> select * from users where users.mail not in (select users.mail from users, comments where users.uid=comments.uid);

    will list all users who have never made a comment. Now this

    mysql> select * from users where (users.mail not in (select users.mail from users, comments where users.uid=comments.uid)) and (users.mail not in (select users.mail from users, node where users.uid=node.uid));

    will display all users who have neither content nor comments, which would lead one to expect that this

    mysql> delete from users where (users.mail not in (select users.mail from users, comments where users.uid=comments.uid)) and (users.mail not in (select users.mail from users, node where users.uid=node.uid));

    would work. But no,

    ERROR 1093 (HY000): You can't specify target table 'users' for update in FROM clause

    Stupid, but true. Damn MySQL. So now we have to play rocket scientist to get it done, and create a temporary table of users we want to delete:

    mysql> CREATE TEMPORARY TABLE t select mail from users where (users.mail not in (select users.mail from users, comments where users.uid=comments.uid)) and (users.mail not in (select users.mail from users, node where users.uid=node.uid));

    And now finally delete the damn SPAMers (which would be the vast majority of this garbage):

    mysql> delete users from users join t on t.mail = users.mail;

    posted at: 02:31 | path: /SW/business/Drupal | permanent link to this entry

    Thu, 11 Jul 2013


    /SW/fileSharing/btsync: BitTorrent Sync

    Your own personal "dropbox". The puppet configuration below is for my personal convenience in deploying to multiple machines. BitTorrent Sync[1] is really easy to install and use without Puppet. On each machine you want to sync, just put the btsync in some convenient subdirectory, start it from within that directory, point your browser to http://localhost:8888/, and there tell it which directory to sync and what the shared "secret" is for that directory, and it should then just work for machines on the same network. Without further ado, here is my Puppet module:

    class btsync ($syncdir) {
    
        # BitTorrent Sync: setup of multiple nodes
        #
        # Note that because btsync is not yet packaged for Debian/Ubuntu, I am using
        # the sync directory to distribute new versions of btsync to the nodes. However,
        # this means the initial installation must be "primed" for a new installation:
        # place the btsync executable required on the new node in the sync directory, named
        # as "btsync_", ie. btsync_amd64 / btsync_i386 / btsync_x86_64 for most Linux people.
        #
        # Note that this configures all nodes with the same basic settings, but 
        # WITHOUT shares. You must login to the webUI at http://VPN-IP:8888/
        # and manually specify shares for each machine with this configuration.
        # This line
        #       "listen" : "<%= ipaddress_zentuxnet %>:8888"
        # in btsync.conf.erb is where I am setting the webUI listen restriction.
        # Replace with "0.0.0.0:8888" to allow connections from anywhere.
        #
        # btsync --generate-secret
    
        $btuser = 'btuser'
        $installdir = '/usr/local/btsync'
    
        user { $btuser:
            ensure => present,
        }
    
        file { "$installdir":
            ensure => directory,
            mode   => 740,
            owner  => $btuser,
            group  => $btuser,
            recurse => true,
            before => Exec['copybt'],
        }
        file { "$syncdir":
            ensure => directory,
            mode   => 640,
            owner  => $btuser,
            group  => $btuser,
            recurse => true,
        }
    
        # verify the latest version of btsync is installed (contained in the sync dir)
        exec { copybt:
            command => "cp $syncdir/btsync_$architecture $installdir/btsync",
            path   => "/usr/bin:/usr/sbin:/bin",
            unless => "diff $syncdir/btsync_$architecture $installdir/btsync >/dev/null",
            require => File["$syncdir"],
            notify => File["$installdir/btsync"],
        }
        file { "$installdir/btsync":
            ensure => file,
            mode   => 740,
            owner  => $btuser,
            group  => $btuser,
        }
        
        # configuration file for basic settings. Note that template is inserting
        # machine-specific values for:
        # * hostname
        # * webUI listen IP address (set to my VPN IP)
        file { "$installdir/sync.conf":
            ensure => file,
            mode   => 640,
            owner  => $btuser,
            group  => $btuser,
            require => File["$syncdir"],
            notify  => Service["supervisor"],
            content => template("btsync/sync.conf.erb"),
        }
        
        # supervisord because no init.d script. And keeps the thing running if it falls down.
        # Restart fails without the custom "restart" and the sleep period.
        package { 'supervisor': }
        service { 'supervisor':
            ensure     => running,
            restart    => "/etc/init.d/supervisor stop && sleep 3 && /etc/init.d/supervisor start",
            subscribe  => File['/etc/supervisor/conf.d/btsync.conf'],
            require => Package["supervisor"],
        }
        file { "/etc/supervisor/conf.d/btsync.conf":
            ensure => file,
            mode   => 640,
            owner  => root ,
            group  => root,
            require => Package["supervisor"],
            content => template("btsync/btsync.conf.erb")
        }
        
    }
    

    Two file templates are referenced, and can be downloaded from here:

    [1] http://labs.bittorrent.com/experiments/sync.html

    posted at: 03:18 | path: /SW/fileSharing/btsync | permanent link to this entry

    Sat, 06 Jul 2013


    /Linux/Debian/APT: Adding an Ubuntu PPA to Debian

    I seem to need to look this up once a year or so, so let's stop that. Add a line to /etc/apt/sources.list like this:

    deb http://ppa.launchpad.net/csoler-users/retroshare/ubuntu raring main

    You will need to tweak which version of Ubuntu to pull from, to correspond to your Debian version. After the first "apt-get update" there might be an error complaining about missing repository keys. Import as follows:

    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0AA42215

    where you get the last item from the error message. Re-run the update, and now (in this example) you can install retroshare.

    posted at: 05:40 | path: /Linux/Debian/APT | permanent link to this entry

    Tue, 02 Jul 2013


    /Admin/commandLine/misc: Web Page to HTML

    Especially when the page runs off the screen and a screenshot just will not do the job:

    wkhtmltopdf http://blog.langex.net/ /tmp/webpage.pdf

    And really useful for those of us whose primary CV is a web page.

    posted at: 02:07 | path: /Admin/commandLine/misc | permanent link to this entry