タグ

ブックマーク / nowokay.hatenablog.com (26)

  • 「写経」の原典 - きしだのHatena

    書籍とかのサンプルコードをそのまま入力して勉強することを「写経」というけども、それを言い出したのは角谷さん、というメモ。 写経は言葉ではなく心で理解するのが大事。 2004-2005頃に @t_wada と働いていた頃、サンプルコードをコピペでなく手打ちすることを「写経」と呼んでました。和田さんが以前の現場に通いながら"TDD by Example"のサンプルコードを「祈るような気持ち」で手打ちしていたというエピソードを形容して「写経ですね」と呼んだのが始まりだったような…— Kakutani Shintaro (@kakutani) 2021年9月18日 恐らく2005年7月ごろではないかと思われる。 この夏は写経が来るね, 地震が来た - 角谷HTML化計画(2005-07-23) 角谷さんのブログでの初出も7/15だけど、babieさんのコメントを見るとこの時期にまわりで語ってたこと

    「写経」の原典 - きしだのHatena
    j5ik2o
    j5ik2o 2021/09/19
    西尾さんの"エンジニアの知的生産術"にも写経の話題があるので気になる人それも読むとよいかも。頭ごなしに写経は意味ないと言う人がいるけど、正しい知識をつけたほうがよいと思う
  • 作って理解するWebフレームワーク - きしだのHatena

    前回、簡単なDIコンテナを作ってみたので、次はこれを使ってWebフレームワークを作ってみたいと思います。 Webサーバーをつくる まず、WebフレームワークなのでHTTPサーバーが必要ですね。なので簡単なものを作ります。 とりあえずブラウザからリクエストを受け取ったら200 OKとHTMLを返すだけのサーバーです。 今回は、そこらのブラウザからアクセスできればいいや、ということで、RFCとかの仕様に準拠することは考えません。 public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSoc = new ServerSocket(8989); for (;;) { Socket s = serverSoc.accept(); new Thread((

    作って理解するWebフレームワーク - きしだのHatena
    j5ik2o
    j5ik2o 2016/04/20
    Finagleでも同様な機能を付加させて使ったことある。既存フレームワークを読み解く基礎的な知識として知っておくとよいですね。
  • オブジェクト指向は禁止するべき - きしだのHatena

    プログラムがまだ不慣れな人が「プログラムちょっとわかるようになったけど、まだぜんぜんオブジェクト指向とかできてません」のように言ったり、ちょっと慣れた人が「このソース、ぜんぜんだめ。オブジェクト指向ができてない」にようなことを言ったり、まるで、オブジェクト指向ができてるかどうかがよいプログラムかどうかを表すことになってるようだ。 Javaのアルゴリズムのに、「Javaなのにオブジェクト指向ができていない」のような書評がついているのを見たときには、お前は何を求めてるんだと思ったりもした。 そのようなオブジェクト指向は、窓から投げ捨てるべきだ。オブジェクト指向はプログラムのよしあしの基準にならない。 むだにHogeインタフェースとHogeImplクラスがあったり、むだにnewするだけのcreateメソッドがあったり、どこで値が設定されてるかわからないオブジェクトがひきまわされてたり、ソースコ

    オブジェクト指向は禁止するべき - きしだのHatena
    j5ik2o
    j5ik2o 2014/07/20
    DDDをやっていればわかるのだけど、いわゆるオブジェクト指向論に捕われずに概念をコミュニケーション上で使えればよく、そういう部分とそれ以外の技術的な部分を分けて設計・実装するというのが現実解だと思っている
  • JAWS-UG三都物語で「そろそろJavaみなおしてもええんやで」というプレゼンしました - きしだのHatena

    夏のJAWS-UG 三都物語 2014というイベントで「そろそろJavaみなおしてもええんやで」というプレゼンしてきました。 Javaのイベントではなかったので、Javaを使ってない人を想定したプレゼンでしたが、実際会場のほとんどがJavaメインではなかったようです。 for(int num : nums){ if(num > 10) continue; sum += num * 2; } というコードが、NetBeansの「関数操作を使用」というリファクタリングで sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum); になったところがハイライト。 ここまでできるとは思ってなかった。 そろそろJavaみなおしてもええんやで from なおき きしだ

    JAWS-UG三都物語で「そろそろJavaみなおしてもええんやで」というプレゼンしました - きしだのHatena
    j5ik2o
    j5ik2o 2014/07/09
    やはりアンチエイジングにScalaですね
  • Java8には型推論があるので型指定不要で変数が使えますよ - きしだのHatena

    Javaプログラマのみなさんは、Javaは型推論がないから変数の型指定をしなくていけなくてダサい、などとイジメられた経験があると思います。 おかあさんに型推論をねだるとGroovyをわたされたり、おとうさんに型推論をねだるとScalaがやってきたり、プレステが欲しいって言ったのにWiiやXboxを買い渡される感を味わった人も多いのではないでしょうか。 そんな良い子のJavaプログラマのために、今年はサンタが素敵なプレゼントを持ってきてくれましたよ。 同じ型を書くのがダサい たとえばウィンドウを出してボタンを押したらメッセージが表示されるサンプルを書くとこんな感じになりますね。 public static void main(String... args){ JFrame f = new JFrame("テスト"); JButton b = new JButton("押して"); JText

    Java8には型推論があるので型指定不要で変数が使えますよ - きしだのHatena
    j5ik2o
    j5ik2o 2013/12/24
    頑張ってますね!(天上界より
  • Java8 Lambdaの文法拡張まとめ - きしだのHatena

    デフォルトメソッドは前に解説しました。 Java8で最もインパクトのある構文拡張、デフォルトメソッド ここでは、それ以外の構文拡張についてまとめておきます。 ラムダ式 実装すべきメソッドがひとつだけのインタフェースを関数型インタフェースといいます。 UnaryOperatorインタフェースは実装すべきメソッドがapplyメソッドひとつだけなので、関数型インタフェースになります。 たとえば、UnaryOperatorインタフェースを実装したクラスを定義すると次のようになります。 class MyOp implements UnaryOperator<String>{ @Override public String apply(String t) { return "** " + t + " **"; } } このUnaryOperatorインタフェースを使う、List#replaceAllを

    Java8 Lambdaの文法拡張まとめ - きしだのHatena
    j5ik2o
    j5ik2o 2013/12/03
    Java8のreturnは関数を抜けるだけか。便利そうだけど、Scalaの文脈においては、break, continue相当として使えてしまうという弊害がありそう。だから入っていない説もありそうw
  • Java8 Streamではクイックソートが書けない - きしだのHatena

    タイトルは釣りです。 もちろん、汎用ライブラリなので、Streamを使ってクイックソートが書けないわけではありません。 ただ、Streamで完結したままではクイックソートは書けません。Listとの相互変換が必要です。 で、Streamで完結したままクイックソートが書けない直接的要因はいくつかあって、それを解消するユーティリティメソッドが用意されてれば、この件に関してはStreamで完結することもできるのですが、だからといってさまざま出てくる「xxxが書けない」を解決するためのユーティリティメソッドを追加しまくれば幸せになれるかというと、そうでもないわけです。 そもそも、なんでそんなユーティリティメソッドが必要になるのかというのが題。 結局のところListなどCollectionと、新たに追加されたStreamが別扱いになっているところに原因があって、CollectionとStreamの変

    Java8 Streamではクイックソートが書けない - きしだのHatena
    j5ik2o
    j5ik2o 2013/11/24
    Stream関連
  • Java8で最もインパクトのある構文拡張、デフォルトメソッド - きしだのHatena

    Java8でのラムダの使い方などを説明してきたのですが、構文拡張自体には触れていなかったので、改めてここで簡単に説明しておこうと思います。 まずは、Java8で実際に最もインパクトがある言語拡張、インタフェースのデフォルトメソッドです。 デフォルトメソッドとデフォルト実装 いままでインタフェースには実装をもつことができませんでしたが、Java 8からはインタフェースが実装をもてるようになります。 実装をもつメソッドを定義するときには、キーワードdefaultをメソッドの前につけます。 interface Foo{ void print(String s); default void twice(String s){ print(s); print(s); } } twiceメソッドが実装をもっています。この実装をデフォルト実装といいます。 デフォルトメソッドを実装するクラスで、デフォルトメ

    Java8で最もインパクトのある構文拡張、デフォルトメソッド - きしだのHatena
    j5ik2o
    j5ik2o 2013/06/11
    Scalaのtrait相当のことができるって認識でよいかな
  • Java8で強化されたMapと、書きやすくなったメモ化再帰 - きしだのHatena

    Java8のlambda構文の話を書くと、旧来の書き方でいいというコメントがつくのですが、それでも便利になったMapの恩恵を受けることは多いんじゃないかと思います。 ※ 2018/5/31 Java9からはメモ化再帰には使えなくなっています ※ 2019/2/15 なんか問題ない? Mapには、lambda式を使ったメソッドが多く追加されていますが、たとえばgetOrDefaultメソッドのようなlambda式を使わないメソッドも追加されていて、これも便利です。 そして、このようなlambda式を使わないメソッドも、間接的にはlambda構文サポートでの言語拡張のおかげです。 Mapはインタフェースなので、Java7までの構文でメソッドを追加しようとすると、Mapを実装しているすべてのクラスに新しいメソッドの実装を追加する必要がありました。そしてそれは現実的に不可能なので、今までMapなど

    Java8で強化されたMapと、書きやすくなったメモ化再帰 - きしだのHatena
    j5ik2o
    j5ik2o 2013/05/23
    Scalaからだいぶ影響受けてる感ある?Java8ユーザーが幸せになれるといいなぁと純粋に思う。
  • Java8のStreamの目的と書きやすさや可読性、並行処理の効果について - きしだのHatena

    さて、前回Java8のStreamの使い方をざっと見てみたのですけど、はてなブックマークのコメントで「Javaが使われている領域でこんな言語拡張は必要か」「可読性が損なわれていて単なる自己満足ではないか」のようなコメントがついていました。 実際どうなのか考えてみます。 Java8のStreamの目的 では、いまJavaが使われている領域を考えてみましょう。 Javaがいまよく使われているのは、クライアントサイドではなくサーバーサイドです。とくに、直接アクセスをうけつけるサーバーではなく、分散データ処理のためのHadoopやHBase、全文検索エンジンのLuceneなど、バックエンド処理を行う製品のシェアが大きいように見えます。 TwitterGoogleでも、Javaで書かれたバックエンドが動いているようです。Facebookも分析系ではJavaを使っているようです。 大手サービスでバッ

    Java8のStreamの目的と書きやすさや可読性、並行処理の効果について - きしだのHatena
    j5ik2o
    j5ik2o 2013/05/10
    Stream歓迎。Java脳の拡張をそろそろやらないと他の言語勢からmap, reduce, flatMap!!という必殺技で兵糧攻めにあいますね。
  • 「プログラミング言語の基礎概念」という本が非常にお気に入り - きしだのHatena

    このところScalaで言語を実装してみたりしてたんですが、何をしてたかというと、「プログラミング言語の基礎概念」というに書いてあることを実装してみてたのです。 この「プログラミング言語の基礎概念」、博多駅のところの紀伊國屋に行ったときにたまたま目に入ったで、薄いし1800円だし、こいつはいいぜと思って買ってみたら、非常によいでした。 どのくらい気に入ったかというと、毎日布団に持って入って3行読んだら熟睡してしまうという気に入りようです。最後の章に入ったあたりでは、もうこの赤い表紙を見ただけで寝入ってしまうという、快適な睡眠に欠かせないアイテムになっていました。 プログラミング言語の基礎概念 ((ライブラリ情報学コア・テキスト)) 作者: 五十嵐淳出版社/メーカー: サイエンス社発売日: 2011/07/01メディア: 単行購入: 6人 クリック: 60回この商品を含むブログ (12

    「プログラミング言語の基礎概念」という本が非常にお気に入り - きしだのHatena
    j5ik2o
    j5ik2o 2011/12/21
    快眠のススメ
  • Scalaでパーサーを作ってみる〜9:関数の定義と呼び出し - きしだのHatena

    Scalaの勉強をはじめたので、とりあえず簡単なパーサーを作ってみてます。 http://d.hatena.ne.jp/nowokay/20111109#1320815540 前回、変数のスコープを導入しました。 http://d.hatena.ne.jp/nowokay/20111111#1320987235 そうすると、やっぱり関数定義したいですよね。 ということで def hoge(x) ={ x * 2 } みたいな形で関数を定義してhoge(3)とやったら6が返るようにしてみます。 構文要素 まず構文要素を定義します。 case class Func(params:List[String], proc:AST) extends AST case class FuncDef(name: String, func: Func) extends AST case class FuncC

    Scalaでパーサーを作ってみる〜9:関数の定義と呼び出し - きしだのHatena
    j5ik2o
    j5ik2o 2011/11/14
    よい記事
  • Scalaでパーサーを作ってみる〜3:式の評価 - きしだのHatena

    Scalaの勉強をはじめたので、とりあえず簡単な数式パーサーを作ってみてます。 http://d.hatena.ne.jp/nowokay/20111101#1320102262 前回は、構文木のオブジェクトを生成しました。 http://d.hatena.ne.jp/nowokay/20111104#1320365981 これで、構文木が扱えるようになったので、あとはその構文木を処理して式を評価するだけです。 式の計算を進めて値を出すことを「評価」といいます。 その前に、前回のエントリで水島さんに教えてもらったことを取り込みます。 構文木作成に使わない構文要素は「~>」「<~」を使うと左右の項を捨てれるということでした。ということでfactorの項を書き換えてみます。 def factor: Parser[AST] = intLiteral | "("~>expr<~")"^^{ x=>

    Scalaでパーサーを作ってみる〜3:式の評価 - きしだのHatena
  • Scalaでパーサーを作ってみる〜2:構文木の作成 - きしだのHatena

    Scalaの勉強をはじめたので、とりあえず簡単な数式パーサーを作ってみてます。 前回は、とりあえず構文規則を定義しました。 Scalaでパーサーを作ってみる〜1:構文定義 - きしだのはてな 今回は、その構文規則からASTオブジェクトを生成しようと思います。 基底になるASTトレイトを用意して、それぞれの構文要素を定義します。 trait AST case class AddOp(left: AST, right:AST) extends AST case class SubOp(left: AST, right:AST) extends AST case class MulOp(left: AST, right:AST) extends AST case class IntVal(value: Int) extends AST 構文ルールでAST要素を生成するようにします。Parserの

    Scalaでパーサーを作ってみる〜2:構文木の作成 - きしだのHatena
    j5ik2o
    j5ik2o 2011/11/04
  • Scalaでパーサーを作ってみる〜1:構文定義 - きしだのHatena

    Scalaの勉強をはじめました。 で、なんかパーサーコンビネータというのがあるらしく、パーサーが簡単に作れるらしく、じゃあパーサー作ってみるのがScalaの勉強にいいんじゃないかということで、簡単なパーサーを作ってみることにします。 とりあえず構文定義してみます。 今回つくるのは、整数の計算をするパーサーってことにします。整数と、+/-、*、あと()くらいが使えるものにします。割り算を入れないのは、そこは単純に処理を付け加えれば実現できるから。 式の優先順位と、同じ優先度に複数の演算子があればいいってことにします。あと、単項演算子も使いません。めんどうだから。 実装方針は「ソースコードが増えないこと」です。 JavaTokenParsersを使うと、Javaのリテラル表記がそのまま使えるパーサーが作れるらしいんですけど、構文を全部自分で定義したい病気なので、その一階層上のRegexPars

    Scalaでパーサーを作ってみる〜1:構文定義 - きしだのHatena
    j5ik2o
    j5ik2o 2011/11/04
    ━(゜∀゜)━!
  • テスト駆動開発が嫌いだ - きしだのHatena

    テスト駆動開発が嫌いだ。 ただし、ここでの「テスト駆動開発」は日で今TDDと呼ばれてる多義的なものじゃなく、「テスト駆動開発入門」にかかれている「テスト駆動開発」。 もっと正確にいうと「テスト駆動開発入門」がミスリーディングをわざと誘ってて有害で嫌い。 テストは、プログラムが正しく動くことは検証できるけど、プログラムが正しいことは検証できない。そのようなテストに設計を依存してしまうと、正しく動くプログラムは作れるけど正しいプログラムは作れない。 設計も含めてテストによって駆動しましょうという「テスト駆動開発入門」のやり方では正しいプログラムが作れない。プログラムの正しさを別のやり方で担保しつつ、そちらを中心に開発を駆動して、あくまでも開発作業だけをテストで駆動するという考え方のほうが、正しいプログラムに近づける。 そして、TDDをいまがんばってる人たちも、それは当たり前にわかってると思う

    テスト駆動開発が嫌いだ - きしだのHatena
    j5ik2o
    j5ik2o 2011/09/03
    素直に共感した。"正しいプログラム"の部分はDDDで追求しようと思っています。
  • どのプログラム言語を選ぶべきか・・・ - きしだのHatena

    PHP-erはダメな言語でいかにまともなものを作るかっていうマイナスからのスタートだし、 JavaScript-erは何もないところで何か動いて楽しいっていう0からのスタートだし、 Ruby-erはRuby好きって言ってるだけだし、 Java-erはJavaの仕様にしか興味がないし。 Scala-erは生ぬるいこと言うと狩られるし、 Smalltalk-erは過去の栄光語ってるだけだし、 COBOL-erは苦労話しか出ないし、 FORTRAN-erはプログラムに興味ないし、 Perl-erは同窓会みたいだし、 Python-erは仲間探すの大変だし、 Erlang-erはどこにもいないし、 C-erは目先の仕事にしか興味ないし、 C++-erはC++の復興にしか興味ないし、 C#-erはWindowsにひきこもるし、 ActionScript-erはAdobe税はらうのに大変そうだし、 O

    どのプログラム言語を選ぶべきか・・・ - きしだのHatena
    j5ik2o
    j5ik2o 2011/08/30
    どうせ狩られてしまうのなら、どの言語いいか。。Scalaかな。
  • Java SE 7のjava.nio.file.Filesがとても便利な件 - きしだのHatena

    とても便利。 たとえば、あるサイトからHTMLをダウンロードしてファイルに保存する場合。 try(InputStream is = new URL("http://www.google.com/").openStream()){ Files.copy(is, Paths.get("C:\\Users\\kishida\\Downloads\\google.html")); } ファイルの内容を一行ずつ読み込んで処理をする場合。 for(String s : Files.readAllLines(Paths.get("C:\\Install.log"), Charset.defaultCharset())){ System.out.println(s); } まあ、直接文字列でファイルパスを渡せなかったり、デフォルトCharset使う場合でも引数が省略できなくて、まだるっこいコードになってし

    Java SE 7のjava.nio.file.Filesがとても便利な件 - きしだのHatena
  • [Java]正しい無限ループの書き方 - きしだのはてな

    boolean д = true; for(;д;){ System.out.println("でれません"); } boolean ω = true; for(;ω;){ System.out.println("ぬけれません"); } boolean ェ = true; for( ;(ェ); ){ System.out.println("終わりません"); } boolean TдT = true; while(TдT){ System.out.println("帰れません"); } 参考 while(1)をfor(;;)って書くやつ(2ch)

    [Java]正しい無限ループの書き方 - きしだのはてな
  • SIは面白くないけどエンタープライズは面白い - きしだのはてな

    ここんところ、SIという業態はもうダメという話になってます。 で、エンタープライズ(=企業向けシステム)というのは、SIという業態で開発されるので、エンタープライズ=SIという前提で、企業向けシステムは面白くないという話になっています。 そこから、企業向けアプリは面白くないからサービスを作りましょう、という流れになって、GREEやDeNAなどに人材が流れてます。 実際は、サービスや企業向けというアプリケーションの種類と、SIや内製、パッケージという構築側の業態は独立なので、別に語るべきです。 たとえば、このインタビューを見ると、ゲーム業界もSI化していて、面白くなくなっていそうなことが伺えます。 稲船敬二氏は,何を思い,何を考え,何を目指してカプコンを辞めていくのか。渦中の氏に直撃インタビュー また、GREEやDeNAが提供するゲームは急激に大規模化していて、おそらくSI形態での開発が増え

    SIは面白くないけどエンタープライズは面白い - きしだのはてな
    j5ik2o
    j5ik2o 2011/01/26