自作PCにArch linuxをインストール

GPTパーティション、UEFIで起動させる
自作PCにArch linuxをインストール
GPTパーティション、UEFIで起動させる
#表示はrootでの操作、$はリモートPCから一般ユーザの操作。

PCにインストールCD入れて CDから起動するが、
ブートメニューではUEFI モードのCD Driveから起動

シェルが出てきたら

# passwd

でrootのパスワード入力

# ip addr

でPCのプライベートIPアドレスが取得されていることを確認

# systemctl start sshd

以上がインストール先のPC上での作業。後はメインのPC (ここではMac)のターミナルから作業開始

$ ssh root@[先ほどのプライベートIPアドレス]
# ls -l /sys/firmware/efi
total 0
drwxr-xr-x  2 root root    0 Aug 23 08:27 efivars/
-r--------  1 root root 4096 Aug 23 08:32 systab
drwxr-xr-x 99 root root    0 Aug 23 08:32 vars/

のように何か表示されたらEFIモードで起動している。

# lsblk
NAME              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                 8:0    0 139.8G  0 disk 
├─sda1              8:1    0   100M  0 part 
├─sda2              8:2    0   128M  0 part 
└─sda3              8:3    0 139.5G  0 part 
sdb                 8:16   0   2.7T  0 disk 
├─sdb1              8:17   0   128M  0 part 
└─sdb2              8:18   0   2.7T  0 part 
sdc                 8:32   0 279.5G  0 disk 
├─sdc1              8:33   0   512M  0 part 
└─sdc2              8:34   0   279G  0 part 
sr0                11:0    1 522.3M  0 rom  /run/archiso/bootmnt
loop0               7:0    0 226.4M  1 loop /run/archiso/sfs/root-image
loop1               7:1    0   1.5G  1 loop 
└─arch_root-image 254:0    0   1.5G  0 dm   /
loop2               7:2    0   1.5G  0 loop 
└─arch_root-image 254:0    0   1.5G  0 dm   /

この様に階層表示で接続されているHDDなどが表示されるので、インストール先のHDDの
デバイス表示を確認。

# cgdisk /dev/sdc

cgdiskパーティションを作成するが、
/dev/sdc1 boot linux partition
/dev/sdc2 efi FAT32でフォーマットし EFI boot partitionとする
/dev/sdc3 / linux partition

一番上のfree スペースはMBR領域であるが、EFIブートなのでfreeのままにしておく。
efi boot partitionはタイプをef02にすると EFI partitionになる。

# mkfs.vfat -F32 /dev/sdc2 
# mkfs.ext4 /dev/sdc1 && mkfs.ext4 /dev/sdc3
# mount /dev/sdc3 /mnt
# mkdir /mnt/boot
# mount /dev/sdc1 /mnt/boot
# mkdir /mnt/boot/efi
# mount /dev/sdc2 /mnt/boot/efi
# nano /etc/pacman.d/mirrorlist

control+w でJapanを検索。 行頭の数字を 0,1に変更して日本のダウンロードサイトを優先させる。

# pacstrap -i /mnt base vim openssh grub efibootmgr os-prober
# genfstab -U -p /mnt >> /mnt/etc/fstab
# arch-chroot /mnt /bin/bash
# vim /etc/locale.gen

en_US.UTF-8とJa_JP.UTF-8の行頭をアンコメントする。

# locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done15
Generation complete.
# echo LANG=en_US.UTF-8 > /etc/locale.conf
# echo KEYMAP=jp106 > /etc/vconsole.conf
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc
# echo Arch >  /etc/hostname

sshdの起動をセットしたらmkinitcpio,パスワードの設定してブートローダのインストール。

# systemctl enable sshd.service
# mkinitcpio -p linux
# passwd 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
#grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

ネットワークの設定はbeginnersに長々と書いてあるが、NetworkManager一発でOKっぽい。
NetworkManagerの日本語版wikiをみると
最後にNIC (Network Interface Controllers, ネットワークカード) を落として下さい。
と書いてあるが、この通りにやるとMacからのターミナル接続が切れてしまうので不要。
英語版にはこの記載なし。

# pacman -S NetworkManager
# systemctl enable NetworkManager.service
# exit

その後chrootを抜ける。

# umount /mnt/boot/efi
# umount /mnt/{boot,}
# shutdown -h now

アンマウントしてから、シャットダウン。rebootでも良い。CDは取り出すこと。

ShiftJIS エンコーディングのCSVファイルをnode.jsで読み込みしたい

 やりたいことはNode.jsと連携させるつもりのMongoDBにShiftJISエンコーディングのCSVファイルのデータを突っ込むこと。
MongoDBはファイルのタイプに関するオプション JSONとかCSVとか は存在するがencoding指定はないのでおそらくutf-8前提と思われる。
Node.jsからエンコーディング指定してファイルを読み込み、MongoDBのデータベースに書き込む設計とする。
node-csv-parserで郵便番号処理というページがヒット。
郵便番号辞書はShift_JISで公開されているので、ファイルエンコーディングは同じ。

npm install csv
npm install iconv

Raspberry piの最適化

swap fileの使用停止

# /etc/init.d/dphys-swapfile stop

GUI系のデーモンを削除

# apt-get remove --purge consolekit dbus

使用しないデーモンの自動起動をOff

# chkconfig triggerhappy off
# chkconfig alsa-utils off
# chkconfig lightdm off
# chkconfig motd off
# chkconfig plymouth off
# chkconfig ntp off

ntpdateパッケージをインストールし一時間ごとに時刻合わせを行うようにcronを設定

# aptitude install ntpdate
root@pi:/home/pi# crontab -e

# 1時間ごと(毎時0分)に、時刻合わせを行う


0 * * * * /etc/network/if-up.d/ntpdate > /dev/null 2>&1

raspberry pi に node.js ver0.8.20をインストール

sudo apt-get install nodejs

とやるとver0.6系が入るのでexpressが使えない。そこで、
http://www.e-ark.jp/2013/02/20/rails-on-raspberry-pi/
を参考にソースからビルド。

$ sudo apt-get install libssl-dev
$ wget http://nodejs.org/dist/v0.8.20/node-v0.8.20.tar.gz
$ tar xvf node-v0.8.20.tar.gz
$ cd node-v0.8.20
$ pico deps/v8/SConstruct

以下を編集。
‘gcc’: {
‘all’: {
‘CCFLAGS’: [‘$DIALECTFLAGS’, ‘$WARNINGFLAGS’, ‘-march=armv6’],
‘CXXFLAGS’: [‘-fno-rtti’, ‘-fno-exceptions’, ‘-march=armv6’],
},
のように-march=armv6を追加。

$ export CCFLAGS=’-march=armv6′
$ export CXXFLAGS=’-march=armv6′
$ ./configure
$ make
$ sudo make install

えらく時間が掛かるが(3時間弱?)、buildに成功したら
バージョンの確認

$ node -v
0.8.20
$ npm -v
1.2.11

npmもインストールされる。
最後にExpressも入れとこう。

sudo npm install -g express

サーバーサイドJavaScript環境node.jsその他もろもろ

まず node.jswebページからMacintosh Installerで
インストール。node.js本体とパッケージマネージャのnpmがインストールされる。nodeコマンドが使えるように環境変数を書き換え。

次にsocket.ioとsqlite3をnode.jsから使えるようにnpmでインストール。

npm install sqlite3
npm install socket.io

ターミナルから

$ node
> require("sqlite3")
> require("socket.io")

とやってそれぞれの内容が表示されたらインストール終了。

使いこなせるかどうか分からんが、Node.jsと相性が良いとされるmongoDBとそのラッパであるmongooseも入れておくか。express、kockout.jsも。

$ brew install mongodb
$ npm install mongoose
$ sudo npm install -g express

expressは -g オプションを付けてグローバルインストール。
knockout.jsはインストール作業と言うよりも、webアプリのrootディレクトリにでも突っ込んで

<script type='text/javascript' src='knockout-2.2.1.js'></script>

とやればいいだけ。当面の目標であるデータのグリッド表示(Excelみたいな)を実現するためにKoGridも使ってみよう。

git clone https://github.com/ericmbarnard/KoGrid.git

google calendarから日本の祝日のリストを取得する

前回の投稿でholidayというクラスを定義したコードをポストしたが、こちらはタプルのリストで書き直してみた。

# coding: utf-8
import datetime
import httplib2
import urllib
from xml.dom import minidom
from xml.dom.minidom import parseString
     
def get_japan_holiday(start,days,rg):
    """
    start :いつから dateオブジェクトで渡す
    days:調べたい期間を 日数で渡す
    rg:listで返ってくる祝日の要素数 
        大きくするとgoogleがエラーを返すのか? 未確認
    """
    end = start + datetime.timedelta(days)
    host = "http://www.google.com/calendar/feeds/"
    user = "ja.japanese%23holiday@group.v.calendar.google.com"
    param = "/public/full"
    val = {"start-min" : start.strftime("%Y-%m-%d"),
    "start-max" : end.strftime("%Y-%m-%d"),
    "max-results" : str(rg)}
    http = httplib2.Http()
    url = "%s%s%s?%s" % (host, user, param, urllib.urlencode(val))
    response,content = http.request(url) #返値には responseが必要
    xdoc = minidom.parseString(content)
    elements = xdoc.getElementsByTagName("entry")
    holidays = []
    for element in elements:
        day = holiday_name = ''
        for child in element.childNodes:
            if child.tagName == 'gd:when':
                day = child.getAttribute('startTime')
                d = day.split('-')
                date = datetime.date(int(d[0]),int(d[1]),int(d[2]))
            if child.tagName == "title":
                holiday_name = child.firstChild.data

        holidays.append((date,holiday_name))
        
    sorted_holidays = sorted(holidays,
            key=lambda holiday:(holiday[0].year,holiday[0].month,holiday[0].day))
 
    return sorted_holidays

if __name__=="__main__":
    now = datetime.datetime(2013,1,1)
    for holiday in get_japan_holiday(now,365*2,100):
        print holiday[0].isoformat() + ' ' + holiday[1]

google calendar から 祝日のリストを取得する

今作成中のwebアプリで、祝日のリストが必要。厳密にやると、春分の日と秋分の日が、年に依って変化してしまうダメダメな日本の法律。仕方がないので、google様にお世話になる。以下はgoogle calendarから祝日の日付と名前をlist形式にして返すpythonのコード。

# coding: utf-8
import datetime
import httplib2
import urllib
from xml.dom import minidom
#from xml.dom.minidom import parseString

class Holiday:
    def __init__(self,date_string,name):
        self.date_string = date_string
        self.name = name
        d = date_string.split('-')
        self.date = datetime.date(int(d[0]),int(d[1]),int(d[2]))
    def __repr__(self):
        return self.date_string + ' ' + self.name

def get_japan_holiday(start,days,range):
    """
    start :いつから datetimeオブジェクトで渡す
    days:調べたい期間を 日数で渡す
    range:listで返ってくる祝日の要素数 
   大きくするとgoogleがエラーを返すのか? 未確認
    """
    end = start + datetime.timedelta(days)
    host = "http://www.google.com/calendar/feeds/"
    user = "ja.japanese%23holiday@group.v.calendar.google.com"
    param = "/public/full"
    val = {"start-min" : start.strftime("%Y-%m-%d"),
    "start-max" : end.strftime("%Y-%m-%d"),
    "max-results" : str(range)}
    http = httplib2.Http()
    url = "%s%s%s?%s" % (host, user, param, urllib.urlencode(val))
    response,content = http.request(url)
    #print parseString(content).toprettyxml(encoding="utf-8")
    xdoc = minidom.parseString(content)
    elements = xdoc.getElementsByTagName("entry")
    holidays = []
    for element in elements:
        day = holiday_name = ''
        for child in element.childNodes:
            if child.tagName == 'gd:when':
                day = child.getAttribute('startTime')
            if child.tagName == "title":
                holiday_name = child.firstChild.data
        holidays.append(Holiday(day,holiday_name))
        
    sorted_holidays = sorted(holidays,key=lambda holiday:(holiday.date.year,holiday.date.month,holiday.date.day))

    return sorted_holidays

if __name__=="__main__":
    now = datetime.datetime(2013,1,1)
    print get_japan_holiday(now,365*2,100)

Python + Pyramid1.4 のチュートリアル

MacOS X 10.8.3上でテスト。python 2.7はインストールされているから、ターミナルで

$python
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

で確認。次にvirtualenv,vertualenvwrapperをインストール。
その後、pyramidという仮想環境を作り、

$ workon pyramid
$ easy_install pyramid

で仮想環境に入ってから、pyramid1.4がインストールされる。eclipseで編集予定なのでworkspaceディレクトリに入り、
Pyramidのframeworkを解説しているのOn Unixのコマンドをターミナルから実行する。
test.pyを実行するためには、easy_install nose WebTestもやっておく。
サーバーを起動させるにはreloadオプションをつけ、

$pserve development.ini --reload
$pcreate -s alchemy tutorial
$python setup.py test -q
$nosetests --cover-package=tutorial --cover-erase --with-coverage
$initialize_tutorial_db development.ini

eclipseのNew Project->PyDevProject Project名はTutorial
(projectのルートディレクトリ名と同じ名前にすれば階層構造維持して読み込まれる)

アプリケーションの実行はターミナルから

pserve development.ini --reload

OpenCVを使う

仕事で画像処理を行うこととなり、画像処理ライブラリをインストールするための備忘録。ライブラリはOpenCVを使う。

まずffmpegをダウンロード。ダウンロードしたディレクトリにcdしてターミナルから
./configure
make
make install

次にOpenCVのmakeの際に、cmakeが必要なので、cmakeをインストール。

http://www.cmake.org/cmake/resources/software.html

からcmake-2.8.9-Darwin64-universal.dmgをダウンロードし、インストール。

最後にOpenCVをダウンロード。解凍し、開発用ディレクトリに移してから、releaseディレクトリを作り、cmakeを起動、Browse SourceでOpenCVディレクトリを指定、Browse Buildにはreleaseディレクトリを指定。

ConfigureボタンでXcodeを指定、コンパイラはUse default native…

Generateボタンクリック。エラーなしで終わったら、OpenCV/releaseディレクトリに移動。
xcodeプロジェクトを起動。
32/64bit環境で使いたいので、 ArchitecturesはStandard(32/64-bit intel)、Valid Architecturesはi386,x86_64でbuild。OpenCV/release/libディレクトリにライブラリが出来るので、使いたいプロジェクトTARGETSを選択、Link Binary With Librariesに該当ライブラリをDrag&Drop。