2014/12/28

[Android][Arch] Xperia Z2 Tablet に chroot Arch Linux 環境を入れた

前提条件

  • Xperia Z2 Tablet の root 化済み
  • BusyBox インストール済み

自分が入れた BusyBox はこれ。BusyBox - Google Play の Android アプリ

やったこと

sd カードに arch 用のパーティションを作る

busybox の fdisk, mkfs を使用。詳細は略す。

arch 格納用のディレクトリ準備

# 読み書きできるように再マウント
mount -o rw,remount /

# マウントポイントを作成
mkdir /mnt/arch

# sd カードの arch 用パーティションをマウント
cd /mnt
mount -t ext2 /dev/block/mmcblk1p2 arch

arch のベースシステム(?)を配置

cd /mnt/arch

# ベースシステムが格納されたファイルをダウンロード
wget http://os.archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz

# 解凍
tar zxfv ArchLinuxARM-armv7-latest.tar.gz

[2015/01/6更新]:armv7でなく、armv5だったので修正。

[2015/01/7更新]:やっぱりarmv7だったので修正。

chroot しても問題なく動くように設定を書き換える

# dns につながるように設定を書き換える
rm /mnt/arch/etc/resolv.conf
echo 'nameserver 8.8.8.8' > /mnt/arch/etc/resolv.conf

# chroot 環境から proc が見えるようにする
mount -t proc /proc /mnt/arch/proc

# /dev が必要なプログラムも多いので bind しておく
mount -o bind /dev /mnt/arch

arch 環境を整える

# 既存パッケージのアップグレード
pacman -Syu

# 必要なパッケージをインストール
pacman -S vim
pacman -S git
pacman -S ghc
pacman -S cabal-install
cabal update
cabal install cabal-install
cabal install pandoc
pacman -S graphviz
pacman -S go
pacman -S base-devel

pacman -S imagemagick
pacman -S otf-ipafont

とりあえず、 golang と imagemagick が動くことは確認できた。

2014/11/08

[Vim, Ubuntu]Ubuntu1204 での vim ビルドメモ

忘れないように。 Ubuntu1204 をインストールして、 aptitude で build-essential を入れたくらいのはず。

sudo aptitude install libncurses5-dev
sudo aptitude install liblua5.2-dev
sudo aptitude install liblua5.1-0-dev
sudo aptitude install luajit libluajit-5.1-dev

cd ~/project/vimsrc/

hg pull
hg update

./configure --enable-luainterp --with-luajit --prefix=/home/mikoto/app/vim/ --enable-fail-if-missing
make -j8
make install

2014/10/03

[Mikutter] mikutter の change_account プラグインの interactive 機能を使ってみる

mikutter で、クリック一発でイベント発行出来る方法無いかなぁと考えていたら、 mikutter-adventure を思い出したので、参照しながらボタンクリックでイベント発火の練習をしてみる。

こんな感じでメッセージ内に表示されたボタンに応じたイベントを発行できるようだ。

多分コマンドでも代用できるけど、いちいち右クリックして選択とかしたくない・させたくない場合に使えそう。 (多用してボタンが並ぶとちょうどよいタイミングで画面がスクロールしてひどいことになったりしそうですが...)

タスク管理プラグイン作って、完了ボタンを押すとみくったーちゃんが褒めてくれる感じのプラグインなんてどうだろうか?

参考文献

mikutter-adventure/mikutter-adventure.rb at master · moguno/mikutter-adventure

2014/09/27

[作業記録, Debian] tmux をビルドした

早速ダウンロード・ビルド

git clone git://git.code.sf.net/p/tmux/tmux-code tmux-tmux-code

./configure
-bash: ./configure: No such file or directory

あ、configure ない。 README 見よう。

...(抜粋)
    $ git clone git://git.code.sf.net/p/tmux/tmux-code tmux
    $ cd tmux
    $ sh autogen.sh
    $ ./configure && make

autogen が必要みたい。

sh autogen.sh
autogen.sh: 16: autogen.sh: aclocal: not found
aclocal failed

aclocal とな。 automake がいるのか。というか入れてなかったっけ?

sudo aptitude install automake
sh autogen.sh
./configure
checking for library containing event_init... !!!configure: error: "libevent not found"!!!

こんどは libevent だ。

sudo aptitude install libevent-dev
./configure --prefix=/home/mikoto/opt/tmux
make -j8
make install

うん、できたっぽい。作業記録なので動作確認は割愛。あと、ビルドのためのパッケージはほぼすべてインストール済みだったのでそれも省略。

2014/09/20

[Debian, Ruby]Debian(wheezy) に rbenv で ruby2.1.3 をインストール

これだけ。

# 必要パッケージ取得
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev rbenv ruby-build

# rbenv 初期設定
rbenv init
echo eval "$(rbenv init -)" >> .bashrc

# 2.1.3 のパッケージ URL を指定したファイルを作成
vim 2.1.3
cat ./2.1.3
install_package "yaml-0.1.4" "http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz"
install_package "ruby-2.1.3" "http://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.3.tar.gz"

# 2.1.3 インストール
rbenv install ./2.1.3

# ruby コマンドで 2.1.3 が呼び出されるようにする。
rbenv global 2.1.3

2014/09/19

[Mikutter] UserConfig に連想配列を格納して、設定画面から変更できるようにしたい

UserConfig に連想配列を格納して、設定画面から変更できるようにしたかったので挑戦してみた。

実現方針は下記。

  • 設定画面の設定値を連想配列に紐付ける
  • 連想配列に変更があったら UserConfig を更新する

設定画面の設定値を連想配列に紐付ける

Settings の各関数にリスナを渡せるので、リスナ内で連想配列に出し入れするよう頑張ってもらう。

select は、 3.0.5 の時点ではリスナを渡せない。 3.0.6 くらいでフィックスされるのではないだろうか。

連想配列に変更があったら UserConfig を更新する

UserConfig[key] で取得できる値はコピーなので、 格納した連想配列に変更があった場合には連想配列自体を入れ替える。

上述のリスナの set 処理の最後に、連想配列をごっそり入れ替える処理を入れる感じ。

コードと、その結果の設定は下記の通り。

設定項目がゴチャッとしてきたらそれなりにわかりよくなるのではないでしょうか。

書きながら思ったけど、何かやるたびに連想配列全体のコピーが走るんだな、これ。 性能が気になる場合は、更新・取得にさらなる工夫が必要ですね。

参考文献

2014/08/14

[Mikutter, 作業記録] mikutter を Windows8 にインストールした

Windows8 に mikutter をインストールしたい

まずは ggr.

MikutterInstallBattleForWindows - mikutter Wiki(http://yuzuki.hachune.net/wiki/MikutterInstallBattleForWindows)

ふむ。やるか。

ruby のインストール

wiki の指示通りに rubyinstaller-2.0/0-p481.exe をダウンロードしてインストールした。

mikutter のダウンロード

都合のよいことに、すでに git 導入済みだったので、リポジトリからクローンして とってきた。

vimshell% mkdir develop
vimshell% cd develop
vimshell% git clone git://toshia.dip.jp/mikutter.git
!!!Cloning into 'mikutter'...!!!
!!!Checking out files: 100% (672/672), done.!!!

windows 用パッチブラグインの展開

こちらも git で。

vimshell% cd ~/develop/mikutter/plugin
vimshell% git clone https://github.com/moguno/mikutter-windows.git mikutter-windows

セットアップスクリプトの実行

vimshell% cd ~/develop/mikutter/plugin/mikutter-windows/
vimshell% c:/Ruby200/bin/ruby.exe ./setup.rb

...何も起きなかった。さすがにだめか。普通にダブルクリックする。おぉ、bundler のフェッチとインストールがはじまった。

コマンドプロンプトが閉じないと思っていたら、ショートカットできてた。コマンドプロンプトは開きっぱなしなのかな? 反応なし。コマンドプロンプトで「ruby mikutter」やってみたら gem が足りないって怒られた。やはりあれは途中だったのか...。しまった。 setup.rb をやり直す。

今度はちゃんと complete って表示されるまで待ったよ。

そのあと、「ruby mikutter.rb」でできました。

デスクトップにできたショートカットでも問題なし。

2014/08/12

[Mikutter] データソースを作ってみたい!

データソースの作成がしてみたいので、ホームタイムラインと同じ物を表示するだけのデータソースを定義してみる。

そもそもデータソースって何?

「抽出タブ」で選択できるデータの取得元。抽出タブの設定でチェックを入れると、そのデータソースのメッセージがタブに表示されるようになる。

「抽出タブ」を全く使っていなかったので、自分にとって「得体のしれない何か」であったが、今回の勉強でこんなもんかと解った気がしますわ。

「抽出タブで対応できないような特定のツイートを抽出する」、「外から情報撮ってきて表示する」ような機能はデータソース使うのがスマートっぽいですね。

じゃあ作ってみる

はい、やっていきましょう。

前準備

勉強用プラグイン作成。

cd ~/.mikutter/plugin/
mikutter.rb generate study_datasource
mikutter.rb spec study_datasource

コーディング

データソースを作成するにあたり、最低限必要な作業は下記の通り。

  1. 提供するデータソースの宣言(登録)
  2. 1 で宣言したデータソースにメッセージを追加する

これだけ。以下、今回作った具体的なコード。

.mikutter.yml

---
slug: :study_datasource
depends:
  mikutter: 3.0.4
  plugin: []
version: '1.0'
author: 
name: study_datasource
description: データソースの勉強するよー

study_datasource.rb

# -*- coding: utf-8 -*-
# mikutter datasource の勉強。
# ホームタイムラインのクローンデータソースを作成する。
#
# データソース作成手順としては、
#     1. filter_extract_datasources で、「こんなデータソースを作るよー」と宣言
#     2. データソースにメッセージを追加したいタイミングで
#        「:extract_receive_message」を呼ぶ。
#         その際、引数に「データソースに紐付くシンボル」を渡す。
# という感じ良いみたい。
#
# 既存タイムラインからの抽出でない場合は、
#     1. 自前でデータ取得ループ作成
#     2. 自前でメッセージ作成
#     3. 「:extract_receive_message」を呼ぶ
# となる感じですね。

Plugin.create(:study_datasource) do
    DATASOURCE_NAME = 'clone_home_timeline'

    # このプラグインが提供するデータソースの定義を組み立てて返却
    def datasources
        ds = {clone_home_timeline: "ホームタイムラインのクローン".freeze}
        ds[DATASOURCE_NAME.to_sym] = DATASOURCE_NAME
        ds
    end

    # 提供するデータソースの登録
    # 登録は、このプラグインで定義したデータソースを
    # 引数で渡ってきたデータソースにマージすることで行う。
    filter_extract_datasources { |ds|
        p "Add My Datasources"
        [ds.merge(datasources)]
    }

    # データソースにメッセージを追加
    # on_update で受け取ったメッセージ全てをデータソースに突っ込んでいる。
    on_update do |service, messages|
        messages.each do |message|
            p "Add message to #{DATASOURCE_NAME}"
            Plugin.call(:extract_receive_message, DATASOURCE_NAME.to_sym, [message])
        end
    end
end

参考文献

2014/07/30

[Mikutter] イベント定義を試した

イベントを定義したい

リストに所属している人のツイートがあった場合に発火するイベントが欲しくなったので、勉強がてら作って見る。

イベント定義の手順

  1. defevent で下記項目を定義
    • イベント名
    • 優先度
    • 引数の型
  2. Plugin.call(イベント名, 引数) でイベント発火

これだけ。

確認用コード

.mikutter.yml

---
slug: :studyEvent
depends:
  mikutter: 3.0.3
  plugin: []
version: '1.0'
author: 
name: studyEvent
description: イベントの勉強。

studyEvent.rb

# -*- coding: utf-8 -*-

Plugin.create(:studyEvent) do
    defevent :list_tweet_receive,  priority: :routine_passive, prototype: [UserList, Message]

    onboot do |service|
        Open3.capture3("echo 'start' > ~/tmp/ttt.txt")
    end

    # リストのツイート受信毎に list_tweet_receive イベントを発行する
    on_appear do |messages|
        messages.each{ |message|
            Plugin[:list].timelines.each{ |slug, list|
                if list.related?(message)
                    Plugin.call(:list_tweet_receive, list, message)
                end
            }
        }
    end

    # イベント発火をトリガに処理を行う
    on_list_tweet_receive do |list, message|
        Open3.capture3("echo '#{list.user}/#{list[:name]}' >> ~/tmp/ttt.txt")
        if list.user === 'mikoto2000' && list[:name] === 'News' then
            Open3.capture3("echo '#{message}' >> ~/tmp/ttt.txt")
        end
    end
end

イベント発火の部分だけ抜き出すと以下な感じか?

# -*- coding: utf-8 -*-

Plugin.create(:studyEvent) do
    defevent :list_tweet_receive,  priority: :routine_passive, prototype: [UserList, Message]

    # リストのツイート受信毎に list_tweet_receive イベントを発行する
    on_appear do |messages|
        messages.each{ |message|
            Plugin[:list].timelines.each{ |slug, list|
                if list.related?(message)
                    Plugin.call(:list_tweet_receive, list, message)
                end
            }
        }
    end
end

「リストイベントを追加するプラグイン」として単体で提供して、 このイベントが欲しかったら依存関係に入れろみたいな感じでどうか?

依存関係に入れなくても、プラグインが入っている時だけリスト系の機能が使えます的な使い方できるか?

-> 公開した。

mikoto2000/mikutter-list-event : https://github.com/mikoto2000/mikutter-list-event

2014/07/21

[Ruby, Mikutter] mikutter プラグイン「ゆかりが読む」を作った

mikutter プラグイン「ゆかりが読む」を作った

mikoto2000/mikutter-yukari : https://github.com/mikoto2000/mikutter-yukari

requirements 厳しすぎるけどまぁそれはそれ。

とりあえず自分の環境で動いたので公開。 ツイートを、音声配信サーバに投げて音声化し、再生します。

音声配信サーバとしては「VOICEROID+ 結月ゆかり」がインストールされた Windows7 端末を想定。

TODO

  • 先頭の twitter id とか末尾のハッシュタグとかは、読み上げ的には必要ないので無視するのがよいかなぁ。
  • ニュースツイート(nhk_news とか) のリンクは、リンク先をスクレイピングして読みあげたい。

mikutter plugin tips

本プラグインを作るにあたって、設定のデフォルト値の指定方法について調べたのでメモ。

プラグインのデフォルト値

プラグインのデフォルト設定値を作りたい場合、「on_boot」内で空チェックして、空ならデフォルト値設定とするのが良いようだ。

参考資料

VLC の曲名を nowplaying できる mikutter プラグイン書いた - polamjaggy : http://polamjag.hatenablog.jp/entry/2013/11/18/035402

2014/07/19

[Ruby, Mikutter] Mikutter プラグインを作ってみる。

はじめに

プラグインの書き方解説ページの「5 STOT 形式でコピー」を写経。

参考資料

Writing mikutter plugin : http://toshia.github.io/writing-mikutter-plugin/#sec-5

$ cd ~/.mikutter/plugin
$ mikutter.rb generate stot
$ mikutter.rb spec stot/
$ cd stot
$ vim stot.rb

...で、こんな感じ。

$ cat .mikutter.yml
---
slug: :stot
depends:
  mikutter: 3.0.3
  plugin: []
version: '1.0'
author: 
name: stot
description: Copy to clipboard with STOT format.
$ cat stot.rb
# -*- coding: utf-8 -*-

Plugin.create(:stot) do
  command(:copy_as_stot,
    name: 'STOT形式でコピー',
    condition: Plugin::Command[:HasOneMessage],
    visible: true,
    role: :timeline) do |opt|
      message = opt.messages.first
      screen_name = message.user[:idname]
      Gtk::Clipboard.copy("#{screen_name}: #{message.to_s} [https://twitter.com/#{screen_name}/status/#{message.id}]")
  end
end

つぎに

ツイートの本文を外部プログラムに渡すプラグインを作ってみる。

探せば有りそうと考えてはいけない。

参考資料

Rubyから外部プログラムを起動 - None is None is None : http://doloopwhile.hatenablog.com/entry/2014/02/04/213641

$ cd ~/.mikutter/plugin
$ mikutter.rb generate runWith
$ mikutter.rb spec runWith/
$ cd runWith
$ vim runWith.rb

...で、こうなる。

$ cat .mikutter.yml 
---
slug: :runWith
depends:
  mikutter: 3.0.3
  plugin: []
version: '1.0'
author: 
name: runWith
description: ツイートの内容を外部プログラムに、実行する。
$ cat runWith.rb 
# -*- coding: utf-8 -*-

require "open3"

Plugin.create(:runWith) do
  command(:run_with,
    name: 'echo to ~/tmp/echo.txt',
    condition: Plugin::Command[:HasOneMessage],
    visible: true,
    role: :timeline) do |opt|
      message = opt.messages.first
      Open3.capture3("echo '#{message.to_s}' > ~/tmp/echo.txt")
    end
end

とりあえず echo で試した。 あとはコマンドと引数を変更すればよいだけ。 外部プログラムが呼べてしまえば、もう何でも出来ますね!

2014/05/11

[作業記録][Debian]ALminium を導入しようとしてみた


下準備

仮想マシン再作成

# ホストPCで
sudo virsh destroy alminium
sudo virsh undefine alminium
sudo virsh vol-delete --pool default alminium.img
sudo rm /var/lib/libvirt/images/alminium.img
sudo virt-clone -o debian_org -n alminium --file /var/lib/libvirt/images/alminium.img
sudo virsh setmaxmem alminium 2048000
sudo virsh start alminium
sudo virsh setmem alminium 2048000
# 下記確認・設定を行う
# ホスト名修正
# IP アドレス確認
sudo virsh console alminium

ベースは ssh, git 導入済みなので ssh で接続。 次に、 Jenkins のインストールと、ベース URL の設定を行う。

Jenkins のインストール・設定

# ゲストPCで
sudo aptitude update && sudo aptitude -y dist-upgrade
# Debian では Jenkins インストールしてくれなかったのでインストールする
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
echo 'deb http://pkg.jenkins-ci.org/debian binary/' | sudo tee -a /etc/apt/sources.list
sudo aptitude update && sudo aptitude install jenkins
sudo service jenkins restart

ベース URL の設定。

/etc/default/jenkins の JENKINS_ARGS の末尾に "--prefix=$PREFIX" を追加する。

本番

ALMinium のインストール

cd ~/work
git clone https://github.com/alminium/alminium.git
cd alminium
sudo bash ./smelt
Debian / Ubuntu が検出されました。
インストールに失敗するかも知れませんが、お許しくださいm(__)m

途中MySQLのパスワードを聞かれたら空のままエンターキーを押してください。
MySQLのパスワードを設定するとインストールに失敗します。
パスワードを設定したい場合は、ALMiniumのインストール完了後行ってください
*******************************************************
  ホスト名の設定
*******************************************************
ホスト名(IPアドレスもしくはDNS名)を入力してください。ホスト名はApacheのバーチャルホストで利用されます。
例えば、192.168.1.4をホスト名で入力すると、http://192.168.1.4/でアクセスすることになります。
(上記の設定ではhttp://localhost/では接続できないのでご注意ください)
ホスト名: 192.168.11.209


*******************************************************
  SSLのサポート
*******************************************************
SSLのサポートを有効にすると、httpsのみの接続を許可します。
httpでのアクセスは、全てhttpsのポートへ転送されるようになります。
SSLの証明書は認証機関により署名されたものではありません。通信の暗号化のみ
に利用します。
gitの利用では、

  $ git config --global http.sslVerify false

などのコマンドで、SSLの証明書を無効にする必要があります。

SSL(https)サポートを有効にしますか?(y/N) N


*******************************************************
  メール設定
*******************************************************
Redmineのシステムメールを送信するための設定を行います。

<利用する上での注意>
・利用したいメールシステムと通信可能なことをご確認ください。ファイアーウォールなどで遮断されている場合は管理者にお問い合わせください。
・Sendmailコマンドを利用する場合、別途Sendmailの設定を行う必要があります。
・G-Mail/Hotmailを利用する場合、ユーザー名とパスワードがあれば利用可能です。

次の中から、使いたいメールシステムを選択してください。
ここでメール設定を行わない場合は「N」を選択してください。

0. 独自のメールサーバーを設定する
1. Linux内のSendmailコマンドを使用する
2. G-Mail/Google Apps
3. Windows Live Hotmail

N. メール設定をしない

番号選択: N


メール設定を行いません。


継続的インテグレーションツールのJenkinsのインストール・設定を行うことができます。デフォルトはインストールしません。よく分からなければNを選択してください。Jenkinsをインストールしますか?[y/N]y

※ ここで、MySQL のルートパスワード入力になるが、空ですすめる。

... (snip)

Enabling site jenkins.
To activate the new configuration, you need to run:
  service apache2 reload
mkdir: cannot create directory `/var/lib/jenkins/plugins': File exists
[ ok ] Restarting Jenkins Continuous Integration Server: jenkins.
--2014-05-10 10:20:28--  http://localhost:8080/jenkins/jnlpJars/jenkins-cli.jar
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8080... connected.
HTTP request sent, awaiting response... 503 Service Unavailable
2014-05-10 10:20:32 ERROR 503: Service Unavailable.
...(snip)

こんな感じのエラーで無限ループになるので、 Jenkins の設定を頑張る。

cd /var/lib/jenkins
mv config.xml _config.xml
sudo service jenkins restart

先には進むが、いろいろ残念なことになるので解消する。

[....] Starting web server: apache2apache2: Syntax error on line 268 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/sites-enabled/redmine: Cannot load /usr/lib/ruby/gems/1.9.1/gems/passenger-4.0.42/buildout/apache2/mod_passenger.so into server: /usr/lib/ruby/gems/1.9.1/gems/passenger-4.0.42/buildout/apache2/mod_passenger.so: cannot open shared object file: No such file or directory
Action 'start' failed.
The Apache error log may have more information.
 failed!

Jenkins から。

cd /var/lib/jenkins
mv _config.xml config.xml
sudo service jenkins restart

その後、 Jenkins にアクセスし、アップデート等行う。

次、 apache2。これは、 mod_passenger が無いと言っているようなので apt でインストールする。

sudo aptitude install libapache2-mod-passenger
sudo service apache2 restart

apache2 のページを開くと、 gem 'thin (>=0) ruby' が無いって怒られた。 thin をインストールする。

sudo gem install thin rubu

...まだたりないらしい。

gem パッケージが足りないとすると、Gemfile.local あたり探せば良いかな。あった。

cd /opt/alminium
bundle update
...(snip)

いろいろインストールされた。 ALMinium のホーム画面は表示されたけれど、エラーだか警告だかのメッセージが表示されている。

バックログが設定されていません。設定画面 管理 > プラグイン, からリンク 設定 をクリックして設定してください。フィールドを設定後、このページへ戻りツールを利用してください。

ログを見てみる。 (/opt/alminium/log/production.log)

~ { .log } DEPRECATION WARNING: Passing a template handler in the template name is deprecated. You can simply remove the handler name or pass render :handlers => [:erb] instead. (called from realtime at /usr/lib/ruby/1.9.1/benchmark.rb:295) }

バックログの設定の警告とは関係ないログっぽい。 /opt/alminium/plugins/redmine_backlogs/app/controllers/rb_server_variables_controller.rb を修正。

---    format.js { render :file => 'rb_server_variables/show.js.erb', :layout => false }
+++    format.js { render :file => 'rb_server_variables/show', :layout => false }

バックログの DB マイグレーションがうまくいっていなかったらしい。

Support - "Plugin migrations have not been executed" after successfull installation

cd /opt/alminium
sudo rake redmine:plugins:migrate RAILS_ENV=production

とりあえずホーム画面は映った。

残課題

  • Jenkins の認証がおかしい。
    • ログインユーザが「(null)」になっている。
    • 「Jenkinsの管理」画面に「リバースプロキシーの設定がおかしいようです。」と表示される。

あと、インストールスクリプトちょっと見る限り、 Jenkins はリポジトリの登録さえしておけば apt-get でインストールはしてくれそう。その後の設定がどうなるかは読んでないけれど。

apache2, redmine, jenkins あたりの認証共通化の仕組みを勉強しないことにはこれ以上ダメそうね。どうしたものか。

2014/04/14

[普通の日記]今日勉強した雑多なもの

css でマウスオーバー時にカーソルの形を変える

/* マウスオーバー時にマウスカーソルをpointer(指)にする */
cursor: pointer;

DOM でテキストノードを追加する

var textNode = document.createTextNode("TEXT");
element.appendChild(textNode);

css セレクタで、要素直下の要素だけを指定する

PARENT_SELECTOR > CHILD_SELECTOR

Dojo Toolkit でにょきっと出たり入ったりする show/hide 処理

Reference の Example 3 あたりを見ると出来るよ!
dojo/fx/Toggler — The Dojo Toolkit - Reference Guide

dojo/_base/connect は古いらしい、 dojo/on とか dojo/aspect とか使うらしい

dojo.connect() — The Dojo Toolkit - Reference Guide

2013/12/22

[Debian]Ricty のインストール

Ricty のインストール

# 合成元のフォントパッケージをインストール
sudo aptitude install fontforge ttf-inconsolata fonts-migmix

# 作業用ディレクトリの作成と移動
mkdir -p ~/tmp/ricty
cd ~/tmp/ricty/

# 合成スクリプト取得
wget https://raw.github.com/yascentur/Ricty/master/ricty_generator.sh

# 合成開始
sh ricty_generator.sh auto

# フォントインストール
mkdir ~/.fonts
cp -f Ricty-\*.ttf ~/.fonts/
fc-cache -vf

2013/11/30

[KVM]KVM + libvirt でいろいろやったよ

KVM + libvirt でいろいろやったよ

半年くらい前のメモを発掘したのでとりあえずブログに保管する。


# パッケージインストール
sudo aptitude install qemu-kvm libvirt-bin virtinst

# OS 再起動(/dev/kvm の権限を更新するため)

# USER が kvm を使えるようにする
# 多分再起動とか必要。ログアウトでいいのかな?
sudo adduser USER kvm

# 仮想マシン作成 & Debian インストール
# 最小構成 + vim + ssh
sudo virt-install --connect qemu:///system --name debian_org --ram 512 --disk path=/var/lib/libvirt/images/debian_org.img,size=5 --network network=default,model=virtio --nographics --location='http://ftp.jp.debian.org/debian/dists/wheezy/main/installer-amd64/' -x console=ttyS0,115200

仮想マシン設定ファイルの場所

/etc/libvirt/qemu/DOMAIN_NAME.xml

イメージファイル等の場所

/var/lib/libvirt/*

仮想マシン以外の設定も、 /etc/libvirt の中にある。 autostart 内のもの(普通は設定ファイルへのシンボリックリンク)は libvirtd 起動時に実行される。

基本操作

sudo virt-install --connect qemu:///system --name DOMAIN_NAME --ram RAM_SIZE --disk /PATH/TO/DISK,size=GB --network network=default,model=virtio --vnc --cdrom /PATH/TO/CDROM
sudo virsh list --all
sudo virsh dominfo DOMAIN_NAME
sudo virsh start DOMAIN_NAME
sudo virsh suspend DOMAIN_NAME
sudo virsh resume DOMAIN_NAME
sudo virsh reboot DOMAIN_NAME #KVMでは使えないらしい
sudo virsh shutdown DOMAIN_NAME
sudo virsh destroy DOMAIN_NAME
sudo virsh undefine DOMAIN_NAME

ストレージ

libvirt にはストレージプールなるものがあるらしい。 まだ使ってないのでいつか調べる。

sudo virsh pool-list
sudo virsh vol-list POOL_NAME
sudo virsh vol-delete VOL_NAME

qemu-img create -f qcow2 IMG_NAME IMG_SIZE

Windows7 のインストール

virtio ドライバ

WindowsGuestDrivers/Download Drivers - KVM(http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers)

VM 作成

sudo virt-install --connect qemu:///system --arch=x86_64 -n voice -r 24000 --vcpus 4 --vnc --vnclisten 0.0.0.0 --noautoconsole --os-type windows --os-variant win7 --disk path=/var/lib/libvirt/images/voice.img,size=10 --disk path=/home/mikoto/iso/virtio-win-0.1-59.iso,device=cdrom,perms=ro --cdrom /dev/cdrom --boot cdrom,hd --prompt

これで、サーバの 5900 ポートに VNC クライアントでアクセスすれば画面が表示される。 (windows7 の Real VNC では、 64bit color よりも上の色だと接続できなかった...)

インストール途中で、追加のドライバ(virtio)をインストールする。

これだと NIC も HDD も virtio として追加されないようだ。 disk のオプションに "bus=virtio" を追加するとか、 ネットワークオプションとして "--network bridge=br0,model=virtio" を追加するとかが必要なようだ。 いつか再インストールの機会があれば試す。

ボリュームのリサイズ

10GB は小さすぎた...。

# ボリュームの情報確認
sudo virsh vol-info --pool default voice.img
# リサイズ
# virsh vol-resize は未サポートらしい(2013/5/25,Debian7,KVM)
sudo qemu-img resize voice.img +20G

その後、コンピュータの管理からパーティションを拡張すれば OK.

2013/10/29

[Debian][鯖]Gitit のインストール

インストール

aptitude install gitit git-core

データ格納ディレクトリ作成

mkdir -p /data/wiki

デフォルト設定ファイルの作成

gitit --print-default-config > /data/wiki/gitit.conf
vi /data/wiki/gitit.conf
# 修正点のみ抜き出し
# パスをすべて絶対パスに直す
repository-path: /data/wiki/wikidata
user-file: /data/wiki/gitit-users
static-dir: /data/wiki/static
templates-dir: /data/wiki/templates
log-file: /data/wiki/gitit.log

起動スクリプト作成

cp /etc/init.d/skeleton /etc/init.d/gitit
vi /etc/init.d/gitit
#! /bin/sh
### BEGIN INIT INFO
# Provides:          gitit
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Wiki Server Gitit
# Description:       Wiki Server Gitit
### END INIT INFO

# Author: mikoto2000 <mikoto2000>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Wiki Server Gitit"
NAME=gitit
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="-f /data/wiki/gitit.conf"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
PWD=/data/wiki

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --quiet --oknodo --retry=5 --signal 0 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac

:

起動スクリプトに実行権限追加

chmod a+x /etc/init.d/gitit

スタート確認

/etc/init.d/gitit start
ps aux | grep gitit

ストップ確認

/etc/init.d/gitit stop
ps aux | grep gitit

サービス登録

update-rc.d gitit defaults

2013/10/13

vim を +lua でコンパイルする

vim7.4 で neocomplete が使いたいので頑張る。

sudo aptitude install lua
cd /PATH/TO/VIM/SRC
hg pull
hg update
./configure --enable-luainterp=yes --with-luajit --prefix=/home/mikoto/app/vim/
make && make install

... -lua だ! .configure の出力を真面目に見てみよう...。

./configure --enable-luainterp=yes --with-luajit --prefix=/home/mikoto/app/vim/ | grep lua
checking --enable-luainterp argument... yes
checking --with-lua-prefix argument... no
checking --with-luajit... yes
checking for luajit... no
checking if lua.h can be found in /usr/include... no
checking if lua.h can be found in /usr/include/lua... no

ヘッダが無いとダメなのかー。

sudo aptitude install liblua5.2-dev
ls /usr/include | grep lua
lua5.2

oh...パスが違うようだ。

sudo ln -s /usr/include/lua5.2 /usr/include/lua
./configure --enable-luainterp=yes --with-luajit --prefix=/home/mikoto/app/vim/ | grep lua
checking --enable-luainterp argument... yes
checking --with-lua-prefix argument... no
checking --with-luajit... yes
checking for luajit... no
checking if lua.h can be found in /usr/include... no
checking if lua.h can be found in /usr/include/lua... yes
checking if link with -L/usr/lib/x86_64-linux-gnu -lluajit is sane... no

luajit が有効にならない...。 別途 luajit が必要? wheezy には deb パッケージなかったので今回はいいや。 luajit なしで続行。

# こっちだと lua5.2 見つけてくれるのね...
./configure --enable-luainterp=yes --prefix=/home/mikoto/app/vim/ | grep lua
checking --enable-luainterp argument... yes
checking --with-lua-prefix argument... no
checking --with-luajit... no
checking for lua... (cached) /usr/bin/lua
checking if lua.h can be found in /usr/include... no
checking if lua.h can be found in /usr/include/lua5.2... yes
checking if link with -L/usr/lib -llua5.2 is sane... yes
make && make install
vim --version | grep +lua
+dialog_con_gui  +lua             -rightleft       +windows

よしできた。

2013/08/07

[Haskell]Haskell のカリー化について考えた

Haskell のカリー化について

「すごいHaskellたのしく学ぼう!」に、カリー化と部分適用は完全に理解しておいてくださいと書かれていたのでしっかり学ぶ努力をしてみる。

下記のような関数があったとして、

myAdd :: Integer -> Integer -> Integer
myAdd x y = x + y

(myAdd 4) の返り値は、

myAdd' :: Integer -> Integer
myAdd' y = x + y
    where x = 4

と同等の関数であるという事なのだろうか?

いや、参考文献を見る限り違うようだ。

これは、「カリー化して部分適用」したという事らしい。

Integer -> Integer -> Integer を、 Integer -> (Integer -> Integer) と (Integer -> Integer) の 2 つの関数に分解するのが カリー化という事か。

Haskell なら、すべての関数を処理系が自動で変換してくれる。

Java で、オレオレ Add 関数のカリー化をする場合こんな感じになるのかな?

StudyCurry.java(https://github.com/mikoto2000/MiscellaneousStudy/blob/master/java/StudyCurry/src/jp/dip/oyasirazu/study/curry/StudyCurry.java)

とりあえず、「関数の分解がカリー化」、「具体的に数値を入れると部分適用」という印象。

参考文献

カリー化と部分適用の違いと誤用 - Togetter(http://togetter.com/li/183700)

カリー化 != 部分適用 - ((プログラミング | 形式) 言語) について書く日記(http://d.hatena.ne.jp/kmizushima/20091216/1260969166)

カリー化 - Wikipedia(http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)

StudyCurry.java(https://github.com/mikoto2000/MiscellaneousStudy/blob/master/java/StudyCurry/src/jp/dip/oyasirazu/study/curry/StudyCurry.java)

2013/05/28

[Debian] Debian 最小構成インストールからデスクトップ環境を作る

全部作業が終わってからメモしてないのに気づいて .bash_history から作業内容をサルベージした。あとから見て思い出す分には多分大丈夫という程度の残念メモ。

1. aptitude のプロキシ設定

2. aptline の修正

3. パッケージのインストール

aptitude install awesome awesome-extra
aptitude install x-window-system
aptitude install mozc
aptitude install iceweasel
aptitude install iceweasel-vimperator
aptitude install vim
aptitude install git
aptitude install ibus-mozc
aptitude install ttf-japanese-gothic ttf-japanese-mincho
aptitude install fonts-japanese-gothic fonts-japanese-mincho
aptitude install fonts-ipafont-gothic fonts-ipafont-mincho
aptitude install ttf-kochi-gothic-naga10 ttf-kochi-mincho-naga10
aptitude install ttf-vlgothic
aptitude install ttf-takao

4. キーボードレイアウト変更(capsをctrlへ)

/etc/default/keyboard を編集する。 XKBOPTIONS に "ctrl:nocaps" を設定する。
XKBOPTIONS="ctrl:nocaps"

5. グラフィックドライバインストール(?)

aptitude install nvidia-glx

6. (ここまでやって x-window-system が立ち上がらなくなる)

7. xorg.conf の作成

Xorg -configure
mv xorg.conf.new /etc/X11/xorg.conf

8. パッケージインストール第 2 弾

aptitude install cifs-utils
aptitude install vim-athena
aptitude install sudo
aptitude install xdm

9. vim 環境

vim プラグインのインストールと、 vimproc のビルド。
aptitude install gcc make
cd ~/.vim/bundle/vimproc/
make -f make_unix.mak

10. 新しい iceweasel のインストール

aptitude install debian-keyring
aptitude install pkg-mozilla-archive-keyring
# "deb http://mozilla.debian.net/ wheezy-backports iceweasel-release" を追加
vi /etc/apt/sources.list
aptitude update
aptitude purge iceweasel
deb http://debian.multimedia.org wheezy main contrib non-free
aptitude install -t wheezy-backports iceweasel

11. google-chrome のインストール

mkdir /var/cache/localdeb
cd /var/cache/localdeb/
apt-ftparchive packages . | gzip -c9 > Packages.gz
apt-ftparchive sources . | gzip -c9 > Sources.gz
# "deb file:/va/cache/localdeb ./" を追加
vi /etc/apt/sources.list
aptitude update
aptitude install google-chrome-stable

12. 音関係

aptitude install alsa
# 認識されているサウンドデバイスの一覧表示らしい。
# 結果の card, device を確認
aplay -l
# どの card,device で音がなるかを確認していく
aplay -D plughw:1,3 /usr/share/sounds/alsa/Front_Center.wav 
aplay -D plughw:1,7 /usr/share/sounds/alsa/Front_Center.wav 
...
# デフォルトで使用するサウンドデバイスを設定する
vi /etc/asound.conf
# /etc/asound.conf の中身.
# pcm.!default {
#  type hw
#  card 1
#  device 7
#}

13. 今思い出したパッケージ

aptitude install pandoc

14. ファイル関連付け

vi ~/.local/share/applications/mimeapps.list
# ~/.local/share/applications/mimeapps.list の内容
# [Default Applications]
# text/plain=gvim.desktop
# text/x-markdown=gvim.desktop
# text/html=iceweasel.desktop
# application/pdf=xpdf.desktop

まとめ

素直にインストール時点で Desktop 環境を選択しましょう。