Archive for SUNAGA Takahiro

git pull requestメモ

  • githubでfork→作業→commit→rebaseでまとめる→push→GitHubでpull request
  • git rebase -i [対象commitのhash] → 対象commitのhash~現在までがでてくる
    • でてくるエディタで、pickをsquash にすると、その変更と直前の変更をまとめる

参考リンク

Debian wheezy の webkit のバグ?

Debian wheezy の webkitgtk-3.0 で、$.ajax を async: true で呼びまくるとFDがリークするっぽい。
ちなみにPyGIから使用している。

まだちゃんと検証はしてないので嘘かも。

Gentoo with systemdでzabbix-agentd.confの指定がおかしい

net-analyzer/zabbix-2.2.0-r3のsystemd用起動ファイルにある設定ファイルの指定がおかしいかったので修正。

system # cd /usr/lib/systemd/system
system # diff zabbix-agentd.service zabbix-agentd.service.orig
9c9
< ExecStart=/usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
---
> ExecStart=/usr/sbin/zabbix_agentd

libwnck (ウィンドウマネージャ操作ライブラリ)

サイネージというほどのものではないけど、それ的なもののソフトウェアをつくるために、X上で外部プロセスのウィンドウをいじってどうにかするみたいなのを探した。

いろいろ当り最終的にlibwnckを見つけた。ウィンドウマネージャの操作ライブラリ。Pythonバインディングのpython-libwnckもある。

import wnck, gtk
screen = wnck.screen_get_default()
screen.force_update()
windows = screen.get_windows()

これでウィンドウリスト (WnckWindowのリスト) が得られる。これに対して、

w = windows[0]
w.get_name() # Window Name
w.get_application().get_name() # Application Name
w.get.get_class_group().get_name() # Class Name

こんな感じで情報を取得し、

w.set_geometry(wnck.WINDOW_GRAVITY_CURRENT, wnck.WINDOW_CHANGE_X | wnck.WINDOW_CHANGE_Y, 100,100,0,0)
w.set_title("新しいタイトル")
gdk_w = gtk.gdk.window_foreign_new(w.get_xid())
gdk_w.set_decorations(0) # デコレーションの削除
# 反映させる
gtk.gdk.window_process_all_updates()
gtk.gdk.flush()

こんな感じにウィンドウが操作できる。

uWSGIと併用時のエラー

ちなみに、python-wnckを使用するWebアプリをuwsgi上で動かしたらこんな感じのエラーが出てしばらくこまった。

172.29.4.50 - - [12/Mar/2014:22:59:39] "GET /info HTTP/1.1" 200 4 "" "Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
[pid: 15271|app: 0|req: 6/6] *.*.*.* () {32 vars in 508 bytes} [Wed Mar 12 22:59:39 2014] GET /set_center/info => generated 4 bytes in 6 msecs (HTTP/1.1 200) 4 headers in 138 bytes (1 switches on core 0)
Wed Mar 12 22:59:41 2014 - !!! uWSGI process 15270 got Segmentation Fault !!!
Wed Mar 12 22:59:41 2014 - *** backtrace of 15270 ***
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_backtrace+0x25) [0x431ea5]
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_segfault+0x21) [0x431f81]
Wed Mar 12 22:59:41 2014 - /lib/x86_64-linux-gnu/libc.so.6(+0x324f0) [0x7fa477a794f0]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_xcb_display_new+0x109) [0x7fa47201fa89]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_display_new+0x2d) [0x7fa47201fb3d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libwnck-1.so.22(wnck_screen_get+0x117) [0x7fa474660617]
Wed Mar 12 22:59:41 2014 - /usr/lib/python2.7/dist-packages/gtk-2.0/wnck.so(+0xa809) [0x7fa4748ac809]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x56fd) [0x7fa47521d04d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7fa475304647]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyInstance_New+0x7b) [0x7fa4752ec58b]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x11c1ac) [0x7fa4752ea1ac]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6806) [0x7fa475274806]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xcbdf6) [0x7fa475299df6]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x27dd) [0x7fa47521a12d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - *** end of backtrace ***
Wed Mar 12 22:59:41 2014 - DAMN ! worker 2 (pid: 15270) died :( trying respawn ...
Wed Mar 12 22:59:41 2014 - Respawned uWSGI worker 2 (new pid: 15296)

最初はなんかcherrypyかuWSGIのスレッドが有効になっちゃってて変な事がおこっているかと思ったけど、どうやらPython初期化後にforkしてからGTKとかX11のAPI使っているから発生しているよう。(断定的に調べていないので違うかも。)

uWSGIのlazyオプションを指定するとfork後の初期化になるようなので、それで改善した。

Windows ExplorerのWebDAV

Windows (8.1も含む) のエクスプローラーからは、WebDAV経由で50MBオーバーのダウンロードができないらしい。

改修用の「Fix It」というプログラムが有るらしいけど、どうやらWindows 8.1では使用できない模様。(もしかしたら8専用のものが有るのかもしれない)

とりあえず解決方法としては、「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters」のFileSizeLimitInBytesがファイルサイズ制限値になっているらしいのでこれを変更すればOK。

(From Microsoft Communityの該当ページ)

相変わらず不遇なWebDAVである。

 

GDM-3.8.4-r2@GentooでOh no something has gone wrong!

いろいろとパッケージアップデートしたらGDMで「Oh no」画面が出てログインできずに。

とりあえずログを見る。

# cat /var/log/Xorg.0.log
・・・
[   184.547] (II) NOUVEAU(0): [XvMC] Extension initialized.
[   184.547] (==) NOUVEAU(0): DPMS enabled
[   184.547] (II) NOUVEAU(0): RandR 1.2 enabled, ignore the following RandR disabled message.
[   184.547] (--) RandR disabled
[   184.550] (EE) AIGLX error: dlopen of /usr/lib64/dri/nouveau_dri.so failed (libLLVM-3.1.so: cannot open shared object file: No such file or directory)
[   184.550] (EE) AIGLX: reverting to software rendering
[   184.550] (II) AIGLX: Screen 0 is not DRI capable
[   184.550] (EE) AIGLX error: dlopen of /usr/lib64/dri/swrast_dri.so failed (libLLVM-3.1.so: cannot open shared object file: No such file or directory)
[   184.550] (EE) GLX: could not load software renderer
[   184.550] (II) GLX: no usable GL providers found for screen 0
[   184.553] (II) NOUVEAU(0): NVEnterVT is called.
[   184.580] (II) NOUVEAU(0): Setting screen physical size to 677 x 381
[   184.580] resize called 2560 1440
・・・

どうやらlibLLVM-3.1.soの読み込みに失敗している模様。まずそれが存在しているか、またldconfigで検索できるか確認する。

# locate libLLVM-3.1.so
/usr/lib32/llvm/libLLVM-3.1.so
/usr/lib64/llvm/libLLVM-3.1.so
# ldconfig -p | grep libLLVM-3.1
(※なし)
#

存在はしているようだけど、ldconfigで検索できていないっぽい。
とりあえずld.so.confに追加する。(今回は /etc/ld.so.conf.d/05llvm.conf として追加した)
追加したあとにldconfigも忘れずに。

# cat /etc/ld.so.conf.d/05llvm.conf
/usr/lib32/llvm
/usr/lib64/llvm
# ldconfig

これでgdmをリスタートしたら直った。

# systemctl restart gdm

めでたし。

これはパッケージか何かのバグだろうか。
それとも何か設定が違っていたのだろうか。。。

Wiki Memo

なんとなくWikiについてメモ。データ管理の観点から。

主にWikiMatrixからいろいろ引いた。

Aneuch Wiki

by Aaron Graves

(From WhatIsAWiki)

According to Ward Cunningham, the inventor of the very first wiki (WikiWikiWeb), a wiki is “The simplest online database that could possibly work.”

WikiってのはもっともシンプルなオンラインデータベースだってWikiを作った人も言っている。

XWiki

(From WikiMatrix / XWiki)

XWiki also includes an advance form and scripting engine making it a development environment for data-based intranet applications. It has powerfull extensibility features, using scripting a plugin and highly module architecture. The scripting engines allows to access a powerfull API allowing to access the XWiki repository in read and write mode.

データをいじるようなアプリケーションが作れるようなスクリプトエンジンがあるげ。

なんかVelocityとかGrooby, Python, Rubyでページ内にスクリプトがかけるっぽい。あとちょっとSQLっぽいクエリ言語があるっぽい。柔軟性はありそうだけど、やや面倒かも。

WikiTextに対するアノテーション。

その他妄言

ページがデータになるようなやつは?なんかページ内にある要素がhoge:table1:B2みたく参照できる。

ページが断片的な述語の集まりになっているデータベース的な。

Wikiとは関係ないけど、図表って言うのはやっぱりなんとなく楽しい。

そういえば、WordPressは差分更新したときにそれをうまく表示できないというか、表現できてない気がする。

メタWiki (WYSIWYG→Wiki→・・・的な) 。

WikiText構文: 曖昧さがある。曖昧な部分を真面目に推測するエンジン?

Wiki利点

  • 面倒くさくない
  • すぐ使える
  • 差分管理
  • 構造考えなくていい
  • ちょろっと書けばすげー綺麗になる

いじょ。

PIL (Python Imaging Library) のImage.thumbnailがうまく出ず小一時間・・・

PILのthumbnailで小一時間悩んだ。以下のソース

size = ***
img.open(hoge)
img.thumbnail((size, size))
img.save(fuga)

これでなぜかサムネイルがfugaに保存されるはずが、そのまま変換前の画像が保存される。

エラーも何も出ず。

いろいろ探っていたらsizeが文字列型なのが問題だった。エラーぐらい出てほしかった・・・。

文章とか資料とか図表を書くときの注意

まとまった文章とか資料とか図表を書くとき向け。当たり前だけど気をつけるべきところなど。思いついたところから。ざっくばらんにですが。。。

その文章・資料の意味を考える

  • いま書いている文章・資料は何のために書くのか
  • 誰のために書くのか
  • 文章の頭に「文章の目的」と「対象読者」を書いておくとよい

資料を管理できるようにする

  • ページ数を降る
  • 書いているひとの名前を書く
  • 資料の作成日時・更新日時を頭に書いておく

文章のルールを決める

  • こういうときはこう表現する、と決める
  • 自己流でいいけど、分かる方法で決める。(文章内部に書く、など)

未定義かつ明らかでない表現は使わない

  • 「誰が見ても明らかに意味が分かる」ときを除いて、資料上で意味を定義する。
  • 赤矢印は○○という意味、太文字は○○という意味、等

何となく書かない

  • そこにそれが書いてある意味を考える。
  • 「そこにそれが書いてある意味は特にない」ということもある。しかし明確に区別されるべき。
  • そこに書いてあるものは伝わるか?そこに書く必要があるか?そこに書くべきものは足りなくないか?
  • 逆に、伝われば簡単な書き方、省略した書き方をする。常に文章は短い方がいい。

不要なクオリティを求めない

  • 書いている文章がどのクオリティを目指すべきなのか考える
  • 伝わればいい場合もあれば、外部に出しても恥ずかしくないにする場合、読み手に非礼がないよう丁寧にしなければいけない場合もある
  • 「伝わればいい」場合は、本当に伝わりさえれば、汚くてもいい、乱暴でもいい。誤字脱字にもこだわる必要もない。日本語文章になってなくてもいい(箇条書きとか)。そこにかける時間は無駄。
  • 「文章としてのクオリティ」を求める場合は、絶対に書き手以外の人がチェックする。自分では絶対誤りを見逃す。

「広く・浅く・抽象的」な説明から入り、「狭く・深く・具体的」な説明に入るように書く

  • 大まかな概要説明から入って、だんだん細かく各部を説明するようにする

「一般化された表現」と「例示」を両方書く

  • 一般化だけではうまく伝わらないことが多いし、例示だけだと「何のために例示したのか」が分からない。
  • (例) 「max(a,b) はaとbのうち大きい方を示す。(←一般) 例えばmax(5,7) は7を示す (←例示)」

同じ表現は同じ意味、違う表現は違う意味にする

  • 同じ表現なのに意味が違ったりすると混乱する
  • 全て統一されていると読みやすい
  • (a,b,c)と(d,e,f)は同じ意味にする、{a・b・c}と(d,e,f) は違う意味にする
  • (図を書くとき) 同じ図形かつ同じ色は同じ意味、違う図形や違う色の場合は違う意味にする、などなど

「動詞(句)」と「名詞(句)」の区別をする

  • システム関係では、名刺と動詞の区別を大切にするとわかりやすくなることが多々ある
  • 「関数の説明は動詞にする」、「変数の説明は名詞にする」などなど (ただしこのルールが絶対ではない)

JavaScriptの入門中の入門のカンペ

入門の入門部分だけざざっと。

★基本文法

コメント

 // ここはコメント
 /* ここもコメント */

関数(メソッド)定義

function 関数名( パラメータ ){
  // 関数の内容;
  //  ・・・
}

※パラメータ は省略可

関数(メソッド)呼び出し

// フツーの関数を呼ぶ
間数名( パラメータ );
// 返り値を変数に入れとく場合
変数 = 間数名( パラメータ );
// オブジェクトの関数 (メソッド) を呼ぶ
オブジェクト.メソッド名( パラメータ );

// 具体例 Math.max: 与えたパラメータのうち大きなほうを返すメソッド
var a = Math.max(5, 10); // aには 10 が代入される

※パラメータ は省略可

変数の操作

a = 5;  // aに5を代入する
a += 1; // aに1を足す
b = a * 6;  // bにaの五倍 (36になる) を代入する
s = '文字列'; // sに「文字列」と代入された
m = 'bの値は' + b + 'です'; // 連結: mに"bの値は36です" と代入される
n = "シングルクォートとダブルクォートはどっちでもいい";

条件分岐: if文

※「条件式」の書き方は次節

if( 条件式A ){
   // 処理内容; ←ここは「条件式A」が真のとき実行される
}
else if( 条件式B ){
   // 処理内容; ←ここは「条件式A」が偽だけど「条件式B」が真のとき実行される
}
else if( 条件式C ){
   // 処理内容; ←ここは「条件式A,B」が偽だけど「条件式C」が真のとき実行される
}
else{
   // 処理内容; ←ここは「条件式A,B,C」の全てが偽のとき実行される
}

※ 「else if(){ ~ }」や「else{ ~ }」 は省略できます。

ループ: for文

// 定型文
for(var 変数 = 初期値; 変数 < 終了値; 変数++){
    // 繰り返し行う処理内容
}

// 0~9まで「今の数字は○○です」と表示 (alert) させたい場合
for(var i = 0; i < 10; i++){
   alert('今の数字は' + i + 'です');
}
// ※ 「i < 9」ではなく「i < 10」なのに注意

 

条件式

※ 真=正しい、偽=ただしくない、みたいな感じ

// 基本形
(a == 50)   // aが50の場合に真
(a == "hoge") // aが"hoge"の場合に真
(a == b)   // aの内容とbの内容が等しい場合に真
(a != b)   // aの内容とbの内容が違う場合に真
(a > 5)   // aが5より大きい場合に真
(a < 5)   // aが5より小さい場合に真 if(a >= 5)   // aが5「以上」の場合に真
(a <= 5)   // aが5「以下」の場合に真

// 複合条件
( ! 条件式 )   // 「条件式」が偽の場合に真
(! (a == 4) )   // !の例: (a != 4) と同じ意味

( 条件式A && 条件式B ) // 「AかつB」: 条件式AとB両方共真の場合に真
( 条件式A || 条件式B ) // 「AまたはB」: 条件式AかB片方でも真の場合に真
( (a == 4) || (a == 5) )  // aが4か5の場合に真
( (1 <= a) && (a <= 10) )  // aが1~10の場合に真
(  1 <= a  &&  a <= 10  )  // 括弧は省略できる

★基本ライブラリ

デバッグ等のためにメッセージダイアログを表示する

alert('表示させたいメッセージ');

指定時間待って処理を続ける (setTimeout)

// 指定「ミリ秒」後に「関数」を呼び出す
setTimeout(関数, ミリ秒);

// 指定「ミリ秒」後にやりたい処理をベタ書きする
setTimeout(function(){
    // やりたい処理;
    //  ・・・
}, ミリ秒);

★jQuery等外部ライブラリのもの

初期化時に実行される処理の書き方(jQuery)

$(function(){
    // 初期化時にやりたいこと;
    //  ・・・
});

 

セレクタで指定した要素のCSSを変える (color, visibility とか)

$('セレクタ').css('CSS項目名', '変える値');

セレクタで指定した要素の「属性」を変える (src, href とか)

$('セレクタ').attr('CSS項目名', '変える値');

入門の入門でした。

以上。