2012年4月28日土曜日

Ubuntu 12.04入れてみていくつか

Ubuntu 12.04入れてみました。
ネイティブで11.10が動いているもののアップグレードと、
VirtualBox上にクリーンインストールと。

気付いた点を何点か。

まず11.10からのアップグレードの方。
  • アップグレードの場合、まずパッケージファイルをダウンロードした後に
    一つずつインストールされていきますが、
    私の場合そのインストール中にウィンドウやランチャーなどが消え
    壁紙だけの状態になってしまいました。

    やむなく電源を落として再起動したところ、途中で固まってしまう状態に。

    解決策は、grubで古いカーネルのリカバリモードを選択して起動し、
    そこからdpkgを選択してインストールの続きを行うこと。
    設定ファイルが修正されていて、残すか上書きするかを聞いてきたりしたときは
    見づらいですが頑張って読みましょう。 
   それ以外は特になし。

次に12.04のクリーンインストールの方。
  • ランチャーをAuto hideにするとうまく動作しません。
    マウスカーソルを左端に持っていっても表示されません。
    http://ubuntuforums.org/showthread.php?t=1965991

    どうやらバグのようです(ちなみに11.10からアップグレードした方は普通に大丈夫)。
    修正を待ちましょう。
  •  フォントの変更がデフォルトではできません。
    gnome-tweakをインストールします。
  • こっちの環境では英語キーボードを使っていて、Alt+「`」でiBusのon/off切り替えをするのですが
    デフォルトだと「同じアプリ内のウィンドウのスイッチ」として動作してしまいます。
    1. System Settings...から
    2. [Keyboard]-[Shortcuts]-[Navigation]と辿り、
    3. [Switch Windows of an application]がデフォルトで[Disabled]となっているのですが、
      一度それに何か適当なショートカットキーを割り当て、削除します。
      これで解決。

  • 開発にAptana Studio 3を使っているのですが、
    ダウンロードして展開してaptana_studio_3を起動しても
    ランチャー上で固定できません。
    解決策として、
  1. alacarte を起動
  2. Programmingを選択して「New Item」をクリック
  3. メニュー項目の設定をして保存する
  4. dash homeから3.で作った項目を検索し、クリックして実行する
  5. ランチャーに出てきたアイコンを固定する
とするのが楽。

Ubuntuにmecab+groonga+mroongaをソースからインストール

Ubuntuにmecab+groonga+mroongaをソースからインストールする。

mroongaのサイトにある手順ではリポジトリ追加してapt-get install、で
それはもう簡単にインストールできたのですが
その後mysqlがアップデートされたらうまく動かなくなってしまったので
ひと通りソースからビルドしました。

以下はバイナリやライブラリは/usr/bin/,/usr/lib/など、
confは/etc/に配置する手順です。
  1. ビルドに必要なものをインストール
    sudo apt-get install build-essential
    sudo apt-get install libtool
    sudo apt-get install autoconf
    sudo apt-get install apt-src
    sudo apt-get install libmysqlclient-dev
  2. mecabをビルドしてインストール

    http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#download
    ここからのリンクでソースをゲット。
    今はmecab-0.993.tar.gzでした。
    tar zxf mecab-0.993.tar.gz
    cd mecab-0.993
    ./configure --prefix=/usr \
        --sysconfdir=/etc \
        --with-charset=utf8
    make
    sudo make install
    sudo ldconfig
  3. mecabの辞書をビルドしてインストール

    上のリンク先の「IPA辞書」をダウンロード。
    今はmecab-ipadic-2.7.0-20070801.tar.gzでした。
    tar zxf mecab-ipadic-2.7.0-20070801.tar.gz
    cd mecab-ipadic-2.7.0-20070801
    ./configure --prefix=/usr \
        --sysconfdir=/etc \
        --with-charset=utf8
    make
    sudo make install
  4. groongaをビルドしてインストール

    https://github.com/groonga/groonga/tags
    から、タグ振ってあるものをダウンロード。
    今回はgroonga-groonga-v2.0.1-0-g700532f.tar.gz
    というファイル名でダウンロードしました。
    tar zxf groonga-groonga-v2.0.1-0-g700532f.tar.gz
    cd groonga-groonga-4627bd1
    ./autogen.sh
    ./configure --prefix=/usr \
        --sysconfdir=/etc \
        --with-default-encoding=utf8
    make
    sudo make install
    sudo ldconfig
  5. mroongaをビルドしてインストール

    mysqlのソースをaptでゲット。
    apt-src install mysql-server
    今回はmysql-5.1-5.1.62というディレクトリにソースが落ちました。

    https://github.com/mroonga/mroonga/tags
    から、タグ振ってあるものをダウンロード。
    今回はmroonga-mroonga-v2.01-0-g8378adf.tar.gz
    というファイル名でダウンロードできました。
    tar zxf mroonga-mroonga-v2.01-0-g8378adf.tar.gz
    cd mroonga-mroonga-1bfcbe2
    ./autogen.sh
    ./configure --prefix=/usr \
        --sysconfdir=/etc \
        --with-mysql-source=$PWD/../mysql-5.1-5.1.62 \
        --with-mysql-config=/usr/bin/mysql_config \
        --with-default-parser=TokenMecab
    make
    sudo make install
  6. apparmorの設定を変更

    ubuntuではmysqldの動きはapparmorで制限されていて、
    このままではMecabの辞書もgroongaの設定ファイルも参照できないので、
    アクセス出来るように設定を追加します。

    以下の内容のファイルを作成します。
    /etc/apparmor.d/abstractions/mysql-server-mroonga
    /usr/lib/groonga/plugins/ r,
    /usr/lib/groonga/plugins/** rm,
    /etc/mecabrc r,
    /usr/lib/mecab/ r,
    /usr/lib/mecab/** r,
    以下のファイルに、追記します。
    /etc/apparmor.d/local/usr.sbin.mysqld
    #include <abstractions/mysql-server-mroonga>
  7. mysqlにプラグインを登録

    mysqlにログイン。
    mysql -uroot -p
    password:
    プラグイン登録。
    mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
    funtionの登録。
    mysql> CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname 'ha_mroonga.so';
 以上で、動くようになりました。

この情報は2012/04/26頃の情報です。

2012年4月11日水曜日

ubuntu oneがうまくアップロードされなくなった場合(ubuntu)

以前のエントリでUbuntu OneのWindows版クライアントが
うまく動作しなくなった場合の対策を書いたが、
Ubuntuの方もファイルがあるのにうまくアップロードされていない、という現象がたまに起きる。

自宅で書いたサンプルコードをUbuntu Oneディレクトリ内にgit pushして、
翌日やる気満々で職場のPCでpullしてobjectファイルが無い、と出ると
かなり精神的ダメージがでかい。

Windows版の対策と同じような処理をするのは
こんなシェルスクリプトでいけそう。

u1refresh.sh
#!/bin/bash
u1sdtool -q
rm ~/.local/share/ubuntuone/syncdaemon/tritcask/*
u1sdtool --start

実行後しばらく待つと、再度同期が始まる。はず。

ご利用は自己責任で。

2012年4月8日日曜日

FireFoxをTLSv1で繋がせる

FireFox11.0でhttpsで通信すると、SSLv3で接続される。

何が問題かというと、
SSLサーバをVirtualHostでリバースプロキシしているところにアクセスしようとしたとき。
Client Helloの時にサーバ名が渡されないので、
アクセスしようとしているVirtualHostで設定している証明書が渡されず、
エラーとなってしまう。
ChromeだとOK。

サーバ側の設定で何とかできないか調べたけど結局良く分からない。
とりあえずWorkaroundとしてはこれ。
https://addons.mozilla.org/en-US/firefox/addon/force-tls/
Force TLSというアドオンを入れ、URLを設定する。
これでひとまずはエラーが出ないようになる。

2012年4月6日金曜日

Django+MySQL+Cast as SIGNED INTEGERでTruncated incorrect INTEGER valueでUnicodeEncodeErrorなところから逃げ延びる

Django+MySQLで、unicodeの全角文字と数字が混じった列のdistinctな一覧を
【数字の昇順】→「文字順」で取得したい。
単純に文字順にしてしまうのは 1,10,11,2,3,4 になるのでだめなパターン。

QuerySet APIの distinct はPostgreSQLでしかサポートされていないので、
DBのViewを書いた。

create view app_view1 as
select distinct col1,
    case when length(col1) = 0 then 0
                when cast(col1 as UNSIGNED INTEGER) > 0 then cast(col1 as UNSIGNED INTEGER)
                else 2147483647 end as sort
from table1

ちなみに本題とはあまり関係ないけどModelはこんな感じ。
class View1(models.Model):
    col1 = models.CharField(max_length=10,blank=True,primary_key=True)
    sort = models.IntegerField()
    class Meta:
        app_label="app"
        ordering=["sort","col1"]
        managed=False
文字はsortを十分に大きくしておいた上でsort昇順→col1昇順にすればいいはず。

MySQL Workbenchからだとゴキゲンに動作する。

実際に実行する。タイトルのような文字列を叫んで憤死する。

原因としては、実際にはMySQL内で実行した際にcastで「Truncated incorrect INTEGER value:'【文字列】'」というwarningが出ており、
それをMySQLdbモジュールが拾おうとしてしまって、【文字列】部分がUnicodeになっているせいでUnicodeEncodeErrorになるという
余計な事すんなよというもの。

何とかする方法を考える。
・MySQLdbをいじる(UnicodeEncodeErrorを吐かないようにする)→できればやりたくない
・Djangoをいじる(warningを拾わないようにする)→できればやりたくない
・継承で何とかする→djangoのdb backendを作れば何とか出来るんだろうができればやりたくない
・MySQLでWarningを出さないようにできないか→MySQL Suppress Warningとかでググる。死屍累々。
・あきらめてPython上で並べ替えをする→今回はいいがこんな感じので大量のデータに対してやろうとしたらどうするよ

SQLに立ち戻る。
要は数字だけ以外の場合に、CASTさえしなければよい。

MySQLにはREGEXPがあった。
create view app_view1 as
select distinct col1,
    case when length(col1) = 0 then 0
                when col1 REGEXP '^[[:digit:]]+$' then cast(col1 as UNSIGNED INTEGER)
                else 2147483647 end as sort
from table1

何とか逃げ延びた。

MySQLでSELECT時に連番生成

OracleでいうROWNUM()みたいなやつがやりたい。

アドホッククエリとしては、こうすればできるっちゃできる。
SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, table1 t;

でもこれをViewにしようとしたら、MySQLはView内でサブクエリ使えない。

詰んだ。