Gnomeパネルの配置が変になったら

たまにGNOMEパネル(一番上のメニューバーのこと)のアプレットの配置がおかしくなることがある。電源ボタンが一番右にあったはずなのに他の物がいつのまに一番右にきてることがあったり…

リセットする方法はあるようだ。このサイトによると、.gconfを削除すれば良いということだが、.gconfにはパネル以外の情報も入っているはずなのでちょっと危険だと思う。パネルだけリセットしたければ.gconf/apps/panelだけ削除すれば良い。念のためにバックアップを取ることをおすすめする。

リセットでは根本的な解決になっていない。ちゃんとした設定方法があったので紹介する。
端末などでgconf-editorを起動させる。gconf-editorの中で/apps/panel/appletsを開くと、その中にいくつか項目があるはずだ。どれか一つ選択してみる。そうすると、右側のペインに項目が出てくる。


そのなかにpanel_right_stickという項目とpositionという項目があるはずだ。positionは文字通りアプレットの位置なのだが、panel_right_stickがオンになっていると、positionは右側から見た位置と解釈されるようだ。だから一番右に置きたいものはpanel_right_stickをオンにしてpositionを0にすれば良いことになる。二番目のものは1などにして…これを使えば解像度を変更したりしても配置は崩れない筈。

MacPortsでコンパイラを変更してビルドエラーを回避

コンパイルがうまくいかないパッケージは使用するコンパイラを手動で切り替えたらうまくいった。ビルドに使用するコンパイラを切り替える方法はここで説明されている。

コンパイラを変更してビルドするときは、必ずビルドの前にcleanを実行すること。たとえば

sudo port clean emacs-app

emacs-appはapple-gcc42を使用したらビルドできた。+universalをつけるとコンパイルできなかった。

sudo port install emacs-app configure.compiler=apple-gcc-4.2

apple-gcc42をインストールしていない場合は、それも入れること。自動では依存性を解決してくれないようだ。これも+universalはビルド出来なかった。

sudo port install apple-gcc42


LionになってOpenMPIがなぜか削除されてしまったので、MacPortsでOpenMPIをインストール。デフォルトのコンパイラだとビルド出来ない。

sudo port install openmpi +gcc44 configure.compiler=macports-gcc-4.4

もし+gcc45にするなら、configure.compiler=macports-gcc-4.5にすること。ちなみに、使用するときはmpicc, mpicxx, mpirunなどは、openmpicc, openmpicxx, openmpirunなどに名前が変わっているので注意。前の名前でシンボリックリンクを作っておくと良いかも。


GnuplotwxWidgets出力をする方法がわからなかったのだけど、やっとできた。

sudo port install gnuplot +wxwidgets build_arch=i386 configure.compiler=apple-gcc-4.2

起動したら

set term wxt

wxwidgets出力になる。でもやってみたら、ウィンドウがまったく反応しない。使えない…


MacPortsからすこしずれるけれど、wxPythonはどうしてもMacPortsではインストールできなかった。公式サイトからダウンロードする。

pythonのバージョンが指定されているようなので、使うバージョンのpythonMacPortsで入れておくこと。32bitで起動する必要があるので+universalをつけてビルドする。あと、wxWidgetsMacPortsでいれておく。
そしたら先ほどダウンロードしたwxPythonをインストール。
wxPythonが扱えるバージョンのpythonを次のように起動する。

arch -i386 python2.6

arch -i386は64bitとしてではなく32bitで起動させるという意味。おそらくPythonUniversal Binaryでビルドしていないとだめ。
pythonの中で

import wx

をして、何もエラーがでなければ、正常にインストールされた証拠。
pythonGUIを作れるようになったので、何かつくろうかなあ。

FuseFSを使ってFFmpegでGnuplotの動画を作成

以前「GnuplotをRubyから操作 - notes plastiques」で紹介した方法を使うと Gnuplot で gif アニメを作成できる。しかし、このgifアニメ、ファイルサイズがものすごく大きくなってしまう上に、他の動画ファイルに変換する方法が見当たらない。 Windows だと Giam で変換できるようだが、ファイルサイズが大きいせいか上手く動作しなかった。
そこで別の方法を考える。

できれば、最終的な動画ファイルを作成するまで、中間ファイルをディスクに作成しない方法が良い。 Gnuplot 側で連番で画像ファイルを作成し、それを FFmpeg で動画に変換することは可能だが、一旦画像ファイルを作成するので容量が必要だし、ディスク律速になってしまう可能性もある。

追記(8/15): この段落に記して方法は、別記事にまとめました。

まず考えたのは、 Gnuplot では標準出力に画像を出力し、外部プログラムでそれを受け取ってストリーミングできる動画形式にオンザフライで変換し、それを FFmpeg に渡すという方法。この方法の場合にやらなくてはいけないことは、受け取った画像データを解釈し、動画の1コマとして組み込むこと。画像データを解釈するプログラムを自前で書くのはかなり面倒だ。 ImageMagickC++ bindings である Magick++ を使えば、生のピクセルデータに変換されたものを扱うことが出来る。これを例えば AVI のファイル構造に従って1コマずつ作成していけば良い。 AVI の作成についてはここが参考になる。

ただ、 ImageMagick が必要なのが難点。 ImageMagick の QuantumDepth が8であればよいが、16であると普通の BMP と違うので、自前で変換しなくてはいけない。変換はビットシフトするだけで良いがやはりちょっと面倒だと思う。さらに、 C/C++ から外部プログラムを扱うのがやや面倒。fork-execという手法を使えば良いらしいのだけども…

そこで、別の方法を考える。FuseFSを使う。FuseFSとはユーザー権限で、独自のファイルシステムを作成できるモジュール。これを使って、仮想的に連番の画像ファイルが存在するようにし、読み出されたときはGnuplotを呼び出して出力された画像を返すようにする。こうして、FFmpegから連番ファイルを読み込ませて動画ファイルに変換させる。この方法ならDisk Freeで、しかも画像ファイル構造には無頓着に実装できる。(ただし、FuseFSについて勉強しなくてはいけないけれど。)
FuseFSはいろいろなプログラミング言語から扱える。C言語RubyPythonなど。いちばん良いのはC言語だが、前述したようにGnuplotとのパイプの処理がやや面倒。(それほど面倒でもない?)なので扱い慣れているRubyを扱いたい所だが、Macではなぜか正常に作動しない。そこで仕方なくPythonを使ってみることにした。ちなみにPythonはほとんど自分で書いたことが無かったのだが、あまり抵抗なく書くことが出来た。インデントでブロックを規定してるというのは知っていた。

まずは準備。FuseFSのPython Bindingsをインストールする。
MacPortsの場合、fuse-bindings-pythonfuse-bindings-python25がある。fuse-bindings-pythonPython 2.4用でfuse-bindings-python25はPython 2.5用らしい。新しいのは無いのかな…
Ubuntuの場合、python-fuseがある。
インストールが出来たら、

からダウンロードして、

python main.py /path/to/mountpoint

でマウントする。pythonfuseが扱えるバージョンを使うこと。
そしたら、/path/to/mountpointを開くと、image_0.pngとimage_1.pngとimage_2.pngがみえるはずだ。普通に開いてもらえば、三角関数のグラフがみれると思う。一覧では見えていないが、実はimage_数字.pngというファイルも読み出せば存在するようになっている。試しにimage_100.pngなどを開いてみていただきたい。この数字は313まで呼び出せるようになっている。ffmpegで上限が無いとエラーになってしまうから上限を設定した。ちなみに、image_00100.pngのようにしても読み出せるのでお試しいただきたい。
動画化は

ffmpeg -i /path/to/mountpoint/image_%d.png -sameq out.mp4

などとすれば良い。正弦波が進行していく様子が動画になるはずだ。

コードについて記しておく。
Gnuplotとのやりとりはsubprocess.Popenを用いている。外部プログラムとの連携を比較的簡単に行える。

サンプルプログラムのhello.pyが参考になる。

からfuse-pythonをダウンロードして解凍すると/example/hello.pyに確かあったはず。

現在のコードの問題点は、ファイル名ごとにいちいちGnuplotを立ち上げているということ。プロセス立ち上げのコストがかかってしまう。できれば一度だけGnuplotを立ち上げ、その中でplotを何回も呼び出して、としたいのだが、plotしたときに出力される画像データがどこで区切られているのか検出するのが困難なので実装できてない。ちなみに既に呼び出されたファイルについてはreleaseが呼ばれるまでは保持するようにしている。あとは、Pythonに慣れていないのとメモリ管理に詳しくないのとでいただけない実装になっているからなおしたい。

GnuplotをRubyから操作

C#から操作するのはこのブログで昔に扱ったったように思うけれど、最近はずっとUnix環境下なのでRubyで。
RubyでOpen3というのを使うと、Ruby内で外部プログラムを起動してその標準入力、標準出力、標準エラー出力を扱うことができる。

例えばアニメーションの作成

#!/usr/bin/ruby

require 'open3'

Open3.popen3('gnuplot') do |gp_in, gp_out, gp_err|

  Signal.trap(:INT) do
    gp_in.close
    print gp_err.read
    exit
  end
  
  gp_in.puts "set terminal gif animate delay 2 optimize size 640, 480"
  
  gp_in.puts "set output \"pic.gif\""

  PhaseSplitCount = 128
  TWO_PI = 3.141592 * 2
  
  for i in 0..(PhaseSplitCount-1)
    gp_in.puts "plot sin(x+#{i*TWO_PI/PhaseSplitCount})"

    gp_in.puts "print \"#{i}\""
    puts gp_err.gets
  end

  gp_in.puts "set output"
  gp_in.puts "exit"
  
  gp_in.close
end

これをすると正弦波が移動していくアニメができる。
途中の

gp_in.puts "print \"#{i}\""
puts gp_err.gets

は何をしているかというと、gnuplotにコンソール出力をさせ、それを読み取るまでRuby側で待つということをして、同期をはかっている。別に非同期でよければ無くてもよいのだが、アニメーション作成時だったらどのコマまで描画したかというのは知りたいものであろう。
あと

Signal.trap(:INT)

のくだりは、Ctrl+Cで強制終了させられるときには、その前にgnuplotのパイプを閉じるようにしている。そうしないと終了しないからだ。

Google ChromeからのHTTPリクエストを監視するExtensionを作る

アクセスしているアドレスを一覧表示する方法のメモ - notes plastiques」の続きで、Google ChromeからどんなURLにアクセスしているかを解析するためのGoogle Chrome Extensionを作ってみた。案外と簡単に作成できた。
WebRequestAPIという試験的APIを使用する。

通常では試験的APIは使用を制限されているので制限解除するためにChromeを設定する必要がある。(後述)

Extensionの作り方はここが参考になる。

Extensionを作る

適当な名前でフォルダを作成し、これらのファイルを作成する。

{
  "name": "url analyse",
  "version": "0.1",
  "description": "url analyse",
  "permissions": [ "experimental" ],
  "browser_action": {
    "default_icon": "icon.png",
    "popup": "popup.html"
  }
}
  • icon.png
    • アイコン用。19x19で適当に。
  • popup.html
<a href="analyse.html" target="_blank">open</a>
  • analyse.html
<div id="capturelist"></div>
<script>
var capturelist = document.getElementById("capturelist");
chrome.experimental.webRequest.onBeforeRequest.addListener(function(details){
  capturelist.innerHTML += details.url + "<br />"
});
</script>

Extensionをインストールする

まず試験的APIの使用を可能にするために、about:flagsあるいはchrome://flagsを開き、「試験運用版の拡張機能 API」を探し、有効化する。実際に有効化するには再起動が必要なので、再起動すること。

拡張機能のページ( chrome://extensions/ )を開き、右上の「デベロッパーモード」をクリックすると、ボタンが出てくるので「パッケージ化されていない拡張機能を読み込む…」をクリックし、フォルダ選択ダイアログが開くので、先ほど作成したExtensionのフォルダを選択し、拡張機能として登録する。
そうすると、右上の拡張機能のアイコンが並んでいるところに、今回作成した拡張機能のアイコンが現れるので、クリックする。そうすると、openというリンクが書かれたポップアップが現れる。そのリンクをクリックすると、新しいタブが開く。真っ白の何も書かれていないページの筈だ。
そのタブを開いたままにして、どこかページにアクセスしてみる。その後、先ほどひらいた拡張機能のタブにもどるとURLがずらっと一覧表示されているはず。めでたし。


これでいろいろ遊べそうですね。WebRequestAPIが実際に正式APIとして生き残るかは謎ですが…
あと、拡張で自動的にダウンロードして保存ができれば完璧なのだが、やり方は分からない。ひょっとしたら出来ないのかもしれない。

検証したChromeのバージョン:12.0.742.122

一度の三角関数の解析値

一度の三角関数にむけて - notes plastiques」の続き。

maximaを使うことで計算できた。

cos1:-sqrt(-2^(4/3)*(4^(1/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)*sqrt(-2*4^(11/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/3)+2^(13/2)*sqrt(3-sqrt(5))*%i*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(13/2)*sqrt(sqrt(5)+5)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+4^(13/3))+32*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(7/2)*4^(1/3)*sqrt(3-sqrt(5))*%i+2^(7/2)*4^(1/3)*sqrt(sqrt(5)+5))^(1/3)-4^(22/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(4/9)/(4^(1/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)*sqrt(-2*4^(11/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/3)+2^(13/2)*sqrt(3-sqrt(5))*%i*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(13/2)*sqrt(sqrt(5)+5)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+4^(13/3))+32*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(7/2)*4^(1/3)*sqrt(3-sqrt(5))*%i+2^(7/2)*4^(1/3)*sqrt(sqrt(5)+5))^(1/3)+2^(5/3)*4^(11/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/9))/(2^(13/9)*4^(5/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/9));
sin1:-sqrt(-2^(4/3)*(4^(1/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)*sqrt(-2*4^(11/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/3)+2^(13/2)*sqrt(3-sqrt(5))*%i*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(13/2)*sqrt(sqrt(5)+5)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+4^(13/3))+32*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(7/2)*4^(1/3)*sqrt(3-sqrt(5))*%i+2^(7/2)*4^(1/3)*sqrt(sqrt(5)+5))^(1/3)-4^(22/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(4/9)/(4^(1/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)*sqrt(-2*4^(11/3)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/3)+2^(13/2)*sqrt(3-sqrt(5))*%i*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(13/2)*sqrt(sqrt(5)+5)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+4^(13/3))+32*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/3)+2^(7/2)*4^(1/3)*sqrt(3-sqrt(5))*%i+2^(7/2)*4^(1/3)*sqrt(sqrt(5)+5))^(1/3)+2^(5/3)*4^(11/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(2/9))/(2^(13/9)*4^(5/9)*(sqrt(2)*sqrt(3-sqrt(5))*%i+sqrt(2)*sqrt(sqrt(5)+5))^(1/9));

maximamacportsやapt-getなどで入れられる。


maximaに入力した命令はこちら

一度の三角関数にむけて

今日は塾バイトの日。数学を教えていたら、ふと一度の三角関数の厳密値ってどうなるんだろうと気になって調べてしまった。

もちろん半角と三分の一角の三角関数は、倍角公式を使って方程式を解けば計算可能だ。

半角だったら

  • 2\cos^2 \theta-1=\cos 2\theta
  • - 2\sin^2 \theta + 1=\cos 2\theta

三分の一角だったら

  •  4 \cos^3 \theta - 3 \cos \theta = \cos 3 \theta
  •  - 4 \sin^3 \theta + 3 \sin \theta = \sin 3 \theta

三次方程式までなら、Wolfram先生に頼めば厳密解を解いてくれます。

でも五分の一角は…五次方程式だから無理…


というわけで、360=2*2*2*3*3*5なので、五度の三角関数まで頑張って計算させてみた。(360とは書いたけれど30度の三角関数から始めた。)

Cos[5 deg] = Sqrt[(1/2) (1 + (1/2) Sqrt[(1/2) (4 + 2/((1/2) (1 + I Sqrt[3]))^(1/3) + 2^(2/3) (1 + I Sqrt[3])^(1/3))])]
Sin[5 deg] = Sqrt[1 + (1/2) (-1 - (1/2) Sqrt[(1/2) (4 + 2/((1/2) (1 + I Sqrt[3]))^(1/3) + 2^(2/3) (1 + I Sqrt[3])^(1/3))])]
  • cos(5 deg) =
  • sin(5 deg) =

すごい汚い…笑


虚数単位が入ってくるのは仕方ないのだっけ。たしか三次関数の解で、解自体は実数だけど、どうしても表式に虚数単位が入ってしまうっていうのがあったような。不思議ねぇ。



一度はどうやっても無理なのかなあ


追記
72度の三角関数を忘れていた。

六度が計算できた。

Cos[6 deg] = Sqrt[7 + Sqrt[5] + Sqrt[6 (5 + Sqrt[5])]]/4
Sin[6 deg] = (-1 - Sqrt[5] + Sqrt[30 - 6 Sqrt[5]])/8

あとは加法定理で…

あれ、Wolfram先生が働いてくれない…苦笑