2009年1月31日土曜日

EclipsePluginの青本が届いた!

EclipsePluginの青本とAGILE ESTIMATING AND PLANNINGが一緒に届いた。青本…やっぱり厚いなw 写真の一番下にあるのが青本。

下から2番目は青本と同じたけぞえさんが書いてる独習JavaScript。たけぞえさんは去年この2冊を書いておられたらしいが、どっちも厚すぎ!そりゃ忙しいわ…。

そして、上の2冊が最近やっと読み終えた「実装パターン」「ThoughtWorksアンソロジー」。どっちも非常に良い本だったからおすすめ!

それにしても、しばらくは読書が大変そうだ…(青本はリファレンス的に使うと思うけども)。

真ん中の銀色はMacbookAirです、薄いね!これもおすすめw

2009年1月24日土曜日

Iterator#remove()?

ついさっき次のような発言を見かけてショックを受けた。ええーループ中に削除なんてできないっしょ?と思ってしまった。なんといぅか、それが自分の中での常識だったのだ。だけど、あえてIteratorインターフェースが提供しているという事は…できるんだろぅな、いやどーなんだ、と思って試してみた。もし「できた」となると、過去に書いてきたコードで糞のよぅな無駄を生んできたという事実が残ってしまう。過去の事実を考えると変な汗が出るので出来て欲しく無いが、できたら出来たで今後は便利になる。
package com.shin1ogawa;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.util.*;
import java.util.Map.Entry;
import org.junit.*;

public class IteratorTest {
  private Map<Integer, String> map;
  private List<Integer> list;

  @Before
  public void setUp() {
    map = new HashMap<Integer, String>();
    for (int i = 0; i < 10; i++) {
      map.put(i, "value" + i);
    }
    assertThat(map.size(), is(10));
    
    list = new ArrayList<Integer>();
    for (int i = 0; i < 10; i++) {
      list.add(i);
    }
    assertThat(list.size(), is(10));
  }

  @Test
  public void hashMap() {
    Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
      Entry<Integer, String> next = iterator.next();
      if (next.getKey() % 2 == 1) {
        iterator.remove();
      }
    }
    System.out.println(map);
    assertThat(map.size(), is(5));
  }

  @Test(expected = ConcurrentModificationException.class)
  public void hashMap2() {
    Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
      Entry<Integer, String> next = iterator.next();
      if (next.getKey() % 2 == 1) {
        map.remove(next.getKey());
      }
    }
  }

  @Test
  public void arrayList() {
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {
      Integer next = iterator.next();
      if (next % 2 == 1) {
        iterator.remove();
      }
    }
    assertThat(list.size(), is(5));
    System.out.println(list);
  }

  @Test(expected = ConcurrentModificationException.class)
  public void arrayList2() {
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {
      Integer next = iterator.next();
      if (next % 2 == 1) {
        list.remove(next);
      }
    }
  }
}
うわわわ…。

2009年1月23日金曜日

eclipseのアシストに感動した!

しょっちゅう感動してるし、そもそも有名な機能かもしれないけど。

  • まずはこんなカンジ
  • で、JComponent型の変数componentのinstanceofによる型の確認を少し書いてみると…

    すげぇぇぇ!まだifのブロックも閉じてないコンパイルエラーの状態だし、componentのキャストもまだ書いてないし!!
  • で、新たに候補として上がったAbstractButton#setText()を選択して確定するとこぅなる。

    まさに俺がやろぅとしていた事です!型推論どころか「あなた推論」をやってのけるeclipseすごいよ、マジすごい。
  • ちなみに、Class#equals()ではダメ。

europaでは確認できなかったのでganymedeから導入された機能だと思うけど、JDTのバージョンによってはeuropaでもできるのかな?

2009年1月21日水曜日

eclipseのリファクタは便利だけど、たまにビミョー

eclipseにメソッドを自動生成させた直後の状態だと、タブで各要素を移動しながら名称を変更できる。が、この状態でメソッドのパラメタの名称を変更しようとするとJavaDocの@paramが追随してこない。

自動生成直後じゃない場合は、当然追随してくれるんだけど。

2009年1月17日土曜日

MacOS用のSkype2.8betaが便利

Skypeの2.8betaがリリースされていたので使ってみる。

手順は、ビデオチャットを開いて「共有」メニューから「全画面を共有」するだけ!

ちょっと画像が小さくてわかりにくいけど、ビデオ通話ウィンドウにこんなカンジに表示される。

MacOXの拡大機能やワークスペースの切替等の機能もちゃんと反映される。

これはペアプロのプラットフォームとして使えるか!?と思ったけど、当然ながら単なる通話ウインドウなので操作はできないwでも、Eclipse上の操作がこれだけ鮮明に共有できるのであれば十分便利だと思った。

追記

そうそう、同一LAN内同士だとうまく繋がらない状況がある、といぅ現象も解消されているよぅだった。快適。

2009年1月7日水曜日

「これなしでは生きていけない」ウェブ・サービス

TechCruchに記事が上がっていたので、影響されて自分なりの物も書いてみる。

Slimtimer

Time Tracking。これが全ての行動のフロントとなる…なるべき!と考えている。こいつでの操作を全てFriendFeedやTwitterに流す事で自分の行動を細かく記録できる…特に社内での行動はそうすべき!と考えている。行動を見せる事からやらないと、社内の可視化や透明化の根本的な部分が実現できないと思う。

Remember The Milk

個人的なタスク管理。かなり優秀で、有料サービスの方を使用している。今はEclipseのPluginを作りかけていたりもする。Remember the MilkのタスクをTimeTrackingに取り込んで使用するのが気持ちいい。
困っているのは、個人のタスク管理以外のタスク管理はまた別に存在していて、TracやらRedmineやらJIRAやらも併用しているという事。あ、ついでに書くと、仕事でのタスクは必ず1タスク6h以内をメドに分割して使う。進捗率は0% or 100%みたいなカンジで使うのがリズムが良い(50%の状態もあったりするけどw)。

FriendFeed

こいつで自分の行動を一本化し、行動ログというかライフストリームとして使用している。

Google Reader, Gmail, Google Sites, Google Calendar, Blogger

Google様のシリーズ。言わずもがな。ブックマークは使ってない。

Assembla

個人的なソースコードは全部ここに置いている。去年辺りからメジャーになってきたよぅな気がして少し嬉しい。

Twitter

生産性に…という人もいるが、その分以上にインプットが多いと思うな。そんなに時間を割かなくても、アウトプットにつなぐための質の良いインプットを提供してくれていると感じてる。本気で生産性が落ちると言ってる人は、使い方が上手く無いんじゃないかなーと思う。
また、社内の可視化に使うための「準」フロントにもなるとずっと考えていたけど、最近の各種サービスのローンチを見ているとどぅやらその考え方は正しいよぅだ。だけど、実際のフロントは「Time Track」で、その内容を「Microblog」でフィード、一部コメントはそこへの返信で…といぅ形が最も自然に使えて浸透し易いシステムじゃないかなーとか考えている。

ガジェット:iPhone 3G

TechCrunch同様、これはサービスでないが絶対に必要なもの。ByLine(App)を使ったGoogleReaderとの連携、ToDo(App)を使ったRemember the milkとの連携、NatshLiphone(App)を使ったTwitterの利用、Mac上のiCalを使ったGoogleCalendarとの連携…。そして、案外重要な使い方なのが散歩の時のGPSの利用。散歩中に、迷子になる事を恐れずアレコレ適当な道に突入できる。

個人的に重要な順番に書いてみた。他にもいくつか使っているけど、それらはあまり使用頻度が高く無い。毎日使うって程は使っていない。

  • Tumblr
  • Evernote
  • delicious
  • Passpack
  • Magnolia(ブックマークはdeliciousを使っているが、辞書や翻訳した単語はこっちに登録している)

これらは便利なWEBサービスで、無いと困る。でも、去年から考えているんだけど、別にWEBブラウザで使う必要って無いと思う。専用クライアントの方が便利だと思う派。データ構造だけはサーバ側に置きたいけど、個人的にはUIはブラウザよりもAIRが好み。究極はすべてのタスク管理(BTSも)をSlimTimerの専用クライアントから状態操作をしたかったり。例えばTracなんかだと色んなプラグインを作る必要も無くて、クライアント側の好きなプラットフォームでグラフなり、タスクの親子関係やら何やら色々作れば良い。

ちなみに、技術者であればたくさんアンテナを広げて色んなサービス(そのローンチも)を「知っているか」「見たか」「触ったか」という事がめっちゃ大事だと思う。そういった様々なサービスの登場を細かくチェックして、見たり触ったりして、「どんな使い方をさせるのか」「どんな便利なUIを持つのか」…といった「パターン」を吸収して行くべきだ。こういった知識と経験なが無いと、絶対に良いものは作れないし提案も出来ない、と感じてる。

ここまで書いて、色んなサービスを書いたのにリンクを貼ってない事に気づいた。面倒なので諦めます、興味持った方はごめんなさい><