1. 例外設計 における大罪 和田 卓人 (a.k.a id:t-wada or @t_wada) Jun 27, 2012 @ java-ja 12年6月28日木曜日 2. 自己紹介 名前: 和田 卓人 (わだ たくと) ブログ: http://d.hatena.ne.jp/t-wada メール: takuto.wada@gmail.com Twitter: http://twitter.com/t_wada タワーズ・クエスト株式会社 取締役社長 12年6月28日木曜日
よく使うJavaのクラスは、たいてい引数なしコンストラクタを持っています。 List<String> list = new ArrayList<String>(); Calendar calendar = new Calendar(); でも、引数なしコンストラクタを持たないクラス*1も結構あります。 InputStream inputStream = new FileInputStream(file); TrayIcon tryaIcon = new TrayIcon(image); 全体的に見てみると、引数なしのコンストラクタを持つクラスと持たないクラス、どちらが多いんでしょうか。 調査結果 以下の条件で、調べてみました。 java, javaxパッケージ public クラス 廃止されたクラス(Deprecated)、抽象(Abstract)クラス、アノテーション、例外(Throwa
開発段階にあるJDK8に「符号なし整数」に関する演算APIが追加されたことが「Unsigned Integer Arithmetic API now in JDK 8」において発表された。追加されたのは符号なし整数の比較演算、符号なし整数の除算、符号なし整数の剰余算、符号なし整数と文字列の双方向変換処理など。主にjava.lang.Integerおよびjava.lang.Longにおけるスタティックメソッドとして実装されている。どのような機能が追加されたかはchangeset 4922:71200c517524を見るとわかりやすい。 Javaの整数(byte, short, int, long)は符号付き整数で、符号なし整数として型宣言する機能は仕様としては提供されていない。今回追加された符号なし整数に関する機能はJava仮想マシンレベルでの拡張ではなく、特別に配慮が必要になる除算に関する
とても便利。 たとえば、あるサイトから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プログラマ」を見つける事ではありません。「最低限のスキルを持った戦力が欲しい」という状況です。したがって、優れた指摘をしてくるのであれば超したことありません。設問について議論が発生するならば、この設問を投げる必要がなかったということです。 Javaを詳しく知っている人からすれば間違いでは?曖昧な質問では?と感じる設問があるのは確かです。しかし、優秀な人をテストしたい訳ではないのです。したがって、正確性とか厳密性については求めません。「だいたいあっている」ならば前提条件である「中堅プログラマの補充」の条件を満たすからです。 中堅プ
JDK 7で追加されるクラス・メソッドを一覧してみようと思いました。標準APIのソースコードはJDKと一緒にインストールされるので(src.zip)、これを展開し、Javadocコメントの@sinceタグに1.7とあるものを抽出すればいいというのが最初の発想です。 JDK 7のソースコードからJavadocコメントの@sinceタグ部分抜粋 新しく導入されたクラスは、クラスのJavadocに記載される@sinceタグに1.7と書かれています。以下は、JDK 7で新規追加されるクラス javax.swing.JLayer の例です。 package javax.swing; :(中略) /** * {@code JLayer} is a universal decorator for Swing components :(中略) * @since 1.7 :(中略) */ public fi
Java言語のチェック例外は本当にGood Partなのか?というエントリーを読んで自分の考え方を簡単にまとめておこうと思う。 まず、チェック例外自体はJavaの『あまり良くない仕様』とみるのが体勢であると思う。自分もどちらかといえば、『なるべく実行時例外で』という派。とはいえ、『クソ仕様なんでチェック例外はまったく使うべきではない』派ではなく、『必要に応じて使い分ける』派。そもそもクソ仕様とdisるくらいならクソ言語なんか使わない方が幸せ。 まずチェック例外自体に関する問題を改めて整理する。 いちいち定義するのがクソ面倒 常にtry-catchかthrows句を強制するのでクソウザい 横断的に処理しにくい 大規模プロジェクトになればなるほど、例外に関するスキルがないクソ人ばかり これらについては散々議論されているだろうし、愚痴になるだけだと思うので割愛。 で、自分はどうして『必要に応じて
元ネタはこちらですが、「優れたJavaプログラマ」を見分ける質問ではありません*1。次のような状況を想定してください。 受託業務を中心にしている弊社は、Javaで業務系ウェブアプリケーションの開発を行う事になりました。しかし社内のリソースを使うにも1−2名足らない事が見積もりから解っています。そこで、中堅エンジニアを1−2名募集することになりました。正社員か派遣かは問いませんが、経験が3年程度の中堅プログラマが必要です。同等またはそれ以上のスキルを持つ正社員がプロジェクトを牽引しますが、ゼロから教えながら教育することはできないので、必要最低限のスキルを持っていることが条件になります。 こんな状況を想定して、面接の質問を考えてみました。経験が3年程度あれば、問題なく答えられるはずです*2。尚、質問はホーム言語がJavaである前提です。 下記質問にそれぞれ50文字以内を目安に簡単に説明すること
と言っても1メソッド呼び出してるだけですけど。 ソースは最後においていますが、整数のリストの合計を取得してます。 次のようなCallableインタフェースを実装したクラスを用意して SummaryTask implements Callable<Integer> そのクラスのリストを用意して List<SummaryTask> summaryTasks = new ArrayList<>(); 一気に実行開始 List<Future<Integer>> results = new ForkJoinPool().invokeAll(summaryTasks); 最後に結果を集計という感じです。 for(Future<Integer> future : results){ result += future.get(); } 実行結果としては、ぼくのマシンはデュアルコアなので、だいたい2倍の速度
_ Javaには良い点があるのか? Javaは本当に良く使われているプログラミング言語だから、プログラミングを知らない人でもプログラムを記述できる。プログラミングを知っているというのは、この場合、ケースバイケースで記述することができるってことだ(というか、正直なところおれが知っているプログラミングはそのあたりまでで、ケースはわかってもプログラミングがわからなくて、まずいプログラミングをすることもたくさんある)。 そのため、プログラムとは言えないソースコードをたくさん目にする機会があってうんざりした。 どのくらいうんざりしたかと言うとコーディングの掟というケーススタディ本を上梓できたくらいだ。 コーディングの掟(最強作法) 現場でよく見る不可解なJavaコードを一掃せよ! (開発の現場セレクション)(arton) というわけでうんざりしているのはJavaで書かれた妙なコードであって、Java
はじめに ソースコードは設計であり、コードの記述は品質に直結するのは言うまでもない。ちなみに、プログラマにとって特に重要なのは保守性だ。コードは書いた直後から保守対象となるからだ。コードは要求文書の範囲で動けばいいと思っている人がいれば今すぐ、ソースコードをコピペして100klに増えるプラグインがいつの間にかインストールされる呪いをかけてあげよう。幸い、ここを読んでいる人にはそんな人はいないだろうと思うけれども。 ということで、コードの品質を下げる要因、すなわちシステム全体の品質を下げる要因となり、かつ使われやすいアンチパターンを挙げ、対策を検討していくことにする。対象は以下: 出力パラメータ 処理状態返却 意味のある配列 無意味な初期化 多すぎるtry-catch 暗黙の順序 コンパイラ警告の無視 過剰なコメント e.printStackTrace() 出力パラメータ メソッドの引数にオ
テスタ棒で基板の上を調査している場合、テスタ棒を当てるのにかなり神経を使っている。なぜならICなどピッチが狭い時、一歩間違えれば隣のピンとショートしてしまうかもれないし、きっちり当てないと接触不良で正しい値が得られないからだ。しかしテスタ棒を当てた後、測定値を読み取るには、どうしても視線をテスタに向けなければならない、この時にツルっとテスタ棒の位置を狂わせてしまう事故が起きがちだ。 そこで測定値をPCで読み上げるようにしてみた。うちにあるのはだいぶ昔に買ったM-6000Mというテスターで、RS-232Cで測定値を読み取ることができる。そしてVOICEBOXという便利な読み上げソフトウェアがあるので、これらを組み合わせれば出来そう。このテスタを買った当時は、どうやらRubyでも同じようなアプリを作成していたようだ(もう12年も前なのか)。今回はRustでゼロから書き直した。RS-232Cから
「プログラミング言語Rust公式ガイド」を大分前に送って戴いていたのを、ようやく読んだ。 Rustは、個人的にかなり気に入った言語で、早く組込み開発で普通に使えるようにならないかなと思っている。Rustの公式のガイドがとても良く出来ており、おそらく多くの人がここをとっかかりに始めているのではないかと思う。本書は、このガイドを読んだ人、読んでいない人のどちらにも勧められる良書だ。ただ中盤以降の翻訳は一部こなれていない箇所もあり、意味が良く分からない時のために原書もあると良いと思う。 2章 Shadowing。Rustでは同じ名前の変数を複数回宣言できて、それにより前の変数はShadowされる(見えなくなる)。他の言語では、ほとんどが二重宣言のエラーになるところだ。便利かもしれないが個人的にはRustの言語仕様の中で、ほぼ唯一疑問を感じるところ。まぁ関数のサイズが小さければ問題ないのかもしれな
いよいよおまちかね!GF決勝大会レディーゴ(ry GFは世界の覇権をかけたガベージコレクト・ファイトの略だろJK …少しGガンダムに毒されてしまったようだ… ガベージコレクションの性能を検証したのをあげたのはJ2SE 5.0が出た直後あたりが最後だったっけ。もう5年近く前か。 http://shin.cside.com/diary/2004/10.htm#1 JavaSE 6 update14にてG1ガベージコレクタが入ったようなのでこれを試してみる。 ベンチに使うのはいつもどおりの自作STG。 GCのログも全部掲載してるので長文です。 インクリメンタルガベージコレクタ まず一番最適化してるインクリメンタルGCでの設定。なおインクリメンタルGCは5.0のときに実装がまるごとコンカレントGCにさしかえられているのでコンカレントGCを使っているという認識でOK。単に長いオプション名を暗記してい
2008年4月7日に発表されたGoogle App Engineが、ちょうど1年後の2009年4月7日にJavaに対応したことが発表されました。さらに、Java開発には必須のEclipse用のプラグイン「Google Plugin for Eclipse」が同時に発表され、Java利用者は簡単にGoogle App Engine用のプログラム開発とEclipse上からのデプロイができるようになっています。今回はそんな便利な「Google Plugin for Eclipse」の使い方を説明します。 はじめに 2008年4月7日、Googleのインフラでウェブサービスを展開できるという「Google App Engine」が発表され世界中が驚かされました。この時点では利用できる言語としてPythonのみがサポートされており、Pythonの開発者がGoogleの社員であることを考えると当然なの
ゴールデンウィークに特に予定のなかった筆者は,「ちまたで噂のGoogle App Engine for Java(GAE/J)とFlexでスケジュール共有ツールでも作ってみよう」と思い立ちました。およそ5日間かけて開発を進めたのち,2009年5月6日に「ご都合.com(画面1)」を公開しました。その後,はてなブックマークやニュースサイトなどでご紹介いただいたおかげで,公開後6日で約2000人の方にご利用いただいています。 そこで本稿では,この「ご都合.com」の開発で実際に筆者が得た経験を通じて,GAE/JによるWebアプリケーション開発の実際とそのポテンシャルについて紹介します。 米Googleが2008年4月に発表したGoogle App Engine(画面2)は,「自分が開発したWebアプリケーションをGoogleのデータセンターで運用できるクラウドコンピューティング・サービス」です
基本的には、ここの内容をそのままGitHubに登録してpagesの設定をすれば良い。例えば「Reveal.js、Markdown、Githubでスライドを作成する。」が良くまとまっている。だが1つ謎の事象が起きて悩んだ。 index.htmlの中に、直接markdownを書く時には良いのだが、以下のようにdata-markdown属性でmdファイルを指定すると、不可思議な動作をする。 <section data-markdown="./md/firstpage.md" data-separator="\n---\n$" data-vertical="\n--\n"> <script type="text/template"> </script> </section> 最初にcommit/pushした時は表示されるものの、変更してcommit/pushしても変更が反映されなかったり、そもそも
軽さと薄さに仰天、モバイルディスプレー「VAIO Vision+ 14」で2画面を試す 2024.08.08
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く