Hatena::ブログ(Diary)

130単位

2009-02-27

Eclipse ビルド・パス設定で.svnフォルダを除外する

※追記

この記事の内容は問題があります。同様の手順を試すのは避けていただきたく思います。


Javaの開発ですが、IDEEclipse、バージョン管理はSubversion(TortoiseSVN)を使っています。

リポジトリ作成からしばらくして、どうも様子がおかしいことに気づきました。「src/main/webapp/WEB-INF/classes/」以下がうまく更新できないのです。

現象としては、コミットの際にコミット先が「src/main/java」になってしまいます。.svnフォルダが隠しフォルダになっていないのもよくわかりませんでした。

ただ一番の原因は、自分がJavaの仕組みを理解しきれていなかったことでした。コンパイルされたclassファイルは、別のフォルダに出力されるのですね。いろいろ自動生成してくれるDoltengなどのSeasarプロダクトに頼ってきたツケが回ってきました。

ビルド・パス設定画面

プロジェクト右クリック→ビルド・パス→ビルドパスの構成をクリックし、設定画面を開きます。ここでソースフォルダと出力フォルダの対応が確認できます。

設定画面のなかに「除外」という項目がありました。ここに設定すればよさそうです。編集画面を開き、例を参考にして「**/.svn/*」というパターンを追加します。

f:id:deeeki:20090227225257j:image

これで.svnフォルダがコピーされなくなり、普段どおりSubversionが使えるようになりました。

と思いきや

数日間は問題なかったのですが、本日またおかしくなりました。「src/main/webapp/WEB-INF/classes/」からなぜか.svnフォルダが消えてしまい、妨害状態になってしまってました。原因は不明です。

SubclipseというSubversionと連携するためのEclipseプラグインがあるようです。設定の手間を考えてちょっと避けていたのですが、素直に利用したほうが良さそうな気がしてきました。


※追記

上記の.svnフォルダが消える現象の原因がわかりました。ビルド・パスの構成を変更して再ビルドすると、除外設定をした影響で消えてしまうようです。結局、除外してもしてなくてもダメということになります。ですので、欠落のあるこの対処は真似しないようお願いします。

以下記事を新たに書きましたので、よろしければ参考ください。

Eclipse Subversiveプラグインを導入 - 130単位

2009-02-26

SAStruts/S2JDBC ネストしたプロパティの画面部品

SAStruts/S2JDBC JSPで画面部品を作ってみる - 130単位

の続きです。

実際に作りたかった画面部品は、テーブル結合を伴った、ネストしたプロパティを持つ項目でした。これを実現するのにまた地味に時間を食いました。というか要はMapの使い方を知らなかっただけなのですが。

エンティティとサービス

従業員に部署を結合して、所属する部署を表示させたいとします。

Employeeへ関連を定義します。

@Entity
public class Employee {
    ...
    @ManyToOne
    Department department;
}

EmployeeServiceで、結合して取得するようにします。findAll()をオーバーライドしてます。

public class EmployeeService extends AbstractService<Employee> {
    ...
    @Override
    public List<Employee> findAll() {
        return select()
            .innerJoin(department())
            .orderBy(asc(id()))
            .getResultList();
}

JSP

さて、前回ようなJSPに単に追加しただけでは、ネストしたプロパティにアクセスしようとするとエラーが起きます。

<html:option value="${e.jgjycd}">${e.id} ${e.name} (${e.department.name})</html:option>
javax.el.PropertyNotFoundException: Property 'name' not found on type test.entity.Department

employeeはBeanMapになっていても、departmentがBeanMapではないためです。employeeのみにBeans#createAndCopy()を実行しただけでは、departmentというプロパティはできなくなっているようです。ひがさんの少し前の記事にも、「ネストしたプロパティは対象外」と書かれています。

そこで、employeeをMapに詰め替えてListを構築する際に、departmentも同様にMapにしてやる必要があります。Mapに値を追加するには、「put(key, value)」を使います。

<%
    /* インポート等省略 */
    List<Employee> employeeList = employeeService.findAll();
    List<BeanMap> employeeItems = new ArrayList<BeanMap>();

    for (Employee employee : employeeList) {
        BeanMap empMap = Beans.createAndCopy(BeanMap.class, employee).execute();
        BeanMap deptMap = Beans.createAndCopy(BeanMap.class, employee.department).execute();

        empMap.put("department", deptMap);
        employeeItems.add(empMap);
    }
%>
<html:select property="searchLectureCd">
    <html:option value=""></html:option>
    <c:forEach var="e" items="${jgyofpItems}">
    <html:option value="${e.jgjycd}">${e.id}  ${e.name} (${e.department.name})</html:option>
    </c:forEach>
</html:select>
ちなみに

最初は下記のようにやろうとしてました。

empMap.department = deptMap;

もろにPHP(の連想配列)の影響なわけですが、これではダメですね。

サービスでMap取得 (失敗例)

そもそも「最初からサービスでMapを返せばいいんじゃないの」と思い、以下を試してみました。

public class EmployeeService extends AbstractService<Employee> {
    ...
    public List<BeanMap> findAllMap() {
        return jdbcManager
            .from(BeanMap.class)
            .orderBy(asc(id()))
            .getResultList();
    }
}

しかし結果は失敗。問い合わせ実行時に例外が発生します。

org.seasar.extension.jdbc.exception.NonEntityRuntimeException: [ESSR0704](org.seasar.framework.beans.util.BeanMap)はエンティティではありません。

Eclipse上ではエラーになりませんでしたし、SQLによる照会のselectBySql()だとMapで返せるようなので、いけるかと思ったのですが。AbstractServiceのジェネリクスでエンティティが指定されているのが関係してそうですが、今の自分の知識量ではこのくらいの推測が限界です。

というわけで、素直にJSPでMapに詰め替える方法を用いることにしました。

2009-02-25

SAStruts/S2JDBC JSPで画面部品を作ってみる

これまではこんな感じで週ごとに振り返ってきましたが、なかなか現実に追いつかず、また記憶があいまいな部分もあったりして、ちょっと書くのがしんどくなってきました。

これからはその日やったことを、HOTな状態のまま書いていきたいと思います。

画面部品

  • マスタ系テーブルから項目取得
  • セレクトボックスで表示

こんな画面部品をつくりたいと考えました。

参考リンク

その1: 画面部品 - C/pHeR Memo - Java とか。Eclipse とか。

その2:Cubby - Tips 集

ひと月前にこれらの記事を見たときはさっぱり意味がわかりませんでした。が、あらためてサンプルを見なおしてみたところ、作れそうな気がしてきたので実践してみることに。

よくある従業員テーブルから、idとnameでセレクトボックスを作る場合を例にしてみます。

失敗例

上記リンクその2のサンプルを参考にして、S2JDBCのServiceを利用した形で書いてみます。

<%@page import="java.util.List"%>
<%@page import="org.seasar.framework.container.SingletonS2Container"%>
<%@page import="test.entity.Employee"%>
<%@page import="test.service.EmployeeService"%>
<%
    EmployeeService employeeService = SingletonS2Container
        .getComponent(EmployeeService.class);

    List<Employee> employeeItems = employeeService.findAll();

    pageContext.setAttribute("employeeItems", employeeItems);
%>
<html:select property="employeeId">
    <c:forEach var="e" items="${employeeItems}">
        <html:option value="${e.id}">${e.id} ${e.name}</html:option>
    </c:forEach>
</html:select>

実行すると、「<html:option value="${e.id}">${e.id} ${e.name}</html:option>」の行でエラーが出ます。

javax.el.PropertyNotFoundException: Property 'id' not found on type test.entity.Employee

プロパティが見つからない」といわれます。ここで参考記事を読み返してみます。

  • JSTL で使用可能にするために検索結果を Beans で BeanMap にコピーする。
画面部品 - C/pHeR Memo - Java とか。Eclipse とか。

どうやら、型がBeanMapである必要があるらしいです。エンティティそのままではダメなようです。公式リファレンスにも、そのような記述がありました。

ActionやActionFormのプロパティは、 publicフィールドをELやStrutsが参照できるようにするために、 JavaBeansはMapに、配列はListにラップされています。

Super Agile Struts - Feature Reference

プロパティ」とは

どうも、PHPの影響でプロパティとフィールドを混同してしまっていることに気づきました。ので、あらためて理解しようと調べてみました。

プロパティはフィールドとメソッドの中間的な存在と考えることができ、また高水準なカプセル化の実現にも使われる。

プロパティ - Wikipedia

プロパティとは、JavaBeansの属性を表すものです。一言でいえば、「Javaクラスのフィールド(インスタンス変数)をカプセル化したもの」です。

カプセル化するとインスタンス変数は賢くなる:やり直し「JSPとTomcat」(8) - @IT

Javaでは純粋なメンバ変数は「フィールド」が正しく、アクセス可能な状態であれば「プロパティ」と言い換えられる、というように解釈しました。

成功例

Beans#createAndCopy()を用いて、取得したエンティティをBeanMapに変換します。複数件のListなので、繰り返す必要があります。

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="org.seasar.framework.beans.util.BeanMap"%>
<%@page import="org.seasar.framework.beans.util.Beans"%>
<%@page import="org.seasar.framework.container.SingletonS2Container"%>
<%@page import="test.entity.Employee"%>
<%@page import="test.service.EmployeeService"%>
<%
    EmployeeService employeeService = SingletonS2Container
        .getComponent(EmployeeService.class);

    List<Employee> employeeList = employeeService.findAll();

    List<BeanMap> employeeItems = new ArrayList<BeanMap>();
    for (Employee employee : employeeList) {
        BeanMap map = Beans.createAndCopy(BeanMap.class, employee).execute();
        employeeItems.add(map);
    }

    pageContext.setAttribute("employeeItems", employeeItems);
%>
<html:select property="employeeId">
    <c:forEach var="e" items="${employeeItems}">
    <html:option value="${e.id}">${e.id} ${e.name}</html:option>
    </c:forEach>
</html:select>

これでうまくいきました。

あとは部品を使う側のJSPに、以下のように記述します。

<c:import url="/WEB-INF/view/test/parts/selectEmployee.jsp"/>

ところで、2つめの例で

エンティティのリスト
xxxList (employeeList)
Mapのリスト
xxxItems (employeeItems)

って変数名をつけてみたのですが、一般的にはどういう風につけるものなのか、ふと疑問に思ったりしました。

2009-02-23

はじめてのSAStruts 6週目

はじめてのSAStruts 5週目 - 130単位

の続きです。

いろいろやっていたと思うのですが、あまりメモに残してなかったのでざっくりと。間違った情報があったら申し訳ありません。

2/9〜2/13

エンティティとテーブルの再構築
  • とりあえずIntegerとString(VARCHAR)で開発を進めていた
  • 実際の現行テーブルは数値にはNUMERIC、文字列にはCHARが使われていた
    • というわけで型を揃えることにした
  • gen-entityを行うと以下のようになった
  • gen-ddlでは以下のようになる
  • BigDecimal/DECIMAL、String/VARCHARで進めていく方針に変えた
  • S2JDBC-GenDBリファクタリングに非常に便利
    • が、もっと早い段階で現行のDB設計を確認しておくべきだとも思った
マイグレーション初体験
  • マイレーション…テーブル定義(DDL)からテーブルを再構築すること
  • S2JDBC-Genにより、DB2へgen-migrate
    • 外部キー生成で失敗した
    • 無くても支障はないので、外部キーを除いて実行したらうまくいった
  • 参考:Seasar2 - S2JDBC-Gen - Migrate
SQL自動生成でできること
  • 1対多の結合で、多側の最新のレコードのみ結合したい処理があった
  • MAX関数+自己結合で実現しようと考えた
    • が、SQL自動生成ではSELECT句を指定できないので、どうも不可能っぽい
  • 最新かどうかをフラグで持つ代替カラムを新たに設けることにした
  • (ビューを作っておいて結合する、という手もあったかもしれない)
Long型
  • 数値に「L」をつけるとLong型と解釈されることを知った
  • e.g. public Long a = 1L;
ファイル書き込み
  • ファイル作成してから、ストリームを開いて書き込む
  • PrintWriterを利用した
ファイル読み込み
  • TextUtil#read()は、引数がパスのStringだとうまくいかなかった
  • 引数がFileだとうまくいった

2009-02-22

hetemlで上級者モードのcron設定

普段からなんとなく耳にはしていた、cronというものに初めて触れることになりました。読み方は「くーろん」が正しいようです。まずは以下で基本的なことを学びます。

cron の設定ガイド
http://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

hetemlでcron設定

やりたいのは、レンタルサーバーのhetemlでphpファイルを自動実行すること。公式のマニュアルは以下。

レンタルサーバー「heteml」 - cron 設定マニュアル
http://heteml.jp/support/manual/cron/

実行したいプログラムは少し複雑な日時指定のため、「上級者モード」で設定する必要がありました。その点も踏まえて、留意点を以下に挙げておきます。

設定時の留意点
  • phpファイルの先頭に「#!/usr/local/bin/php」と記述する
    • ついでに改行もしておく
    • php5の場合は「#!/usr/local/bin/php5」
    • インクルードされるファイルには不要
  • ファイルを「アスキーモード」 で転送する
    • Windows-UNIX間で改行コードを正しく変換するため
    • WinSCPだと「テキストモード」が該当
  • phpファイルに記述するパスは絶対パスにする
    • 「./cron/」のような指定ではダメだった
  • 日時指定欄は12バイトまでしか入力できない
    • 「5,6,11,12,17,18」のように、規則性のない時刻に1日6回設定したい
    • しかし、作成された内容を確認すると「5,6,11,12,17」となってる
    • cronは計5つまで設定可能なので、とりあえず2つに分けて設定することで対処
  • cron処理出力結果のメール送信先は1アドレスのみ登録可能
    • カンマを入力すると「メールアドレスの形式が誤っています。」とアラートが表示される
「上級者モード」のスクリーンショット
  1. サイドメニューの「ウェブ関連」から、「cron設定」へ進み、タブで「上級者モード」を選択
    f:id:deeeki:20090222160749j:image
  2. 設定名とともに分、時刻、日、月、曜日、実行ファイルを入力し、「新規作成」をクリック
    f:id:deeeki:20090222160750j:image

こんな感じで設定します。

2009-02-21

主役にしていただきました

f:id:deeeki:20090221090348j:image

それは突然のこと。

アイマスク×イヤホンという懐かしき電波少年的手法で連れて行かれ。

不安ではありましたが、なかなかできない貴重な体験。

もう完全に身を任せていました。

ようやくマスクがはずれたのは、それから約30分後*1

すてきな人たちに囲まれて。

楽しいひとときを過ごすことができました。

企画していただいた皆さま、ありがとうございます。

そして足を運んでいただいた皆さま、ほんとにありがとうございます。

プレゼント

junzo氏にいただきました。

f:id:deeeki:20090221084112j:image

勉強します。

*1:少し予定外ではあったようですが

2009-02-19

はてなブックマークの自動ロード対応ページ一覧

はてなブックマークリニューアルされてから、AutoPagerize*1が効かなくなっちゃったなーなんて思っていました。が、はてブ自体にそのような機能が存在することに、本日ようやく気づいたのでした。

「次の20件」とかの横のマークを押すと、

f:id:deeeki:20090220001319j:image

自動ロード機能が有効になって、

f:id:deeeki:20090220001318j:image

次のページが読み込まれます。

これでページ送りの際のクリックが無くなり、スムーズな閲覧が可能になります。ちなみにユーザー登録しなくても利用できます。

対応ページ一覧

自動ロード機能に対応しているページをざっと挙げてみます。

参考リンク

ヘルプページにわかりやすい解説がありました。

ページ自動ロード機能ってなに?
http://b.hatena.ne.jp/help/autop

機能がまとめて紹介されているこちらも参考になります。

はてなブックマークの細かすぎて伝わりにくい新機能を勝手に紹介 - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips

*1ブラウザ拡張機能による次のページの自動読み込み

2009-02-18

はじめてのSAStruts 5週目

はじめてのSAStruts 4週目 - 130単位

の続きです。

DBアクセス処理を実装していくにあたり、O/RマッパーのS2JDBCを本格的に使い始めました。

2/2〜2/6

  • 複数のスキーマからエンティティ自動生成
    • スキーマ毎にxml定義を作成してみる
    • 「schemaname」に対象のスキーマ名を記述
    • Gen-Entityのみで、他のタスク(Geb-Namesとか)には不要
    • それぞれのxmlAnt実行
      • (ただし基本的に最初の1回しか実行しないため、1ファイルで都度書き換えればよいのかも)
    • DDL生成時(Gen-DDL)は、1つのxmlを実行すればよい(エンティティでの指定が必要(後述))
    • 参考:Seasar2 - S2JDBC-Gen - Gen-Entity

s2jdbc-gen-build.xml

<project name="app-s2jdbc-gen" default="gen-ddl" basedir=".">

  <property name="schemaname" value="SCHEMA"/>  <!--追加-->

  <target name="gen-entity">
    <gen-entity
      ...
      schemaname="${schemaname}"  <!--追加-->
    />
  </target>
</project>
@Entity
@Table(schema="SCHEMA")
public class User {
    ...
}
@JoinColumns({
    @JoinColumn(name="FOREIGN_ID", referencedColumnName="ID"),
    @JoinColumn(name="FOREIGN_SUB_ID", referencedColumnName="SUB_ID")
})
  • JSPのリンクの記述
    • 「/app/module/list」と「/app/module/edit/1」
    • 共通のメニューを持ちたい場合

通常のリンクだと、URLからの相対パスになってしまうのでリンクがずれてしまう。

<html:link href="./">機能TOPへ</html:link>

SAStruts拡張タグリブを用いることで、JSPファイルから見た相対パスになる

<s:link href="./">機能TOPへ</html:link>

SAStrutsには、Strutshtml:link継承したs:linkが用意されています。 href属性を設定するときに、コンテキストルートを自動的に補完させる場合に使います。パスを/ではじめた場合は、コンテキストルートからみたパスになります。パスが/ではじまっていない場合は、JSPからみたパスになります。

Super Agile Struts - Feature Reference
  • DB2用ダイアレクトの種類
    • Db2GenDialect、Db2390GenDialect、Db2400GenDialectがある
    • AS400にはDb2400GenDialectを用いるっぽい
    • DB2は詳しくないが、どうもoffsetが使えないように見受けられる

▼Db2390GenDialect *1

@Override
public String convertLimitSql(String sql, int offset, int limit) {
	return convertLimitOnlySql(sql, offset + limit);

}
  • 共通のカラムの処理
    • ユーザーコード、更新日付、プログラム名のカラムが全テーブルに存在
    • ただし、それぞれのカラム名は各テーブル毎のプレフィックスが付いている
    • 一箇所にまとめて書けないものかと思ったけど、挫折
    • 各サービスにinsert()/update()をOverrideして書くことにした
    • 各エンティティのフィールド名を同一にすれば、親クラスを作ることで可能?なのかも

*1:Db2400GenDialectはこれを継承している

2009-02-17

はじめてのSAStruts 4週目

はじめてのSAStruts 3週目 - 130単位

の続きです。

この週でView(JSP)が一通り完成しました。

1/26〜1/30

▼application_ja.properties

errors.required2={0}は空白にすることができません。
labels.title=タイトル

▼ActionForm

@Required(arg0 = @Arg(key = "labels.title"),
    msg = @Msg(key = "errors.required2"), target = "insert")
public String title;

▼Action

@Execute(input = "create.jsp")
public insert() {
    //...
}
<property name="interceptorName">"loginConfirmInterceptor"</property>
  • Switch文の条件にString型は不可
    • 「型 String の値でスイッチすることはできません。 int 値または enum 定数のみが許可されています」
    • 上記エラーがでたので、「if〜else」でやることにした
  • String型の比較
    • 「==」による比較でうまく動かなかった
    • equals()メソッドを使って比較しないといけない

strA == strB は、strA と strB が同じオブジェクトかどうかを調べたりする際に用いる演算子です。

とほほのJava入門
  • 成功メッセージの表示
    • エラー時と同じ要領でやることができた

▼Action

ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("messages.success"));
ActionMessagesUtil.addMessages(RequestUtil.getRequest(), messages);

JSP

<html:messages id="msg" message="true">
  <font color="blue"><bean:write name="msg" ignore="true"/></font>
</html:messages>

2009-02-16

はじめてのSAStruts 3週目

はじめてのSAStruts 2週目 - 130単位

の続きです。

この週はひたすらView(JSP)をつくっていました。

1/19〜1/23

  • JSPのループ文
    • beginとendを指定
    • または、対象の配列などをitemsで指定
<c:forEach var="month" begin="1" end="12">
  <html:option value="month">month</html:option>
</c:forEach>

<c:forEach var="user" items="userList">
  ${user.id} - ${user.name}
</c:forEach>
  • FCKeditor導入成功
    • デモのプロジェクトを一度作ってみる
    • それと同じような構成にしたら動いた
    • 表示されるまでに若干時間がかかる印象
      • 項目(ツールバーみたいなの)を減らせばある程度はマシになるのかも
  • JSPの条件文
    • 「if」は単独で用いて、「else」はどうやら存在しない模様
    • 代わりに「choose〜when/otherwise」を用いる
<c:if test="${flg == 1}">
  //条件一致時の処理
</c:if>

<c:choose>
  <c:when test="${id != null}">
    //条件一致時の処理
  </c:when>
  <c:otherwise>
    //それ以外の時の処理
  </c:otherwise>
</c:choose>
  • 打ち合わせ
    • ポスグレは使わず、DB2のみでの運用に仕様変更

▼application_ja.properties

title=タイトル

JSP

<bean:message key="title"/>

参考リンク

JSP*タグリファレンス
http://tag.main.jp/index.html

サンプル付きでわかりやすく、非常にお世話になっています。

2009-02-15

はじめてのSAStruts 2週目

開発でいっぱいいっぱいで、追いつくどころか全然更新できてませんでしたが。

はじめてのSAStruts 1週目 - 130単位

の続きです。

※2/16追記:コードに一部誤りがあったので修正しました。

1/13〜1/16

  • S2JDBCDB2への接続を試す
    • jdbc.diconにてcurrentschemaプロパティの設定が必要
    • S2JDBC-Genの自動生成もいちおう成功
    • ただ最後のSUCCESSFULメッセージが出力されなかった(ファイルはできている)
  • ユーザー情報をセッションに保存 (続き)
    • いろいろ試すものの、丸2日間全然できなかった
      • Dtoクラスをアノテーションセッションスコープにする。これは正しい
      • アクションにpublicプロパティとして設ける。これも正しそう
      • しかし、次に遷移した画面では消えている。こんな状態の堂々巡り
    • しばらくしてBeansの使い方が間違っていることに気づく
user = userService.findUser(id, pass);
userDto = Beans.createAndCopy(UserDto.class, user);

これ↑だとダメ。

Beans.copy(user, userDto);

createAndCopyではなくて、copyするのが正しいっぽい。アクション内で新規作成したオブジェクトを格納したことによって参照が外れた、と拙い知識で理解

user = userService.findUser(id, pass);
userDto.id = user.id;
userDto.name = user.name;

このようにBeansを使わずに書いても問題なかった

2009-02-14

まつもとゆきひろ氏「オープンソースソフトウェアRubyの開発」 聴講メモ

中部圏技術者協同組合 - セミナーご案内 | 2009-02-14 (土) Ruby開発者が語る!
http://www.centea.or.jp/modules/eguide/event.php?eid=1

なかなかない機会と思い、情報を得てからすぐに予約。で本日参加してきました。

オープンソースソフトウェア プログラミング言語Ruby

自己紹介
Rubyの世界へようこそ
プログラミング言語Ruby
Ruby = SmallTalk - 奇妙な文法
       + Perlスクリプト機能
       + Pythonの例外など
       + CLUのイテレータ
       + そのほか良いものもろもろ
  • 簡潔
    • 型指定不要
    • コンパイラ指示不要
    • 実行可能疑似言語
      • 少ない指示でいろいろなことをやってほしい
      • アルゴリズムの説明では、簡単な疑似言語を使ったりする(が、実際はいろいろと宣言が必要)
      • → 疑似言語そのもので動かしたい
    • 生産性の法則 (『人月神話』より)
      • 「ある時間内にプログラマが書けるコードの量は言語によらず一定」
      • アセンブラ500行で実現できることとRuby500行で実現できることは違う
      • より簡潔な記述で済ませた方が良い
    • 階乗のサンプルコード
      • JavaRubyで比較
      • Rubyだと簡潔に書けて、やりたいことと書いたことの差が少ない
  • 柔軟
    • 機械の都合を優先しない
    • 自由度は高く
    • 自己責任
      • 「強力な力には強力な責任を伴う」
  • 生産的
    • メタプログラミング
    • DRY
      • Don't Repeat Yourself (繰返しをしない)
      • コピーしてコードを書いていくと、バグもコピーしてしまう可能性がある
    • 思考に沿った表記
      • puts STDIN each.take(10)
      • → STDINを各行取り出して、最初の10行を切り出す
      • 例えばHaskellだと逆の流れになる
  • 使う側にやさしい
アジャイル宣言との類似
  • プロセスやツールより人と人同士の相互作用を」
    • 人間にフォーカス
  • 「包括的なドキュメントより動作するソフトウェアを」
    • 素早い開発サイクル
      • 重要なのはお客様の問題を解決するソフトウェアが実際に動くかどうか
      • ドキュメントにコストをかけるのはばかばかしい
  • 「契約上の交渉より顧客との協調を」
    • 豊かな表現力と対話支援
  • 「計画に従うことより変化への対応を」
    • 動的で柔軟な言語
言語からのメッセージ
  • Sapir-Whorf仮説
    • 言語は思考に影響を与える
      • バベル17』(影響を受けた書籍)にも同様の記述
  • Rubyが与える影響とは
    • 職業プログラマでは、お金のためにやってる感がなんとなく微妙
    • 自分の思いを伝える自由度が高いと、満足度も高い
  • Enjoy Programming!
Rubyの今後
  • 1.8-安定
    • 日常利用、安定、互換
  • 2.0-人参
    • コミュニティを通じて技術者があつまらないといけない
      • 技術者へ課題を提供する餌みたいなもの
    • 趣味から仕事へ
      • スケーラビリティ
      • ひとりでの開発じゃ済まなくなってきてる → 多人数開発への言語上での対応
    • Ruby2.0

感想

名古屋に在住されていたとは知りませんでした。

最も印象に残ったのは、生産性についての「書けるコードの量は言語によらず一定」のあたり。あくまで考え方のひとつではあるそうなのですが、言語の開発者自身によって語られたことで、大きな納得感がありました。

また、好きなことをやっている影響からか、なんというか非常に魅力的な雰囲気・人となりが感じられました。

参加することができて良かったです。ありがとうございました。

関連リンク

未来の言語は「APL」? Rubyのまつもと氏が講演 − @IT
http://www.atmarkit.co.jp/news/200902/13/matz.html

まつもとゆきひろが語る「ビューティフルコード」×「プログラマ35歳定年説」 聴講記 - TrinityT’s LABO
http://d.hatena.ne.jp/TrinityT/20090207/1233997847

まつもとゆきひろ氏が語る「ビューティフルコード」セミナーに行って来た - Slow Dance
http://d.hatena.ne.jp/LukeSilvia/20090207/p1

追記:

質疑応答時、「Ruby発祥の地は名古屋?」というのでちょっとした盛り上がりがありました。気になったので探してみたところ、ほんとになってました。

The World of Hello World
via : no title

*1:「お金にならない仕事でも怒られない立場」らしい

*2:実際に聞いたのだそう

2009-02-09

はじめてのSAStruts 1週目

Java初心者ながら、1月始めよりJava案件にメインでどっぷりと関わっています。SAStrutsフレームワークとして選んだのですが、そもそもStrutsすら触ったことのない状態がスタート地点でした。

Super Agile Struts
http://sastruts.seasar.org/

約1ヶ月が過ぎ、このところはDBアクセスやファイル入出力といった若干手のかかる処理を実装しています。そんな中、現在進行形でいろいろとメモしておきたい欲求が日増しに高まってきました。

ただ、初心者状態から試行錯誤してきた先月分の経験もあるにはあって、そちらも書き残しておきたかったりもしています。未だ抜けない完全主義の性です。

というわけで、記憶の範囲内でざっと振り返ってみたいと思います。今週中に現実に追いつくのが目標です。

1/5〜1/9

※以下は簡易なメモです。正確な情報はSAStrutsリファレンスなどをご参考ください。

  • PostgreSQLJDBCドライバーを組み込む
    • そもそもドライバーが必要ということ自体知らなかった
    • Download (PostgreSQL > JDBC Driver)
    • JDBC3とJDBC4の2つあって迷った
    • 最初JDBC4のほうでやろうとしてダメだった
    • JDBC3にしてみたらうまくつながった
  • S2JDBC-Genを使ってみる
    • エラーが出たりしてなかなかうまくいかなかった
    • テーブル→エンティティ生成時はターゲットを「gen-entity」にして実行する必要があった
    • サービスまで自動生成されることに再び感動
  • ログイン情報をセッションに保存→読み込みを試みる
    • Dtoクラスを利用するのが一般的らしい
    • 「@Component(instance = InstanceType.SESSION)」とアノテーションをつける
    • private/protected/publicでできることの違いがいまいち理解しきれていない
    • アクション内では取得できるもののJSPで取得できず、結局うまくいかなかった

2009-02-08

名幹事による結婚式二次会

araiさんちっちゃくさんおめでとうございます。

というわけで、結婚式の二次会に出席してきました。

  • 新郎新婦登場
  • 祝辞
  • 乾杯
  • ケーキカット
  • ご友人余興1
  • ご友人余興2
  • 四方割り
  • 同僚スピーチ
  • 新婦当てゲーム
  • 賞品付き○×クイズ
  • ギターセッション
  • ご友人余興3
  • サプライズ&お祝いVTR
  • お見送り

相当に盛り沢山な内容で、その場にいるだけで純粋に楽しめました。

店決めから企画、そして当日の司会までこなし、すべてを取りまとめたのが幹事のnoiri氏。「お疲れ様でした」よりもむしろ、心から「ありがとうございました」といいたいです。サポートした師匠simizuくんにももちろん感謝です。

f:id:deeeki:20090210003304j:image

なんとなく撮ってみました。

できる限り居心地の良い空間を保つため、また本番独特の流れに適応するために、持ってきてたのでしょう。その判断、成功へ向けての強い意志にも感心です。

(そんなカリスマ幹事noiri氏とともに新境地を開拓してみたい営業マンの方、ぜひエクスブリッジへ)

2009-02-05

db2jcc_license_cisuz.jarの在り処

お客様先を訪問して、現地でデータベースアクセスの動作確認。JavaのWebシステム(SAStruts+S2JDBC)からDB2@AS400への接続テストです。

しかし、持っていったVMWare+仮想マシンのコピーが全く役に立たなかったりなどして、なかなか思うようにいかず。結局SELECTはできるけどINSERTはできないという中途半端な状態のまま、時間切れで帰ってきてしまったのでした。

個人的に引っかかったのが、DB2JDBCドライバーのライセンスjarファイル。db2jcc_license_cu.jarというのを組み込んではいたのですが、db2jcc_license_cisuz.jarが必要というエラーが出てうまくいきませんでした*1

で、探し始めてはみたものの一向に見つからず。検索語句に「download」と加えてみても、出てくるのはDL済み前提のマニュアル的なページばかり。仕方がないので、IBMのページからそれらしきファイルをひたすら物色。2時間近くかけてやっとこさ発見しました。

IBM - DB2 UDB Version 8 FixPaks & client downloads for 32-bit DB2 Products for Windows Operating Systems on 32-bit Intel and AMD systems
http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg21256059

こちらのページの最新バージョンっぽいやつの、上から3番目。

f:id:deeeki:20090206013215j:image

DB2 Connect Enterprise Edition or DB2 Connect Unlimited Edition or DB2 Connect Application Server Edition or DB2 Connect Unlimited Edition for iSeries」の中にありました。zip解凍後、「.jar」などでファイル検索すると見つかると思います。

f:id:deeeki:20090206093601j:image

パスでいうと、CONEE¥db2¥Windows¥CONNEC~3.cabというキャビネットファイルの中になります。


いちおう記憶の範囲内で、辿り着いた経路を以下に書いておいてみます。

  1. IBM - Application development DB2 Universal Database for Linux, UNIX and Windows Version 8
  2. ページ半ば、「Downloads」枠内のリンクをクリック
  3. IBM - DB2 UDB Version 8 FixPaks and clients
  4. 「Choose your platform...」枠内で、「Windows-x86 (AMD and Intel) -- (DB2 32-bit)」を選択→「Go」クリック
  5. 「iSeries」の文字に気づき、該当ファイルをFTPダウンロード解凍して発見

ただし、これで解決するとは限りません。もう少し調査・準備して来週再挑戦です。

*1:SELECTが確認できたのは、現地でお借りしたAS専用らしきドライバーを用いたから

2009-02-04

ブラウザシェアをグラフ化してみた (2009年1月)

IEの市場シェア、減少続く――67.5%に - ITmedia News
http://www.itmedia.co.jp/news/articles/0902/03/news042.html

こんな記事を見かけました。で、自分のブログではどうなのだろうと、ふと気になったのでした。

市場全体

上記記事中の数値をもとに、まずは全体のブラウザシェアをグラフ化。

f:id:deeeki:20090205010952p:image

このブログ

続いてGoogle Analyticsの結果より、130単位ブラウザシェアをグラフ化。

f:id:deeeki:20090205010948p:image

感想

それなりに技術寄りのネタを書いているからか、Firefoxのシェアが10%近く多くなっています。ただ、それでもIEが半数以上。意外な気もしなくもないのですが、根強いIEの定着度にあらためて驚かされました。また、Google Chromeが3位と健闘しています。何気に社内に愛用ユーザーがいたりするのが、少なからず影響しているのかもしれません。

おまけ:グラフ作成

moBlur.org - Google Charts GUI with jQuery
http://moblur.org/workshop/google_chart_gui/

こちらのWebサービスを利用しました。URLエンコードした文字列にすることで、一部の日本語表示も可能です*1

続きを読む

*1:「単位」は無理だったのでカタカナにした

2009-02-03

Google Analytics SSL認証付きサイトへの導入

SSL認証を含んだWebサイト案件に最近関わりました。で、アクセス解析Google Analyticsを導入することになりまして。そこでちょっとした知識として得たことのメモです。

異なるプロトコルの影響

Google Analyticsにおいてプロファイルを新規作成する場合、プロトコル(「http://」か「https://」)を選ばなければいけません。

f:id:deeeki:20090204011159j:image

となると、同一ドメインであっても、認証の有無により解析結果が分かれてしまうように思えます。しかし、プロファイルを作成完了してトラッキングコード(ga.js)を確認してみると。

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-XXXXXXX-X");
pageTracker._trackPageview();
} catch(err) {}</script>

最初の行に、プロトコルを判断する三項演算子の条件分岐が存在します。それに応じて、jsファイルを取得するURLを振り分けています。

というわけで、実際は認証の有無に関わらず解析できるっぽいです(試してはいないですが)。

留意点

ただし「以前のトラッキングコード(urchin.js)」に関しては、プロトコルの選択によって表示されるコードが変わるため、すこし注意が必要です。

http://の場合
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
_uacct = "UA-UA-XXXXXXX-X";
urchinTracker();
} catch(err) {}</script>
https://の場合
<script src="https://ssl.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
_uacct = "UA-XXXXXXX-X";
urchinTracker();
} catch(err) {}</script>

とはいえ、こちらも正しく条件分岐を加えれば、統合された解析結果を得ることは可能なようです。

参考リンク

【コラム:アクセスログ解析】第3回 Google AnalyticsでのSSLサイトの計測の注意点とは? - Webマーケティングコラム - アクセスログ解析 - Webマーケティングガイド┃Webマーケティング情報ポータルサイト
http://www.e-research.biz/column/col_2/000549.html

おまけ

開発環境と本番環境で同一のソースコードを用いたいが、開発環境では解析を無効化したい場合(「www.hostname.com」が本番環境のドメインとする)。

JavaScript
<script type="text/javascript">
if (location.hostname == 'www.hostname.com') {
//・・・
</script>
}
PHP
<?php if ($_SERVER['HTTP_HOST'] == 'www.hostname.com'): ?>
<script type="text/javascript">
//・・・
</script>
<?php endif; ?>

まぁ、プロファイル作成時にドメイン指定があるため、こうしなくても解析結果からは除外されていると思います…。

2009-02-02

1月分の読書記録

先月に比べてほぼ倍の冊数となりました。

印象に残ってるのは『プログラミングでメシが食えるか!?』SEよりもプログラマ志向な自分としては、共感しつついろいろと参考になる一冊でした。マンガでは『バクマン。』がツボにはまりまくりました。

1月分読書データ

f:id:deeeki:20090203001115j:image

1月の読書メーター
読んだ本の数:13冊
読んだページ数:2665ページ

Webディレクション 成功の法則48Webディレクション 成功の法則48
ヒアリングや初期段階の設計手法が参考になった
読了日:01月30日 著者:大谷 秀映,松原 慶太,高山 一登,山本 聰,玉田 雄以,原田 秀司,川辺 伸司,大井 恵介
ONE PIECE 巻51 (51) (ジャンプコミックス)ONE PIECE 巻51 (51) (ジャンプコミックス)
11人の超新星に心躍った。ここ数年のワンピで一番おもろかったかも。
読了日:01月30日 著者:尾田 栄一郎
比較は不幸のはじまり―ないものねだりの心理学 (ソニー・マガジンズ新書 10)比較は不幸のはじまり―ないものねだりの心理学 (ソニー・マガジンズ新書 10)
無所属の時間。好奇心遺伝子。他者比較でなく、自己比較を。
読了日:01月29日 著者:高畑 好秀
プログラミングでメシが食えるか!?―成功するプログラマーの技術と仕事術プログラミングでメシが食えるか!?―成功するプログラマーの技術と仕事術
得意分野を持つ。やりがいを与えて後輩を育てる。
読了日:01月27日 著者:小俣 光之
聖(さとし)の青春 (講談社文庫)聖(さとし)の青春 (講談社文庫)
棋士村山の人生を追体験。何度も心が揺さぶられる
読了日:01月26日 著者:大崎 善生
牛丼一杯の儲けは9円―「利益」と「仕入れ」の仁義なき経済学 (幻冬舎新書)牛丼一杯の儲けは9円―「利益」と「仕入れ」の仁義なき経済学 (幻冬舎新書)
「仕入れが利益率を決める」
読了日:01月21日 著者:坂口 孝則
「距離感」が人を動かす──500人のトップ経営者に学んだ複眼的対人関係論 (講談社+α新書 412-1C)「距離感」が人を動かす──500人のトップ経営者に学んだ複眼的対人関係論 (講談社+α新書 412-1C)
「関係年齢(出会ってから積み重ねた歳月)」を意識する
読了日:01月14日 著者:大塚 英樹
アイシールド21 33 (33) (ジャンプコミックス)アイシールド21 33 (33) (ジャンプコミックス)
ギリギリの展開。ヒル魔の伏線が気になる。
読了日:01月13日 著者:稲垣 理一郎
バクマン。 1 (1) (ジャンプコミックス)バクマン。 1 (1) (ジャンプコミックス)
想像以上に面白かった。まさに周波数が合ったって感じ。
読了日:01月11日 著者:大場 つぐみ
発信力―頭のいい人のサバイバル術 (文春新書 (556))発信力―頭のいい人のサバイバル術 (文春新書 (556))
自分というのは、探すものではなく、日々作っていくべきもの
読了日:01月09日 著者:樋口 裕一
情報は1冊のノートにまとめなさい 100円でつくる万能「情報整理ノート」 (Nanaブックス)情報は1冊のノートにまとめなさい 100円でつくる万能「情報整理ノート」 (Nanaブックス)
継続が大事。そのために仕組みをシンプルにする。
読了日:01月06日 著者:奥野 宣之
バカにならない読書術 (朝日新書 72) (朝日新書 72)バカにならない読書術 (朝日新書 72) (朝日新書 72)
知育(入力)-徳育(演算)-体育(出力)の循環が脳を育てる
読了日:01月04日 著者:養老 孟司; 池田 清彦; 吉岡 忍
Eclipseで学ぶはじめてのJavaEclipseで学ぶはじめてのJava
丁寧な解説で言語だけでなくコーディングの作法まで学べる
読了日:01月01日 著者:木村 聡

読書メーター