- githubでfork→作業→commit→rebaseでまとめる→push→GitHubでpull request
- git rebase -i [対象commitのhash] → 対象commitのhash~現在までがでてくる
- でてくるエディタで、pickをsquash にすると、その変更と直前の変更をまとめる
参考リンク
参考リンク
Debian wheezy の webkitgtk-3.0 で、$.ajax を async: true で呼びまくるとFDがリークするっぽい。
ちなみにPyGIから使用している。
まだちゃんと検証はしてないので嘘かも。
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
サイネージというほどのものではないけど、それ的なもののソフトウェアをつくるために、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()
こんな感じにウィンドウが操作できる。
ちなみに、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 (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で「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についてメモ。データ管理の観点から。
主にWikiMatrixからいろいろ引いた。
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を作った人も言っている。
(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のthumbnailで小一時間悩んだ。以下のソース
size = *** img.open(hoge) img.thumbnail((size, size)) img.save(fuga)
これでなぜかサムネイルがfugaに保存されるはずが、そのまま変換前の画像が保存される。
エラーも何も出ず。
いろいろ探っていたらsizeが文字列型なのが問題だった。エラーぐらい出てほしかった・・・。
まとまった文章とか資料とか図表を書くとき向け。当たり前だけど気をつけるべきところなど。思いついたところから。ざっくばらんにですが。。。
入門の入門部分だけざざっと。
// ここはコメント /* ここもコメント */
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( 条件式A ){ // 処理内容; ←ここは「条件式A」が真のとき実行される } else if( 条件式B ){ // 処理内容; ←ここは「条件式A」が偽だけど「条件式B」が真のとき実行される } else if( 条件式C ){ // 処理内容; ←ここは「条件式A,B」が偽だけど「条件式C」が真のとき実行される } else{ // 処理内容; ←ここは「条件式A,B,C」の全てが偽のとき実行される }
※ 「else if(){ ~ }」や「else{ ~ }」 は省略できます。
// 定型文 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(function(){ // やりたい処理; // ・・・ }, ミリ秒);
$(function(){ // 初期化時にやりたいこと; // ・・・ });
$('セレクタ').css('CSS項目名', '変える値');
$('セレクタ').attr('CSS項目名', '変える値');
入門の入門でした。
以上。