サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPhone 16
jappy.hatenablog.com
Spring Security + Spring Sessionを使っている場合、通常、セッションの中身はシリアライズされてセッションストアに保存されます(実際に確認したのはRedisのみ)。 シリアライズされる org.springframework.security.core.context.SecurityContextImpl には serialVersionUID が定義されているのですが、その値は SpringSecurityCoreVersion の中にあります。 https://github.com/spring-projects/spring-security/blob/4.1.x/core/src/main/java/org/springframework/security/core/SpringSecurityCoreVersion.java#L35-L41 コードの
ES6で書いていたJavaScriptのコードがIE(※)で動かなかったので、その時に対応した内容のメモです。 ※ IEのバージョンは9以上を想定してます。IE8、あるいはそれ以前となるとさらに面倒さが増すので。 各ブラウザの対応状況を知る 各ブラウザの対応状況を調べるには、以下のサイトが便利でした。 ECMAScript 6 compatibility table 「Show obsolete platforms」にチェックを入れると、サポート切れの古いブラウザについても状況を確認することができます。 なお、IE9以下は、ECMAScriptとして「6」ではなく「5」を選んでおかないと表示されません。ES6はIE10でも絶望的なのに、それより古いバージョンが対応してるわけないですもんね。。 Chromeが良くも悪くも手厚くサポートしているので、普段の動作確認をChromeでのみ行うのはリ
今更感はありますが…。 Spring Boot(というよりSpring)でインジェクションされるコンポーネントのデフォルトのスコープはSingletonになります。 そのため、Singletonスコープのコンポーネントに対して、Singletonより短いスコープであるPrototypeコンポーネントをインジェクションしようと思った場合、@Scope("prototype") をつけてコンポーネントを定義してインジェクションさせるだけではうまくいきません。 prototypeスコープを使うには、いくつか方法があります。今回は4つの方法を試してみました。 なお、以下の本エントリでは、動作の説明のため、カウンタコンポーネントを利用します。 方法1: proxyMode = ScopedProxyMode.TARGET_CLASS を指定する カウンタの定義。proxyMode を指定しているとこ
MyBatisのSQLは2Way SQLではない上、動的SQLやスニペットなどによって可読性が損なわれがちということもあり、構文エラーは早めに検知する仕組みを用意した方がよいという印象です。 そこで、Mapperを全スキャンして、SpockでData Driven Testingを行う方法がよいんじゃなかろうか?と考えました。 Spockを使うと、各SQLを一つのテストパターンとして実行できるので、SQLにバグがあった場合にそのMapper・メソッドが特定しやすくなるんじゃないかという狙いです。 というわけで、Springを使っていることを前提として、以下のような根拠の下で、実装してみました。 通常Mapperインタフェースは特定のパッケージ以下にそろっているはずで、Springであれば ClassPathScanningCandidateComponentProvider を使うと、パッ
最近身の回りでSwaggerを聞くことが多くなってきたと感じます。 上記記事でも言及されていますが、AWS API Gateway Importerでも、APIをAPI GatewayにインポートするためのAPIの入力仕様としてSwaggerが使われています。 私もちょっと前から、AWS API Gatewayを使ってます。API GatewayでAPIを作成するにあたり、GUIからポチポチAPIを作っていくのが辛いというのは多くの人の共通認識だと思うので、AWS謹製のインポータを使うのが今のところは最善の選択だと実感しています。 というわけで、Swaggerについての簡単なまとめ資料みたいなものを作りました。 Swaggerで調べると、Swagger codegenやSwagger UIをメインにした記事は多いのですが、Swagger Specificationの書き方そのものについて紹
ここ最近はIonicを使ったハイブリッドアプリを開発してました(個人でなく、会社でのプロジェクトです)。 さて、こちらの記事の通り、Cordova Androidに脆弱性が見つかり、修正版がリリースされました。 IonicではCordovaのAPIを利用してネイティブの機能を使うので、今のプロジェクトでも「脆弱性の影響ないかな?」「そもそも、今のCordovaのバージョンなんだっけ?」と思ったのですが、調べていく過程で色々と混乱してしまっていたので、整理がてらまとめておきます。 Cordova iOS, Cordova Androidのバージョンを調べる 最初に結論なんですが、Ionic(Cordova)プロジェクト内のCordovaのバージョンを調べたい場合、プロジェクトの直下で # cordova platform list とすればよいです(Ionicの場合はionic platfo
最近関わったプロジェクトでは、GitHub FlowとPull Requestベースの開発を行いました。 個人的には、まともにこのスタイルで開発するのは初めてだったということもあり、YWT(やったこと、わかったこと、次にやること)形式でふりかえった結果を紹介していきます*1。 モダンな開発現場では当たり前に行われていることなので、「今更?」と思うかもしれませんが、「本やWebを真似しても、小難しいコマンドがたくさん出てくるばかりで、本当に開発効率が上がってるのか分からない゚・(ノД`)・゚・。」みたいな人もいるのではと思います(私がそうでした)。 ちなみに、プロジェクト開始前の自分のGit/GitHubスキルは以下のとおりでした。 GitHubは使っていたが、一人でmasterブランチに対して「add->commit->push」を行うだけ 書籍「GitHub実践入門」を通読した というわ
先日のJenkinsユーザ・カンファレンスの講演を受けて、Jenkins Workflow Pluginがすごく便利そうだったので、早速試してみました。 想定するプロジェクト構成 基本的にはGradleの階層型マルチプロジェクト構成で、その他にドキュメントのビルド(Sphinx)とCoffeeScript, Sassのコンパイル用のプロジェクトがあります。 ファイル構成を簡略化するとこんな感じです。 root/ build.gradle settings.gradle common/ build.gradle sub1/ build.gradle sub2/ build.gradle doc/ Makefile ui/ Gruntfile.coffee package.json 各プロジェクトの概要は、 root rootプロジェクト common sub1, sub2の共通クラス sub
はじめに この記事は、「Java EE Advent Calendar 2014」の5日目の記事となります。 昨日は、@kazuhira_rさんの「JCacheの実装とキャッシュ管理のご紹介」でした。 明日は、@susumuisさんの「ねこ踏んじゃった系エントリ:Tomcatいじめたら意外と強かったこと」です。 このエントリは、9月にこのブログで前置きしておいた、既存のアプリケーション(Java SE 6、Java EE 5、JBoss AS 5.1.0.GA)のバージョンアップについてまとめたものです。 このプロジェクト、正直なところ、11月に終わっている予定だったのですが、諸々の事情により、まだ完了しておりません…。本来であればこのAdvent Calendarもドヤ顔で報告する算段だったのですが。 というわけで、中間ふりかえりという形で、ハマった点や新しいJavaを使ってみた所感など
ここ最近、タイトルの通りのことをやろうとしていて、そのための雑記(記録)を書いていこうと思います。 目的 自動化できるところは可能な限り自動化し、テストできる(すべき)ところは可能な限りテストする、といった当たり前のことを当たり前にやって、開発業務を効率化する、というのが目的。 以下のようなアプリケーションをターゲットにします。ビルド職人、デプロイ職人への依存度を小さくし、なるべくシンプルで統一的なフローにしたいと思います。 Java EE Ruby on Rails Node.js ツールの検討 ツールは目的ではなく手段なので何でもよいのですが、Jenkins, Capistrano3, Chef, serverspec, Dockerといったツールを選ぶにあたっての評価ポイントは以下。 使い慣れているかどうか 情報量が多いか、公式のドキュメントが整理されているか オープンソースであるこ
デブサミやJava Day Tokyoなど、会社の許可をもらってイベントにありがたく行かせてもらっているけど、ちゃんとレポートできていなかったということで、社内勉強会で話すことにしました。 まとめ資料を作ったので、このブログにて先行して公開してしまいます*1。少し前のエントリで資料をアップロードしたのはこのための準備でした。 資料の位置づけ 古いJavaの知識で止まっている人(自分含め)やこれから本格的にJavaを学ぼうと思っている人に、最近のJava関連の新機能などをざっくりつかんでもらうための資料です。内容の深さ・広さは、聴く人のJavaスキルに合わせた一応合わせたつもりです。 Java SE 8がリリースされて、その界隈では「for文禁止」などと言われる一方で、会社の新人研修で教えるJavaでは、「ループはforやwhileを使って書きます」みたいに教えるわけで、その辺のギャップを埋
調べものをしていたらたまたまDropwizardを見つけたので試してみました。 Dropwizardとは? Dropwizard is a Java framework for developing ops-friendly, high-performance, RESTful web services. 公式サイトにある通り、「運用に優しく、ハイパフォーマンスな、RESTful Webサービスを作るためのJavaフレームワーク」のようです。 依存関係としてdropwizard-coreを一つ追加すると、Jetty, Jersey, Guava, Logback/slf4jなどのよく使うライブラリが含まれます。 単純な実行(アプリケーションの起動)なら、Javaがインストールされている環境なら、ビルドしたjarファイルと設定ファイルがあれば、 java -jar {jar file} se
はじめに このエントリーは、TDD Advent Calendar 2013 - Qiita [キータ]の参加エントリーです。前日のエントリーは、@PoohSunny(swimming_pooh)さんによる「2013年のTDDイベントをまとめてみた」でした。 今回が初のAdvent Calendar参加になります。どうぞよろしくお願いします。 というわけで、技術的な話は控えめにして(コードは1行も出てきません!)、自分の経験をふりかえりながら、これまでの私的TDDの反省とか改善点とかを紹介したいと思います。 一言で言えば、このエントリーでの主張は「テストコードもちゃんとリファクタリングしていかないとダメだよね」というものです(タイトルはちょっと仰々しく付けてしまいました…)。もうちょっと詳しく言うと「読みやすく、保守しやすいテストコードを書くために、アンチパターンを知り、定石を積み上げてい
Redmine設定のピンポイントなネタです。 日常的にRedmineを使っていくと、バージョン管理システム(VCS)との連携なしでは考えられなくなってくるので、エラー「リポジトリに、エントリ/リビジョンが存在しません。」なんてのは運用上、致命的。GitやMercurialが主流(?)な今、役に立つかどうかは不明ですが、ちょっと嵌ったので、メモとして残しておきます。 このエラーに遭遇したら、まずはRedmine.jpの以下の記事を見るかと思います。 http://redmine.jp/faq/repository/error_scm_not_found/ 上記の記事で解決できればよいのですが、設定を見直しても解決できない場合もあります。今回、症状は以下の記事とまったく同じでした。 StepupEngineeringはてな支店: Redmineハマリメモ SVN連携 上の記事や、その参考リンク
以前Twitterでつぶやいたのですが、Gradleのチートシートが欲しかったので、自分で作ってみました。 ソースコード https://github.com/tq-jappy/Gradle-CheatSheet ダウンロード 内容はもっと洗練させていきたいですが、ひとまず以下に公開します。 https://github.com/tq-jappy/Gradle-CheatSheet/raw/master/gradle-cheatsheet.pdf チートの項目は自分のプロジェクトで利用するものに特化しているところはありますが、ブログ、Twitter、あるいはGitHubへのPull Requestなどでフィードバックをいただけると嬉しいです。 きっかけ Gradleのユーザガイドは日本語版もあるし、かつ非常に丁寧に書かれているので、欲しい情報は大体ユーザガイドを参照すれば分かります。ただ、
ちょうどキクタローさんが「Challenge Java EE ! - maven-war-pluginで環境ごとの設定ファイルを管理してみた」を書かれていたので、便乗してGradleでやってみようと思いました。 前置き Gradleで設定情報を外出しして環境ごとに切り分ける方法については、すでにいくつかの方法が紹介されています。 bluepapa32 さん(bluepapa32’s Java Blog - Gradle で環境ごとに構成を変更する) Hayashi さん(Literal Ice - Gradleでプロパティなどの設定情報を外出しして切り替えて使う ) 今回は、Gradleの動的にタスクを定義できるという特徴を生かして、手間や重複が少なく、環境が増えた場合でも管理しやすい方法を検討してみたので、紹介したいと思います。簡単に言うと、環境設定ファイル(hoge.propertie
久しぶりのGradleシリーズです。これまで作ったアプリケーションをHerokuにデプロイしてみます。 昔はRailsアプリケーションに限っていたようですが、現在のHerokuではベータ的にGradleもサポートされています。 Q: Does Heroku support Gradle builds? A: Yes. Gradle support is in private beta currently. Please contact the Heroku team if you want to try our Gradle build support. http://wiki.developerforce.com/page/Webinar:_Heroku_Java_Webinar_FAQ というわけで、試してみました。 Herokuアカウントを作る アカウントをもっていなかったので、ht
Selenium Webdriverを使ったテストで、前回のスローテストと別に起きる大きな問題が、テストコードのメンテナンス性の悪さでした。 SeleniumのJUnit4テストコードを作るために、今までやっていたことは以下のような方法です。 Firefoxの「Selenium IDE」プラグインを使ってケースを自動生成 テストデータ(入力値)のパターンを増やしてテストするため、上記のテストコードをコピペして、別のテストケースを作成 この方法だと、アプリケーションの修正などでテストコードの修正が必要な時に、悲惨なことになります*1。 さておき、今回のネタは http://code.google.com/p/selenium/wiki/PageObjects にもあるように、ページオブジェクトパターンを使って書くといいよという話。 以下のコードを見直してみたいと思います。Googleのページ
以前からSelenium WebDriverを使ってWebアプリケーションのテストを行なっているんですが、ずっとつきまとっていたのがスローテスト問題(テストに時間がかかる!)。 スローテスト問題は、テストの並列化やテスト数の削減などの解決策とともに随所で議論されてきたテーマですが、Selenium WebDriverを使っていて特に私が気になっていたのは、ブラウザ(Firefox)の起動時間でした。ローカルで一度テストが通るのを確認するのに、毎回数秒(7秒くらい)待たされるのは、精神衛生上よくないですよね。これをなんとかするべく、色々悩んできましたが、ようやくいい方法が見つかったので、紹介したいと思います。 なお、ブラウザの起動も含めSeleniumテストの効率化の取り組みについては、サイボウズLiveのSeleniumテスト並列化(Slideshare)がすばらしいまとめになっています。
JerseyとGuiceの連携の例。 Jerseyを使うとJAX-RS準拠のRESTfulなHTTPサービスを作ることができる。 この時リソースクラス(クラス宣言に@Pathをつけたクラス)は、自動でHTTPリソースとして登録されるので、特別インスタンスを取得することはない。ただ、DIコンテナとしてGuiceを使っている場合、リソースクラスはGuiceの管理下におけない。そんな場合にも、ビジネスロジックやStringなどのインスタンスをリソースクラスにDIする時のやり方についてまとめておく。 準備 Jerseyの各種jarファイルと、Guiceのjarファイル(今回はguice-3.0-no_aop.jarとjavax.inject.jarのみ)をビルドパスに通しておく。 DIなしの場合 まずはメインクラス。 package sample; import com.sun.jersey.ap
さくさく開発にかかせないのが、データベースのマイグレーション。 今回は、Flywayを使って、GradleのタスクとしてFlywayのマイグレーションが実行できるようにします。FlywayはJava向けのDBマイグレーションフレームワークの一つで、個人的にはシンプルで扱いやすいかなと思って気に入ってます。機能面での比較は、Flywayのトップページの下の方にあります。強いてマイナス面を挙げるなら、ロールバック(=スキーマのダウングレード)ができない点くらいでしょうか(その辺の見解はFAQで言及されています)。 GradleとFlywayの連動を行うにはいくつか選択肢があります。素直にgradle-flyway-pluginを使ったり、GradleからAntタスクを呼び出す方法なども検討しましたが、最終的に、FlywayのコアAPIを使ってカスタムタスクを独自に作る方法を採用しました。 とい
今回はGradleをJenkinsで使う場合の話です。 Jenkinsを使って前回作成したプロジェクト(gradle-sample-webapp)のビルドを行います。 リポジトリからソースコードを取得 ユニットテストの実施 war作成 Javadoc作成 Jenkinsにプラグインをインストール Jenkinsの動いているところまでは終わっているものとして、Jenkinsに必要なプラグインをインストールしていきます。普段の開発でJenkinsを立てる場合(良い事ではないですが)無計画に必要なものを入れてごった煮にしてしまってるのですが、今回もそこは改善していません…。 赤字で書いているのが今回の実施に必須なもの、それ以外は静的解析のために今後使いそうなもの、普段のプロジェクトでよくインストールしているものになります。GradleとGitのプラグインだけが必須ということになりますね。 Sta
時間とモチベーションに余裕のあるうちに行けるところまで調べていきます。というわけで、今回はwarの作成と、Jettyでの起動確認。 コード 需要はないと思いますがGitHubに公開します(EclipseからGitを利用するのに妙にハマりました…。Gitはあまり使い慣れていないので余計なファイルが混ざってるかも…) https://github.com/tq-jappy/gradle-sample-webapp アプリケーションを作成する 作るwarはとりあえず何でもよいので、基本的なGETでメッセージを返すHelloServletを含むwarにします。 作ったファイルは以下の3つ。 sample.servlet.HelloServlet.java(src/main/java) HttpServletを継承して、Get時にリソース内のファイル"hello.txt"を読み込んで、中身をそのまま
さくさく開発を目指しているのに、トラブルシューティングに時間をとられるのもいかがなものかと思いつつ…。 Build Gradle Model for xxx 昨日作ったgradle-sampleプロジェクトが、今日Eclipseを起動した時にタスクが何も実行できなくなってしまいました…。新規にGradleプロジェクトを作ろうとしてもやっぱりダメ… Address family not supported by protocol family: 接続 Could not fetch model of type 'EclipseProject' using Gradle distribution 'http://services.gradle.org/distributions/gradle-1.2-bin.zip'. 参考にしたサイト。 ここでEclipseのメニューバー[Window]→[
IvyやMavenもまともに使ったことはないですが、Gradleを使いはじめました。 目標と前提条件 Gradleがどこまで面倒見てくれるかは何も考えずに立てた条件がこちらの通りです。 Jettyで動作する実行可能なWAR(java -jar sample-app.war -p 8080みたいな形で)を作成したい。 もちろん、WARなので、そのままデプロイしても使える。 WARの作成、テスト(ユニットテストや性能テストなどカテゴリ別に指定出来れば理想)、デプロイは最低限タスクとして実行できるようにする。 Checkstyle, FindBugs, Coberturaを使った静的解析結果をレポートする。結果はJenkinsから参照できるようにする。 開発はEclipse 3.7。 依存するライブラリには、Mavenリポジトリに存在しない独自jarも含む。 非Java EE。 とりあえずこんな
昨日のつづき。修正箇所はそこまで多くなかったので、自前で修正してjarを作ることにした。 DbUnitが依存するApache POIを最新の3.8にしてNoSuchMethodErrorを回避する方法。 org.dbunit.dataset.excel.XlsTable org.apache.poi.ss.usermodel.DateUtilをimportして、153行目あたりの if (HSSFDateUtil.isCellDateFormatted(cell)) を、 if (DateUtil.isCellDateFormatted(cell)) に直す。 org.dbunit.dataset.excel.XlsDataSetWriter 101行目あたりの cell.setCellValue(new HSSFRichTextString(column.getColumnName())
Javascript製のグラフ描画用ライブラリとして、色々あるうち、Flotを使ってみた。 他にもいくつか選択肢はあったんだけど、 Ajaxで外部データを取り込んでグラフ描画が可能 以前も使ったことのある実績(簡単に使える) jQuery製であること ひと通りのAPIが提供されていて、サンプルやリファレンスなどのドキュメントが充実している MITライセンス といった理由により、他の選択肢と比べて一歩抜き出ているので、Flotにしてみた。 今回はリアルタイム更新の機能を試してみたかったので、サンプル( http://people.iola.dk/olau/flot/examples/realtime.html )に少し手を加えてみた。 改良点は、 X軸を時系列にする。 データは外部JSONデータを取り込む。 グラフを複数本(2本)にする。 初期表示時はデータ数は0個で、更新のたびに1個増えて
今までであればインストールスクリプトも、Windows用のバッチファイル、Linux用のシェルスクリプトとそれぞれ作っていたのだけど、少しやり方を変えて、共通のGroovyスクリプトで実行できるようにしてみる。 メリットとしては、まずスクリプトが1本に収まることによる生産性、保守性の高さ。まがりなりにも一番長く触れてきた言語はJavaなので、親和性の高いGroovyなら、それ単独で見ても、バッチファイルやシェルスクリプトよりも効果的に開発できるし、バッチとシェルの違いに気をつけながらほとんど同じ振る舞いをするスクリプトを2つ作らなくて済む。 ちなみに今回、インストール対象のアプリは全てJava製で、JREも各インストール先に導入済み。そのため、GroovyならJREさえ入っていれば動くので、既存の環境に手を加えずにそのまま導入できる。インストーラを実行するために実行環境を新たに入れる必要は
Tomcat+Struts製Webアプリケーションのテストを自動化したい。 テスト用のプロジェクトをチェックアウトして、適当なターゲットを実行すると、誰でも、再現可能なテストができるようになっていて欲しい。 【希望】 1. JUnit4。 2. 各テストメソッドの中で画面遷移のテストを行う。このボタンやリンクをクリックしたら、XXXに遷移して、YYYが表示される、等。 3. 併せてDBの内容のチェックも行う。 4. テストの中でDBのテーブルにデータの登録・更新・削除があった場合でも、テストが終わるとテスト開始前のものに戻っていること。ただしDBトランザクションのロールバックでは実現しない(アプリの機能としてコミット・ロールバックが発生するため。つまり、コミット発生後にコミット前のデータに戻す必要がある)。 5. テスト用DBの作成・破棄、アプリケーション(サーブレットコンテナ)の起動・停
次のページ
このページを最初にブックマークしてみませんか?
『jappy.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く