Skip to main content

Posts

Showing posts with the label programming

Wordpress の qtranslate の言語セクションを取り除くプログラム

概要 これは qTranslate から各言語のマルチサイトに移行する際に使うプログラムです。qTranslate によってつけられた言語ごとの内容とタグを取り除きます。 Keywords: qTranslate, qTranslate-X, multi-site, multi-language, Wordpress はじめに 今から 10 年ほど前 (2013年) 当時の Web Hosting では一番安いサービスでは利用できる SQL database の数は 0,そして次のレベルでの databse 付きのサービスでも 2 個まで,というようなものが多かったです。そのため database を使用する Wordpress を多言語で使う際には qTranslate https://qtranslatexteam.wordpress.com/ などの多言語化プラグインを使い database の消費数を減らすことが行なわれていました。 qTranslate プラグインの仕組み qTranslate プラグインでは地の文に特殊なタグ ([:ja],[:]など) を入れてプラグインがその都度言語ごとの内容を取り出すという方法をとっています。 qTranslate プラグインの利点と問題点 多言語化しても database の消費数が 1 個で済むのが qTranslate の一番大きな利点です。10 年前 (2013年) にはdatabase 数が 2 個までというようなHosting service が普通であったため,この利点は大きかったです。しかし,qTranslate では地の文にタグを入れて言語を区別するため,タグを誤って消してしまったり,知らずにタグと同じ文字列を入れると表示が乱れるという問題があります。また,他のプラグインは内容にタグを入れて言語を切りかえていることを知らないために,同時に使えないプラグインがありました。つまりプラグインの利用に制限があります。 qTranslate サポート終了, Wordpress の version up 現在は database の価格が低下し,入門の Web Hosting サービスでも 10 個の database を使えるというものも珍しくなくなりました。そして qTranslate は Wordpres...

boost sha1 の出力と python の hashlib の出力を比較しながら使いたい場合

先日, sha1 ダイジェストを C++ (boost) と python の両方で使いたいということがありました。通常 1 つの言語だけで実装する場合には配列の中身さえ同じならばいいのですが,私の利用方法では 2 つの実装のからの出力が一致する必要がありました。このコードはその問題を避けていますので,もし,こういう利用方法をされる場合には参考になるかと思います。(単純にフォーマットをそろえているだけです。) #include <boost/uuid/sha1.hpp> /// get sha1 digest as a std::string /// /// \param[in] mes message to be hashed /// \return digest string std::string get_sha1_digest(const std::string& mes) { boost::uuids::detail::sha1 sha1; sha1.process_bytes(mes.c_str(), mes.size()); const int DIGEST_SIZE = 5; unsigned int sha1_hash[DIGEST_SIZE]; sha1.get_digest(sha1_hash); std::stringstream sstr; for (std::size_t i=0; i < DIGEST_SIZE; ++i) { sstr << std::setfill('0') << std::setw(8) << std::hex << sha1_hash[i]; } return sstr.str(); }      上記の関数の出力は,次の python code の出力に一致します。   import hashlib def get_sha1_digest(mes): sha1_obj = hashlib.sha1(mes.encode()) return sha1_ob...

複数の線を持つ線グラフを Jenkins の plot plugin で描く方法

私は毎夜のソフトウェアテストを自動化するために Jenkins というツールを使っています.今回は, valgrind  を使ってメモリーリークのテストを自動化することにし ました.その際,エラーの数の結果をグラフとして表そうと思って, Plot plugin  を使うことにしました. Plot plugin の例図からは,複数のデータラインを描くことができるのは明らかなのですが,どうやったらいいのかは参照のページや,例としてあった Perl script,plugin 中の help からは私にはよくわからなかったのです. ここで重要な考えは,それぞれのデータラインにはそれぞれの出力ファイルが必要ということでした.私はこれを誤解していました. 例として,ビルドの時に次の property データファイルを出力します.それぞれのファイルが1つのデータラインを表します. valgrind_trunk_result.definitely.property valgrind_trunk_result.indirectly.property valgrind_trunk_result.possibly.property それぞれのデータの中身は1行のデータ点です.たとえば, valgrind_trunk_result.definitely.property ファイルの中身は次のような1行 です. YVALUE=0 このファイルを ${WORKSPACE} ディレクトリ以下に出力します.ここで," WORKSPACE " は jenkins が提供する環境変数です. 図1が私の plot plugin の設定を示しています.これは jenkins の config 画面です.3つの data series があって,それぞれにデータファイルがあります. Figure 1: Plot plugin configuration in Jenkins 図2が結果です.複数の線が描かれているのがわかります.(実際には 3 本の線がありますが,最初の線と2番目の線が同じデータなので,重ねって見えません.) Fugure 2: Plot data with multiple data lines

ビデオ字幕のタイミング作成の半自動化

概要 私はボランティア活動として誰もが無料で利用できる算数の解説のビデオの翻訳をしている.このビデオに字幕をつける作業に費やす時間が意外に多くて困っている.作業の流れ(ワークフロー)から,字幕作成時には既に音声の入ったビデオとそのスクリプトがあるので,これを使ってできるだけ自動で字幕を作成できないかと考えた.今回,タイミング作成のエンジンとして YouTube の transcript機能を使って,半自動で字幕タイミングを作成したところ,作業時間をある程度短縮することができた.YouTube のtranscript 機能では text フォーマットが入力となるので,srt ファイルを text にする filter を実装した.また,transcript 機能でタイミングを作成した場合,字幕に不自然な改行が入ることがある.そこでこれを除く機能も実装した.以前,13分のビデオの字幕のタイミング生成をした時,手動で 4 時間半程度かかったが,今回の方法でほぼ同じ長さのビデオの字幕タイミング作成を3時間弱程度に短縮することができた.今回作成したソフトウェアは new BSD license で公開しているので,誰でも自由に利用することができる. 字幕のタイミング作成の半自動化 私はボランティア活動で「どうして分数の割り算はひっくりかえしてかけるのか」とか「そもそも分数で割るというのはどういう意味か? 3で割るという意味ならわかるが,2/3 で割るとはどういう意味なのか?」のような算数の解説のビデオ作成をしている.その際に字幕も作成するのだが,このタイミングの作成にかなりの時間をとられている.例えば,13分のビデオの字幕タイミング作成に4時間半程度かかったことがある. しかし,私には字幕のスクリプトがあり,そして音声も作成している.今回,これを使ってできるだけ字幕のタイミング生成を自動化できないかをSundayResearch のテーマとした. 私の友人の一人に音楽の mp3 ファイルをフーリエ解析し,そこからリズムをとり出すというソフトを作った人がいる.その人はダンスダンスレボリューションというゲームのマットを持っているのだが,ゲーム機は持っていないので,それで遊ぶために作ってみたということである.最初は字幕作成には音声の解析をすべき...

Scratch を学ぶ (2)

前回は scratch というプログラミング環境がどういうものかを簡単に話しました.そこではイベントという考えを使ってプログラムが動きます.今回はこの環境でキャラクターを動かした10歳の生徒の話です. この Scratch というプログラミング環境では,キーイベントというイベントの一種が提供されています.たとえば,「右の矢印キーを押す」というイベントがあります.このイベントが起こると,x を 10 増やすというようなプログラムを書きます.すると,右の矢印キーを押すたびに猫を右に動かすことができます.これを上下左右のキーでそれぞれ行うことで,キーを使って猫を移動させることができます. 今日の生徒はドラゴンを登場させて,同じことをしました.するとなんと,猫もドラゴンも全く同じ動きをしてしまいます.まあ,そのようにプログラムしたので当然です.コンピュータはとても速く計算し,とても正確で,そしてとても愚かなものです.書いたとおりのことしかしません.その生徒はドラゴンを速く動かしたいと言いました.私は動く量を変えましょうと答えました.今は1回のキーを押すと,動く量が 10 です.速さとは一定時間に動く距離のことですから,これを増やせば速度は思いのままに変えられます.しばらくしてどうしたかなと思って見たら,この生徒はなんと,同じキーイベントをもう1つ作っていました. つまり,右矢印のイベントが発生すると,2つのプログラムが起動するのです.1つのプログラムは10右へ移動であり,2つのプログラムでは合わせて20の移動になります.この環境では並列に動く部分でもちゃんと考慮されているようにできているらしく,これで正しく2倍の速度で動くのです.3倍速く動かすためには,もう1つプログラムを起動すればできます.なんという発想! 私はジョジョという漫画の1シーンを突然思い出しました.主人公がスタンドで浮くという場面です.(知らない人はすみません) 仗助がスタンドに押されて移動する場合,私の発想はスタンドの押す速度を変えることでしたが,この生徒の発想はスタンドの数を増やすことだったのです. しかし,この生徒の方法では基本的に整数倍にしか速くできません.もちろん1つのプログラムがキャラクターを10押して,もう1つが同じキャラクターを5押すとすれば 15 押すことになり.1.5 倍の...

Scratch を学ぶ (1)

しばらく前から私は Scratch [1] というプログラム言語を10歳から12歳の生徒達に教えています.時々見る生徒の創造力というのはかなり驚くものです.その1つをここに書いておこうと思います. まずはプログラムを少し知っている人に向けての概念的な説明をしましょう.後で10歳の生徒にする例による説明も書きます.概念を理解した方が応用がきくのですが,どうしてもとっつきにくいものです.また,例による説明はその例についてはわかるのですが,その他の場合にどうなるかがわからないことが多いという問題があります. Scratch というのは言語名でもありますが,プログラム環境でもあります.その環境ではスプライトキャラクター [2] というものをイベントリブンで動かすプログラムができます.スプライトキャラクターはオブジェクトと考えても良いもので,イベントによってプログラムが起動し,それぞれのプログラムは並列に走ります. しかし,このような説明ではプログラムをしたことのない人には何のことはわからないでしょう.プログラム環境,スプライト,イベント,オブジェクトなどはプログラミングで使う概念なので,それぞれについて理解する必要があります.しかし,もちろんこのような概念は10歳の生徒にはあまり話をすることはありません.先に述べたように例による説明には問題点がありますが,ここではまず例を使って説明をしたいと思います. たとえば scratch を起動すると,猫がいます(図 1).この猫に何かが起こるとどうするかということをプログラムするのです.ここで何かが起こるというのは,マウスのボタンが押されたとか,何かキーが押されたとか,そういうことです.それをイベントが発生すると言います.イベントが発生するとプログラムが動き出すので,イベントで駆動(driven: ドリブン)のプログラムと言います.それぞれのキャラクター,猫とか犬とかは自分の状態を持っており,その状態を使ってプログラムが動きます.状態というのは,猫がどこにいるかという位置とか,猫がどちらの方向を向いているとかのことです.プログラミングでは,状態を持っているものをオブジェクトということがあります.ここでは猫は1つのオブジェクトであり,犬もまた1つのオブジェクトです. Figure 1. Scratch pro...

空白を含むコマンドラインオプションを bash スクリプトに渡す:$* と $@

私は bash にしろ C++ のプログラムにしろ,コマンドラインを処理する時にはできるだけ規則的なものだけにして極力簡単で済ませるようにしている.たとえば,全ての引数は '-arg_key value' のようなものであり,たとえ必要なファイル名であってもできるだけこの規則に従うようにしている.この場合,コマンドラインのオプションは必ず key を持つのでその結果は map に入れておけば良い.こうするだけでパースのコードは驚くほど簡単になり,getopt などを使う必要もない.また,コマンドラインのサポートはできるだけ簡単にしてできるだけconfig ファイルを用いることにしている.というのは,1つはこの方法では負の数値の指定に困るからであり,もう1つはテストなどでの再現が簡単だからである. しかし,この方法はコマンドラインオプションの value が空白を含む場合には問題が起きる.できれば config file だけですませたいが,そうもいかないこともある. そのような例を示そう. たとえば vector 値を渡したい場合に command -eye_position '0 0 -10' -up_vector '0 1 0' とするような場合を考える.C++ のプログラムを手動で起動する場合には問題はないが,これが test case などで shell script や python から呼び出したい場合には注意が必要である. この例を test_1.sh に示す. -- test_1.sh -- echo "call with two args, but the second one has spaces." echo "./test_2.sh args0 'args1_1 args1_2 args1_3'" ./test_2.sh args0 'args1_1 args1_2 args1_3' -- test_1.sh -- 呼び出される test_2.shはコマンドラインがどのように解釈されるかを示す. -- test_2.sh -- echo "show the args...

Math objects on programming (2)

単純な組合せを生成することは前回で述べた.しかし,私の仕事では,GPU という高速ではあるが,メモリサイズが小さい計算機を使う必要がある.ここでの data size は GB の単位であり,64 GB とか 512 GB というのは現在のところ,一台の GPU には収まらない.512 GBは我々の使っている一台の計算機の実メモリにも収まらない.そこで,何十台かの計算機に複数の GPU を搭載して,それを協調して使うわけである.ほとんど全ての我々のクライアントは計算機の台数と性能の関係についての情報を要求する.それは我々のクライアントは特定の問題を解く必要があり,そのためには何台の計算機と何台の GPU を購入する必要があるかを知りたいためである.したがって,計算機を何台使ったかについてプログラムのデータ処理のスループット性能がどうかを見たい.そこで,計算機の台数を新たなパラメータとする. data_size_list = [ 5, 64, 512, ] screen_resolution_list = [ '2560x1440', '3840x2160', ] node_count_list = [ 1, 2, 4, 8, 16, 32, 64, ] しかし,データがメモリに収まらなければ遅いことは確実にわかっているので,テストに際しては計算機の台数は data size によって変化させたい.ループの場合には,不要なものを filter out するということが簡単に思いつく.以下のようなプログラムになるだろう. for d in data_size_list: for s in screen_resolution_list: for n in node_count_list: # FILTER: filter some cases. # assume one node can handle # 64G, but not more if (n * 64 < d): continue item_list = [ d, s, n, ] comb_list.append(it...

Python PIL experiment (a image comparison tool) continued

numpy and PIL 実際に画像に適用してみた所,1024x1024 の大きさの画像では処理に 6 秒程度,消費するメモリサイズは230MBなのだが,3840x2160の画像を利用すると,2.3GBのメモリと263秒の時間がかかることがわかった.この2つの解像度はpixel の数で言えば 8 倍程度で,メモリの処理が比例しているのは良いとしても,処理の時間がかかりすぎる.また,メモリの消費量自体も多すぎる.私はプログラム中で3つのバッファを使っているだけであり,1024x1024の場合には 10 MB程度,3840x2160 の場合には,72MB程度と思っていた.しかし,30倍ものメモリが消費されている. プロファイルの結果,最内ループの tuple の生成と abs 関数にほとんどの時間がかかっていることがわかった.そこで,この部分を numpy で書くことにした.結果を以下に示す.Intel Core i7-2720 2.20GHz Linux(Kubuntu 12.10, kernel 3.5.0-27), Python 2.7 における結果である. native  230MB, 6.0 seconds for 1024x1024 image numpy 110 MB, 0.21 second for 1024x1024 image native  2300MB, 263 seconds for 3840x2160 image numpy 320 MB, 1.18 second for 3840x2160 image 計算速度は 30 倍から200倍に, メモリサイズも 50% から 15% の消費量と激減している.実は最初の実装では倍程度にしか高速化できなかったので,私は多少失望したのであるが,profile した結果,非0の要素をカウントするための sum関数がほとんどの時間を占めていることに気がついた.この sum 関数は pythonのbuildin のもので,おそらく numpy の data 構造から毎回値を取り出しては計算しているのであろう.これを numpy.sum に変更した所,ほどんどの時間を占めていた sum 関数の消費時間が profile では...

Python PIL experiment (a image comparison tool)

概要: Python の画像 module PIL を使ってみた. Python PIL module Python には画像ファイルを処理するのに便利な Python Imaging Library (PIL) という module がある.今回はファイルフォーマットは異なるが,内容が同一かどうかをテストしたいという状況にあった.たとえば,テストの参照となるファイルは圧縮されているが,それと比較するファイルはそうではないというようなものである.convert などのツールを使うということも考えたが,時には使ったことのないツールを使ってみるのもよいだろうと PIL で画像を比較するツールを書いた.

Math objects on programming (1)

概要 プログラミングにおいて数学的な object を使うとプログラムが簡単になることがある.今回この考えが上手くいった例に会ったのでそれを示す. 数学的 object とプログラミング プログラムのテストにおいて,異るパラメータの組合せを考えるということはよくあることである.組合せを生成する簡単な方法は,多重ループを使うことである. ここではpython 風の pseudo code を使う.また,実際に動く python のプログラムも公開する. たとえば,2つのパラメータのリストがあった場合,  data_size_list = [ 5, 64, 512, ]  screen_resolution_list = [     '2560x1440', '3840x2160', ] この組合せは,   for d in data_size_list:     for s in screen_resolution_list:       print_comb(d, s) # output のように書いて出力することができる.この方法は簡単であるが,ある特定のリストが不要な場合,プログラムコードを変更する必要がある.それで直積の考えを使って組み合わせを生成することにする [1].何の積かというと,集合の積である.ここに k 個の集合があり,その要素の全ての組合せを考える時,k 個の集合の直積を考えている.これは再帰的に定義することができる. \(k = 0\), つまり 0 個の集合の直積は一つの空リスト([])である. \(k \geq 0\) の時,       \begin{eqnarray*}       A_1 \times \cdots \times A_k   &=&\left\{(a,t)| a \in A_1, t \in A_2 \times \cdots \times A_k        \right\} \end{eqnarray*} である.二番目の条...