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

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

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を拡張する方法でも対応できることがわ…