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

  • PPAPで学ぶDaggerによるDI - きしだのHatena

    Daggerってありますよね。コンパイル時に依存性を解決するのでパフォーマンス的に有利なDIコンテナです。 https://google.github.io/dagger/ 依存関係の不備がコンパイル時にエラーになって発見できるのも、実行時にエラーが出たときの修正の難易度が高いAndroidアプリにはありがたいということで、Androidでよく使われてるようです。 基的なオブジェクトの定義 I have a pen. public class Pen { @Override public String toString() { return "ペン"; } } I have an apple. public class Apple { @Override public String toString() { return "アッポー"; } } Ohh!!! Apple Pen!!! p

    PPAPで学ぶDaggerによるDI - きしだのHatena
  • 作って理解するDIコンテナ - きしだのHatena

    DIコンテナ使ってるけど、アノテーションってなんなの!って聞かれて、作ってみたらわかるよと答えてみたので、自分でも作ってみました。 よくわかった。 「DIコンテナ使うと何がいいの?」ということも、作ってみるとわかります。あと「DIって何がいいの?」に関しては、「DIはちょっとコードを書くのが楽になるだけで、それだけあっても仕方ない、大事なのはコンテナ」と答えるようにしてますが、コード比率からもそれがよくわかります。 続編としてWebフレームワークも作っているので参考まで。 作って理解するWebフレームワーク - きしだのHatena まずはコンテナを作る とりあえず1ソースの状態で。 こんな感じで、管理する型を登録できるようにします。 static Map<String, Class> types = new HashMap<>(); static void register(String

    作って理解するDIコンテナ - きしだのHatena
  • 作って理解する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
  • Javaをチラ見する - きしだのHatena

    Javaを知らないからちょっとだけ見てみたい、みたいな人のために、ちょっとしたチュートリアルを書いてみました。 準備 まずはJDKをダウンロード・インストールしてください。 http://www.oracle.com/technetwork/java/javase/downloads/index.html ダウンロードページでは「Accept License Agreement」にチェックして、自分の環境にあわせたインストーラをダウンロードします。 今だとu73とu74がありますが、初めてインストールするなら74でいいと思います。 インストールするものを選ぶダイアログで「開発ツール」「ソースコード」「パブリックJRE」が出ますが、パブリックJREは不要なので、左のアイコンをクリックして、×がついてる感じのを選ぶといいと思います。 あと、NetBeansもダウンロード・インストールします。

    Javaをチラ見する - きしだのHatena
  • 乱数のたのしい話と遺伝アルゴリズム - きしだのHatena

    金曜日の「プログラマのための数学勉強会@福岡」で乱数の話をしてきました。 プログラマのための数学勉強会@福岡 #3 - connpass で、乱数の生成だとか、クイックソートや素数判定などの乱択アルゴリズムの話とかをしました。 乱数タノシイヨ 乱数のたのしい話 from なおき きしだ その中で、遺伝アルゴリズムで巡回セールスマン問題(TSP)を解くというのをやってみました。遺伝アルゴリズム、すいぶん昔から名前は知ってて、どういうアルゴリズムかも知ってて、実装もそんな難しくないと知りつつ、書く機会がありませんでした。なので、この機会に書いてみようと。 とりあえず最初に完全にランダムでTSPを解いてみます。 TSP with random ぐちゃぐちゃですね。 下部のグラフはその時点での最短距離。最初に距離が短いものをみつけていくけどだんだんみつかりにくくなる、という感じになっています。 1

    乱数のたのしい話と遺伝アルゴリズム - きしだのHatena
  • 小学校低学年へのプログラミング教育には効果がないと考えたほうがいい - きしだのHatena

    子どもへのプログラミング教育は早ければ早いほどいいというものではない。 最近子どもへのプログラミング教育が話題になることが多いけど、恐らく小学3年生までの子どもへの効果はほとんどなく、小学4年生でもほとんどの子どもには難しいと思う。 人間の知能の発達には段階があって、必要な段階に達していないうちにそれが必要な教育を行っても効果は望めない。 まず、なんでこのエントリを書いたかというと、プログラミングには適した発達段階があるということを知らないと、その発達段階に達する前にプログラミング教育を行って、もちろんプログラミングは出来なくて、その子には適性がないという判断をしてしまうとうことが起きてしまうんじゃないかと思ったからだ。 まだ適した段階まで来てないだけなのにプログラミング教育をして失敗して「この子にはプログラミングができなかった/興味をもたなかった」という実績を作ってしまうことによって、将

    小学校低学年へのプログラミング教育には効果がないと考えたほうがいい - きしだのHatena
  • ぼくの実装した最弱のディープラーニング - きしだのHatena

    8月の頭からディープラーニングを実装していたのを、先日、プレゼンしてきました。 プログラマのための数学勉強会@福岡 - connpass ぼくの実装した最弱のディープラーニング from なおき きしだ ※追記 2023/4/12 SpeakerDeckにも置いてます https://speakerdeck.com/kishida/weakest-deep-learning-i-implemented GPU対応したり、ドロップアウトとかミニバッチとかいろいろ実装して、結構つよくなってます。 ちゃんと学習してくれないこと以外は。 ソースはこんな感じになってきています。 https://github.com/kishida/neuralnet/tree/CorrectOperationAsCCN GPU対応にはaparapiを使っています。JavaGPUコードが書けるスグレモノです。 ap

    ぼくの実装した最弱のディープラーニング - きしだのHatena
  • OptionalがSerializableではない話と使い方まとめ - きしだのHatena

    Optionalは意図的にSerializableではなくなってますね。 でその意図としては、一旦Serializableにして出力形式を決めてしまうと、今後ずっとその出力形式を維持しないといけないことになるので、そのメンテナンスコストを嫌ったというのがあるようです。 このメンテナンスコストの中には、仕様が変えれなくなる、というコストも含みます。 なので、シリアライズしたい場合には、フィールドはnullを持つようにして、getterでOptionalに変換するということになると思います。 基的にOptionalは、Optional-returnイディオムをサポートするもの以上ではない、ということをBrian goetzさんも書いています。 Shouldn't Optional be Serializable? そこで、Optionalの使い方としては、基的にメソッドの戻り値としてだけ、

    OptionalがSerializableではない話と使い方まとめ - きしだのHatena
  • 品質におけるコメントの役割。あるいは、レビューとコメント - きしだのHatena

    昨日のエントリでも書いたきょんくんとの会話なんだけど、なんとなく、コメントとテストは同じように扱えるんではないかという認識のもとで話がすすんでた。もちろん、コメント書けばテスト書かなくていいとかそういうのではなくて。 テストは、書きやすい対象と書きにくい対象がある。関数的に計算を行うコードの場合はテストが書きやすい。一方で、関数的ではなく副作用のあるコードはテストが書きにくい。データベースを扱ったり通信したりUIがあったり。 そして、そのようなテストを書きにくいときに、コメントはテストのように品質のために使えるんではないか。 で、問題は、どのように品質のために使うかということなんだけど、コードレビューのときの指針として使えばいいんじゃないかなと思った。 コードレビューのとき、コードだけを見ていると、名前付けとかコードの順番とか条件文の使い方とか、体裁的なものだけのレビューになりがち。そこで

    品質におけるコメントの役割。あるいは、レビューとコメント - きしだのHatena
  • 会社員になってJJUG CCCのスポンサーセッションで発表してきた - きしだのHatena

    2月1日からLINE Fukuoka株式会社というところで会社員をやっております。 ということで、JJUG CCC 2015 Springのスポンサーをやらせてもらって、スポンサーセッションで登壇してきました。 だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。 from なおき きしだ ※4/15 15:41追記 P37の「近所の定屋」は今週値上げして490円になりました 内容としては、Javaエンジニア養成読の記事をベースに、Java歴史について、技術トレンドや経済的な情勢、そしてハードウェアの事情から捉えてみて、いろいろな流れのなかで影響を受けてきたことを示しつつ、コミュニティがどう変遷してきたか、個人的にこの先をどう考えて動いてたかってのを、ふんわりと説明したかった感じです。 ということで、タイトルにある「誰も教えてくれないJavaの世界」というのは、そう

    会社員になってJJUG CCCのスポンサーセッションで発表してきた - きしだのHatena
  • Javaでのnullチェックのパフォーマンス - きしだのHatena

    Javaでのプログラムでは、Optionalが入ったとはいえ、nullとのつきあいは依然として重要です。 そんな中で、nullが入ってると困る処理を書くときには、nullチェックを行うほうが安全です。 そのとき、どのようにnullチェックを行うかというのが問題になります。 Java7からは、Objects.requiredNonNullというメソッドが導入されたので、このメソッドを使って、以降の処理でnullじゃないことを保証するということができます。 けど、このrequiredNonNullが遅いんじゃないかという話があるので、どう遅いのか調べてみました。 requireNonNullと同様に、値がnullだったらNullPointerExceptionを吐いて、null以外だったら素通りするという書き方のひとつに、getClassメソッドを呼び出すというものがあるので、これと比べてみま

    Javaでのnullチェックのパフォーマンス - きしだのHatena
  • コードに対してコメントを書くと実装に関するコメントになる - きしだのHatena

    おととい、渋谷JVMというイベントがあって登壇させてもらったんですが、そのあとビール飲んでるときに、ぼくが「コード書く前にコメントだけ書くのいいよね」と言ったあとの返答としてきょんくん(kyon_mm)が言った言葉。 全体としては 「コード先に書いてそのコードに対してテストを書くと実装に対するテストになるし、コードを先に書いてそのコードに対してコメントを書くと実装に対するコメントになる」 という感じ。 ここに至るまでの話もおもしろかったんだけど、ここでは、コメントについて書いてみます。 まず、実装に対するコメントってどういうのかというと、こういうの。 id = findId(name); if(id == -1){ // idが-1だったとき登録 register(name); } いやそれはコード見ればわかるから、ってやつですね。 これは、こうやるとより適切です。 id = findId

    コードに対してコメントを書くと実装に関するコメントになる - きしだのHatena
  • ソフトウェアプロセス技術がロストテクノロジーになっている - きしだのHatena

    最近会った人とよく話すのが、ソフトウェアプロセス技術がロストテクノロジーになってるんではないかということです。 ソフトウェアプロセスというのは、「プロセスがよいソフトウェアをつくる」という前提のもと、どのようなタイミングでどのような成果物を作り、どのような管理をし、どのように検査をしてソフトウェアを作るかという手順です。 そして、プロセス技術というのは、そのようなプロセスを構築し運用し改善する技術です。 このようなソフトウェアプロセス技術は、1995年くらいから2000年くらいにかけて盛り上がり広まりかけたのですが、そのタイミングでWebが広まりはじめ、「Webは進化が速い」「作るものがどんどん変わる」などを合言葉に、「アジャイルプロセスを採用する」という名目でなんら管理されないプロセスが普及しました。その結果、プロセス技術は完全に下火になっているように思います。 もちろん、Webの発展段

    ソフトウェアプロセス技術がロストテクノロジーになっている - きしだのHatena
  • パーセプトロンからSVMでの画像認識まで、機械学習エントリのまとめ - きしだのHatena

    なんかJJUGナイトセミナーで機械学習をやるっぽくて、定員100人が40人キャンセル待ちとかになってますね。 【東京】JJUG ナイト・セミナー「機械学習・自然言語処理特集!」12/17(水)開催 - 日Javaユーザーグループ | Doorkeeper ということで、予習用だか復習(になるかわかんないけど)用に、2008年になんか機械学習をやってたときのエントリをまとめてみます。 今でこそ機械学習はなんかもりあがってるけど、2008年にぼくがやってたとき「ところで機械学習やってなんになるの?」ってよく言われてました。ぼくも「いや、なんかそこに機械学習ってものがあるから実装してる」みたいな答えをしてた気がします。特に目的はありませんでした。 たまたま サポートベクターマシン入門 というを見かけて、なんか実装してみたくなっただけです。 変な力がありあまってたっぽい。 機械学習ことはじめ

    パーセプトロンからSVMでの画像認識まで、機械学習エントリのまとめ - きしだのHatena
  • ソニーデジタルペーパーを買った。これはいいものだー - きしだのHatena

    発表されたときから興味があって、その値段のせいで買うのを躊躇していたソニーデジタルペーパー、なんかレビューみてたら一瞬気を失っていて、その間に注文してしまっていたようです。 ひとこと。これはいいものだー。 ソニー デジタルペーパー DPT-S1 出版社/メーカー: ソニー発売日: 2013/12/03メディア: エレクトロニクスこの商品を含むブログ (1件) を見る 表示 大きいことはいいことだ。 パタヘネやWEB+DB PRESSが実物以上の大きさで表示できるのは、とてもいいです。これで、アルゴリズムデザインみたいなでかいを裁断する気になります。 ブラウザ機能もあって、文字の多いサイトを読むのにもいい感じ。 通常の大きさのだと見開きで表示できるサイズなのですが、見開き表示のモードがないのが当に残念。 4枚表示でも読めるのですけど、横向きで2枚表示が欲しい。 ただ、電子書籍を読んだり

    ソニーデジタルペーパーを買った。これはいいものだー - きしだのHatena
  • オブジェクトはストックで、関数はフロー - きしだのHatena

    的にオブジェクトと関数はおんなじもので、Javaのラムダ式では記述は関数だけど扱いはオブジェクトになってたりします。逆に、関数でオブジェクトを実現することもできます。 なので、オブジェクトと関数が、モノとしてどう違うかっていう話にはあまり意味がなくて、問題は表現としてどう違うかってことになると思います。 表現として、オブジェクトはフィールドとかプロパティとかで状態をもって、その状態をもとにいろいろ動いて、状態を変えます。 関数は引数をとって、その引数をもとにいろいろ動いて、戻り値を返します。 オブジェクトは状態が大事、関数はデータの流れが大事、って感じになります。 アプリケーションの中では、ユーザーインタフェースとデータ構造・ストレージは状態が大事です。処理に関してはデータの流れが大事です。 ここで、ユーザーインタフェースやデータ構造はプラットフォームごとに一揃えあれば充分です。ストレ

    オブジェクトはストックで、関数はフロー - きしだのHatena
  • オブジェクト指向について - きしだのHatena

    参考までに、ぼくの基的な定義は、ランボーの「データ構造と振る舞いが一体となったオブジェクトの集まりとしてソフトウェアを組織化すること」という定義に従っています。そのようなオブジェクトが単体ではなく組織化されるということが重要です。オブジェクト指向を勉強するとはそのような組織化のしかたを勉強することだと考えています。 現在のシステムは、データはデータベースに格納され、振る舞いとは分離して管理されています。そのような中では、システムをオブジェクトの集まりとして組織化することはできません。 局所的にも、ステートレスを前提としたHTTPの処理では、オブジェクト組織の必要な局面はありません。 個別のオブジェクトの共通化に継承を使うという点では「クラスは単にユーザー定義型であり、継承は部分型と差分プログラミングを実現する仕組みだととらえる」だけで充分だと考えています。 そうしたシステムにオブジェクト

    オブジェクト指向について - きしだのHatena
  • Java VMの改善案が楽しそう - きしだのHatena

    なんか、Java VMの改善案がでてますね。 すげー楽しそうです。 http://cr.openjdk.java.net/~jrose/pres/201407-JVMEvolution.pdf プロジェクトValhallaとプロジェクトPanamaがあります。 http://openjdk.java.net/projects/valhalla/ http://openjdk.java.net/projects/panama/ Valhallaは、Value TypesとSpecialization、PanamaはArrays 2.0とLayoutsがあります。 概要をまとめてみますが、かなり適当な解釈で書いてたりするので、細かいことはちゃんと原文みてください。 Value Types 簡単にいえば、新しい基型を定義できるようにするというものです。 http://cr.openjdk.ja

    Java VMの改善案が楽しそう - きしだのHatena
  • 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
  • 「きしだのはてなのあれってどうなの勉強会」やってきました - きしだのHatena

    24日の土曜日に、「きしだのはてなのあれってどうなの勉強会」やってきました。 【東京】きしだのはてな勉強会 〜「きしだのはてな」のあれってどうなの〜 - 日Javaユーザーグループ | Doorkeeper んで、あいかわらずその場にいないと意味がわからない資料ができあがりました。 きしだのはてなのあれってどうなの勉強会 運営のmegascusさんは 思ったよりもきしださんの人気が薄かったのか人が集まりませんでした。 【東京】きしだのはてな勉強会 〜「きしだのはてな」のあれってどうなの〜をやってきた - 水まんじゅう とは書いてますが、内容もなにか具体的にわからない、参加費3000円、そしてPlay勉強会とかぶる(時間的にはかぶってなかったようだけど)という中で21人集まってもらえたのは、なかなかありがたいことだなーと思いました。 運営のmegascusさんと岡澤さん、おつかれさまでした

    「きしだのはてなのあれってどうなの勉強会」やってきました - きしだのHatena