Windowsのコマンドプロンプトでファイルを作成する

mkdirはあるけど、touchとかないし、
コピーや移動はできるけど、
コマンドプロンプトでどうやってファイル作るんだ?
って実は新人の頃から思っていた。


まぁなんかあんだろうと思って、
ずーっとほったらかしにしてたわけだけど
(ってか丸5年間ほったらかしってひどいですが・・・)


で、今日調べてみたら、ないでやがんの。
ってかほんとにないっぽい。


そしたら、エディタなしでテキストファイルを作成する方法
ふーん。。

C:\hoge>echo テストデータです。 > test.txt

C:\hoge>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 6CCB-417E です

C:\hogeディレクト

2007/04/10 19:26

. 2007/04/10 19:26 .. 2007/04/10 19:26 21 test.txt 1 個のファイル 21 バイト 2 個のディレクトリ 39,878,098,944 バイトの空き領域


めでたし、めでたし。


っていうか、MS-DOSだった頃って、
テキストファイルの編集とかって
どうやってやってたんでしょうか?
viみたいのがあったのでしょうか?

はじめてのPlagger

俺も「それPla」って言ってみて。
とか前々から思っていたものの、なかなか手を出せず。


ようやく常駐先から本社に戻ってきて、
あまりやることもないのでいじってみることに。


今いる会社では、グループウエアにLotusNotesというのを
使っていて、個人的に非常に使い勝手が悪い。


そしたら、事業部も全く違う先輩がLotusNotesにアクセスして、
メールをゴッソリもってきてRSSフィードに登録する〜
なんていうプラグインを作成していて、頂戴した。


config.yamlをどう書いていいやらわからず、
perlの文法もわからず、
体当たり主義的にネットやソースコードをみながら動かす。


最終的に半日かかってようやく動かせて、
Thunderbirdからメールやら社内SNSの最新記事やらを
読めるようになりました。


この調子で普段みてるものをバンバンとってきて
一元管理してしまいたいなぁと。


っていうか、こういうことやってると
自然になんとなく言語が分かったりして。
たまにはこういうことするのもいいなぁと。

Mash up Award 2nd

事業部が違うので、研修も一緒じゃなかったし、
仕事上でも全然絡みがないけれども、ネット上ではよく絡んでる同期が、
Mash up Award 2ndで賞を3つも取った!!


詳細は彼のブログで。
個人的にはwordariumがお気に入りです。


世の中どんどん変わってて。
クラッチでもの作らなくても、
あるものをいい感じに組み合わせて使って。


楽しまなきゃ。俺も。


っていうか、前回もうちの会社のチームが賞を取ったわけだけど。
うちの部の人とか全くしらなくて。
そこら辺がうちの会社ちょっと寂しいなと思います。

ちょっとしたこと(ファイルの中身の置換)

root
  |
  hoge01
    |
    hoge101.html
    hoge101.jpg
    hoge102.html
    hoge103.html
  hoge02
    |
    hoge201.html
    hoge202.html
    hoge203.html
  hoge03
    |
    hoge301.html

こんな感じでHTMLファイルが置いてあって、
全てのHTMLファイルのタイトルタグの中を一律に変更したくて。

require "fileutils"
Dir.glob("C:/root/*/*.html").each{ |file|
  FileUtils.mv(file, file + ".hoge");
}

置換対象のファイルをブワーっと".html.hoge"という名前に変えます。


で、以下のようなスクリプトを書きました。

f = open(ARGV[0])
while line = f.gets
  if (line.index("<title>") == nil)
    puts line
  elsif
    puts line.sub("<title>", "<title>ほげほげ ") 
  end
end
f.close

プログラムの起動引数で渡されたファイルのフルパスを元に
タイトルタグの部分を書き換えます。
title_chage.rbという名前で保存します。


で、こんな風に呼び出し用のリストを作ってブワーって。

ruby title_chage.rb C:/root/hoge01/hoge101.html.hoge > C:/root/hoge01/hoge101.html
ruby title_chage.rb C:/root/hoge01/hoge102.html.hoge > C:/root/hoge01/hoge102.html
ruby title_chage.rb C:/root/hoge01/hoge103.html.hoge > C:/root/hoge01/hoge103.html

".html.hoge"のタイトルタグ部分を置換させたものを
".html"ファイルにリダイレクトさせます。


呼び出し用のリストを作るのも、
Dir::globと正規表現で置換すればサクっとできます。


って、そんなことしてたら、華麗なる一族がはじまっちゃったじゃないですか。

はじめてのAOP

今日はAOPです。

Advice(MethodInterceptor)
→プログラム中に挿入されるコードを表します。Interceptorと呼ばれることもあります。


Joinpoint(MethodInvocation)
→対象となるクラスとAdviceを結合するポイントを表します。
 AdviceはJoinpointから引数やメソッドの情報を取得することができます。


Pointcut
→どこにJoinpointを設定するのかを定義します。


Aspect
→AdviceとPointcutを関連付けます。


InterType
→フィールドやメソッドの追加、実装するインタフェースの追加など,
 クラスの静的な構造を変更します。


いきなり知らない単語が羅列されるとびびります。
なんとなく、わかったような気になってみます。
でも、まったく実感わかないので、先に進みます。
# メリットだけは先に知ってたりします。。


で、設定例をみてみます。

<component class="java.util.Date">
    <aspect pointcut=".*">
        <component class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
    </aspect>
</component>


んー、ようわからん。。
TraceInterceptorのソースをみてみる。
なんかイロイロやってるけど、BEGINとENDが出力されるっぽい。


とにかく実装してみよ、、ということで。
こないだDIコンテナを動かしたときのソースに
↓を追加して、dionファイルに↑を追加する。

java.util.Date date = (Date) container.getComponent(Date.class);
System.out.println(date.getTime());


で、動かす。

DEBUG 2007-02-27 11:20:08,750 [main] S2Containerを作成します。path=study/dicon/BatchMain.dicon
DEBUG 2007-02-27 11:20:08,937 [main] S2Containerを作成しました。path=study/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。
WARN 2007-02-27 11:20:09,250 [main] java.util.Dateのメソッド(parse)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,328 [main] java.util.Dateのメソッド(UTC)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(getClass)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(notify)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(notifyAll)にはアスペクトを適用できない修飾子が指定されています
DEBUG 2007-02-27 11:20:09,406 [main] BEGIN java.util.Date#getTime()
DEBUG 2007-02-27 11:20:09,406 [main] END java.util.Date#getTime() : 1172542809406
1172542809406

なんかめっちゃワーニング。
Objectを継承したメソッドや、staticメソッドは
だーめよ、ってことなんでしょうか。


では、

にしてみます。

DEBUG 2007-02-27 11:25:03,187 [main] S2Containerを作成します。path=study/dicon/BatchMain.dicon
DEBUG 2007-02-27 11:25:03,390 [main] S2Containerを作成しました。path=study/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。
DEBUG 2007-02-27 11:25:03,640 [main] BEGIN java.util.Date#getTime()
DEBUG 2007-02-27 11:25:03,640 [main] END java.util.Date#getTime() : 1172543103640
1172543103640


なるほどねぇ。
にしても、kijimunaは便利っすねぇ。
今のプロジェクトでも、
XMLとソースコードを行ったり来たりするのが大変で。


こういうかゆいとこに手が届いてる感が魅力的です。

はじめてのDIコンテナ

最近仕事でセンタに長時間ラチられるため、勉強の時間が取れず。
ようやく開始。


いきなりよくばってWebアプリとかはじめると挫折しそうなので、
バッチアプリでS2DAOをいじくるとこからはじめようと。


で、手はじめに。
ダウンロードしてきたexamplesの中に作成


Batchというインタフェースを作ります。

package examples.di;

public interface Batch {

  Object execute();

}

で、その実装クラス

package examples.di.impl;

import examples.di.Batch;

public class BatchImpl implements Batch{

  public Object execute() {
    
    System.out.println("呼ばれました");
  
    return null;
  }
}


こいつを呼び出すmain文を持つクラス。
第一引数に指定された文字列でコンポーネント定義を探して
インスタンスを取得するような形です。

package examples.di.main;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

import examples.di.Batch;

public class BatchMain {
  
  private static final String PATH = "examples/di/dicon/BatchMain.dicon";
  
  public static void main(String[] args) {
    S2Container container = S2ContainerFactory.create(PATH);
    
    Batch bt = (Batch) container.getComponent(args[0]);
    Object o = bt.execute();
    
  }
  
}


で、そのコンポーネント定義。
"batch"という名前でimplクラスを定義。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC
  "-//SEASAR//DTD S2Container 2.3//EN"
  "http://www.seasar.org/dtd/components23.dtd">
<components>
  <component name="batch"
    class="examples.di.impl.BatchImpl">
  </component>
</components>


でもってDIコンテナということで。
依存性を持たせます。


DataAccessObjectというインターフェースを作ります。

package examples.di;

public interface DataAccessObject {

    Object execute();
    
}


実装クラスはそのうち、データベースにアクセスすることにして、、

package examples.di.impl;

public class DataAccessObjectImpl {

    public Object execute() {
    
        System.out.println("いずれデータベースにアクセスします。。");
 
    return null;
    }
}


BatchImplにセッターを作ってDataAccessObjectの
インスタンスをインジェクションして呼び出す形にします。

package examples.di.impl;

import examples.di.Batch;

public class BatchImpl implements Batch{
    
    private DataAccessObjectImpl daoi;
    
    public Object execute() {
        
        System.out.println("呼ばれました");
        daoi.execute();
     
        return null;
    }
    
    public void setDataAccessObjectImpl(DataAccessObjectImpl daoi){
        this.daoi = daoi;
    }
}


定義ファイルはpropertyタグを使ってインジェクションの定義をします。
daoiのクラス定義をcomponentタグで追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC
    "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd">
<components>
    <component name="batch" class="examples.di.impl.BatchImpl">
          <property name="DataAccessObjectImpl">daoi</property>
    </component>
    <component name="daoi" class="examples.di.impl.DataAccessObjectImpl">
    </component>
</components>


んで、実行すると、、

DEBUG 2007-02-23 19:40:45,593 [main] S2Containerを作成します。path=examples/di/dicon/BatchMain.dicon
DEBUG 2007-02-23 19:40:45,765 [main] S2Containerを作成しました。path=examples/di/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。

今日からSeasar2の勉強をはじめます。

勉強する理由


・4月から担当になるプロジェクトもJavaになりそう。


・DIとAOP
→理屈はわかってるので。実感してみたい。


XML地獄からの解放
→今はモロ地獄に落ちています。


・日本語の使えるコミッタやユーザがネット上にいる
→結構気が小さいもので。


・新しいことやりたい
→実はこれが一番大きいかなぁ。


ただ、導入するにあたっていろんな人を説得する局面もあるだろうし。
生産性と品質は外せないファクター。


それが立証できれば良いのかなと。


っていうか、まずは自分が触ってみて、
どんなもんか理解しないと、、ということで。



で、何からはじめようかと。


まずは、本家のSeasar2のコンテナのセットアップページ
http://s2container.seasar.org/ja/setup.html


ダダダっと使用するライブラリが列挙。
知らないライブラリが出てくるとビビってしまいます。
いつどこで、どんなことがあるかわからないですし。


① aopalliance-1.0.jar

とりあえす、それぞれが何をするものなのかだけ簡単に。
aopalliance でググってみると↓の@ITの記事がみつかる。
http://www.atmarkit.co.jp/fjava/rensai3/springdi03/springdi03_1.html

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

↑みたいなクラスがあるようだ。
Interceptorってサッカーでパスをカットするようなイメージ。
Invocationって実行とか呼び出しっていう感じでしょうか。
で、ソースコード読むと、

public class MyMethodIntercepter implements MethodInterceptor{
  public Object invoke(MethodInvocation invocation) throws Throwable {
    System.out.println("メソッド実行前");
    Object result = invocation.proceed();
    System.out.println("メソッド実行後");
    return result;
  }
}

invocation.proceed の前後に割り込んでいる感があります。
で、こいつがどうやって呼ばれてるかというと…XML。。。
クラスにidつけて、そいつがどういう風に動くか定義してあるんだけど、
あー、そんな風に動くのねっ、、て、そういう勉強が本質ではないので、
次に進みます。
ま、AOPなんでしょう。aopalliance。


② commons-logging-1.1.jar
こいつは知ってるし、今の使ってるので飛ばします。


javassist-3.3.ga.jar
なんだちみは?ってことで、ググります。
↓なにやら本家的なサイトがひっかかりました。
http://www.csg.is.titech.ac.jp/~chiba/notes/javapress03/index.html
Java バイトコードを操作するクラスライブラリらしい。
バイトコードって聞くだけでなにやらオタッキーなカホリがしてきますが、
読んでくとなにやら便利そうです。あんまり深くつっこむのはやめておきます。


④ ognl-2.6.7.jar
コレみたことあります。使ったことないですが。
なんか直感的に文字の並びが、 おにぎり みたいな気がして個人的に
グッときます。(そんな話はほんとにどうでもいいですが…)
式言語なんですね。タグライブラリと組み合わせて、ちょちょっといい感じに
できるんでしょうか。


⑤ s2-framework-2.x.x.jar
コレは、まぁ。なんていうか。


geronimo-j2ee_1.4_spec-1.0.jar
ジェロニモ。アパッチのおたけび!!
いつぞやかのITアーキテクトサミットかデブサミ
講演を聞いて、グッときたプロダクト。
でも、S2JTA,S2Txを使う場合とか、S2Tigerを使う場合とか
よくわからないですが、どんな使い方するのかよくわからないので
飛ばします。


portlet-api-1.0.jar
ググってみると↓のサイトがみつかりました。
http://journal.mycom.co.jp/news/2005/10/20/033.html

PortletServletのようなものだが、いくつかの点でServletとは根本的に異なっている。
たとえばServletではリダイレクトやリクエストのフォワーディング、
ストリームへの任意のマークアップの送信ができるが、Portletではできない。
PorletではPortletの仕様にのっとってインフラストラクチャに用意されてる機能のみを使ってのアクセスなどが提供される。
またServletはそれ単体でスタンドアロンアプリケーションとして動作するが、Portletはそういったものではないという。

うーん。よくわかりません。。。


log4j-1.2.13.jar
これは普段使ってます。



で、Seasar2拡張機能(S2JTA, S2DBCP, S2JDBC, S2Unit, S2Tx, S2DataSet)を利用する場合、、
はにゃ?って感じですが、みてみます。


junit-3.8.2.jar
普段使ってます。


② poi-2.5-final-20040804.jar
これはエクセルと連携するときに使うやつっすよね。


③ s2-extension-2.x.x.jar
なんか拡張なんでしょうか。。


geronimo-jta_1.0.1B_spec-1.0.jar
geronimo-ejb_2.1_spec-1.0.jar
ジェロニモねぇ。



で、S2Container用のプラグインKijimunaも是非ご利用ください。
↑こういうのを使いたいんですよね。なんというか。



EJB3アノテーションを使いたい場合は、
→ひとまず使わないかなぁ。。



Tigerアノテーションを使いたい場合は、
→うーん。後から考えます。



そんな感じで、これからいよいよセッティングです。