タグ

ブックマーク / nishiohirokazu.hatenadiary.org (32)

  • 例えば「写経」という言葉を避けてみる。 - 西尾泰和のはてなダイアリー

    サイボウズ式「続・エンジニアの学び方」の第5回が公開されました。この回では、小崎さんが「どうしてコードを読もうと思ったのか」と、コードを読むために新しい言語を学ばなければいけない場合に「どうやって学ぶか」を聞きました。 ところで、小崎さんは自分の学び方を「写経」と読んでいて、僕もこの用語は自然に理解できるのですが、公開後のTwitterの反応を見ていると「写経と呼ぶことが嫌」もしくは「仏教での写経の印象で、内容を勘違いしている」という事例がいくつも見つかりました。 プログラミングの学習法としての「写経」という言葉は色々な書籍で使用されています。例えば「100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊」の70ページでは「まず写経することから始めた」というエピソードが紹介されています。また「改訂新版 コンピュータの名著・古典100冊」の99ページでは「技術書の内容にそって深い

    例えば「写経」という言葉を避けてみる。 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2014/09/05
  • Re: なぜ国内でPerlが急速に萎んだのか - 西尾泰和のはてなダイアリー

    Python使いとしては「なぜ国内でPerlが急速に萎んだのか」について一言ツッコみたいところがあります。 >遂にPerlにとどめを刺したのはPythonである。守備範囲は当然ながらPerlと駄々被りで えっ、PerlPythonの守備範囲がだだかぶりって、著者の観測しているそれぞれの言語の「守備範囲」ってどんだけ狭いんでしょう? まあそんな重箱の隅をつつくのはやめておきましょう。このエントリーには結論の文章(の一部)はとても素晴らしいです。 >10年でここまで時代は変わる。今のメインテクノロジーも明日は我が身だ。 >変化の速い時代に生きる我々に必要なのは質を学ぶ事だ。 >もっと10年20年たっても色あせない情報工学を身につけなければならない。 そう、そこで拙著「コーディングを支える技術」のようなが必要になるわけです!(宣伝) ちなみに僕自身は仕事でも趣味でもPerlは使っていません

    Re: なぜ国内でPerlが急速に萎んだのか - 西尾泰和のはてなダイアリー
    taka222
    taka222 2013/08/18
    ”Re: なぜ国内でPerlが急速に萎んだのか - 西尾泰和のはてなダイアリー”
  • Pythonでサブプロセスと対話する - 西尾泰和のはてなダイアリー

    標準入力に1行入れると、標準出力で1行返してくるようなプログラムがあって、起動のたびに7分かかってめんどうだから、プロセスを起動しっぱなしにしておいてHTTPサーバで包んでやろうと思ったんですよ。 サブプロセスの挙動としてはcatだと思っていい。それで p = Popen(["cat"], stdin=PIPE, stdout=PIPE) ってやってから p.stdin.write("%s\n" % query) result = p.stdout.read() ってやるとブロックされてしまった。ブロックを避けるために生のread/writeではなくp.communicateを使えとマニュアルには書いてあるが、それを使うと1回やり取りした時点でfdを閉じてしまうから2回目で「ValueError: I/O operation on closed file」になる。p.stdin.flush

    Pythonでサブプロセスと対話する - 西尾泰和のはてなダイアリー
    taka222
    taka222 2011/04/19
  • 最小限Lisp - 西尾泰和のはてなダイアリー

    Web-DB Vol.60が手元にある人はぜひLispの章を見てみてくださいね。Lispのコードがほとんど構文木と同じであって、その構文木を実行するときにどうなるか、という話。 下のコードを見ればわかるとおり、Lispのコードではリストの区切りにカンマがないけどもPythonにはあるってところと、LispのアトムはPythonでは文字列で表現しているので引用符がくっついている。それくらいの違いしかない。で、その構文木がこれくらいのコードで実行出来る、と。 でまあ、これはコードに特殊形式がないから全部「各要素をevalしてから計算をする」という流れになっているのだけども、それじゃifとか実現できなくて困るよね?どうすればいいと思う?というのは機会があればまた今度書く。 # -*- encoding: utf-8 -*- """ mini-Lisp Lisp解説のための、Lisp風構文木を受け

    最小限Lisp - 西尾泰和のはてなダイアリー
    taka222
    taka222 2011/04/11
  • Pythonで5分で便利なことをするレシピ - 西尾泰和のはてなダイアリー

    5分でわかる Python を知らない人が Python の便利さを学べる記事をかいたよ | HIROKI.JPが、Pythonの説明なのにところどころ「Rubyでは」になっていたり、そもそも無理やりPHP的なことをしようとしていていまいちなのでTwitterでひどいなぁと言っていたら @bellonieta: ここは是非とも@nishioさんに正しい5分記事を書いてもらいたいところ… と言われてしまった。まー、ぼやくのは生産的じゃないからねぇ。Pythonを使ってて色々便利なことはあるけど、一番手軽そうなものを軽く説明してみよう。たとえばなんか書類をつくっているとするじゃない、こんな感じの。 社長: 山田太郎 支社長: 田中一郎 部長: 山川三郎面倒なので3人分しか書いてないけど当はもっとたくさん30行くらいあるとしよう。さー書けた、と思ったらそこに上司が来て「あーあー、そうじゃないよ

    Pythonで5分で便利なことをするレシピ - 西尾泰和のはてなダイアリー
    taka222
    taka222 2011/01/01
  • Rubyが仲間はずれでかわいそうな件 - 西尾泰和のはてなダイアリー

    "に関するトピックやイベントや面白い会社などの情報をツイートしています。"で検索 こんにちは!PHPManiaJPです。PHPに関するトピックやイベントや面白い会社などの情報をツイートしています。(以下略) こんにちは!JavaManiaJPです。(同上) こんにちは!PythonManiaJPです。(同上) こんにちは!PerlManiaJPです。(同上) こんにちは!RoRManiaJPです。(同上) こんにちは!AS3ManiaJPです。(同上) こんにちは!PlannerManiaJPです。(同上) (つд⊂)ゴシゴシ (;゚д゚) 「Sorry, that page doesn’t exist!」 http://twitter.com/RubyManiaJP 節子、RoRとちゃう、Rubyや… 追記: Plannerって言語は聞いたことがないからなんかのウェブフレームワークか

    Rubyが仲間はずれでかわいそうな件 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/10/21
  • Rubyのモジュールをおさらい - 西尾泰和のはてなダイアリー

    module Foo def hello puts "hello" end end Foo::hello #-> undefined method `hello' for Foo:Module (NoMethodError) includeしないと使えないのかな… module Foo def hello puts "hello" end end module Bar include Foo def hello2 hello hello end end def tmp include Bar hello2 end tmp hello # 呼べる うーむ、includeすれば使えるは使えるが、includeはモジュールの中のメソッドをクラスに追加するのであって、メソッドのローカル変数として関数オブジェクトをインポートするのとは違うんだなぁ。これだと実質的に「インポートしたモジュールの中身はグ

    Rubyのモジュールをおさらい - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/10/09
  • クラスが持つ3つの役割 - 西尾泰和のはてなダイアリー

    某所のチャットで話題になって、流れ去りそうだったのでもったいないから転載しておいた。事後承諾で。 MIYAMOTO Daisuke: 型の継承と実装の継承を区別する方法がないんだよな。 西尾泰和(nishio.hirokazu): 型を継承させずに実装を継承させたい→それ移譲で ってことかな? MIYAMOTO Daisuke: そそ。そもそも、クラスに「型としての役割」と「実装としての役割」という複数の責務があることに、俺は長い間気づかなかった。これに気づかないと、型継承と実装継承が頭の中で整理できない。 西尾泰和(nishio.hirokazu): 僕が最近気づいたことも加えると、クラスには「ユーザ定義型」「インスタンスを作成する道具」「実装の再利用の単位」という3つの役割がある。 MIYAMOTO Daisuke: あぁ、インスタンスの生成器ね。 西尾泰和(nishio.hiroka

    クラスが持つ3つの役割 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/10/09
  • Perlでオブジェクト指向を復習中 - 西尾泰和のはてなダイアリー

    ところで my $counter = {"value" => 0}; print "$counter\n"; # HASH(0x1008001f0) bless $counter, Counter; print "$counter\n"; # Counter=HASH(0x1008001f0) てなことをやるとuse strict時には「Bareword "Counter" not allowed」って言われる。bless $counter, "Counter";なら大丈夫。 説明の都合で明示的にパッケージと参照をblessしたいわけなのだが、文字列でやるのはどうなんだろうか?パッケージがファーストクラスのオブジェクトであるような誤解をさせないために明示的に文字列でblessするべきなのか、それとも余計なことに気を取らせないためにBarewordでやっちゃうべきなのか。もちろん普通はCou

    Perlでオブジェクト指向を復習中 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/10/03
  • SPYSEEの会社に遊びに行ってきました - 西尾泰和のはてなダイアリー

    先週の金曜日、id:amachangの新しい会社(オーマ株式会社)に遊びに行ってきました。 正直なところ、最初に話を聞いたときには誰か悪い人に騙されてるんじゃないかとか思ったけども、中を見てみたらアットホームな雰囲気のベンチャー企業でした。目標が熱い!世界を変えるSPYSEEへ! 受託抜きできちんと黒字化してるところや、良好な産学連携関係を構築しているところも考えると、世の中のベンチャー企業の中ではかくだんに「いい会社」の部類に入ると思いました。amachangが入ることでどんな化け方をするのか、今後が楽しみです。 ちなみにamachangが弊社を退社した日の僕のエントリー「SPYSEEのトップに美人画像が出るようになっている!」は伏線だったのですが、転職先予想トトカルチョ #amatoto には影響を与えなかったようでした(苦笑) id:yukobaの「@yukoba なるほど!もっと燃

    SPYSEEの会社に遊びに行ってきました - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/09/27
  • 多重継承まとめ - 西尾泰和のはてなダイアリー

    JavaはInterfaceという特殊な実装を持たないものだけ多重継承できる。実装を多重継承する仕組みはない。同じシグネチャのメソッドを持っている2つのInterfaceを継承した際にエラーにならないので衝突に気付けない。 Pythonはクラスを多重継承できる。同じ名前のメソッドを持っている2つのクラスを継承した際にどのメソッドが呼ばれるかはC3線形化を使って決定される。see: A Monotonic Superclass Linearization for Dylan RubyはModuleという「なにかを継承することはできなくてインスタンス化もできないもの」だけは多重継承できる。Moduleが別のものを継承できないためメソッドの解決は素朴な探索でOK(include A include BしたらBでの実装が優先) SmalltalkにはTraitという実装の多重継承ができるしくみがあ

    多重継承まとめ - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/09/27
  • RubyとCの x = y + y = x について - 西尾泰和のはてなダイアリー

    Rubyで x = y + y = x と書くとこれは x = y + x と y = x を行ったのと同じ振る舞いをする。 > x = y = 1 => 1 > x = y + y = x => 2 > [x, y] => [2, 1] > x = y + y = x => 3 > [x, y] => [3, 2] > x = y + y = x => 5 > [x, y] => [5, 3] > x = y + y = x => 8 > [x, y] => [8, 5] なぜかというと、まず x = y + y = xの y = x が実行されてその代入式の値はxになるから x = y + xところで、これはCでも動くと思って試してみたがしたのようなエラーになってしまう。 error: lvalue required as left operand of assignmentこれはおそ

    RubyとCの x = y + y = x について - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/09/14
  • coverageを使う - 西尾泰和のはてなダイアリー

    http://pypi.python.org/pypi/coverage/2.6/ $ coverage run prettyprint.py $ coverage htmlまあ僕は面倒なので $ coverage run prettyprint.py && coverage htmlとやるのだけど。これをやるとこんなふうになる カバレッジで覆われてないところのテストを書く。あー、でも最後のraise NotImplementedErrorとかは、うっかりミスをしたときにすぐ気づくように付けてあるもんであって普通は到達しないんだよな。わざと到達させるのも馬鹿らしい。 http://nedbatchelder.com/code/coverage/excluding.html http://nedbatchelder.com/code/coverage/config.html#config お

    coverageを使う - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/31
  • Rubyの可視化 - 西尾泰和のはてなダイアリー

    セキュリティ&プログラミングキャンプの参加者 TaKUMA7 の成果物が YouTube と Vimeo にアップロードされていた。素晴らしい!何が素晴しいってちゃんと英語で説明が書いてある!欲をいえばズームインしてちゃんと各クラスの名前やメソッドの名前を見せればもっと説得力があったかも。 Vimeo: http://vimeo.com/14294230 スクリーンショットはこちら: セプキャンで取り組んだ課題:『Rubyの可視化』(クラス定義時、メソッド定義時、インスタンス生成時にリアルタイムで関係性を表示。表示部分は Built with Processing.)

    Rubyの可視化 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/23
  • Ruby 1.9.2リリースとWEBrick脆弱性問題の顛末 - 西尾泰和のはてなダイアリー

    はい、Ruby 1.9.2がリリースされましたね。このバージョンではWEBrick にゼロデイ攻撃可能な脆弱性 - スラッシュドット・ジャパンで紹介されている脆弱性が僕が書いたパッチで修正されているわけなのですけど、そもそもなんで僕が修正しているのか、って顛末がわりと面白いので紹介します。 Apple、upstreamに報告してくれないまま脆弱性をCVEに届け出る upstreamに連絡が来ないまま脆弱性が公開される ruby-devにAppleが書いたと思われるパッチが貼られる(Appleでない人間によって) パッチのライセンスが不明なので取り込めない ライセンスを問い合わせるAppleの窓口が不明なので問い合わせもできない ruby-devを読んだ人はライセンス上安全なパッチを書けない 脆弱性だから話は非公開に進めたい yuguiさんがruby-devを読んでない僕に書かせることにする

    Ruby 1.9.2リリースとWEBrick脆弱性問題の顛末 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/20
  • (Python|Ruby)でネストしたスコープの外側の変数に再束縛する - 西尾泰和のはてなダイアリー

    抜粋翻訳 PEP3104: Access to Names in Outer Scopesの内容をコードで。 Rubyでの挙動(1.9.3dev) メソッドの中で定義されたメソッドは外のスコープにアクセス出来ない。 > def foo(x) > def bar() > p x > end > bar > end => nil > foo 1 NameError: undefined local variable or method `x' for main:Object from (irb):32:in `bar' from (irb):34:in `foo' from (irb):36 from /usr/local/bin/irb:12:in `<main>' メソッドの中で定義されたブロックでは、その定義されたスコープに存在しない名前への束縛のみブロックのローカル変数とし、それ以外は

    (Python|Ruby)でネストしたスコープの外側の変数に再束縛する - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/13
  • Perlのスコープがわからない→わかった! - 西尾泰和のはてなダイアリー

    use strict; use warnings; sub foo{ my $x = "static"; sub bar{ print $x; } &bar(); } &foo(); Variable "$x" will not stay shared at tmp.pl line 7. むむ、当然参照できると思ったらできなかった。なぜだ? @miyagawa それはwarning なので参照はできてるはずですよ。staticってprintされてませんか? warning の意味は、2回目以降の呼び出しでは違う変数になるのでclosureではなくなるからです。see perldoc perldiag ありがとうございます!!警告に目を取られて表示されているのに気づいてませんでした。 tmp$ perl tmp.pl Variable "$x" will not stay shared at

    Perlのスコープがわからない→わかった! - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/13
  • Ruby|Pythonでバイトコードをディスアセンブル - 西尾泰和のはてなダイアリー

    RubyにはPythonのdisみたいなものはないのかなぁと言っていたら、ささださんに教えてもらった。 irb(main):017:0> def facto(n) irb(main):018:1> if n == 0 then 1 else facto(n - 1) * n end irb(main):019:1> end => nil irb(main):020:0> puts RubyVM::InstructionSequence.disasm(Object.method(:facto)) == disasm: <RubyVM::InstructionSequence:facto@(irb)>==================== local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1] s1) [ 2

    Ruby|Pythonでバイトコードをディスアセンブル - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/08/03
  • 不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー

    プログラミング言語は人が作ったもの。人は誤るもの。なので完璧なプログラミング言語は存在しない。 「人は誤るもの、しかし誤りに固執するのは馬鹿の所業だ。」(キケロ) プログラミング言語も、間違った設計をして、馬鹿でない人がそれを修正することの繰り返しで発展してきた。 というわけで言語間での設計判断のい違いとか失敗した設計とかを収集中。一部抜粋して講義資料に入れるつもりなので他の事例をご存知でしたらぜひ情報をいただけるとありがたいです。 if(x = 0) C言語では代入が式であるためif(x == 0)のつもりでif(x = 0)と書いてしまい、常に偽になってしまう。 x = 0の値はint、条件式はboolでないといけないので型エラーだよ派: Java x = 0は式ではないので条件式に入れたら構文エラーだよ派: Python 条件式にx = 0をいれたらx == 0と解釈するよ派: H

    不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/07/25
  • Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い - 西尾泰和のはてなダイアリー

    ラボの昼休みに光成さん、中谷さんとご飯をべながら話した内容を一応ざっくりとまとめておく。 発端はたしか最近Haskellを勉強の光成さんが、Haskellのかっこいいsieveは実はとても遅い(俺は Haskell の sieve についてとんでもない思い違いをしていたようだ...)という話を見て、同様にかっこいいけど遅い下記のフィボナッチ数列の定義の速度を調べてみたら2.5乗くらいのオーダーになっていたという話だったかと思う。 fib = 1:1:zipWith (+) fib (tail fib) 僕も確認するために、コマンドライン引数でNを与えられるフィボナッチ数列のN番目を求めるコードを書いた。 import System fib = 1:1:zipWith (+) fib (tail fib) main = do args <- getArgs print $ (0 *) $

    Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い - 西尾泰和のはてなダイアリー
    taka222
    taka222 2010/06/23