タグ

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

  • Javaパズル:"test".length()の呼び出しで挙動が変わるのはナゼ? - きしだのHatena

    Javalobbyで紹介されてたパズル Thursday Code Puzzler: String Intern Puzzle in Java 7 and 6 | Javalobby このコードをJava7で動かすと、true が表示されます。 String te = "te", st = "st"; // "test".length(); String username = te + st; username.intern(); System.out.println( "String object the same is:" + (username == "test")); Java6で動かした場合はfalseが表示されます。 ここで、Java7の場合でも、コメントアウトされた「"test".length()」をアンコメントすると、falseが表示されるようになります。 String t

    Javaパズル:"test".length()の呼び出しで挙動が変わるのはナゼ? - きしだのHatena
    SiroKuro
    SiroKuro 2012/10/20
    コンパイラの最適化?
  • プログラマが解くのに1時間かかるという問題が普通にプログラマな方法で5分で解ける話 - きしだのはてな

    こういう問題が流れてきた。 まつひろのガレージライフ: 幼児が数分で解けるのに大人が解けない算数(?)の問題 「幼稚園児が5〜10分で解けるのに、プログラマなどの頭脳労働職の高学歴の方が解くのに1時間もかかる」とあるけど、これ1時間かかるの、プログラマとしてあまりよくないんじゃないのかなーと思った。 ので、プログラマ的に解いてみる。 改めて書き出すとこう。 8809=6 3333=0 7111=0 5555=0 2172=0 8193=3 6666=4 8096=5 1111=0 1012=1 3213=0 7777=0 7662=2 9999=4 9313=1 7756=1 0000=4 6855=3 2222=0 9881=5 3333=0 5531=0 5555=0 2581=??? 問題は英語だし語呂合わせじゃない。幼稚園児にわかるということでそこまで複雑なルールでもない。なんらか

    プログラマが解くのに1時間かかるという問題が普通にプログラマな方法で5分で解ける話 - きしだのはてな
    SiroKuro
    SiroKuro 2012/04/10
    「なんらか数字に割り当てられた数を足すんだろう」これは答えを知っている人の思考だと思う。
  • プログラマになるための勉強をしている人の前で話をしてきた - きしだのHatena

    イデアルITスクールというところで、1時間ほど話をしてきました。 プログラマとしてやっていくために大事なことというテーマ。 資料を作らずに、というか構想すら練らずにやってしまったので、ここで整理とまとめと補足を。実際にこれをしゃべったというのではなくて、だいたいこんなことをしゃべろうとしてたという内容をかなり盛って書いてます。 当然ですが、プログラマの仕事はプログラムを書くことです*1。 プログラマとしてやっていくためには、どこで動くプログラムを書くか、なにをするプログラムを書くかということを意識することが大事です。 ということで、まずはプログラムが動くところがどう変わったかという話。 1970年代ころは、デバイスを動かすためのプログラムが多かったのではないかと。 あと、ここには書いてないけど、業務アプリはほぼメインフレームで動いてたと思います。 それが、1980年代くらいからパソコンが出

    プログラマになるための勉強をしている人の前で話をしてきた - きしだのHatena
  • ということで、バイトコードコンパイラを作ってみる。 - きしだのHatena

    おとといと昨日のプログラムを組み合わせて、数式をバイトコードにコンパイルして実行させてみました。 import java.io.*; import java.text.ParseException; import java.util.Stack; public class Compiler { public static void main(String[] a) throws Exception{ System.out.printf("%d : %d%n", eval("4-3"), 4-3); System.out.printf("%d : %d%n", eval("4--3"), 4- -3); System.out.printf("%d : %d%n", eval("((-12 + 3) * 2)"), ((-12 + 3) * 2)); System.out.printf("%d

    ということで、バイトコードコンパイラを作ってみる。 - きしだのHatena
    SiroKuro
    SiroKuro 2011/08/15
    asmとか使うと便利
  • Javaでブラウザが表示できるようになるよ! 2011-05-26 - きしだのはてな

    JavaFX 2.0 betaが公開されました。いまのところ32bit Windows用だけですけど。 JavaFX GA downloads で、JavaFX、あんまり興味ない人も多いかと思いますが、2.0ではWebKitベースのブラウザが入ったのです。 そして、JavaFXJavaFX ScriptがなくなってJava言語で書くようになって、Swingに埋め込めるので、つまりJavaでブラウザが使えるようになったわけです。 ということでとりあえず表示してみました。 星にカーソルを持っていけばちゃんとidなんかが表示されるし、Ajaxな動きもちゃんとできています。 ただ、角丸スタイルは対応してない感じだったりするので、Twitter表示するとくずれぎみ。 まあ、ベータなんで、徐々に対応してもらえれば! それでも、発言にカーソルもっていってボタン押すと右側に発言内容が表示されたり、動きは

    Javaでブラウザが表示できるようになるよ! 2011-05-26 - きしだのはてな
    SiroKuro
    SiroKuro 2011/05/27
    hotjava
  • JDK6のHttpServerで簡単なWebサーバーを作る - きしだのHatena

    日付があしただけど気にするな。 (今は11/23) JDK6にHTTPサーバークラスが用意されてるということで、これを使って静的ファイル専用の簡単なWebサーバー作ってみました。 package webserver; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWrit

    JDK6のHttpServerで簡単なWebサーバーを作る - きしだのHatena
  • そろそろIDEよりコマンドラインのほうが理解が深まるという有害な妄想は捨ててはどうか? - きしだのはてな

    Java入門ブックガイド(入門編)よりよき入門書と出会うために」を読んで。 第一印象として、よりよきJava入門ブックガイドに出会う必要があるなということ。 コマンドラインでは慣れ親しめない サブタイトルに「慣れ親しむことが上達の秘訣」とあるけども、コマンドラインで慣れ親しむのは難しいと思います。 「慣れ親しむことが上達の秘訣」が正しいのであれば、IDEで慣れ親しんだほうが上達するのではないでしょうか? 現実問題として、書籍を買って勉強する人は強制されて勉強するわけではないです。自分の時間をやりくりして入門書を読んでいます。 そして、まだプログラムの面白さを知りません。 コマンドラインでコンパイルエラーが出たとき、じっくりとそのエラーを読み解くのではなく、そこでくじけてやめる可能性が高いと思われます。 それよりは、IDEでエラーを入力段階で修正しつつ進むほうがいいと思います。 javac

    そろそろIDEよりコマンドラインのほうが理解が深まるという有害な妄想は捨ててはどうか? - きしだのはてな
    SiroKuro
    SiroKuro 2010/08/31
    きしださんが使っているのは Java じゃなくて Eclipse だと思う。VBA ではなく Excel であるように、Java じゃなくて Eclipse だと思う。
  • Google App Engine/Javaでセッション情報を定期的に消す処理 - 2010-02-09 - きしだのはてな

    Google App Engineでは、セッション情報はデータストアに保存されます。 で、自動的には消えないので、うかうかするとこんなふうに100万件以上たまってしまいます。 容量もそれなりにって、350MB近くになっていました。GAEでは1GBを超えると課金されるので、この容量は痛い。 ということで、セッション情報を消す処理を書いてみました。あとは、これを手動で呼び出すもよし、CRONで定期的に呼び出すもよし。 あと、ここのlogメソッドのようなものは、どっか書いとくとログを自分のUIで好きに見れるようにできるので便利。これも定期的にまとめたり消したりする処理必要になりますが。 というか、データ全部消す処理って、どう書くのが一番いいんでしょう?なんかすげー時間かかってるんですけど。 ※ shin1ogawaさんに「makeSyncCallサーブレットを立てて、ローカルのプログラムからバ

    Google App Engine/Javaでセッション情報を定期的に消す処理 - 2010-02-09 - きしだのはてな
  • 匿名の反対は実名ではないし、実名かハンドルかという議論は不毛 2009-10-07 - きしだのはてな

    個別の議論はあまり見てないのだけど、「匿名か実名か」という話題が流行ってるらしい。 で、いろいろ盛り上がってるらしい。 なぜ盛り上がってるかというと、「匿名か実名か」という名目のもと「実名か非実名か」という議論をしていて、そこに「匿名か記名か」という議論が混じって、いろいろこんがらがるからだ。 そう。匿名の反対は記名だ。実名の反対は実名以外だ。 「匿名か実名か」というタイトルで、「サービスのIDのみか、実名を併記するか」という話をしているのだから、議論がまとまらないとしても無理はない。 そこで実名という言葉のオレオレ定義をしたりする人なんかが現れて、話はもっとわけがわからなくなる。 IDのみで活動していても、いっしょに酒を飲んだことがあって、その人がどの会社でどんな仕事をしているか、どんな学校でなにを勉強しているか知っていれば、その人の家でメシをったりしたことがあれば、実名を併記している

    匿名の反対は実名ではないし、実名かハンドルかという議論は不毛 2009-10-07 - きしだのはてな
    SiroKuro
    SiroKuro 2009/10/07
    事の発端は実名記名匿名論争ですらなくて「おまえ自分の会社名言えるか?」って話だったような気がしなくもない
  • おとうさん、ぼくにもYコンビネータがわかりましたよ! - 2009-04-09 - きしだのはてな

    やっと、Yコンビネータが何を意味するものなのか、どういう意義があるのかがわかりました。 名前を使わず再帰ができますよ!というだけのものじゃなかったのですね。 まずλありき 関数の話をしたいのです。 そのとき、いちいち hoge(x) = x * 2 としてhogeを・・・、とか名前をつけて話を進めるのがめんどうなので、関数を値としてあらわすと便利ということで、λという値を定義するのです。 そうすると、上のhoge関数なんかはλ(x)(x*2)などとあらわせますが、引数をあらわすのに()を使うといろいろまぎらわしいので、 λx.x*2 のように表記します。 というのがλ。 このとき、λになにかわたされたら、引数としてあらわされる部分を単純におきかえます。 (λx.x*2)y とあったら、xの部分をyでおきかえて (λx.x*2)y → y * 2 となります。λの引数部分を与えられた引数で置

    おとうさん、ぼくにもYコンビネータがわかりましたよ! - 2009-04-09 - きしだのはてな
  • 「クラスとは何かを集合論から考えなおす」を集合論から考えなおす - 2009-03-11 - きしだのはてな

    「クラスとは何かを集合論から考えなおす」について、素朴集合論から考えると混乱するとかZFCっぽくないのは意味がないとかいう指摘を受けたので、ちゃんと考えられるように準備をしてみる。 今回は準備だけ。そして続きがあるかどうかはわからない。 さて、素朴集合論じゃなければどの集合論がいいのかといわれると、ZFCなるものがあるらしい。そして、前回の論でZFCとして致命的なのは、ZFCの公理の中で、すべての集合は要素をたどっていくと空集合にならないといけないというのがあるのだけど、これにあてはまらないということだ。ということで、今回は、集合が要素をたどると空集合になるところまでを考える。 まず、空集合をφとあらわす。空集合は、要素を含まない集合で{}のこと。そして、このφに0という数値を割り当てる。 次に、φを要素とする集合に1という数値を割り当てる。φを要素とする集合というのは{φ}のこと。展開す

    「クラスとは何かを集合論から考えなおす」を集合論から考えなおす - 2009-03-11 - きしだのはてな
    SiroKuro
    SiroKuro 2009/03/11
    "ZFCっぽくないのは意味がない" たぶん誰もそんなこと言ってない
  • ソフトウェア工学、ソフトウェア理学、ソフトウェア人文学 - 2009-03-10 - きしだのはてな

    ソフトウェアには、3つの側面があると思う。 どういう切り口で3つの側面を取り出してもいいのだけど、とにかく3つの側面がある。 最近は、工学・理学・人文学の側面として考えるようになってきた。 たとえば、論理学などからプログラムの表現を考えていくようなプログラム意味論は理学だと思う。それから、プログラムの手続きのグラフ構造から最適化や計算可能性を考えるような、計算理論も理学になる。 なので、理学では意味論と計算論に分かれる。 この、理学だけでは実際に動くプログラムは組めないので、データベース論だとかユーザーインタフェースだとか、アプリケーションを組むためのことも考えないといけない。 理学をもとにアプリケーションを考えることになるので、これは工学になる。工学は多岐にわたる。 ただ、これをソフトウェア工学というと、別の分野になってしまう。 ソフトウェアを作成するとき、基原理やアプリケーションの手

    ソフトウェア工学、ソフトウェア理学、ソフトウェア人文学 - 2009-03-10 - きしだのはてな
    SiroKuro
    SiroKuro 2009/03/10
    型理論は理学系じゃないの? 理学を意味論と計算理論だけに区分するのは乱暴すぎるよ/id:nowokay 入りません(きっぱり
  • クラスとは何かを集合論から考えなおす - 2009-03-08 - きしだのはてな

    いま論理学とか集合論とかを勉強してるので、クラスって何かという話のときも集合論として考えてた。 なので、そのとき考えたことをまとめておく。 まず、「なにか」があるとする。「なにか」はなんでもいい。 そして、その「なにか」の集合を考える。たとえば"aaa"や"bbb"を要素とするStringという集合を考える。3とか5とかを要素とするIntegerという集合を考える。 ここで、その集合がなにを扱うかという規則をどうするかというのがオブジェクト指向としては大切になるかもしれないけど、今回はそこには触れないでおく。 とにかく、「なにか」と『「なにか」の集合』を考えることをここでは大切にする。 これで『「なにか」の集合』を考えたところで、『「なにか」の集合』を要素とする集合を考えて、この集合をクラスとする。つまり、クラスという集合は、StringやIntegerといった集合を要素にもつ。 ここで、

    クラスとは何かを集合論から考えなおす - 2009-03-08 - きしだのはてな
    SiroKuro
    SiroKuro 2009/03/08
    かなり深刻な問題点が含まれているので、言及しました d:id:SiroKuro:20090308:1236520607
  • クラスとjava.lang.Classとクラス型と - 2009-03-06 - きしだのはてな

    id:SiroKuroさんところで、クラスに関する用語についていろいろ議論があって、なんとなくこういうイメージをもった。 クラスをあらわすいろんな用語があるのだけど、それぞれは「クラス」という抽象概念があって、たとえば「Javaオブジェクト」として光をあてれば「java.lang.Class」という影ができ、「言語仕様」として光をあてれば「クラス型」という影ができる。 ここで、それぞれの用語や対応関係は便宜上のもので、実際はもっと適切な用語や対応関係があるとおもう。とりあえずここでは、抽象概念があって、そこに光をあてて影ができるというイメージをあらわしたかった。 抽象概念を直接みることはできないので、ぼくたちはなんらかの視点という「光」をあてて、そこでできた「影」をみることしかできない。

    クラスとjava.lang.Classとクラス型と - 2009-03-06 - きしだのはてな
    SiroKuro
    SiroKuro 2009/03/06
    このイメージは興味深いなぁ。nowokay++。けど「言語仕様」についての影が「クラス型」なんじゃなくて、「型システム」についての影が「クラス型」だと思うー
  • エラー処理の方針とString#equalsの書き方 - 2009-02-19 - きしだのはてな

    String#equalsを使った文字列リテラルとの比較の書き方として、str.equals("リテラル")と書くのがいいか、"リテラル".equlas(str)と書くのがいいかという論争がありました。 そこで、この問題について、エラー処理の方針と絡めて考えてみようと思います。 エラー処理の方針として、エラーパッシングとエラーリカバリーという考え方があります。 エラーパッシングは、エラーがあってもそれを無視して処理を行うという考え方です。例えば音楽データの再生時に、データの一部が欠けていたとしてもそこを適当に補完を行って再生を続けるような考え方です。 人間相手の処理では、エラーによって処理が止まるよりも、それなりの対処を行って処理を続けることのほうが求められるので、ユーザーインタフェースやコンテンツのプログラムではエラーパッシングで考えることが多いと思います。 エラーリカバリーは、エラーが

    エラー処理の方針とString#equalsの書き方 - 2009-02-19 - きしだのはてな
  • クラウド時代のトランザクション(2009-02-09 - きしだのはてな)

    今のデータベースシステムでは、トランザクションはACIDという考え方が基になってます。 これらの用語の頭文字をとってACIDです。 Atomicty 原子性:トランザクション中の処理は全部行われるか全く行われないか Consistency 一貫性:トランザクションが完了したとき、データの状態が正しい Isolation 分離性:複数のトランザクションが実行されても、完了してないトランザクションが他のトランザクションに影響しない Durability 永続性:トランザクションが完了したら、その状態は保存される。 ただ、分散システムでACIDを適用しようとすると、複数のサーバーで処理を分担させたときに一台のサーバーがこけてたらトランザクションが全く行えないとか、トランザクションマネージャーがボトルネックになってしまうとか、スケールアウトしにくくなってしまいます。 Brewerという人が、一貫

    クラウド時代のトランザクション(2009-02-09 - きしだのはてな)
  • なんも考えずに"リテラル".equals(s)と書け - 2008-12-04 - きしだのはてな

    "".equals(stringVariable) は改悪だろうについて。 まず、空文字との比較は場合による。というか、空文字との比較なら s != null && s.isEmpty() か s == null || s.isEmpty() などと書くほうがいい。 あと、件の問題は改悪とは言わないまでも、問題文だけをみてこれを改善といえるほどでもないので、あまり良くない。 中身があるリテラルとの比較。 基的な方針として「二通りの書き方があるとして、実行コストや記述コストが同じならより安全で判断の必要がない書き方を選ぶべき」というのがある。というか、これはコードの書き方だけではなく、すべての行動にあてはまる。判断不要で安全な方法があるのなら、それを選ぶべきだ。シャワーをまっすぐにシャワー置きにかけずに横向きにかけるというのは、これにあてはまる。確かにシャワー置きにはシャワーをまっすぐ置き

    なんも考えずに"リテラル".equals(s)と書け - 2008-12-04 - きしだのはてな
  • JavaScriptが、プログラムの初心者が勉強するのに適さない理由 - きしだのはてな

    デブサミでid:amachangが、初心者がプログラムを勉強するための言語としてJavaScriptがいいと言っていて、ぼくも同じような理由でいいと思って初心者の勉強にJavaScriptを使ってみたことがあるのだけど、実際にやってみるとかなり難しいと思ったので、そのことをまとめておきます。 id:amachangが言ってたことははっきり覚えていないので、まずは、ぼくがJavaScriptがいいと思った理由。 実行環境がデフォルト どんなパソコンにも最初からJavaScriptを動かす環境が入ってます 実際に動いてるものがみれる JavaScriptで動かしているものにすでに接しています 作ったものをすぐに試せる ブラウザで試せます 言語が難しくない(入り口として) 型の指定をしなくていいのは、初心者には敷居が低い で、JavaScriptを使って初心者にプログラムを教えるのを断念した理由

    JavaScriptが、プログラムの初心者が勉強するのに適さない理由 - きしだのはてな
    SiroKuro
    SiroKuro 2008/02/20
    後の世において名著と呼ばれる amachang 本である
  • [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]正しい無限ループの書き方 - きしだのはてな
  • 1