GitHub Flowについて調べています

※この記事は丸太式 Advent Calendarの24日目です

GitHub Flowを弊社の開発で取り入れられないか検討するために、少し調べています。
#何も決定権は持っていないけど
とりあえず読んだ/読んでいる/読もうと思っているページを幾つかピックアップしています。
GitHub Flow(というかGit)を使った開発経験が無いエンジニアをうまく説得できる材料がそろえば良いと思っています。

https://gist.github.com/Gab-km/3705015
http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314
https://pepabo.github.io/docs/github/workflow.html
http://komaken.me/blog/2013/09/09/git-flow%E3%81%A8github-flow%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%BE%E3%81%A8%E3%82%81/

GitHub Flowじゃないけど
http://www.slideshare.net/KatokichiSoft/git-flow-16616440

弊社の製品品質について若干問題が生じているので、社内でもっと活発に議論できればと思っています。

# 関係ないですがlink-cardの日本語文字化けがひどいですね。近いうちに何とかします。

[WordPress]リンク先の情報をカード上で表示するlink-cardプラグインの今後

※この記事は丸太式 Advent Calendarの22日目です

昨日の記事で紹介したWordPressのプラグイン「link-card」ですが、現状あまり使いやすい状態では無いと思っているので継続的に開発していきたいと考えています。

現状の問題点

昨日の記事にも書きましたが、今のlink-cardプラグインには幾つか問題があります。
* キャッシュ機構がないので、アクセスのたびリンク先から情報を取得している
* aタグの直前に挿入するので、文の途中にaタグを使うと意図しないレイアウトになるかも
* etc…

今GitHubのIssueに登録してあるバグや機能拡張は今年度中にやると思います。
また、使いやすい形に出来るように自分でも使いながら考えてみようと思っています。

今後について

あまり英語は得意ではないので、しばらくはWordPress公式のプラグインディレクトリには掲載しないと思います。
将来的にプラグインディレクトリに公開することは十分考えられると思いますし、やる気はあります。

これからlink-cardをよろしくお願いします。

リンク先の情報を表示するlink-cardプラグイン[自作WordPressプラグイン]

※この記事は丸太式 Advent Calendarの21日目です

今日はWordPressプラグインを作りましたのでご紹介します。

link-cardプラグイン

基本情報

  • 名前
    link-card
  • 概要
    aタグにcreateCardクラス属性を付加しておくと、aタグの直前にカード状の情報ボックスを表示します。
  • 動作確認バージョン
    WordPress 4.1で動作確認しています。

使い方

プラグインをインストール

今のところ、GitHubでのみ配布しています。
https://github.com/bis5/link-card
「Download Zip」からZipをダウンロードして、wp-content/plugins/link-cardとして配置してください。
※GitHubからダウンロードしたZipファイルを展開すると「link-card-master」というディレクトリになりますが、「-master」は除いてください。

記事を作るとき

リンクを作成するとき、以下のようにclass属性を追加します。

<a class="createCard" href="http://www.yahoo.co.jp">やふー!</a>

すると、記事を表示した際に、リンクのすぐ上にリンク先の情報が表示されます。
こんな感じです。
この時表示されるのは、titleタグの内容とmetaタグのdescriptionの内容です。

既知のバグ

  • リンク先のdescriptionに日本語が含まれると文字化けする
    文字化けする例
  • descriptionを設定していないサイトではタイトルしか表示されない
    代わりにog:descriptionとか使うと多分いい感じ
  • (バグと言うより仕様ですが)WordPressのサーバからリンク先に都度アクセスするので、最悪アクセス遮断されかねない
    キャッシュするべきですね。。。

久しぶりにちゃんと成果が出た週末で、自分としては満足です。
もちろんこれから先も改修を続けるつもりなので、フィードバックやプルリクお待ちしています。

ubuntu server 14.04にwp-cliを使ってコマンドだけでWordPressをインストールする

※この記事は丸太式 Advent Calendarの20日目です

手順

1. Apache, PHP, MySQLをインストール

必要な物をapt-getでインストールします。

sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server php5-mysqlnd

php5libapache2-mod-php5の依存関係でインストールされる気がするけど気にしない。

2. wp-cliをインストール

コマンドラインでWordPressを操作するためにはwp-cliが必須です。

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

動作確認はphar wp-cli.phar --infoで。
毎回phar /path/to/wp-cli/wp-cli.pharと入力するのは面倒なので、実行権限を与えた上でパスが通っているディレクトリにwpという名前でコピーしておくと便利です。

3. データベースを用意

mysqlのデータベースを作っておきましょう。

mysql -u DBUSER -p
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;

必要に応じてWordPress用のMySQLユーザを作って権限を与えておきます。

4. wp-cliでWordPressをインストール

残りは一気に行きましょう。

mkdir -p /path/to/wordpress
cd /path/to/wordpress
wp core download --locale=ja
wp core config --dbname=wordpress --dbuser=USER --dbpass=PASSWD
wp core install --url=http://example.com/wordpress --title=TITLE --admin_user=ADMIN --admin_password=PASSWD --admin_email=admin@example.com

WordPress 4.1 “Dinah”がやってきた

※この記事は丸太式 Advent Calendarの19日目です

WordPress 4.1 “Dinah”がリリースされました。
このバージョンからデフォルトテーマが”Twenty Fifteen”に変更されています。

なんていうか・・・

めっちゃシンプルですね。

WordPressユーザーにとってもう一つ大きな違いは、集中執筆モードの変更です。
これまでは集中執筆モードに切り替えるとエディタ以外のすべてが消え去ってしまい、ぶっちゃけかなり使いづらい物でした。
また、エディタのボタンも画面上部に離れてしまうので、書式設定には向いていません。

4.1の集中執筆モードは、エディタは残しつつ、エディタ以外のメニューなどは非表示となります。

非表示となった部分を使いたい場合は、カーソルを持って行くことで再び表示されます。
また、再度入力を再開すると、エディタ以外はまた非表示になります。

今までと違って状態を切り替えるのにマウスクリックが不要になったので、結構快適です。

Javaで(サーブレットコンテナ|EJBコンテナ|メッセージブローカー)を組み込む話

※この記事は丸太式 Advent Calendarの18日目です

Javaに組み込めるミドルウェアを調べてみました。
それぞれ解説リンクを掲載していますので、参考にご覧ください。

サーブレットコンテナ

EJBコンテナ

メッセージブローカー

Javaだといろんなミドルウェアがあるのが”当たり前”みたいな感じがして、本格的な入門にもハードルが高いのが現状だと思います。
特にJavaEEになると、日本語の書籍がほぼ無いのもあって業務で使わない限りなかなか勉強する機会が無いですね・・・

「ぼくがかんがえたさいきょうのアプリケーションフレームワーク2014.12」※実装は無いよ!

※この記事は丸太式 Advent Calendarの17日目です

前提

バックエンドはJavaで構築することが前提です。今Javaプログラマなので。

構成と妄想

クライアント <- JSON -> Web <- JMS -> AP <- JPA -> DB
  • それぞれのサーバはスケールアウト出来る物とします。
    そのためにはセッションはDBに格納する必要がありますね。
    今の段階ではXOOPS CubeのDBセッションみたいな管理方法をイメージしています。
  • あえて特定のプロダクトに依存しない書き方をしています。
    それぞれの実装は好きな物を組み合わせることが出来ます(EclipseLink or Hibernate, ActiveMQ or RabbitMQ, Tomcat or Jetty, …)。
    まあ、プロダクト間の差異を吸収するのはフレームワークの仕事ですしね。
  • 基本的にはAPIを通じてアプリケーションを利用することになります。
    そのため、クライアントがWebブラウザだろうがSwingアプリだろうがSWTアプリだろうが全く気にしません。
    ただし、Webサーバにプログラムと一緒にビューをデプロイするのはあまり好みではないです。
  • The Twelve-Factor Appの影響を大いに受けています。
    従ってWeb/APそれぞれのサーバに特別なミドルウェアはインストールしない想定です。
    Webは組み込みTomcatかJettyを使えば良いですし、ActiveMQならアプリケーションに埋め込めるのでメッセージブローカーをインストールする必要はありません。RabbitMQはどうなのかな?

まとめ

「なんていうか・・・すごく言葉にしづらいんだけど・・・・・・あんまりまとまっていませんね!
タイトルに「2014.12」って付けてしまったので、またそのうちやるかも。

HibernateのCriteiraをメソッドチェーンで書いたらなぜかテンションが上がった件

※この記事は丸太式 Advent Calendarの15日目です

業務でHibernateを使っていますが、これまでは弊社内の大半の実装に合わせてこんな感じでCriteriaを書いていました。

Criteria criteria = session.createCriteria(Hogehoge.class);
criteria.add(Restrictions.eq("userCode", userCode));
criteria.add(Restrictions.in("fugaCode", fugaCodes);
criteria.add(Restrictions.ge("targetYearMonth", targetDate);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("days").as("days"));
projectionList.add(Projections.sum("hours").as("hours"));
criteria.setProjection(projectionList);
criteria.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);

今日は実装中に仕様追加が発生したので、ストレス解消を兼ねてスピード重視で実装したら、いつの間にかメソッドチェーンで書いていました。

Criteria criteria = session.createCriteria(Fugafuga.class)
    .add(Restrictions.eq("userCode", userCode))
    .add(Restrictions.in("fugaCode",  fugaCodes))
    .add(Restrictions.ge("targetYearMonth", targetDate))
    .setProjections(Projections.projectionList()
        .add(Projections.sum("days").as("days"))
        .add(Projections.sum("hours").as("hours")))
    .setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);

流れるように実装できたので、自分にはメソッドチェーンの方が向いているようです。
弊社のコーディング規約に特に記載が無ければ、今後ともメソッドチェーンで書きたいですね。


Criteriaをメソッドチェーンで書くと、次のような利点があるように思います。
* (作るべきSQLが見えているなら)流れるように書き表すことが出来る
* わざわざcriteria(変数名)や;(セミコロン)を書かなくて良い
* ProjectionListを変数に格納しなくても良い
* Eclipse等のIDEで整形すれば、適度にインデントが設定されて見やすい

「俺ならこういう理由でこうしたい!」という話があれば、是非お聞かせください。

[Sonatype NEXUS][メモ] 自前のMavenリポジトリを使って依存関係を管理できるようにする

※この投稿は、丸太式 Advent Calendar 2014の11日目です

概要

世の中に公開されているOSSのJavaライブラリは、大抵MavenやGradle等の構成管理ツールで管理できます。
しかし、自分で作ったライブラリや会社の都合で公開できないライブラリを使う場合、自分でJarファイルを追加したり、依存関係を管理しなければなりません。
Javaは1個のライブラリが大量の依存ライブラリを必要とすることもよくあるので、これは非常に面倒です。

そこで今回は、OSSのMavenリポジトリ実装である”Sonatype NEXUS OSS”にライブラリを登録する手順の1例を(かなりざっくりと)紹介します。

手順

  1. 追加したいライブラリのJarを(ダウンロード、自前ビルドなどの方法で)用意する
  2. それっぽいpom.xmlを作る
  3. Sonatype NEXUSのUIからデプロイ

※ソースが用意できる場合、pom.xmlを作ればビルド・デプロイをmvnコマンドでやれます。

Jarを用意する

バイナリのJarを調達します。ソースやJavadocのJarを追加で調達すればEclipseやNetbeansなどのIDEで便利になりますが、今回はとりあえずバイナリだけ登録します

pom.xmlを作る

追加したいライブラリのためのpom.xmlを作ります。
依存しているJarがMaven Central等でホスティングされていれば、その依存関係も記載します。

デプロイ

NEXUSにログインし、repositoriesを開きます。
NEXUSは標準で「3rd party」というリポジトリが用意されているので、これを選択します。
下側に出ている「Artifact Upload」タブからデプロイできます。

GAV Definitionで「From POM」を選択するとファイルアップロード用のフィールドが表示されるので、先ほど作ったpom.xmlをここで指定します。
「Select Artifact(s) to Upload」ボタンからアップロードするJarを選択して「Add Artifact」ボタンを押すと、その下のグリッドに表示されます。
pom.xmlとJarを選択・追加したら、「Upload Artifact(s)」ボタンをクリックすることで、アップロードが完了します。

デプロイした物の利用

デプロイした物を利用するには、pom.xmlにNEXUSのリポジトリを設定して参照できるようにします。
初期状態のNEXUSには{NEXUSのURL}/content/groups/public/というリポジトリが有り、これを指定すると色々と幸せになれる層ですよ。

[メモ] BRMSを組み込むことによる、基幹業務パッケージのカスタマイズ工数削減の可能性の考察

※この投稿は、丸太式 Advent Calendar 2014の10日目です

ビジネスルールエンジンについて、しばらく考察を続けています。
今日は(あまりまとまっていませんが)現状のメモをまとめておきます。
どれくらい先になるかはわかりませんが、将来的に整理しなおすつもりです。

以下メモ

アプリケーションとは独立した、ビジネスルールを処理するための仕組みや実装を、ビジネスルールエンジン、または単にルールエンジンという。

基幹業務パッケージの導入においては、導入先の企業の業務フローに合わせたカスタマイズが必要となる。

特定の業種に対して横展開で受注を獲得しているパッケージの場合を考えてみる。
各企業向けのカスタマイズ部分を基となるコードに密結合させてしまうと、似たようなカスタマイズを繰り返し行うことになりかねない。

このような場合にルールエンジンの概念を導入すると、工数を削減できる可能性がある。
例えば、画面の入力値をバリデーションし、結果に応じてデータを修正し保存する処理があったとする。
この処理をビジネスルールとすると、バリデーション、データの修正、保存の三つに分けることができる。
これらをルールエンジン上に構築することで、アプリケーションの更新とは別にルールの組み替えや追加が可能となる。

先述の例で言うと、データを保存した後に”特定のユーザに対してメールで通知する”という処理を追加する場合、ルールエンジンではあらかじめ規定しておいたルールを追加するだけで良い。