AtCoder Regular Contest #020 (+ Beginner Contest #006) 参加記録

本日は ARC021 があり、参加したのですが、前回の第20回の記録をつけ忘れていたので先にこちらを書いておきます。

Summary

AtCoder Regular Contest #020 (公式解説)

問題A 問題B 問題C 問題D
コンテスト中の最終回答 AC
05:58(1回目)
AC
33:36(1回目)
TLE(20点)
53:13(1回目)
-
終了後じっくりと回答 - - (未挑戦) (未挑戦)
解説を読んでから回答 - - (未挑戦) (未挑戦)

総合: 220点 53:13 (0ペナルティx5分) 68位

続きを読む

死にかけのHDDからのデータ吸い出しには GNU ddrescue が良いらしい

今日は超小ネタ。
(というか、言いたいことは記事タイトルで言い切ってしまってます。)

先日、家でサーバーとして使っているPCのHDDの調子がおかしくなっていたので、データの引き上げを行おうとしたのですが、dd でパラメータをいろいろ設定するのは面倒だし、良いツールなりスクリプトなりがないかと探したところ、ddrescue というプログラムがあることを知りました。

2つの ddrescue

ただ、ちょっとした罠なのですが、ddrescure という名前のプログラムは2種類あります。

どちらも ddrescue で、同じ目的・機能のものですが、まったく別のソフトです。
区別して呼ぶ場合、前者は dd_rescue、後者は GNU ddrescue と呼び分けたりしますが、前者の方が古くからあったからか、単に ddrescue と呼んだ場合、暗黙的に前者を指す事が多いようです。両方とも ubuntuリポジトリに入っているので apt-get でインストールできますが、パッケージ名は、前者が ddrescue で、後者は gddrescue です。

通称 Ubuntu パッケージ名 プログラム名
ddrescue, dd_resque ddrescue dd_rescue
GNU ddrescue gddrescue ddrescue

機能に関しては GNU ddrescue が良いようですので、あまり悩まずそちらを使っておけば良いのではないかと思います。

(2014-06-08:追記) なぜ GNU ddrescue が良いと判断したかというと、単純に後発で、 GNU ddrescue の作者が、類似の他のソフトのマズい点を修正するような設計を行っているようだから、といったところです。"GNU ddrescue dd_rescue" でググったりwikipedia を見たりすると、いろんな意見が見れますので、興味のある方は調べて見てください。

使い方

続きを読む

AtCoder Regular Contest #019 参加記録

最近、ちょくちょく AtCoder の Regular Contest に参加しています。

ここ数回は毎回参加できているのですが、一向に上達する気配が無い……というか、単に当日に漫然と参加している程度では上達するわけもないので、せめて最低限の記録と復習を残してみようと思います。

Summary

AtCoder Regular Contest #019 (公式解説)

問題A 問題B 問題C 問題D
コンテスト中の最終回答 AC
8:13(1回目)
AC
37:33(2回目)
- -
終了後じっくりと回答 - - TLE AC(30点)
解説を読んでから回答 - - AC (未挑戦)

総合: 200点 42:33 (1ペナルティx5分) 92位

続きを読む

JavaScript 向け vim 設定とか unit test とか

ご無沙汰しております。Over80です。

年単位で放置していた当ブログですが、更新再開してみようと思います。一発目の今日は、JavaScript 関連の雑多ネタです。

JavaScript でブラウザ上で動くゲームを作りたい、というところが発端なんですが、 JavaScript はあまり書いたことが無いので、ある程度以上の規模のコードを書くのであればと、開発環境からきちんと揃えていました。

主な内容は、

  • 良い感じのコーディングスタイルを確認しときたい
  • それを確認する lint ツールも欲しい
  • 快適に書けるエディタとかIDEとかあるの?
  • unit test もできるようにしときたい

とかいろいろと調べた内容のまとめです。

続きを読む

python のローカル変数のスコープと functools.partial

今日のネタは、ちょっとミスって pythonエンバグしてしまったので、自戒の意味を込めたメモです。

失敗コードは下記のようなものです(無関係の所はごっそり削ってます)。 引数 e や n の値に応じて、 go に関数オブジェクト (か None) を設定しています。

def in_stage(e=None, n=None):
	go = None
	if (e != None):
		go = lambda: goto_event_stage(e)
	elif (n != None):
		go = lambda: goto_normal_stage(n)

	...(実際の処理本体。途中で go() を使う)...

これ、何が悪いかというと、下のほうの処理本体部分で e や n を変更してしまうと、goを呼んだ時の挙動が変わってしまうんですね。

	# 関数の引数が n=3 だった場合
	go()   # goto_normal_state(3) が呼ばれる

	n = 100 # でも途中で n を変更してしまうと
	go()   # goto_normal_stage(100) が呼ばれる

この現象は lambda 式ではなく、def による名前持ちの関数であっても起こります。

原因と対処法

続きを読む

GUI自動操作ツール Sikuli を Ubuntu 11.10(Oneiric) にインストール

Sikuli は、デスクトップアプリケーションを自動操作するためのツールで、ボタンの画像をキャプチャしておいて画像認識で操作するという、独特ですが直感的なスクリプト体系が特徴的なツールです。

例を見れば一目瞭然なので、サンプルとして、Chrome の特定のプラグインを無効化するスクリプトを書いてみました。

「スパナのアイコン」→「設定」→「拡張機能」と順にクリックし、特定のアイコンを探して、その右に「有効」となっているチェックボックスがあれば、それをクリックして、最後に設定タブを閉じる。……と、若干複雑な事をさせていますが、それなりに直感的に読めたのではないでしょうか。

今日のエントリは、この sikuli を ubuntu 11.10 (Oneiric) にインストールする作業のメモです。Ubuntu 12.04 のリリースを控えた今のタイミングでは、非常に賞味期限の短い記事になりそうですが、備忘録として書いておきます。

Ubuntu 11.10 での状況

続きを読む

python で Google Quine を再現させてみた

Google Code Jam Japan 2011 景品: Goo


先日(といっても2ヶ月以上前ですが)参加した Google Code Jam Japan 2011 ですが、おかげさまで入賞することが出来、右の写真の通り、記念Tシャツを頂くことが出来ました。主催された方々、参加された皆さん、楽しい時間をありがとうございました。

ところで、このTシャツにプリントされたAAですが、これは rubyスクリプトになっていて、これを実行すると自分自身のソースコード(つまりこのAAそのもの)を出力するという変わった性質をもったコードになっています。このようなプログラムのことを quine と呼ぶのだそうで、このTシャツのコードの作りかたは、Code Jam Tシャツについてに詳しく書かれています。

今回は、この Google Quine を ruby ではなく python で再現させてみよう、というネタです。
(余談ですが、このTシャツを受け取ってネタを思いついた翌日にはがっつり時間をかけてコードを完成させていたのですが、ブログのエントリへのまとめは2ヶ月も放置していたという……)

目標とするのは

  1. きちんと Quine になっていること
  2. 元ネタと(可能な限り)同形であること
  3. 元ネタと同等の機能(HTMLカラー出力オプション)を持っていること

です。

Python をご存知の方は判ると思いますが、Pythonはこのようなコードを書くのには全然向いていない特徴を持った言語です。やる前はかなり無謀な気がしていたのですが、いざやってみたらなんとかなってしまって、機能拡張も出来てしまいました。

今日の記事は完成品の紹介と、このネタをやるうえで障害となったPythonの特徴やそれに対するテクニックの紹介の紹介です。

完成品

先に完成形を出しておきましょう。こんなかんじです。

\
        q='''f=l                                          ambda               
     (l,r),(p,m):(                                         l+d(m              
    )+r[:    p],r[p                                         :]);              
   v=(_        _im                                          port              
  __('          s                                           ys')              
 .arg                 v+[0])[1      ];c=chr;      s=c(32);  n=c(   10);y=x  TM
 =c(9                2);l=c(60)    ;g=lambda(   n):c(27)+'  [%sm  '%(n+30*(   
 n!=0               ));d     ,t=( (lam    bda(  n):   '','  '),( g,'   '),(l  
 ambd               a(n)     :l+' fon      t'+s+'co    lor  =%s> '%['black    
 ','r        ed','g ree      n','yell       ow' ,'b    lue  '][n ],l+'pr      
  e>')       )[(v=='-h')      *2+ (v=       ='- e')]  ;pri  nt(t +y+          
  n+red        uce(  f,z     ip(( 20,1     4,13  ,11,7,11   ,3), (4,1         
   ,3,4,       2,1,  0))*   15+[(  990,   4)],     ('',s    *8+'  q='+"  '"   
     *3+q+"'"*3+";"   +s*6+"8;"     +y+n+s*46     +"exec"   +s*6+  "(''"+n+   
       s*47+"+''.j      oin(q        ."+n+s     *48+"split  ()))"   ))[0]+    
                                              d(0))    ;88;
                                              ''';      8;\
                                              exec      (''
                                               +''.join(q.
                                                split()))

このコードは Python 2.x用です。元ネタと同様、そのまま実行で自分自身を出力し、引数に-hを渡すと色付きHTMLで出力されます(元ネタみたく大量のタグを出したりしないので、Firefoxでもきちんと表示できます)、ついでに、-eでANSIエスケープシーケンスによる色付きテキストを出す機能も付けました。


形に関しては、1行目のバックスラッシュ1文字以外は元ネタと完全に一致するようにしています。それぞれの機能確認方法はこんなかんじ:

(元ネタと同様、quine となっているか)
$ diff -u google_quine.rb <(ruby google_quine.rb)
$ diff -u google_quine.py <(python google_quine.py)

(元ネタと同形になっているか)
$ diff -ub <(sed 's/[^ ]/x/g' google_quine.py) <(sed 's/[^ ]/x/g' google_quine.rb)

(HTMLの出力が出来ているか)
$ python google_quine.py -h > tmp.html
$ firefox tmp.html
$ diff -ub google_quine.py <(w3m tmp.html)

(エスケープシーケンスでの色付けが出来ているか)
$ python google_quine.py -e
$ diff -u google_quine.py <(python google_quine.py -e | sed "s/\x1b[^m]*m//g") 

python google_quine.py -h の場合:

python google_quine.py -e の場合:

インデントに意味がある

続きを読む