« 2008年8月 | トップページ | 2008年11月 »

2008年9月の4件の投稿

2008/09/15

転職活動をしてみませんか

自分のキャリアを考えていく上で、転職は手段の一つとして考えていく必要がある。

転職したいと考えたとき、例えばこれ以上今の職場に居たくないと考えるようになったときに初めて転職活動を行うと、余裕が無い状態からのスタートになるのではないか、というような懸念もあり、少しずつ手を付けていくことにした。

手始めに、昨日(2008/09/13)に開催されたエンジニアtype適職(転職)フェアというものに参加してみた。現状、こうしていこう、という方向性についてもあまり強い思いも無く(今から考えていくことになる)、単なる参加した感想になるが、以下に思ったことを記載する。

  • 学生時代の就職活動と、社会人生活を何年か過ごしてきた後では、おそらく同じことを説明されても思うことは変わっている。今すぐに転職したいと考えていなくても、「自分は定年まで今の会社に所属し続けるだろう」という確信が無い人は、1回はこのような場に参加してみることは意義があることであると感じた。
  • 1社のブースは、人が2人座れる位の大きさである。
  • 1対1で会社説明を受け、その後質問をして終わる、というような形式だった。私は全くその会社のことを知らずに行ったのだが、少し失礼だったかな、とは感じた。
  • 企業側は求人に対して強い意志がある(からわざわざこのような場に出ている)。従って、こちらも相応の意思を示さないと失礼であると感じた。私の場合は、冒頭で「今すぐに転職する意思は無い。自分のキャリア形成の一環として転職に対して考え始めたところである。」という意思を示した。相手にとってあまり喜ばしい意思ではないだろうが、曖昧な態度はより問題がある。
  • あまりラフな格好も問題があると思う。不安に思うのであればスーツで良い。また、人に説明させているのだから手帳かノートくらいは用意しておくべきだろう。
  • 転職のための場だが、若い人が多かった。隣で説明を受けていた人は、いつも20代だった。会場全体を見渡しても、、、あまり周りの人を観察していなかったことに今気付いた。
  • 1つの会社の説明を聞き始めると、かなり時間が経過するので、説明を聞きたい会社はあらかじめwebサイトを見て決めておくべきだった。1社当たり、待ち時間含め1時間くらいかかったかと思う。
  • 学生時代の修飾活動先は、東証一部上場やそれ相当の規模の企業ばかりだったので、今回社員100名未満の非上場企業の話を聞けたのは貴重な体験だった。ただ、やはり現在所属している会社とは考え方が異なるなあ、と思うところもあり、自分に適しているのかは熟慮が必要だと感じた。
  • その100名未満規模の会社の方は、社長や取締役の方が説明されていた。
  • 私個人としては、あまり給与面については重視しておらず、エントリシート(入場時に記入するA3の用紙)にも特にそのようなことは記載していなかったのだが、給与面の説明にも重点がおかれていた。聞きたいところはそこではないのに...と少しもどかしかった。
  • (説明を受けたことを鵜呑みにするとすれば)給与は会社の規模には全く比例していなかった。自分の実力に自身がある人は、鶏口牛後、ということも考えてみてもよいかもしれない。

おそらくこのような場に参加する人の大半は、(当たり前だが)転職先を探している人なのであろう。従って企業側の説明内容もそういった人向けに終始しており、若干期待はずれの感もあった。

できれば、今すぐに転職を考えていない人も、自分のキャリアのためと思って、こういう場に参加してみてはどうだろうか。そうすれば、企業側の意識も変わってキャリアプランニングするためにより良い環境になるのではないかと思う。是非。

2008/09/14

本棚の整理

前回のコードで書籍の登録を始めたが、あのままではほんの登録順が分からないので、一時中断した場合、どこから再開すれば分からなくなる問題があった。

このため、前回のコードでは削除してしまったidを復活させプライマリキーとし、@GeneratedValue(strategy = GenerationType.AUTO)アノテーションもつけたままにした。このことにより、idで昇順に並べた場合に登録した順と一致するため、上記の問題は解消した。

書籍の整理に当たって、取り敢えず下記の3種類に分類することにした。

  • 残すもの
  • 捨てるもの
  • 残収容スペースに依っては捨てざるを得ないもの

本日登録した件数、つまり分類が終わった書籍数は107件、うち、廃棄が決定したものは35件である。33%を廃棄することになる。107件というのは、本棚を占めていた割合から勘案すると、全体の1/5~1/6に相当すると思われる。

現在の住居へ越して来てから6年も経過していないにも拘らずこの冊数購入しているということは、消費冊数に対してかなりオーバーペースであることが分かった(転居前に購入してそのまま持ってきたものもいくらか存在はするが)。

 

廃棄する書籍を見てみると、大体以下のように分類できた。

  • 旬を過ぎたもの。資格試験用のものなど。
  • 読み物系。何度も読み返す必要が無いもの。
  • 書籍の内容を十分に理解できており、所有し続ける必要がなくなったもの。
  • 購入時は必要だと考えていたが、結局使用しないまま時間が経過してしまったもの。

 

以下、今回廃棄する書籍のいくつかを記載していこうと思う。

 

読み物。入社直後の研修期間中に、休日暇なので購入したものだったと思う。

 

新人研修でServletやJSPの学習をしたため、理解を深める必要があると思って購入したもの。結局業務ではWeb系とは全く離れたことを行っているので、役に立つことは無かった。

 

この人の著作は、おそらく大学の講義用に執筆しているものだと思われるが、全く役に立たない。この書籍についても例外ではなく、JMFはあまり日本語の資料が無いが、それを根拠にこの本を購入するのは誤りである。

 

大学院時代、研究で用いていたプログラム(CUI)を実用化したい、ということでGUIフロントエンドを作成するために購入した。社会人になっても趣味で続けられれば、と思っていたが、GUIはJava(or MFC)で書くようになり不要となった。C++Builderの解説書籍はあまり無いので選択肢は限られるが、そういう状況の中で悪くない書籍だったと思う。

 

学生時代に研究室のネットワーク管理していた頃に購入したもの。当時はかなり役に立った書籍群ではある。

 

研究で学んだことを趣味にしていけたら、と思って残していた書籍群であるが、残念ながら社会人になって画像処理に関するプログラムを書いたことは無い。

 

今回処理した本棚は社会人1年目前半の場所なので、学生時代に購入したものが多い結果となった。

2008/09/07

書籍購入履歴を永続化する(2)

書籍のデータを入力する部分を実装する。

バーコード読み取りには、上記のエフケイシステム社製バーコードリーダCCD-TSK-USB(スペック)を用いる。バーコードリーダの価格差異が機能や性能に対してどういった影響を及ぼすのかは調査していない。USB接続ができ、Amazonで最安値付近で購入できるものを選択した結果である。

このバーコードリーダは有線であるため、本目的で利用するには、作業場所とPCの位置が離れていないことが条件となる。なお、前述スペック表では、ケーブル長は1.75mとなっている。

書籍バーコード値(上段)入力フィールドの実装

まず、フォーカス遷移制御コードを追加する。このバーコードリーダは、読み取りボタンを押すと、読み取った値と改行を出力する(初期設定の場合)。従って、書籍バーコード値(上段)を入力し、エンターを押すと書籍バーコード値(下段)入力欄にフォーカスを遷移させるようコードを編集する。

  1. BookRecorderView.javaをデザインモードで開き、uppercodeFieldを右クリック「イベント」>「Key」>「keyPressed」を選択する。
  2. 自動生成されたメソッドに、以下のコードを追加する。
  3. if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
        lowercodeField.requestFocusInWindow();
    }

また、ISBN(上段)値が確定した際に、Amazonから書籍名を取得するコードを追加する。これにはHttpClient4を用いる。そのため、プロジェクトにHttpClientライブラリを追加しておく。

Amazonで検索を行うには、以下のURLへアクセスすればよいようだ。これは、Firefox3の右上検索窓で利用されているコード"C:\Program Files\Mozilla Firefox 3\searchplugins\amazon-jp.xml"から類推できる。

http://www.amazon.co.jp/exec/obidos/external-search/?field-keywords=[検索文字列]

また、書籍名はbtAsinTitleタグに設定されているようなので、このタグに囲まれている文字列を書籍名として抽出するようにする。これらの処理をまとめてAmazon.javaに実装した。

結果として、以下のようなコードになる。

private void uppercodeFieldKeyPressed(java.awt.event.KeyEvent evt) {
    if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
        String name = "";
        try {
            name = Amazon.getInstance().getName(uppercodeField.getText());
        } catch (Exception ex) {
            Logger.getLogger(Book.class.getName()).log(Level.SEVERE, null, ex);
        }
        nameField.setText(name);
        lowercodeField.requestFocusInWindow();
    }
}

書籍バーコード値(下段)入力フィールドの実装

ここでエンターを押すと、レコードの確定と、次のレコードへの入力準備が必要になる。つまり、新しいレコードを作成し、書籍バーコード値(上段)入力フィールドにフォーカスを遷移させればよい。

private void lowercodeFieldKeyPressed(java.awt.event.KeyEvent evt) {
    if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
        newRecord();
        uppercodeField.requestFocusInWindow();
    }
}

その他、本来であればcommitも行ってしまってよいと考えたが、Saveボタンを押下した際に実行されるであろうコード

@Action(enabledProperty = "saveNeeded")
public Task save() {
    return new SaveTask(getApplication());
}

の意味が理解できていないので、今回はパスした。このため、終了前にSaveボタンを押し忘れると入力したデータが全て消えてしまう。この対策として、終了確認ダイアログを出すことにした(参考)。

Swing Application Frameworkで作成したウィンドウで終了イベントを取得するには、addExitListenerメソッドでリスナを設定すればよいようだ。ここでは、BookRecorderViewクラスにExitListenerインタフェースを実装し、コンストラクタでリスナを追加するコードを記述した。

public class BookRecorderView extends FrameView implements ExitListener {

    public BookRecorderView(SingleFrameApplication app) {
        super(app);

        initComponents();
        getApplication().addExitListener(this);
(中略)

public boolean canExit(EventObject arg0) {
    if(!isSaveNeeded()){
        return true;
    }
    int result = JOptionPane.showConfirmDialog(this.getComponent(), "Saveボタンを押していない場合、入力値は保存されません。" + "\n終了しますか?",
            "終了確認",
            JOptionPane.YES_NO_OPTION);
    if (result == JOptionPane.YES_OPTION) {
        return true;
    }
    return false;
}

public void willExit(EventObject arg0) {
}

 

以上で前回エントリ冒頭に記載したゴールに到達した。

書籍消費履歴を永続化する

30万円の臨時収入があったら欲しいもの…「薄型テレビ」がダントツ」という記事を見ていたら、大画面映写機の衝動買い意欲を催した。しかし、部屋を見回してみたところ、どこにもそのようなものを置く場所が無いことに気付いた。

現在、私の部屋の収容可能容積を最も消費しているのは書籍である。大型テレビを購入するかどうかに依らず、この状態を何らかの方法で解決することは今後生活していく上で重要な案件であると思い立ち、書籍の処分を行っていくことにした。

ワインコレクタのツールとして、購入・消費した履歴を残しておくワインラベルレコーダというものがあるらしい。将来的に、書籍に対するワインラベルレコーダのようなものをDBを利用して構築できればよいと考えた。

ただし、今現在解決すべき問題はあくまで収容可能容積の改善である。とりあえず処分する書籍の情報が永続化するツールを手っ取り早く作り、書籍を廃棄可能な状態にすることをゴールに定めた。

手早く作成するために、以下の方針をとる。

  • 永続化は、NicoBrowserで経験済みの手段、すなわち、H2 DBを使用したインプロセスDBに、JPAとしてTopLink Essentialsを用いて永続化する。
  • NetBeansのプロジェクト作成ウィザードに、DBアプリのものがあったので、それを利用する。
  • 永続化データは必要最小限の、ISBNデータのみにする。
    • ただし、可読性の改善として、書籍名も永続化する。これはAmazonからISBNをキーにして取得できるだろう。
    • ISBNを入力する時間的コストを削減するため、ハードウェア(バーコードリーダ)を用いる。

以下の記述は、上記のうち2点目の、NetBeansのウィザードを用いたDBアプリ作成手順の記録である。このウィザードを用いれば、永続化データの入力・参照用のGUIが手軽に作成できる。

簡単に済むと思っていたが、このDBアプリ作成ウィザードは既に永続化するDBテーブルが存在することが前提のようであり、今回のようにDBも新規作成する場合が考えられていないようだった。

本来、このような場合はウィザードで「Javaアプリケーション」を選択すべきだろう。実際、Nicobrowserはそちらで作成した。しかし、DBアプリ作成ウィザードの方が永続化データとJTableのバインディングが手軽そうなので、今回はこのメリットを享受することを選んだ。

手順としては大きく「インプロセスDBの作成」「DBアプリ作成」の2つになる。

インプロセスDBの作成

インプロセスDB作成用のダミープロジェクトを作成する。「新規プロジェクト」から「Javaアプリケーション」を選択し、適当な名前を付けたプロジェクトを作成する。

01create_dummy_project

ライブラリフォルダのコンテキストメニュー「新規」>「ライブラリの追加...」から、インプロセスDBとJPAを追加する(事前にライブラリの作成が必要)。今回はNicoBrowserで設定したものを使い回し、DBにH2、JPAにTopLink Essentialsを利用する。

02add_library

「新規」>「エンティティークラス」を選択し、永続化するエンティティクラスを作成する。今回は"Book"という名前にした。この操作を行うことで、Book.javaファイルが生成される。

03create_entity

Book.javaを開き、以下の修正を行う。なお、今回永続化するのは「書籍バーコード(上段); upperCode」「書籍バーコード(下段); lowerCode」「書籍名; name」の3種で、書籍バーコード(上段)をプライマリキーとすることにした。

  • ID自動生成を止めるために@GeneratedValue...の行をコメントアウト。
  • IDの変数名をidからupperCodeに変更。これは変数名"id"を選択した状態でCtrl+Rキーを押すことで一括置換できる。
  • その他の属性lowerCode, nameを追加。
  • setter, getterを追加。これは、Ctrl+Insertキーを押した後「取得メソッド及び設定メソッド...」を選択することで自動生成できる。
  • 元々存在していたsetId, getIdメソッドを削除。

以上の編集を行ったBook.javaは下記の通りとなる。

@Entity
public class Book implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    // @GeneratedValue(strategy = GenerationType.AUTO)
    private String upperCode;
    private String lowerCode;
    private String name;

    public String getLowerCode() {
        return lowerCode;
    }

    public void setLowerCode(String lowerCode) {
        this.lowerCode = lowerCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUpperCode() {
        return upperCode;
    }

    public void setUpperCode(String upperCode) {
        this.upperCode = upperCode;
    }
(以下略)

 

エンティティクラスの生成と同様の手順で、「新規」>「持続性ユニット...」を選択し、持続性ユニットを生成する。設定した値は以下の通り。

持続性ユニット名 デフォルトのまま(BookDBPU)
持続性ライブラリ 追加したJPAライブラリを指定
データベース接続 「データベースの新規接続...」を指定

ここで、「データベースの新規接続...」を選択すると、接続するDB情報の入力を求められる。これに対して、次のように入力する。

04create_db

名前 org.h2.Driver
基本設定:ドライバ org.h2.Driver
基本設定:データベースのURL jdbc:h2:db/BOOK
基本設定:ユーザ名 sa
基本設定:パスワード (未入力)
詳細:スキーマを選択 PUBLIC

「データベースのURL」で、dbフォルダ以下にBOOKという名前のDBを作成することを指定している。

META-INFフォルダの下にpersistence.xmlが生成される。これを開き、「含めるエンティティークラス」にBookが含まれていることを確認する。含まれていなければ手動で追加する。

05edit_pu

DBの実体を生成する。Main.javaを下記の通りとし、プロジェクトの実行を行うことで、dbフォルダとそのフォルダ以下にDBができる。

public class Main {

    public static void main(String[] args) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("BookDBPU");
        EntityManager manager = factory.createEntityManager();
        manager.close();
        factory.close();
    }
}

このdbフォルダが、今回使用するDBである。このフォルダを適当な場所へ移動、リネームする。今回はフォルダ名をBOOKにリネームし、F:\data\DBディレクトリに置いた

06my_db

これでこのプロジェクトの役目は終わりであり、削除してしまって問題ない。

 

DBアプリ作成

「ファイル」>「新規プロジェクト...」を選択し、「Javaデスクトップアプリケーション」を選択する。

11create_new_project01

次のステップでは「データベースアプリケーション」を選択する。

12create_new_project02

DBの設定は、先のプロジェクトと同様に設定する。ただし、「データベース接続」設定での「データベースのURL」は絶対パスで指定する。今回は前述の通りF:\data\DB\BOOKディレクトリにBOOKデータベースをコピーしたのでjdbc:h2:F:\data\DB\BOOK\BOOKとなる。

13create_new_project03 14create_new_project04

ウィザードを進め、完了すればプロトタイプの完成である。このGUIから、DB永続化の実行と、永続化されたデータの参照が行える。

次回は、入力サポート機能を追加する。

« 2008年8月 | トップページ | 2008年11月 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ