Hatena::ブログ(Diary)

sagaraの日記

2010-08-08

ひさしぶりのブログ

00:17

前回書き込みから1年以上開いてしまってましたが、ブログを再開しようと思います。ひさしぶりです。かなり。


理由は、最近Scalaという新しいプログラミング言語を触っているのですが、あまりに情報源が少ないこと(特に日本語)。色々ノウハウがたまってきているので、ブログに書いておけば、始めたばかりの人に多少は役立つかもしれないと思ったからです。


Scala使ってくれる人が増えると良いなと思います。Javaの後継言語ですが、C言語に対するC++のポジションになれるのか、D言語のポジションなのか、もっとマイナーなうちに消えてしまうのか、はたまたC++よりも広まることがあるのか。今後しばらく追いかけてみようと思います。

2009-05-09

Python Hack-a-thon #1のお題

15:25

Python Hack-a-thon #1(http://atnd.org/events/649)のお題で、

「1以上100未満の『2個の素数の積』である整数を列挙しなさい 」

という問題があったので、考えてみました。

結果、綺麗なプログラムは書けなかったけど、記事にします。

以下のプログラムが出来上がったものです。


# python 2.5

z = range(2, 100)
p = set(z) - set(i * j for i in z for j in z)
print [i * j for i in p for j in p if i < j and i * j < 100]

# output is not sorted.

[6, 10, 14, 22, 26, 34, 38, 46, 58, 62, 74, 82, 86, 94, 15, 21, 33, 39,
51, 57, 69, 87, 93, 35, 55, 65, 85, 95, 77, 91]

2個の素数の積なので、やはりまず素数が必要。

最初、素数を求めずに直接『2個の素数の積』を求められないかと考えたけど、数学的に思いつかなかった。

離散数学って目が覚めるくらい綺麗な解法が存在するけど、素数は鬼門のような気がして、はまりそうだったので、今回はあきらめました。

数学的に綺麗でもプログラムが複雑になる可能性もあるしね。

ということで、シンプルに、まず素数の列を求めます。

z = range(2, 100)
p = set(z) - set(i * j for i in z for j in z)

素数とは

1とその数自身以外に正の約数がない

http://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0

ということなので、1以外の正の整数で、任意の2つの数字をかけたものが、素数でない数字。

これら全部を対象範囲の集合から引いてあげれば、素数の列になる。

ちなみに、2行目を下のようにするとこの部分の計算回数は半分に節約できます。

p = set(z) - set(i * j for i in z for j in range(i, 100 / i + 1))

今回は、そんなシビアなプログラム書いてるわけでないので、見やすさ重視で。


最後にお題の2つの素数の積を計算。i < jの条件を外すと、同じ素数同士の積も許すことが出来る。


感想は、Pythonでset型が差集合を簡単に扱えるのは便利だけど、富豪的に感じました。「-」メソッドって… 。けど、組み込みのメソッドの中で、ガリガリにチューンされた手続きが実行されてるなら、そっちの方が良いのかな。

そういえば、2行目と3行目は構造が似ている。lambda使うとか、関数型のアプローチをすると、もっとシンプルにかけるかもしれない。

tanBtanB 2009/05/11 22:35 set型はとってもいいですね。勉強になります。

sagara177sagara177 2009/05/12 09:30 使いどころが重要でしょうね。set型がない場合に、どうやって同じ処理を実現する必要があるのかを意識していれば、利便性と計算コスト、コードの見通しの良さのバランスがわかって、適切な使い方が出来ると思います。

2009-05-06

Macの辞書ショートカットキー

22:57

ほとんど自分のための備忘録。


Macは「command+ control + d」でカーソル位置の単語を辞書で調べてくれる。


利用シーンは、Safariで英語サイト読んでいる時など。

辞書の種類は「よしなに」選んでくれるので、日本語も調べることができる。


自分は、いつもこのショートカットキーを忘れてしまって、オンライン辞書サイトを別タブで開いて、検索している。

その場合だと、以下のステップを踏む必要がある。

  1. 調べたい単語選択
  2. コピー「command + c」
  3. 新規タブ開く「command + t」
  4. 検索ボックスへカーソル移動「command + option + f」
  5. 辞書サイト検索(自分はよく「alc」を使ってる)
  6. 検索結果からサイトをクリック
  7. フィールドに検索語入力、検索
  8. 検索用タブ閉じる「command + w」

この手間が、辞書ショートカットキーによって、以下のように大幅に削減できる。

+調べたい単語位置にカーソル移動

+「command + control + c」

  1. 調べたい単語位置にカーソル移動
  2. 「command + control + d」

副次的な効果として、ポップアップで表示してくれるので、タブ切り替えなどのコンテキストスイッチが発生せず、ちょっとわからない単語を調べる時に便利。


ただし、有効範囲がいまいち不明で、Safariと、TextEdit、Terminalでは使えるけど、PreviewのPDFは使えそうで使えなかったり…


ブログに書いたし、これで忘れないと思う。忘れてもすぐに調べることができるし。それでも使わなかったら、多分このショートカットキーの価値はたいしたことないのでしょう。

t-fridget-fridge 2009/05/08 00:43 コレはやばっ!!
知りませんでした.
便利ですね.
英文サイトを読むスピードが上がりそうですw.

ついでに誤植報告.
echo "2.「command + control + c」" | sed "s/command + control + c/command + control + d/g"

sagara177sagara177 2009/05/08 01:49 typo修正しました。ありがとう。
修正する際に「c」の文字だけに打ち消し線を利用したら、「e」になってしまって、新たなtypoを生みそうになりましたww

「command + control + d」の組み合わせは変則的で、押しにくい配置が理由で、よく忘れるのだと思います。押す際に意識が必要な時点で、既に良いショートカットキーではないと思います。

2009-04-22

LinuxでCD/DVDの名前を調べるvolnameコマンド

22:18

たまに、もともとのディスク名(ボリュームラベル名)を調べて、ファイルを作ったり、ディレクトリを作りたくなる時があるけれど、いつも忘れてしまっているコマンド。

Gnomeみたいなデスクトップ環境だと、勝手にマウントして、アイコンの名前にボリュームラベル名を設定してくれるけど、自分はもっぱらコンソールなので、こういうコマンドが必要だったりする。

[root@localhost /]# volname

SD0905

[root@localhost /]# man volname

VOLNAME(1) User Commands VOLNAME(1)

名前

volname - ボリューム名を返す

書式

volname [<device-file>]

説明

volname は、ISO-9660 ファイルシステムにフォーマットされたデバイス (典型

的なものとしては CD-ROM) のボリューム名を返す。

デバイスファイル名はコマンドラインで指 定 で き る 。 省 略 し た 場 合

、/dev/cdrom をデフォルトとする。

用途がマイナーすぎて、なかなか検索しても見つからないんだよね。毎回。

2009-04-20

2日坊主

23:46

ブログを始めて、やはりというか、案の定、2日坊主状態が続いていた。書く内容の敷居を勝手に高くしすぎていた気がする。

誰かが検索して見てくれたり、そんな有用な情報は書けないまでも、数ヶ月後の自分が思い返して、役に立つ情報しか書く価値がない気がしていて、筆無精になっていた。

一方、その期間Twitterを始めて、役に立たないことを発言することに抵抗がなくなった。そして、Twitterに書くものあるのだったら、ブログに書いてしまえばいいじゃないかと思い始めた。その方がちゃんとした形で残るし、多くの人に見てもらえる。

というわけで、またブログ書こうと思います。