読者です 読者をやめる 読者になる 読者になる

エンタープライズギークス (Enterprise Geeks)

企業システムの企画・開発に携わる技術者集団のブログです。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。

JavaEE7をはじめよう(6) - JPAクエリ(その3) Criteria API

前々回と前回の記事で、JPAが提供する3つのクエリの定義方法のうち、JPQLとNaitiveQueryについて解説した。 今回は、最後の1つであるCriteria APIについて解説する。 Criteria API Criteria API は、API呼び出しによってクエリオブジェクトを構築する方法で…

JavaScriptでLispインタープリターを作ろう(6) ~反復の導入~

前回の記事では変数を導入した。これで、反復処理を記述するための土台がひとまず整ったことになる。それでは早速、反復処理であるwhileを導入してみよう。 反復処理を行うwhile 反復処理は、インタープリターのevaluate関数に以下の記述を追加する事で導入…

JavaEE7をはじめよう(5) - JPAクエリ(その2) Native Query

前回の記事ではJPAのクエリの定義方法のうち、JPQLについて解説した。 今回はNative Queryについて解説する。 Native Queryとは Native Queryは直接SQLを実行する機能であり、JPQLではサポートされてないSQLやデータベース製品固有の方言などを実行すること…

JavaScriptでLispインタープリターを作ろう(5) ~変数の導入~

前回の記事では、Lispインタープリターに順次処理「do」を導入した。ここまでの説明で、「順次・反復・分岐」のうち、「順次」と「分岐」は既に導入できたので、残すは「反復」のみとなる。 しかし、反復を説明する前に説明しておくべき事がある。それは「変…

JavaEE7をはじめよう(4) - JPAクエリ(その1) JPQL

今回から3回に分けて、JPAでエンティティを検索する手段であるクエリを解説する。 JPA では javax.persistence.Query というオブジェクトで、問い合わせの内容を表す。 このQueryを作成する方法は以下の3種類がある。 JPQL (Java Persistence Query Language…

JAX-RSを利用して大量データを効率的に配信する方法

今回の記事では、JAX-RSを利用して大量データを効率的に配信する方法を紹介する。 JAX-RSはRESTアーキテクチャーに基づくWEBサービスの機能を提供するAPIであり、参照実装の1つとしてOracle社が提供するJerseyがある。 このJerseyを利用して、データベース等…

JavaScriptでLispインタープリターを作ろう(4) ~順次処理「do」の導入~

この連載の第3回では、条件分岐ifを導入した。これは、プログラムにおける基本3要素「順次・反復・分岐」のうち、「分岐」をサポートしたことと言える。しかし、「順次」や「反復」に関してはまだサポートしていないため、今回は「順次」を四則演算インター…

JavaEE7をはじめよう(3) - JPAの永続性コンテキスト概要

前回の記事では、JUnit上で動作するJPAのサンプルコードを紹介した。 今回は、前回のサンプルをベースにして、JPAを使う上で重要な機能である永続性コンテキストについて解説する。 永続性コンテキスト JPAは永続性コンテキストというある種のバッファのよう…

JavaScriptでLispインタープリターを作ろう(3) ~条件分岐「if」を導入~

前回の記事では、JavaScriptで記述した小さな四則演算インタープリターの実装を解説した。 この四則演算インタープリターは、電卓としてはうまく機能することが前回の解説で理解できたかと思う。しかし、このインタープリターには、プログラムを記述する際に…

JavaEE7をはじめよう(2) - JPAの基本

JPA(Java Persistence API)は、データベースなどの永続化記憶とJavaのオブジェクトとのマッピングを定義して、SQLをあまり書くことなくデータベースとの同期を取ることができる仕組みである。 JPAはO-Rマッピングだけでなく、永続化コンテキストによる同期…

Lispインタープリター勉強会を開催しました

2014年12月3日に、広島にてLispインタープリター勉強会(http://great-h.doorkeeper.jp/events/16621)を開催しました。 勉強会の開催にあたり、会場の設営や機材の調達など、「すごい広島(http://great-h.doorkeeper.jp/)」の方々には大変お世話になりました…

JavaEE7をはじめよう(1)

これから企業向けのWebシステムを作るとすれば、どのようなフレームワークを採用すればよいのだろうか。 10年ほど前であれば、Struts1 をベースにして、Spring のような他の OSS と組み合わせるのが一般的な選択肢だった。この記事を読んでいる人の中にも、…

メモリを逼迫させずにJPAで大量データを取得する方法

JPA(Java Persistence API)は、データベースから取得したデータをメモリ上に保持する仕様になっている。 そのため、不用意に大量のデータを取得すると、メモリ容量を圧迫してしまい、最悪の場合はOutOfMemoryErrorが起きる可能性がある。 本稿では、JPAの…

FizzBuzz珍コード集(後編)

先月アップした珍妙なFizzBuzzコードの続編である。 問題文は次の通り。 1から指定した整数まで数を出力する。 ただし、3で割り切れるときは"Fizz"を、5で割り切れるときは"Buzz"を、3でも5でも割り切れるときは"FizzBuzz"を出力する。 繰り返し命令(for文,…

Java8勉強会を開催しました

先日告知したとおり、10月25日にJava8勉強会を開催しました。 休日にもかかわらず多くの方に参加いただき、ありがとうございました。 当日使用した資料は誤字などを修正したうえで公開しました。 Java8勉強会 from Kentaro Maeda また、演習問題もgithubで公…

JavaScriptでLispインタープリターを作ろう(2) ~四則演算インタープリター編~

前回の記事では、JavaScriptで記述した小さな四則演算インタープリターの実装を紹介した。今回は、この四則演算インタープリターがどのように作られているかを解説する。 四則演算インタープリターの動かし方 まずはこの四則演算インタープリターの動かし方…

Java8超入門 - for文の代わりにStreamを使おう(1)

今年の3月にリリースされたJava8では、関数型インターフェース、ラムダ式、Stream、Optionalなど、関数型言語の仕組みが導入された。 このブログでも、これまでJava8の新機能の解説記事をたくさん書いてきたが、具体的にどんな場面で使えばいいのだろう、と…

FizzBuzz珍コード集(前編)

柔らかめのプログラミングネタを一つ。 社内のあるチームで、ちょっとしたプログラミングコンテストのような活動をしているが、その中のお題の1つがなかなか面白かった。 お題はおなじみのFizzBuzzである。 1から指定した整数まで数を出力する。 ただし、3で…

Java8勉強会を開催します

勉強会ネタが続きますが、10月25日(土)の13時から17時まで、弊社オフィス(東京都中央区晴海)でJava8の勉強会を行います(参加費は無料)。 トップアーキテクトが伝授する!最新IT技術勉強会 「これだけは押さえておきたいJava8の新機能」 以下はセミナーの…

レガシーコード改善勉強会の資料まとめ

以前告知した通り、昨日ヤフーさんと共催で「レガシーコード改善勉強会」を実施した。 共催とは言っても、会場および告知サイトの提供、当日の運営など、ほとんどをヤフーさんにやっていただいた。 こういうイベントを開催するヤフーさんの心意気に改めて感…

Stream APIの拡張(2) - 委譲方式による拡張

前回の記事では、Stream APIを拡張する方法として、特殊な性質を持つStreamを生成する方法を紹介した。 今回は、委譲を使ってStreamを拡張する方法を紹介する。 委譲によるStream APIの拡張 委譲を使ってStreamを拡張する場合、元のStreamを内部に保持するSt…

Stream APIの拡張(1) - 生成処理の拡張

Stream APIには、他の言語の同様の機能(すなわちHaskellのリスト([])やScalaのコレクション、C#のLINQなど)と比較すると、存在しない機能がいくつかあり、その中には有用なものがある。 以前の記事で紹介したzipもその中の一つだ。 今回は、HaskellやSca…

Template Methodパターンの実装あれこれ

Template Methodは、GoF (Gang of Four) のデザインパターンの1つで、処理の共通部分をスーパークラスに抽出し、固有の処理をサブクラスで実装することで、最適なアプリケーション構造にするパターンである。 今回は、Java7およびJava8におけるTemplate Meth…

レガシーコード改善勉強会

ヤフーさんと共催で、9/27(土)の午後に技術勉強会を実施することになりました(場所は六本木)。 テーマは「レガシーコード改善」で、以下のように盛りだくさんなプログラムになってます。 ■プログラム 「レガシーコード改善のススメ」(稲葉信之 - ウルシス…

JavaScriptでLispインタープリターを作ろう(1)

プログラマーなら一度はLispを作る 「プログラマーなら一度はLispを作る」という言葉は有名だ。実際、世の中にはLispの実装が山のように存在し、Lispの処理系を作成する記事を見かける事も少なくない。 しかし、今までその言葉は知っていたものの、自分でLis…

Java8の基本 - 遅延処理

本稿では、Java8における遅延評価のサポートについて紹介する。 遅延評価とは、ある値に対する計算処理を、実際にその値が必要になった時点で行うことであり、関数型言語が一般的にサポートする仕組みである。 Java8では、Stream APIにおいて遅延評価を局所…

Java8の基本 - Optional型

前回まではStreamクラスを解説してきたが、今回はJava8が提供するもう1つの関数型プログラミングの機能であるOptionalクラスを紹介する。 Optional型 Optionalは存在するかもしれないT型の値を1つ保持するクラスである。 (OptinalInt, OptionalDoubleなど、…

プログラミング言語 Julia

エンタープライズ領域のシステム開発で使われるプログラミング言語はあまり多くないが、世の中には実に多種多様なプログラミング言語が存在する。 実際に業務で利用するかどうかはともかくとして、プログラミング言語が生まれた経緯や特徴を知ることで、視野…

GWTの拡張(3) - 同期処理

GWT

GWTを利用するにあたっては、同期処理が大きな課題になるが、参考情報が少ないので紹介しておく。 同期処理の課題は以下の2つにまとめることができる。 1. 二重登録の防止 ボタンを連続クリックしたり、処理をエンターキーにバインドした状態でエンターキー…

Java8 Stream APIの基本(8) - 終端操作3(close)

Stream APIの最終回として、使用頻度は少ないと思われるが、Stream#closeについて述べる。 Stream#close StreamはAutoCloseableを実装しているため、closeメソッドも存在する。 (正確には Stream のスーパーインターフェースのBaseStreamで実装されている)…

Java8 Stream APIの基本(7) - 終端操作2(Stream#collect)

今回はStream#collectの内部構造の概要を紹介する。 以前の記事では、Streamで加工したデータをList等のデータ構造に変換する際にcollect(Collectors.toList())のようなコードを書いた。 しかしStream#collectはStream APIの汎用的な終端操作であるため、Lis…

ServletFilterによるStruts1脆弱性対策コード

以前の記事で「ServletFilterではマルチパートリクエストに対応できない」と書いたが、Strutsの内部で処理しているマルチパートリクエストのパース処理を実装すれば、ServletFilterだけでも脆弱性問題への対処が可能である。 この方法は、ServletFilterのコ…

Java8 Stream APIの基本(6) - 終端操作の概要

今回から、3回に分けてJava8 Stream API の終端操作について解説する。 終端操作は Stream の中の要素を実際に処理をする工程であり、fliter 等の中間操作は終端操作をトリガーにして初めて実行される。 中間操作を適用した要素に対して、終端操作で処理し、…

GWTの拡張(2) - ローディングパネル

GWT

GWT(Google Web Toolkit)はサーバ間通信を非同期で行う。 このため、入力したコード値に対応する名称をサーバから非同期で取得して画面に表示する際に、リクエスト処理中であることを表示するためにはアプリケーション側で制御する必要がある。 特に、こう…

Java8 Stream APIの基本(5) - zip の実装

先日のStream APIの基本(4)では Spliteratorについて解説したが、2つのリストを扱う方法やインデックスアクセスの方法については記述しなかった。 またStream APIの基本(2)では、 並列処理では2つの要素から順番に要素を取得するには工夫が必要であると述べ…

Java8 Stream APIの基本(4) - ストリームの内部

先日の記事ではStreamの基本的な生成処理について述べた。 今回はStreamの内部処理で扱われるSpliteratorについて解説する。 Spliterator Spliteratorは分割可能なイテレータであり、Streamの低レベルAPI用のインターフェースである(名前の由来はsplitとite…

Struts1の脆弱性対策(続き)

Apache Struts1の脆弱性問題(S2-020)の対策として、先日の記事でbeanutilsのPropertyUtilsクラスを修正する方法を紹介した。 RequestProcessorを拡張する方法 その後検討した結果、Struts1が提供するRequestProcessorを拡張する方法でも対応できることがわ…

Struts1.1が使っているcommons-beanutils.jarのソースコードを取得する際に遭遇した混乱

Struts1の脆弱性問題(S2-020)に対処するために、commons-beanutils.jarを修正する方法を我々が採用したことは、先日の記事 で述べた通りだ。 この作業を行う中で、jakarta-struts-1.1が使っているcommons-beanutils.jarのソースコードを取得する際に混乱が…

Java8 Stream APIの基本(3) - ストリーム生成

ストリームの生成方法についてまとめる。 ストリームを作成するAPIはコレクションなどの既存のクラスのいくつかに追加されており、Streamのstaticメソッドにもストリームを生成する手段が提供されている。 また、Streamの要素走査の中心的な役割である Split…

Struts1の脆弱性問題の対処方法

Apache Struts 1の脆弱性問題の対処方法を紹介する。 この問題は、4月24日に株式会社ラックによって以下のように報告された。 http://www.lac.co.jp/security/alert/2014/04/24_alert_01.html ServletFilterによる対処では、multipart/form-dataに対応できな…

Functionインタフェースに定義されている関数の合成を試してみた

Java8のFunctionインターフェースに提供されている関数の合成を試してみた。提供されている関数はcomposeとandThenの2つである。 関数の合成の処理はとても簡単だ。Java8のFunctionインターフェースの実装を見ると、処理はたった2行で実装されている。nullチ…

GWTの拡張(1) - ウェイティングパネル

GWT

GWT(Google Web Toolkit)でWaitingPanel(ウエイティングパネル)を作成する方法を紹介する。 GWTは、サーバ通信にGWT-RPC(GWTリモート・プロシージャ・コール)を使用している。GWT-RPCではAjaxを利用して非同期通信を行うため、リクエストをサーバへ送信…

Java8 Stream APIの基本(2) - 中間操作の種類と並列処理、副作用

Java 8 Stream API の中間操作の種類・並列処理・それらの注意点についてまとめておく。 プリミティブ型のStream 中間操作のメソッドを見ると、mapの他に、mapToInt,mapToLong, mapToDoubleのような、プリミティブ型への変換を行うメソッドがある。 また、 S…

Java8 Stream APIを使ったピタゴラス数生成処理

先日の記事では、Stream APIの基本的な仕組みを書いた。今回はサンプルコードとして、ピタゴラス数を生成する処理をStreamで書いてみる。 ピタゴラス数とは、三平方の定理でおなじみの a * a + b * b = c * c を満たす自然数の組のことだ。 最初のピタゴラス…

ラムダ式のオブジェクトは再利用される場合がある

Java8で導入されたlambda。このlambdaのオブジェクトがどの単位でインスタンス化されるかが気になったので試してみた。 というのも、lambdaのオブジェクト生成はJavaVM側の制御に任されているため、どのような単位でオブジェクトが生成されるのか純粋に興味…

Java8 Stream APIの基本(1) - 代表的な中間操作

Java8で新たに提供されたStream APIの基本をまとめておく。 (今回は並列処理機能については割愛する。) 概要 Stream API はJava8から追加されたAPIであり、高機能な繰り返し処理を記述できる。同じくJava8から追加されたラムダ式の使用を前提としている。 …

Java8関連のリンク

Java8関連のリンクを整理してみる。[まとまった情報がある公式サイト]http://docs.oracle.com/javase/8/[What's New in JDK 8]http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html[Java8チュートリアル]http://docs.oracle.com/javase/…