Guice(じゅーす)で簡単なテストプログラム(といっても記事で紹介されていたものそのまんまだが)を作ってみた。
—–
Eclipseのショートカットキーに関する情報をまとめます。
以下のサイトが参考になります。エディタにフォーカス当てるとか、選択中のビューの最大化とかは基本中の基本なので、作業効率アップの為にも癖にしておいた方が良い。
eclipsewiki.net – このウェブサイトは販売用です! - eclipsewiki リソースおよび情報
http://shortcutkey.ivory.ne.jp/Eclipse/list1-2.html
TOMCAT起動 | Alt + Shift + T, S |
TOMCAT停止 | Alt + Shift + T, T |
TOMCAT再起動 | Alt + Shift + T, R |
いちいちマウスでアイコンをクリックするのは手間だし、上部のメニューから選ぶのも結構面倒臭いので、この機能にもショートカットを割り当てている。若干押しにくい配置ではあるが、そこまで頻繁に行う作業ではないので問題はない。
カーソルを左に移動 | Ctrl + Alt + H |
カーソルを下に移動 | Ctrl + Alt + J |
カーソルを上に移動 | Ctrl + Alt + K |
カーソルを右に移動 | Ctrl + Alt + L |
ページダウン | Ctrl + Alt + F |
ページアップ | Ctrl + Alt + B |
行頭に移動 | Ctrl + Alt + 0 |
行末に移動 | Ctrl + Alt + 4 |
viプラグイン等も試してみたのだが、Eclipseに搭載されている機能とViのカーソル移動を両立させるにはこの方法が一番良いように思う。ちなみにCtrl + Alt + HはCallHierarchyに割り当てられていたので、これをCtrl + Alt + Cに移動した。
検索したい単語の上でShift + Alt + ↑を押し、その後Ctrl + Kで検索を進める。戻りたければCtrl + Shift + Kを押す。
既に知っている方も多いと思うが、仕事で引っかかったので。
FileクラスのrenameToメソッドはどんな場合でも使えるという訳ではなく、ファイルシステムを超えて使おうとしたときにどうなるかはOS依存らしい。
File (Java 2 Platform SE v1.4.2)
Whether or not this method can move a file from one filesystem to another is platform-dependent. The return value should always be checked to make sure that the rename operation was successful.
なのでファイルの移動したいときには、例えばきちんとFileInputStreamで読んでFileOutputStreamで書くなどの対処が正攻法のようだ。
PythonのPickleモジュールについて学んだので、ついでにJavaの場合を調べてみた。
JavaではSerializableインターフェースというのを継承したクラスであれば、そのインスタンスをバイトストリーム化し、ソケットなどにも書き込めるようだ。簡単な通信テストのため、SerializeServer、SerializeClient、送受信するTransDataクラスを作成した。
—–
http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352
で作成したプログラムだが、.exeも.xlsでもなんでも送れることが確認できた。FileStreamというのは一体どういう仕組みなのか、勉強しようと思う。非常に便利だ。便利すぎて馬鹿になりそうだから勉強しよう。
まあファイルをバイト列に分解しているということのはずだが。。
簡単なファイル転送プログラムを作ってみた。
サーバ側のソースは以下。ソケットから受けとったバイト配列を、引数で指定したファイルのストリームに書き込んでいるだけ。特に理由はないが、32バイトずつその作業を行っている。
import java.net.*; import java.io.*; public class FileTranServer { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("An argument should be port and filename"); int servPort = Integer.parseInt(args[0]); String filename = args[1]; System.out.println("Output file name : " + args[1]); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out int totalByte = 0; while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); //Write to file totalByte = totalByte + recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); } System.out.println("Recieved file size : " + totalByte); clntSock.close(); fout.close(); fout = null; } } }
次はクライアント側。これも引数で指定したファイルのストリームから、32バイトずつソケットのバイト配列に書き込むだけ。
import java.net.*; import java.io.*; public class FileTranClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and filepath"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); String filename = args[2]; byte[] data = new byte[32]; //ソケットの作成 Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = socket.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; while ((len = fin.read(data)) != -1) { totalSize = totalSize + len; System.out.println(new String(data,0,len)); out.write(data, 0, len); } fin.close(); fin = null; System.out.println("size of file : " + totalSize); socket.close(); } }
32バイトずつでも、250KBくらいだったらあっという間に送信できる。まあ同じPC内だから当たり前なのだろうか。別のPCと接続してやってみる必要あり。
ソケット通信でファイル転送をするプログラムを作ってみようと試みている。とりあえず手始めとして、簡単な文字列を送るプログラムを作ってみた。本日はファイル転送までは手が回らず。
クライアント側のソースは以下。引数として、サーバのアドレスと、サーバ側プログラムが使用するポート番号、送信する文字列を指定する。
import java.net.*; import java.io.*; public class FileTranClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and message"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); byte[] byteBuffer = args[2].getBytes(); //Create Socket Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //Create OutputStream OutputStream out = socket.getOutputStream(); out.write(byteBuffer); System.out.println("sent message : " + args[2]); socket.close(); } }
サーバ側のソースは以下。引数として、このプログラムが実行されるポート番号を指定する。
import java.net.*; import java.io.*; public class FileTranServer { public static void main(String[] args) throws IOException{ if (args.length != 1) throw new IllegalArgumentException("An argument should be port"); int servPort = Integer.parseInt(args[0]); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); } clntSock.close(); } } }
サーバ側にて、
//int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32;
としてるところがポイントで、クライアント側から送られてきた文字列を1回32バイトずつ読み込むようにしてみた。ちなみにコメントアウトされてるほうでbufSizeを宣言すると、8192バイトずつ読み込まれるようになった。これはおそらく、僕のPCのデフォルト値なのだろう。
送信するメッセージは、以下の105バイトの文字列とした。
TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori
以下に実行結果を示す。
クライアント側の実行結果。
Connected to server sent message : TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori
サーバ側の実行結果。
Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 127.0.0.1 on port 1045 Message : TokyoNagoyaOsakaNewYorkFukuokaSe Size : 32 Message : oulSapporoSeattleLosAngelesChiba Size : 32 Message : YokohamaKyotoNaraParisFlorenceAk Size : 32 Message : itaAomori Size : 9 Wait for accepting...
32バイトずつ文字列が読み取られている様子が目にみえた。次回はこれを改良し、ファイルの転送にまで繋げたい。おそらくファイルストリームとかいうやつを使うことで出来るのではないか。
今回Javaを勉強しているのだが、ネットワークなどについても何も知らないことに気付かされる。勉強しないとなぁ。
以下が参考にしている書籍。非常にわかり易く解説されていると思う。実例から理論的な説明まで載っているし、何より薄くて扱い易いところが○。大学の教科書として書かれたようで、手始めには適していると思う。ただファイル転送に関する話は載っていないようなので、また情報を探さないと。
id:hyukiさんのエントリで、『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』無料プレゼントを行っている。僕も早速応募してみる。
ちょうどJavaの勉強中だし、d:hyukiさんの文章はわかり易くて好感が持てた記憶がある。これを機会にプレゼントの対象になっていない以下の本は購入しよう。
earファイルをTomcatにdeployする方法が分からない。以下のサイトによると、
Tomcat is a servlet/JSP container available from the jakarta.apache.org site. Tomcat deals only with WAR files. So, in order to auto-deploy a Web application to a Tomcat environment, you must place an application’s WAR file in the appropriate directory or use Tomcat’s deployment tools to manually deploy the file. If you already have an EAR file that contains the WAR file, you can extract the WAR file and use it as is. If you do not have the EAR file or the WAR file, you can use any number of compliant tools to create the WAR file. The following sites discuss the Tomcat deployment process in detail:
と書いてある。つまりwarファイル形式しかTomcatは自動で扱ってくれないということだろうか。earファイルからwarファイルを抜き出せと書いてあるが、今度はその方法が分からない。
あとwarファイルだが、以下の説明を読んだら、Tomcatは展開してから利用するようだ。つまり「纏めすぎてうんぬん」と書いた件は杞憂に終わった。
http://tomcat.apache.org/tomcat-4.0-doc/appdev/deployment.html
When Tomcat is started, it will automatically expand the web application archive file into its unpacked form, and execute the application that way. This approach would typically be used to install an additional application, provided by a third party vendor or by your internal development staff, into an existing Tomcat installation.