ochalog

RubyとMediaWikiとIRCが好き。

DSSP で求めた二次構造を反映させる PyMOL スクリプトの生成(マイナーアップデート版)

2013 年に書いたものを更新。当時と Ruby の書き方が少し変わった。

PyMOLを使ってみよう/クックブック - BioKids Wiki」で書かれているように、タンパク質の構造を詳しく議論したくて DSSP で計算した結果と図の二次構造を合わせたい場合がある。ただ、この PyMOL スクリプトを 1(または数)残基ずつ打ち込むのも面倒なので、自動でスクリプトを生成するプログラムを Ruby で書いてみた。ちなみに、研究室にいる間に研究に使える汎用的なプログラムを書いたのは初めて(笑)

プログラム

やっていることは、入力された DSSP ファイルを本体まで読み飛ばし、鎖と残基番号で指定した残基の二次構造を前述の BioKids Wiki のページの表に従って変換するスクリプトを出力する、という流れ。DSSP ファイルの固定幅の性質を使っているので、バージョンアップで出力形式が変わったら動かなくなるかも。一応手元の DSSP ファイルではすべて正常に動いた。

使い方

foo.pdb と対応する foo.dssp を用意して

ruby gen-alter-ss-dssp.rb foo.dssp > alter-ss.pml

で PyMOL スクリプトファイル alter-ss.pml が生成される。

あとは PyMOL で foo.pdb を読み込んだ後、「File」→「Run...」で alter-ss.pml を読み込むか、

@ alter-ss.pml

とコマンドを打ち込めば、二次構造が DSSP で計算されたものに一気に変わる。

手元で試してみた限りでは、PyMOL の DSS と DSSP では意外と二次構造の割り当てが異なるので、やはり気をつけた方が良いのかも。

2015-03-24 の日記

今日も学校で Linux 環境構築。

結局 PC には Lubuntu、Raspberry Pi には(Raspbian をやめて)Arch Linux を入れた。どちらも軽さ重視。特に Raspberry Pi の方はサーバーとして動けばよいので、GUI とか余分なソフトはいらないということで。以下つらつらと。

Lubuntu

  • ノーマル Ubuntu ではなく Lubuntu を入れてみたら大違い。グラボのせいか前者ではカクカクだったのが、とても滑らかに動くように。
  • ところが ARandR でデュアルディスプレイにしたらカクカクに戻った。あきらめて広めの 1 台ディスプレイに替えたら軽快な動作に戻った。Lubuntu でもこんなに重くなるものなのだろうか。
  • プロキシサーバーの設定は /etc/profile.d にファイルを作って置くのが手っ取り早そう。$http_proxy$https_proxy$ftp_proxy をそれぞれ一緒にしておけばよかった。
  • 今日の新発見は「Terminator」。OS XiTerm2 のように端末の画面分割ができる。作業効率がかなりアップ。
  • あとは Vim とか、いつもの設定。
  • 途中から、Raspberry Pi はこの端末からの SSH 操作で設定した。

Raspberry Pi

  • 以前書いた Arch Linux 関係の記事が役に立った(笑)
  • Arch Linux メモリーカードの準備の仕方が以前と異なるdd でイメージを焼き込むのではなく、パーティションを事前に準備してそこに tar で展開する Gentoo と似た方法になっていた。大容量メモリーカードでも途中でパーティションを広げなくてよくなり、楽になった。
  • ネットワークの設定を systemd-networkd で行うようになっていた。設定がより簡潔になっていて、個人的には好印象。
  • 以前と少し手順を変えた。ストレスが溜まるので、ロケールkeymap 関係は真っ先にやった方が良い印象。
  • 勢いで、研究室ローカルドメインDNS 設定を BIND でやってみた。先生が今年度の先輩に出されていた課題では dnsmasq を使っていたけれど、ゾーンファイルを書いたことがあったのと「DNS & BIND」の本があったので、BIND でいいや、と。
  • GitBucket を起動させてみたら数分もかかった。Raspberry Pi ではハードなのか… GitLab だともっと重そうな気がするが、どうか(インストールが面倒そうだったので今日はあきらめた)。

DNS & BIND 第5版

DNS & BIND 第5版

2015-03-23 の日記

午後から学校の研究室の準備(まだ研究室に正式に入っているわけではないけれど)。

4 月から何人かで先輩が書いたプログラムをいじっていくことになる。クリエイターズネットワークでそこそこうまくいっていることから、Git を使った履歴管理を試してみたいと思っている。研究室に Raspberry Pi がいくつかあるので、実家と同じように Model B のひとつを使ってサーバーを立て、GitLab あたりを動かしたい。あと、それと別に仮想マシンでない Linux 環境が欲しかった。

そういうわけで、Raspberry Pi ともう 1 台の PC の Linux の設定を行った。

学校だとプロキシサーバーを通してインターネットにアクセスすることになるのだけれど、思いの外そのために引っかかることがあった。ブラウザとか apt とかソフト単位で設定しなければ接続できないし、Raspbian のイメージを落とすときにウィルスチェックがかかるせいで想像以上に時間がかかったことも。この辺りは実家で勝手に動かすときとは違う。そういうことで予想外に時間が取られたので、本設定は明日へ持ち越し。

もう 1 台の PC の方は、CPU は i5 でメモリが 16 GB も載っていた(贅沢!)ので、ノーマル Ubuntu でいいかと思ったのだけれど、いざ入れてみると意外とカクカク。ビデオカードの性能不足なのかなぁ。重すぎで作業にならなそうだったので、明日 Lubuntu を改めて入れてみようと思う。

flex の練習:Hiki の見出し抽出

flex の練習その 2。昔 Hiki2MediaWiki でやったような Hiki の見出し抽出。

  • Hiki ソースを標準入力から読み込み、見出しのみを抽出して標準出力に出力する。
  • MediaWiki のように見出し番号を表示する。
  • 見出しレベルが連続していなくても、親子関係を正しく認識する。

hiki-outliner.l

/*
 * Hiki の見出し抽出
 * MediaWiki のように見出し番号をつけて表示する
 */
%{
  int n_bang_stack[7] = {0};
  int n_bang_stack_pos = 0;
  int heading_counter[7] = {0};

  // 見出しを表示する
  void print_heading(int* counter, const char* content);
%}

HEADING ^!{1,6}.+

%option main

%%

{HEADING} {
  int n_bang = 0;
  char* text_ptr = yytext;

  // '!' の数を調べる
  while (n_bang < 6 && *text_ptr == '!') {
    ++n_bang;
    ++text_ptr;
  }

  if (n_bang > n_bang_stack[n_bang_stack_pos]) {
    // 小見出しなので push する
    ++n_bang_stack_pos;
  } else {
    // 同レベルの見出しが見つかるまで pop する
    while (n_bang <= n_bang_stack[n_bang_stack_pos - 1]) {
      --n_bang_stack_pos;

      // 1 つ下のレベルの見出し番号をリセットする
      heading_counter[n_bang_stack_pos] = 0;
    }
  }

  n_bang_stack[n_bang_stack_pos] = n_bang;
  ++heading_counter[n_bang_stack_pos - 1];

  print_heading(heading_counter, text_ptr);
}

.  { }
\n { }

%%

void print_heading(int* counter, const char* content) {
  int i;

  putchar('0' + counter[0]);
  for (i = 1; i < 6 && counter[i] > 0; ++i) {
    putchar('.');
    putchar('0' + counter[i]);
  }
  putchar(' ');

  puts(content);
}

入力例 1

見出しレベルが連続している例。スパロボ Wikiサイバスター」より。

hiki-outliner-sample1-in.txt

!サイバスター
地球内部にひろがる異相世界ラ・ギアスに広大な版図をもつ「神聖ラングラン王国」で作られた風系魔装機。

!!サイバスター・ポゼッション
風の精霊王サイフィスと完全な同調を果たしたサイバスターの姿。

!登場作品と操縦者
基本的にマサキ・アンドー専用機として登場する。

バンプレストオリジナルロボットの元祖。

!!旧シリーズ

!!!第2次スーパーロボット大戦
初登場。

!!αシリーズ

!!!スーパーロボット大戦α
バランス調整で「サイフラッシュ」に加え「コスモノヴァ」を故障で使用不可という状態で参戦する。

!!!スーパーロボット大戦α外伝
マサキより遅れてセニアが地上に運び込み、次のマップからマサキがジャオームから乗り換える。

!装備・機能
高い運動性を誇り、機体とパイロットの回避力を高めれば避けて当てるリアルロボット的な運用法ができる。

入力例 2

見出しレベルが連続していない例。

hiki-outliner-sample2-in.txt

!サイバスター
地球内部にひろがる異相世界ラ・ギアスに広大な版図をもつ「神聖ラングラン王国」で作られた風系魔装機。

!!!サイバスター・ポゼッション
風の精霊王サイフィスと完全な同調を果たしたサイバスターの姿。

!登場作品と操縦者
基本的にマサキ・アンドー専用機として登場する。

バンプレストオリジナルロボットの元祖。

!!!旧シリーズ

!!!!第2次スーパーロボット大戦
初登場。

!!αシリーズ

!!!!スーパーロボット大戦α
バランス調整で「サイフラッシュ」に加え「コスモノヴァ」を故障で使用不可という状態で参戦する。

!!!!スーパーロボット大戦α外伝
マサキより遅れてセニアが地上に運び込み、次のマップからマサキがジャオームから乗り換える。

!装備・機能
高い運動性を誇り、機体とパイロットの回避力を高めれば避けて当てるリアルロボット的な運用法ができる。

出力例

./hiki-outliner < hiki-outliner-sample1-in.txt
./hiki-outliner < hiki-outliner-sample2-in.txt

どちらの例でも、以下のように正しい親子関係で MediaWiki の目次っぽく出力される。

1 サイバスター
1.1 サイバスター・ポゼッション
2 登場作品と操縦者
2.1 旧シリーズ
2.1.1 第2次スーパーロボット大戦
2.2 αシリーズ
2.2.1 スーパーロボット大戦α
2.2.2 スーパーロボット大戦α外伝
3 装備・機能

じくかいせきつーる flex のれんしゅう

最近、青学 Martin J. Dürst 先生の「言語理論とコンパイラ」の講義資料で字句解析と構文解析を勉強中。ダイスボットのコマンドに利用できればと。

リポジトリも作ってみた。

https://github.com/ochaochaocha3/duerst-compiler

字句解析

まだ始めたばかりであまり分かっていないが、とりあえず「字句解析には正規表現が使える」ということが分かった(第 2 回「形式言語の重要性、種類、定義」)。flex を使うと正規表現から字句解析器を生成できることが分かった。

flex の入力形式

  • 宣言部は %{ %} で囲んだ方が無難に感じた。インデントが面倒なので。
  • 同じく、C 言語の実行文も { } で囲んだ方が無難。
%{
  宣言等
%}
%%
正規表現 { 実行文 }
%%
関数等

flex のれんしゅう

第 5 回「字句解析ツール flex」の演習問題をやった。

演習 3「数字の発見」では、ちょっと改造して発見した数字の合計を表示するようにしてみた。

search-nums.l

%{
  long sum_of_nums = 0;
  long num;
%}
%%
[0-9]+ {
  sscanf(yytext, "%ld", &num);
  sum_of_nums += num;
  printf(">>>%s<<<", yytext);
}
%%
int main(void) {
  yylex();
  printf("\nSum of numbers = %ld\n", sum_of_nums);

  return 0;
}

int yywrap(void) {
  return 1;
}

入力例

srw_wiki-mainpage.txtスパロボ Wikiのトップページから。

ようこそ スーパーロボット大戦Wiki へ

スーパーロボット大戦(スパロボ)シリーズについてのあらゆる用語・話題をまとめるwikiです。お役に立てばリンクして紹介などしていただければ幸いです。

    初めての方は「参加案内」を参照してください。
    詳しい書き方は「記事制作のポイント」を参考にしてください。
    書式については「ヘルプ:編集」や「ヘルプ:書式」を参照してください。
    意見交換は以下のページにてお願いします。
        各ページについての意見交換は該当ページのトークページにて。
        複数ページ、wiki全体についての意見交換は「BBS/2015」にて。
    新規ページ作成は登録利用者のみ行えます。荒らし防止のため、ご了承願います。アカウント作成はこちらから。

現在、スーパーロボット大戦Wikiには約 8437 本の記事があります。詳しい統計は「特別:統計」や「スーパーロボット大戦Wiki 統計」を参照してください。
重要なお知らせ

    『第3次スーパーロボット大戦Z天獄篇』発表に伴う編集保護を解除しました。ご協力ありがとうございました。
    Wikipedia等で採用されているガジェットが利用できるようになりました。ご利用になるには、アカウント作成後、「個人設定」→「ガジェット」から有効化してください。    メンテナンス情報/2014-10-30
    脚注機能が利用できます。詳しくは「ヘルプ:脚注」をご参照ください。

出力例

以下の出力。

./search-nums < srw_wiki-mainpage.txt

結果は以下のとおり。

ようこそ スーパーロボット大戦Wiki へ

スーパーロボット大戦(スパロボ)シリーズについてのあらゆる用語・話題をまとめるwikiです。お役に立てばリンクして紹介などしていただければ幸いです。

    初めての方は「参加案内」を参照してください。
    詳しい書き方は「記事制作のポイント」を参考にしてください。
    書式については「ヘルプ:編集」や「ヘルプ:書式」を参照してください。
    意見交換は以下のページにてお願いします。
        各ページについての意見交換は該当ページのトークページにて。
        複数ページ、wiki全体についての意見交換は「BBS/>>>2015<<<」にて。
    新規ページ作成は登録利用者のみ行えます。荒らし防止のため、ご了承願います。アカウント作成はこちらから。

現在、スーパーロボット大戦Wikiには約 >>>8437<<< 本の記事があります。詳しい統計は「特別:統計」や「スーパーロボット大戦Wiki 統計」を参照してください。
重要なお知らせ

    『第>>>3<<<次スーパーロボット大戦Z天獄篇』発表に伴う編集保護を解除しました。ご協力ありがとうございました。
    Wikipedia等で採用されているガジェットが利用できるようになりました。ご利用になるには、アカウント作成後、「個人設定」→「ガジェット」から有効化してください。    メンテナンス情報/>>>2014<<<->>>10<<<->>>30<<<
    脚注機能が利用できます。詳しくは「ヘルプ:脚注」をご参照ください。

Sum of numbers = 12509

数字を >>>数字<<< に変換し、最後に合計を出すことができた。

2015-03-17 の日記:『イミテーション・ゲーム』とマッピング

午後から映画を見に行って、その後散歩と OpenStreetMapマッピングをした。

『イミテーション・ゲーム』

イミテーション・ゲーム/エニグマと天才数学者の秘密』を見てきた。

いやぁ、本当におもしろかった。構成が素晴らしくて、特に後半のエニグマ解読を決めに行くあたりの勢い、解読後から終わりまでの展開が好き。ベネディクト・カンバーバッチをはじめとする俳優の演技も良かった。チューリング先生はもちろん、キーラ・ナイトレイが演じるジョーン・クラークの献身的な姿が強く印象に残った。文句なしにおすすめできる映画です!

見る前にチューリング先生について予習しておくと、背景や時系列を理解しやすいかも。自分は以前藤原正彦先生の『天才の栄光と挫折―数学者列伝』を読んだことがあって、「ここはやっぱりこうくるよなぁ」と納得しながら見ることができた。

天才の栄光と挫折―数学者列伝 (文春文庫)

天才の栄光と挫折―数学者列伝 (文春文庫)

マッピング

散歩時に GPS ロガーの My Tracks で軌跡を記録し、それを OpenStreetMap の GPS トレースページで取り込み、 JOSM で表示しながら地図編集を行ってみた。KMZ → GPX の変換は GPS Visualizer で行える。

GPS ログを元に、遠鉄上島駅付近の道路(二俣街道とか電車通りとか)を現在の状態に合わせてみた。カーブの入力と道路の接続がちょっと大変だった。「ウェイの分割(P)」と「ノードの結合(M)」を知らなくて最初かなり苦労した。

f:id:ochaochaocha3:20150318001845p:plain

あと、通っているポリテクカレッジ浜松の周辺を充実させてみたり。日頃の記憶と地理院地図ストリートビューが頼り。

f:id:ochaochaocha3:20150318001857p:plain

第 19 回ポリテックビジョン in 浜松

授業として「第 19 回ポリテックビジョン in 浜松」を見てきた。挨拶で先生が仰られていたけれど、大学に入ってたった 2 年弱でこれだけ研究を進められるというのは、本当に奇跡的なことだと思う。2 年生の先輩方、お疲れさまでした。

いくつか気になったことも。

  • 技術的にすごいことをしてきてそれを説明したにもかかわらず、まとめが感想と「コミュニケーション力の向上」になっているグループが多かったのはいかがなものか。特に後者は前半のほぼすべてのグループで見られた。築いてきた独自性がそこで損なわれている印象を受ける。
    • 自分が所属している電子情報技術科の発表ではそれがほとんど見られなかった。これは良かったと思う。
  • 同じ種類のテーマが 3 連続で発表されるとき、同じ基礎事項の説明をきっちり 3 回されるのはうんざりした。最初のグループで説明して、後のグループは流すくらいで良いのでは。「発表順が事前に分かっているのだから、こういうところで高めてきた『コミュニケーション力』を発揮して連携すべき」と(短大での)同級生である高校の先輩(ややこしい)も言っていた(厳しい!)。
  • スライドが見難いグループが多かった。特に目立ったのが、細い明朝体を使っていたグループ、コントラストがない色遣い(例えば「青地に赤字」のような暗色の背景に暗色の字)をしていたグループ。後ろから見るとまったく読めない。これは『ノンデザイナーズ・デザインブック』とか『伝わるデザイン|研究発表のユニバーサルデザイン』(書籍版は『伝わるデザインの基本 よい資料を作るためのレイアウトのルール』)を少し読むだけでも変えることができる。
  • 田崎晴明先生が強調されているように、発表の最後は「まとめ」を表示するべき。そうでないと適切な質問をしにくくなる。「ご清聴ありがとうございました」のスライドはむしろ邪魔
  • 「研究の進捗状況をブログで発信した」と書いてあるグループがあったが、URL を書いていなかった。せっかく公開しているのなら書いた方が良い。

このようなことを反面教師にして、来年良い研究発表ができるようにしたい。

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

伝わるデザインの基本 よい資料を作るためのレイアウトのルール

伝わるデザインの基本 よい資料を作るためのレイアウトのルール

2015-02-19 の日記

明日は岐阜の能開大の発表を見に行くバス旅行なので、身体を休めなければ。

午後の授業

3 限の就職の授業は外部講師の方が講義されたが、ややピンぼけな印象で残念。まぁ話の内容としては普通だったけれど、それより終始学校での活動を過小評価している印象を受けたのがなんだかなぁと思った。昔の自分の就活でも似たようなことがあったけれど、採用担当の方にはそういう方が一定数いるのかなぁ…

4 限はどういうわけか TOEIC の練習(時間がなくてリスニングだけ)。初めてなのでリスニングに慣れていない。6、7 割取れていたら良い方か。似たような内容の問題が続いていて面白くなかった。後半のリーディングで挽回できれば良いが…

こんな感じだったので疲れた。

課題

実験のレポートが溜まる一方でまずい。

あと「データ構造・アルゴリズム」の課題、C 言語でリスト構造を書くのが結構苦痛。課題の点数が青天井らしいので、JavaScript の apply のようにコールバック側で任意の型・個数の引数を受け取れる for_each とか filter を書いてみた。その後 remove を書いている途中で飽きてきた。メモリ管理を気にして新しいリストを作りにくかったり、型が邪魔だったり、と普段使っている言語のように簡単に使えないのが辛い。それと別に経路探索でも入れてみようか、などまだネタはあるのだけれど。

Erlang 先生に家計簿の穴埋めを手伝ってもらった

Erlang 先生に、自分が定食とカレーとうどんをどれだけ食べていたか教えてもらった話。

問題

家計簿 7 日分をつけ忘れてしまった。

  • つけ忘れた分は学校の食堂での昼食代。全部で 2,290 円。
  • 1 日につき以下のいずれかを 1 つ食べた。
    • 定食:370 円
    • カレー:350 円
    • 肉うどん:300 円

以上の条件から、各メニューを何回食べたかを求める。

コード

以下を lunch.erl というファイルに書く。

Gist: ochaochaocha3/lunch.erl

結果

Erlang シェルで以下の結果が得られた。

$ erl
Erlang/OTP 17 [erts-6.3.1] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V6.3.1  (abort with ^G)
1> c(lunch).
{ok,lunch}
2> lunch:calc().
[[{{set,370},2},{{curry,350},1},{{udon,300},4}]]

というわけで、定食を 2 回、カレーを 1 回、うどんを 4 回食べていたことが分かった。

感想

f:id:ochaochaocha3:20150214112530j:plain
Wikipediaファイル:Nikuudon.jpg」より。Hykw-a4 さん撮影。

肉うどん率高いな!

…というのはどうでもよく、Erlang(に限らずおそらく関数型言語全般)では数学の答えのように簡潔に書けるのがいいな、と思った。

なぜ Erlang に手を出したか

本屋さんで『すごい E 本』を見つけて思わず買ってしまったのがきっかけでした。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

Erlang だとサーバーを書きやすい」という噂を見たのもひとつ。私は最近、RGRBクリエイターズネットワークで使われている IRC ボット)やボーンズ&カーズ(BCDice;どどんとふで使われているダイスボット)といった、IRC ボットのコードを書いているので、こちらの方面に活かすことを目指したい。

2015-01-23 の日記

就活対策の授業で小論文の練習があった。「あなたにとって仕事とはなにか」というテーマだったのだが、思うことがありすぎて(過去の経験を思い出すと、本当に悲しくて憂鬱な気分になった)考えがとてもまとまらず、結局 1 字も書けなかった。

先ほど見つけた Paul Graham の随筆「意地の悪い人は失敗する」にヒントがありそうなので、じっくり読んでもう一度考えたい。