Skip to main content

Posts

Showing posts with the label python

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...

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

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

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 で画像を比較するツールを書いた.