カテゴリー: 技術メモ

  • Gerritの移行

    WebコンテンツもGerrit配下のgitリポジトリで管理していることから,Gerritを先に移行することにしました。H2データベースを使用していることから,以下の手順ではデータベースの移行が不要となっています。MySQL / PostgreSQL では,データベースの移行が必要と思われます。

    まず,gerrit2ユーザーを追加します。

    $ sudo adduser gerrit2
    $ sudo su gerrit2
    $ cd ~

    gerrit-2.7.warを取得します。

    $ wget http://gerrit-releases.storage.googleapis.com/gerrit-2.7.war

    旧サーバーで圧縮してコピーしたreview_siteフォルダを展開します。scpを使ったことがないので,WinSCP経由でのコピーをしました(笑)。

    $ tar zxvf review_site.tar.gz

    jreをインストールします。openjdk-7でOKでした。headlessの意味はよく分かりませんが,Ubuntuにサジェストされたものを使いました。

    $ sudo apt-get install openjdk-7-jre-headless

    gerritをインストールします。対話的に設定を聞かれますが,旧設定がデフォルトになっているので,そのままEnterキーを押していきます。 Java runtime だけ /usr/lib/jvm/java-7-openjdk-amd64 に変更する必要がありました。旧サーバーの設定はopenjdk-6でした。

    $ java -jar gerrit-2.7.war init -d review_site

    gerritはポート29418を使用するので,開けます。合言葉は,「にくよいな+1」(C)みやびさん,です。

    $ sudo ufw allow 29418/tcp

    gerritを開始します。

    $ cd review_site
    $ ./bin/gerrit.sh start
    Starting Gerrit Code Review: OK

    既にgerritに公開鍵を登録してあるクライアント(Windows PC)から接続を確認します。git bashで,

    $ ssh -p 29418 chitora@192.168.1.7 gerrit ls-projects

    known hostsへの追加の後,プロジェクトのリストが表示されて接続確認OKでした。

    リバースプロキシのapache側の設定は後日にします。

     

  • apacheの設定

    apacheはUbuntu Serverのインストール時に既に入ったようでしたので,設定だけ行いました。

    $ cd /etc/apache2/sites-available
    $ sudo cp default my_site
    
    $ sudo vi my_site
    
    <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName chitora.com
    
    DocumentRoot /var/www
    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    <Directory /var/www/>
    Options -Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>
    
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options -Indexes +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    
    $ sudo a2dissite default
    $ sudo a2ensite my_site
    

    変更点は,ServerNameの設定と,-Indexesの追加です。-Indexesで,ディレクトリ内容が表示されないようにします。

    apacheを再起動します。

    $ sudo /etc/init.d/apache2 restart

    ブラウザから開けない! と思ったら,ufwの設定を忘れていました。

    $ sudo ufw allow http

    無事にブラウザから開くことができました。

    apache

  • gitのインストール

    以前のUbuntuではgit-coreをインストールする必要があったようですが,現在(13.04)ではgitでOKでした。

    $ sudo apt-get install git
    $ git --version
    git version 1.8.1.2
  • ntpサーバー

    $ sudo apt-get install ntp
    $ sudo vi /etc/ntp.conf
    
    # more information.
    server ntp.nict.jp
    server ntp.nict.jp
    server ntp.nict.jp
    
    $ sudo /etc/init.d/ntp restart
    
    しばらくして,
    
    $ sudo ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *ntp-b3.nict.go. .NICT.           1 u  119  256  377   41.039   -5.353  10.750
    +ntp-a2.nict.go. .NICT.           1 u  135  256  337   44.075   -0.237  15.912
    +europium.canoni 193.79.237.14    2 u   20  256  377  285.417   -8.406  18.196
  • ダイナミックDNSの設定

    chitora.comのドメイン名は,バリュードメインのサービスで取得しています。回線がフレッツ 光ネクストで,固定IPアドレスではありません。このため,ダイナミックDNSの設定で,一定間隔でIPアドレスをバリュードメインに知らせる必要があります。今回は,この設定を行います。

    $ crontab -e
    no crontab for tadahiko - using an empty one
    
    Select an editor.  To change later, run 'select-editor'.
      1. /bin/ed
      2. /bin/nano        <---- easiest
      3. /usr/bin/vim.basic
      4. /usr/bin/vim.tiny
    
    Choose 1-4 [2]: 3

    初回なのでエディタの選択が出ました。vim.basicを選びました。

    # m h  dom mon dow   command
    0 0 * * * wget -O - 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=chitora.com&p=XXXXXXX&h=*' > /dev/null 2>&1

    毎日0時0分に,wgetでダイナミックDNS設定CGIにリクエストを送ります。

    wget~以降を実行して正常動作しましたので,旧サーバーのcrontabから削除しておわりです。

     

  • Ubuntu Server 13.04へのアップグレード

    12.10からのアップグレードですが,SSH経由のまま,

    $ sudo do-release-upgrade

    でおしまい。途中,「サービスをリスタートする?」にYESで問題なかった。不要なパッケージもどんどん削除。といっても,現時点ではインストールしたままで特にサービスを追加してないのだけど。

  • 自宅サーバーのリプレース

    2010年末から,HP ProLiant MicroServer N36L+Ubuntu Desktop 10.04で自宅サーバーを運用してきました。メインのサービスはGerritコードレビュー(含むGitレポジトリ)です。Ubuntuの最新は13.04なのですが,10.04からのアップグレード方法がよく分からず面倒だったので,サーバーをリプレースすることにしました。Node.jsを利用した多人数接続のサービスの開発も検討していて,マシンパワーも必要かな,という要求もありました。

    新サーバーは「とにかく安いものを」,ということでFUJITSU Server PRIMERGY TX100 S3にしました。OSレスモデルで,型番はPYT10PZD2Xです。Amazonで¥16,500-でした。ハードディスクがついてないと勘違いしてしまったので,WD Greenの2TBと,増設メモリKingstonの8GBも合わせて注文しました。サーバーと合わせて,計¥35,594-でした。9月17日に注文して,9月19日に全部届きました。

    From 品物

    巨大な梱包でやってきました。キーボード(必要ない)がネックかと思われます。開けると本体は普通の大きさです。

    From 品物

    側面を開けるとこのような内部です。近頃の筐体は,本当にメンテしやすくてよいと思います。2TBのハードディスクを接続しようと思った時点で,「あれ?ハードディスクがある!」と気がついたのでした。

    From 品物

    メモリも挿して,電源ONです。このマシンはVGA ミニD-Sub15ピンコネクタしか映像出力がなくて,居間のテレビしかつながらないので,居間での作業となりました。F2キーで無事BIOSメニューが起動しました。

    From 品物

    DVD-Rが無かったので,CD-Rに焼いておいたUbuntu Server 12.04を起動させます。13.04は700MBを越えていて,DVD-Rが必要でしたが家にメディアがありませんでした。インストール中は,ハードディスクが2台になったので,パーティショニングのところで少し悩みました。とりあえず勘で,2TBの方全体を/homeにしておきました。

    From 品物

    インストールが済んで,ブートです。

    From 品物

    ボケてしまいましたが,ログインプロンプトが出ました。

    From 品物

    インストール中,aptの更新あたりが失敗(タイムアウト)してる気配で,心配していたのですが,案の定pingが通りません。「イーサのケーブル,クロスだったかな?」「今はクロスでも自動認識だよな」と思いながらも,イーサケーブルを別の口に挿したところ,pingが通りました。下の2番の口が,eth0でした。

    From 品物
    $ sudo ufw enable
    $ sudo ufw allow ssh
    $ sudo shutdown -P now

    で電源を落とし,ディスプレイとキーボードを外して設置場所に置いてルーターと接続して,再び電源ONです。メインマシンからPuTTYでログインして,OKでした。

    Ubuntu 12.10に上げようと,

    $ sudo do-release-upgrade

    するのですが,最新といわれて出来ません。検索すると,「/etc/update-manager/release-upgrades」の「Prompt=lts」を「Prompt=normal」に変えるとのことで,それでうまくいきました。結構時間がかかったので,「艦これ」「Cookie Clicker」で遊んでました。更新が完了し,13.04は次の日にすることにして,寝ました。

     

  • lz4のヘッダがよく分からない件

    RealTime Data Compression: LZ4のv1.3.3で圧縮すると,下記のようにヘッダのマジックナンバーが「03 21 4C 18」となります。

    lz4

    t-mat/lz4mt · GitHubで圧縮すると,下記のように「04 22 4D 18」になります。

    lz4mt

    そして,相互に伸長できません。

    マスターソースをSource Checkout – lz4 – Extremely Fast Compression algorithm – Google Project Hostingからチェックアウトすると,lz4mtと同じヘッダになります。

    v1.3.3のソースは公開されていないようなので,Lhazはマスターソースベースで進めます。

  • はじめてのContribution

    google-gdataプロジェクトにContributeしてみました。

    拙作のLhaz+で「最終計画.xls」というファイルをGoogleドライブにアップロードしようとしたところ,プログレスバーが一瞬現れて消えるだけで,ファイルがまったくアップロードされませんでした。

    「最」という字に覚えがありました。Shift-JISで0x8DC5なのです。0xC5は「¥」でパスの区切りのため,0xC5が含まれる全角文字は問題を引き起こしやすいのです。

    「どうせそれが原因だろう」と,同じ0xC5の含まれる「十.txt」をアップロードしてみたところ,これはアップロードできてしまいました。

    そもそも,Lhaz+はユニコードビルドしているので,内部の文字コードはShift-JISではありませんでした。

    あれこれデバッグしてC#のクラスのメンバーをあちこち覗いているうちに,ArgumentException例外がSystem.Net.WebHeaderCollection.CheckBadCharsから投げられていることに気がつきました。

    検索すると,Googleグループで「世」の場合に同現象が起きているとの話がありました。しかし,示されている解決方法を試しても,解決しませんでした。

    仕方がないので既に取得してあったGoogle Data .NET Client Libraryのソースをsvn updateして,中を見始めました。といってもコールスタックの情報が得られていたので,原因箇所はすぐ判りました。

    HttpWebRequest.Headers.SetでHTTPリクエストヘッダに文字列を設定しているのですが,生文字列を設定しているのが原因でした。Uri.EscapeDataStringでエンコードするように修正してみたところ,バッチリ動作しました。「世」でも「最」でもアップロードできるようになりました。

    せっかくなのでIssuesに投稿したところ,3時間ほどで正式な修正をして頂けました。Utilities.EncodeSlugHeaderという違う関数でエンコードしていましたが,修正箇所は同じでした。

    また何か見つけたらPatchを投稿してみたいと思います。

  • C#でmp3ファイルを再生する

     

    C#でmp3再生がようやく出来ました。

    P/InvokeでmciSendCommandを使用します。

    大筋は,Creating a Sound Recorder in C and C# でOKです。

    自分がハマった点は,

    mciSendCommandの第4パラメータ(下記のparam)は,

    public static extern uint mciSendCommandW(uint deviceId, uint command, UIntPtr flags, IntPtr param);

    と,IntPtr型で定義し,Marshal.StructureToPtrで設定している点と,

        [STAThread]
        public static void Main()

    と Single Thread Apartment にしなければならない点でした。STAにしないと,MCIERR_CANNOT_LOAD_DRIVER(266)というエラーが返ります。

    フォームを使うとSTAになるらしいのですが,まだ試作でコマンドラインレベルのため,STAになっていないようでした。

    検索すると,外国の方がたいへん悩んだ様子があり,未解決のままになっているのですが,STAにするといいですよ。

    STAの件は,以前にC++/CLIでMP3再生した時にも同じハマリになったのですが,すっかり忘れていました。