メイン



ソフトウェア技術 アーカイブ

2007年08月14日

ソート・リネームバッチ

ss1.JPG


突然ですが、ソフトウェア技術のポストをします。
技術って言ってもウィンドウズコマンドプロンプトのバッチなのですが、
今回作ったバッチはファイル名の変換を行うもので、ストップモーションアニメの編集に使っているものです。こんな感じになるんだって言うスクリーンショットを上げてみました。





ss2.JPG

なにが行われるのかというと、以下のようにファイルが6つある場合、

movie0001.jpg
movie0002.jpg
movie0003.jpg
movie0004.jpg
movie0005.jpg
movie0006.jpg

このファイル群を名前の降順(小さい順)でソートすると上記のように並びます。

これを以下のように名前を変更してあげるバッチです。

movie0006.jpg → movie0006.1.jpg
movie0005.jpg → movie0006.2.jpg
movie0004.jpg → movie0006.3.jpg
movie0003.jpg → movie0006.4.jpg
movie0002.jpg → movie0006.5.jpg
movie0001.jpg → movie0006.6.jpg


ss3.JPG

なにに使うのかは次のエントリに記したいと思いますが、以下のようなコードを書きました。

ダウンロード
01:> dir /b *.jpg | sort /R > dir.txt
02:> echo rem ファイル名を降順ソートしてリネームします>temp.bat
03:> set SWAPFILENAME=
04:> for /f "tokens=1,2* delims=." %%i in ( dir.txt ) do (
05:> set SWAPFILENAME=%%i
06:> goto label
07:> )
08:> :label
09:> for /f %%i in ( dir.txt ) do (
10:> echo SET STAMP=%%time%%>>temp.bat
11:> echo SET STAMP=%%STAMP::=%%>>temp.bat
12:> echo SET STAMP=%%STAMP:.=%%>>temp.bat
13:> echo SET STAMP=%%STAMP: =0%%>>temp.bat
14:> echo ren %%i %SWAPFILENAME%.%%STAMP%%.jpg>>temp.bat
15:> echo ping localhost -n 1 >>temp.bat
16:> )
17:> start temp.bat

簡単に解説します。

1行目は*.jpgファイルをファイル名で昇順(大きい順)に並べて dir.txt に落としています。unixでいう ls -lr コマンドですね。
2行目は temp.bat の作成です。とりあえずrem文をリダイレクトしています。 temp.bat は実際にリネームするバッチファイルになります。
3行目は変更先のファイル名の変数定義です。
4行目~7行目は dir.txt を読み込んで、1番初めの行のファイル名(ファイル名が1番大きい値のもの)を取得して、SWAPFIMENAMEに突っ込んでいます。また、ファイル名が決まったら8行目に飛ばしています。
9行目~16行目は実際にリネームするバッチファイルを作っていて、ファイル名にタイムスタンプを与えてリネームをするコマンドを生成しています。
10行目で、タイムスタンプを変数に格納しています。
11行目はタイムスタンプのデリミタ「:」を消しています。これは「:」がファイル名に出来ないためです。
12行目はコンマ何秒の「.」を消しています。
13行目は空白(半角スペース)「 」を「0」に置換しています。
14行目は実際にリネームするコマンドの生成です。
15行目はなぜか自分に ping を打っていますが、これは sleep コマンドがDOSに無いため、代替のコマンドです。今回のバッチはファイル名にタイムスタンプを利用しているため、同じタイムスタンプのファイル名が出来てしまわないようにしています。
17行目で最後に生成したバッチを起動しています。

このバッチのそのものの使い道は、ワタクシ用なので、あまりないと思いますが、1つ1つのコマンドは意外と使えるものを用意しました。

★このコンテンツに目的の情報はありませんでしたか?


[ スポンサードリンク ]

2007年08月16日

タグリムーバー(html tag remover)を作ったよ。

prompt.jpg

いつものストップモーションアニメとは関係ないエントリですが、タグリムーバーを作りました。といっても jericho html parser のキッカーです。

ダウンロードはこちら

タグの削除ってエディタの正規表現「<[^>]*>」(こんな感じ?)での置換とかで出来るのですが、複数ファイルまとめてやると、手作業も入ってきてちょっと時間がかかりすぎます。ので、作りました。主に自分用なのですが公開したいと思います。

このタグリムーバはjavaで作られています。つまりjavaがインストールされていないと動きません。

アーカイブに起動バッチを用意しましたのでそれを使っていただければと思います。引数にhtml文書が格納されたディレクトリ(再帰的にテキストに落とします)か、html文書そのものを与えます。

createTxt.jpg

なんでいまさらタグリムーバーなの?ってのもありますが、ググってみてもタグリムーバーって自分にあったものがなかなか見つからなかったからです。調べてる最中に出てきた、このjericho html parserライブラリは非常によかったです。

jspiderなんかを使って落としたhtml文書を(※クローラは時としてwebサーバに対してDos攻撃となりますので注意して使ったほうがいいんじゃないかしらと思います)テキストにしてサクサク読めます。オフラインでローカルのhtml文書を読むとき――主に英文の技術的な仕様書やTIPSなどを読むとき(や保存するとき)などに使ったりしています。

ちなみにリムーバーでディレクトリに対して再帰的に*.htmlから*.txtを作成した後、アーカイブ内の以下のバッチを実行すると*.txtを収集してallDoc.txtっていう1つのファイルにしてくれます。ソート順を適宜考えて変えてあげるなどすれば、それなりに使えるかもしれません。

1行目のdirコマンドは*.txtファイルを/sスイッチでディレクトリ内を再帰的に、/bスイッチでファイル名だけをリストしてdir.txtに落とします。

2行目の%cd%であらわしているのがunixでいうpwdです。allDoc.txtにリダイレクトしています。

3行目、forコマンドの"delims="って言うのは、半角スペースを勝手にデリミタにしちゃうのでそれを防いでいます。これを指定しないと、"C:\Documents and Settings"のパスに含まれる半角スペースがデリミタになって変数iにわたるのが"C:\Documents"になってしまうんです。

4行目、typeコマンドはcatと同じですね。allDoc.txtへ追記しています。

01:>dir /s /b *.txt > dir.txt 02:>echo [ %cd% 以下すべてのテキスト文書 ]>allDoc.txt 03:>for /f "delims=" %%i in ( dir.txt ) do ( 04:> type "%%i">>allDoc.txt 05:>) 06:>del dir.txt

javaのソースは以下になります。うわー。はずかしいけどまぁいいや。たいしたもんじゃないし。 ※アーカイブに格納されています。

import au.id.jericho.lib.html.*;
import java.util.*;
import java.io.*;
import java.net.*;

/*
	http://jerichohtml.sourceforge.net/doc/index.html
	download -> jericho-html-2.4.zip
	jar      -> jericho-html-2.4.jar
	jar cmf MANIFEST.MF TagDel.jar *.class au\*

	MANIFEST.MF
	Main-Class: TagDel
	Manifest-Version: 1.0
	Created-By: 1.4.2_14 (Sun Microsystems Inc.)
*/

public class TagDel {
	
	public static void main( String[] args ) throws Exception {
		try {
			// ファイルパスのパラメータを得る。なければ終了
			if( args.length <= 0 ){
				return;
			}

			// 引数を直接使っちゃう。
			File filePath = new File( args[ 0 ] );

			// 引数が存在しないパスの場合、終了
			if( !filePath.exists() ){
				System.out.println( "error - inValid filePath." );
				return;
			}
			
			// インスタンスの用意
			Vector      allFileList = new Vector();
			FileSetUtil fsuInst     = new FileSetUtil();
			
			// ディレクトリの場合は再帰したい。
			if( filePath.isDirectory() ){
				System.out.println( filePath.getAbsolutePath() );
				fsuInst.createFileList( allFileList, filePath );
			}
			
			// ファイルは直接セット
			else {
				System.out.println( filePath.getAbsolutePath() );
				allFileList.add( (String)filePath.getAbsolutePath() );
			}

			for( int idx = 0; idx < allFileList.size(); idx++ ){
				
				// パスごとにプレーンテキストファイルを作成する。
				fsuInst.createPlaneText( (String)allFileList.get( idx ) );
			}
		} 
		catch( Exception e ){
			System.out.println( e.toString() );
		}
	}
};

class FileSetUtil {
	
	public void createFileList( Vector allFileList, File filePath )
	{
		for( int idx = 0; idx < filePath.list().length; idx++ ){
			File curPath = new File( filePath.getPath() + "\\" + filePath.list()[ idx ] );
			boolean isDir = false;
			isDir = curPath.isDirectory();
			if( isDir ){
				createFileList( allFileList, curPath );
			}
			else {

				// 拡張子の切り出し。拡張子がない場合はスキップします。
				String fileAtrCheckStr = curPath.getPath();

				if( fileAtrCheckStr.lastIndexOf( "." ) >= 0 ){
					fileAtrCheckStr = fileAtrCheckStr.substring( fileAtrCheckStr.lastIndexOf( "." ) + 1 );
					fileAtrCheckStr = fileAtrCheckStr.toLowerCase();

					// htmlとか(xhtml / shtml...)じゃなければリストにパスを加えない
					if( fileAtrCheckStr.indexOf( "htm" ) >= 0 ){
						allFileList.add( (String)curPath.getAbsolutePath() );
					}
				}
			}
		}
	}
	
	public void createPlaneText( String filePath ) throws Exception 
	{
		try {
			
			// 引数のfilePathは信用しちゃう。そのまま使う。
			String renderFilePath = "";
			renderFilePath = "file:" + filePath;
			Source source = new Source( new URL( renderFilePath ) );
			String renderedText = source.getRenderer().toString();
			BufferedWriter bw = new BufferedWriter( 
								new OutputStreamWriter( 
								new FileOutputStream( filePath + ".txt" ), "MS932" ) );

			bw.write( renderedText );
			bw.close();
		}
		catch( Exception e ){
			System.out.println( e.toString() );
		}
	}
};

ほいでわ。

★このコンテンツに目的の情報はありませんでしたか?


2007年08月20日

如何にマウスを使わないか

developer code and tipsのカテゴリがdosコマンドのことばかりになっていますね。 それは、私が以前開発をやってたときに「如何にマウスを使わないか」っていうのが自分の中で流行ってまして、そんな時dosコマンドが非常に便利だったからなんです。

※「マウスを如何に使わないか」って言うのは、開発やってる方なら判ると思いますが、開発者がかかる麻疹みたいなものだと思います。違うかな。エクセルにも如何にマウスを使わないかっていう馬鹿なこともやってましたw

dosコマンドもそうなのですが、それに加えて、以下のようなショートカットをよく使ってましたので紹介します。(下にリストしておきます)

「ctrl + c」 とか 「ctrl + v」ってのは一般的ですよね。コピーアンドペーストです。「ctrl + x」だと切り取りですね。ほかにも「alt + tab」で起動しているウィンドウの切り替え。これもよく使われます。
「tabキー」はどうでしょうか。あたっている(スコープ)カーソルを移動するのに使います。dosコマンド起動時には自動補完ですね。
「altキー」も便利です。タンっとたたくと、アプリケーションのメニューにスコープが当たります。そこからさらに「( )」括弧でくくられているキーをたたくと、アプリケーション上のそのコマンドが実行されます。マウスを使わないエクセルで重宝しました。
あとは、あまり一般的かどうかわからないやつで、私にとって便利だったのが「windowsキー + r 」の、"コマンドを指定して実行"です。ディレクトリパスを指定すればそこが開きますし、アプリケーションにパスが通っていれば実行されます。

例えば、深い階層にあるディレクトリを開くときに、
「win + r」 → cmdを入力してdosプロンプトを開きます。で、cdコマンドで掘っていって、"explorer ."で開く。ってのがマウスでポチポチするよりよっぽど早いときがあります。(cdコマンドで移動せずとも、explorerの引数にディレクトリを指定しても開きます。cdで移動するのは私の癖ですね。)
dosコマンドでは、"cd c:\prog*"→「C:\Program Filesに移動」のようにワイルドカード「*」が使用できて、さらに、cdなどのコマンドの引数の入力候補をtabで選べます。なれると非常に便利ですよ。

尚、Windows2000ではコマンドプロンプトで自動補完を有効にする場合、レジストリをいじる必要があります
/HKEY_CURRENT_USER/Software/Microsoft/Command Processor/CompletionChar
の値を9にします。
(レジストリの編集は細心の注意をしてください。ちなみに上記値のデフォルトは0です。)


windowsの操作
  • 「win + e」エクスプローラが立ち上がります。
  • 「win + r」ファイルを指定して実行が開きます。
  • 「win + f」ファイル検索窓が開きます。
  • 「win + d」デスクトップの表示
  • 「alt + F4」アプリケーションの終了
  • 「alt + enter」(ファイルにスコープをあてて)プロパティ表示
  • 「alt + tab」アプリケーションの切り替え

ファイル・アプリケーションの操作(アプリケーションによっては操作できないショートカットもあります)


  • 「ctrl + c」コピー

  • 「ctrl + x」切り取り

  • 「ctrl + v」ペースト

  • 「ctrl + a」すべての選択

  • 「ctrl + z」アンドゥ(取り消し)

  • 「ctrl + y」リドゥ(アンドゥの取り消し)

  • 「ctrl + f」検索

  • 「ctrl + tab」アプリケーション内のタブの切り替え(など、スコープの切り替え)

  • 「ctrl + n」新規作成

  • 「ctrl + o」ファイルを開く

  • 「ctrl + s」ファイルの保存




ほいでわ。

★このコンテンツに目的の情報はありませんでしたか?


2007年08月21日

バッチファイルでC:\WINDOWS\system32\ftp.exeを制御する(数ある内の1つ(の変な))方法

ftpをタスクスケジュールに登録して、定期的にログファイルなんかをダウンロードするといったことはよくあるのですが、unixではftp.shなどのシェルを組むなどしてcrontabに登録します。

windowsでも同じようにバッチを組んでやってみたのですが、ログインのところでなんかうまくいかないため、試行錯誤した結果下記のようになりました。

<なんかうまくいかないバッチ>

01:>echo open ホスト名>cmd.ftp
02:>echo user ユーザ名 パスワード>>cmd.ftp
03:>echo get / put(ftpのコマンド)>>cmd.ftp
04:>echo close>>cmd.ftp
05:>echo bye>>cmd.ftp
06:>ftp -s:cmd.ftp

ftp.jpg

スクリーンショットは、hogeというホストにユーザ:moge / パスワード:mogeでログインしようとしているものです。(このアカウントは正しいものとして)1行目のopen時にユーザとパスワードを聞かれ、2行目でリダイレクトしてるユーザとパスワードを解決できずにLogin failedとなる。。。 うーんopenしたいだけなんスけど。

でも、よくみてみると
331 Password required for user moge moge
なんてかいてありますね。

どういうことかというと、「user moge moge」というアカウントのパスワードを聞いてきているわけです。
2行目の「user moge moge」っていうコマンド行をログインアカウントだと思って、このアカウントのパスワードを聞いてきているわけです。

ちがwwwwそれは「user アカウント パスワード」って言うコマンドを実行してほしいんですwwwでもわかってくれない。これが正しい挙動でもなんかやだなぁ。

ftpのopenコマンドのヘルプ見ても、アカウントとパスワードを聞かれるのを抑制できるようなオプションないみたいだし。

ftplogin.jpg


ので、以下のように変えてみた

<ちょっと納得いかないけどうまくいったバッチ>

01:>echo open ホスト名>cmd.ftp
02:>echo ユーザ名>>cmd.ftp
03:>echo パスワード>>cmd.ftp
04:>echo get / put(ftpのコマンド)>>cmd.ftp
05:>echo close>>cmd.ftp
06:>echo bye>>cmd.ftp
07:>ftp -s:cmd.ftp

入れて、出れた。スクリーンショットは正しいホスト、ユーザ、パスが与えてあるので消しています。
うーん。どうなのって思うけど、出来たから結果オーライです。

ちなみに、ftpのコマンドバッチ(cmd.ftp)をリダイレクトしているのは、

01:>ftp ホスト名
02:>ユーザ名
03:>パスワード
04:>ftpのコマンド get/put
05:>close
06:>bye

っていうバッチを組むと1行目で、実行の制御が1行目でFTPに移って、2行目以降は起動したバッチの制御上なので、正しく実行されないためです。

なんかバッチバカみたいになってきましたけどバッチのことばかり考えているわけじゃありません。
ほいでわ。

★このコンテンツに目的の情報はありませんでしたか?


2007年08月23日

ストップモーションの簡単な作り方




type="application/x-shockwave-flash" width="320" height="258">



バッチバカのお時間ですよ!というわけで、引き続きの内容ですが、ムービーをjpgファイル群に落として規則的に間引いたらストップモーションになるんじゃね?という内容でお送りします(最終回)



結果、成功しましたよ!というか、ただの早送りっぽくね?っていう感じですが。サンプルフラッシュを参照いただければわかると思いますが、雰囲気は出ているんじゃないかと思います。ただ、サンプルは、そのまま時間軸に沿って再生しても面白くない内容でしたので演出上、コイツを使って逆再生しています。



作り方は非常に簡単です。



・デジカメなどを用意してムービーで撮影します。
・avi2jpgで撮影したムービーをjpgファイル群に落とします。
・適宜演出を加えるなどします(ファイルを逆順にソートするなど)(てかこれしか演出のしようがなさそうですけど)
・下記のバッチをたたきます。
・ユーザが入力した内容で規則的にファイルを間引いていきます。
・あらためて、jpg2aviで動画を作成します。
・出来上がりです(゚∀゚)



どうでしょう。簡単にストップモーションを作りたい方には使えるんじゃないかと思って公開してみますが、これまたほかに使い勝手のないバッチですね。好きな方は実験してみてはいかがでしょう。
作ってみた感じ、
・間引くファイル数を調整しなければいけない
・実際に取るムービーは気持ち、スローモーションな感じで
っていうのがキモなんじゃないかなと思いました。



<ストップモーション作成バッチ>
01:>@echo このディレクトリ内の jpg ファイルを何枚毎に削除するか指定します。
02:>@set /P USER_INPUT="何枚毎に削除するか入力してください(半角数字)"
03:>setlocal EnableDelayedExpansion
04:>dir /b *.jpg > dir.txt
05:>set SWAPFILENAME=0
06:>set CURFILE=0
07:>for /f "delims=" %%i in ( dir.txt ) do (
08:> set /a SWAPFILENAME+=1
09:> set CURFILE=000!SWAPFILENAME!
10:> ren "%%i" movie_!CURFILE:~-4!.jpg
11:>)
12:>mkdir backup
13:>for /l %%j in ( 0, 1, %SWAPFILENAME% ) do (
14:> set /a CHECK=%%j%%%USER_INPUT%
15:> set /a CURFILE=%%j
16:> set DELFILE=000!CURFILE!
17:> if !CHECK! gtr 0 (
18:> move movie_!DELFILE:~-4!.jpg backup
19:> )
20:>)
21:>set LISTED=
22:>@set /P LISTED="ファイル名の整形(再ソート)を行う場合は[ Y ]を入力してください"
23:>if "%LISTED%"=="Y" (
24:> goto LISTED_ON
25:>) else (
26:> goto LISTED_OFF
27:>)
28:>:LISTED_ON
29:>dir /b *.jpg > dir.txt
30:>set SWAPFILENAME=0
31:>set CURFILE=0
32:>for /f "delims=" %%i in ( dir.txt ) do (
33:> set /a SWAPFILENAME+=1
34:> set CURFILE=000!SWAPFILENAME!
35:> ren "%%i" movie_!CURFILE:~-4!.jpg
36:>)
37:>:LISTED_OFF



あとは、ちょっと技術的な内容と使い方説明します。技術ったってなんてことはないですよ。
まず、このバッチをたたくとユーザに何ファイル毎にjpgファイルを残して、後は間引くか聞かれます。
"3"と入力すると(半角数字でお願いします)



0001.jpg ×
0002.jpg ×
0003.jpg
0004.jpg ×
0005.jpg ×
0006.jpg
0007.jpg ×
0008.jpg ×
0009.jpg
・・・



×のついたファイルがbackupディレクトリに移動していきます。
"4"だと 0001.jpg / 0002.jpg / 0003.jpg / 0005.jpg / 0006.jpg / 0007.jpg / 0009.jpg が間引かれていくわけですね。



これが終わるとさらに残ったファイルに対する再ソートを聞いてきます。



0003.jpg
0006.jpg
0009.jpg
・・・



これらのファイルを



0001.jpg
0002.jpg
0003.jpg
・・・



にリネームしたければ"Y"を入力してエンターしてください。
こんな感じの仕様です。



詳細な内容ですが、backupディレクトリに格納する条件が14~17行目の
14:> set /a CHECK=%%j%%%USER_INPUT%
15:> set /a CURFILE=%%j
16:> set DELFILE=000!CURFILE!
17:> if !CHECK! gtr 0 (
です。これは、ユーザが入力した値でファイル名を割り算します。で、割り切れなかった残りの値が0より大きいものをbackupディレクトリに格納しているわけです。こういう演算を余剰演算[ % ] とかっていいますけど、14行目がえらいことになっていますね。



分解すると以下のようになります。
set /a CHECK=%%j %% %USER_INPUT%
演算子なんだか参照指定子なんだかよくわからんですね。



で、割り切れなかった値の話に戻りますが、ユーザが"3"を入力すると、



1 ÷ 3 = 0 あまり 1
2 ÷ 3 = 0 あまり 2
3 ÷ 3 = 0 あまり 0
4 ÷ 3 = 1 あまり 1
5 ÷ 3 = 2 あまり 2
6 ÷ 3 = 2 あまり 0



のように、あまりが出た(0より大きい)ファイル名をbackupディレクトリにどかしているんですね。
ちなみに比較演算子の gtr は~より大きい値という意味です。( if /? で確認できます)
このような演算をしたいために、はじめにファイル名をソートしています。10行目ですね。
10:> ren "%%i" movie_!CURFILE:~-4!.jpg
これは、既存のファイル名を movie_0001.jpgから連番でリネームしているコマンドです。



と、解説はこんなところでしょうか。もっといいやり方はあると思いますが、やりたいことが実現できればいいんじゃないかと思います。へへへ。
まぁそんなくだらないバッチですが、ダウンロードはこちら。

★このコンテンツに目的の情報はありませんでしたか?


2007年08月25日

リンクに rsstickerajax (RSS) を適用してみました。

rssnavi.PNG

dynamic driveでいただきました、スクリプトを適用して、リンクにRSSつけてみました。なんだかピョコピョコしてます。

javascriptとphpで作られているのですが、サイトへの適用はそれほど難しくなかったです。 ただ、はじめにデプロイ(こういうのデプロイっていうの?)したときに文字化けしちゃってまして、いろいろ見ていましたら、phpのソース内でハードコーディングでencoding="ISO-8859-1"でRSSのxmlを拾ってくるような実装となってました。

これはUTF-8に修正して何とか見れるようになりましたよ。\(^o^)/オワタ
スクリプト弄るのすごい久しぶりでした。しかしまぁよくつくるなぁ。感謝です。

★このコンテンツに目的の情報はありませんでしたか?


2007年08月26日

RunPeriodicTasksを適用でやっと日付指定投稿ができたよ!

cron.PNG

ついでにもうひとつ技術の話です。 ワタシが借りているチカッパ!レンタルサーバーのサービスはcronというもの(定期的にプログラムを実行したりするスケジューラみたいなもの)が適用されないということを知らずに、日付指定の投稿を行いつづけてました。

で、予定の日時が過ぎても勝手に投稿されなくて困ってたんです。 管理ページでは、例えばスクリーンショットのように「~分前」みたいな感じで、時間の経過は表示されていたのですが、投稿自体はされてなかったんです。

(゚3゚)アルェーなんだろなー?というわけでグーグル先生に聞いてみたら、cronがサービスとして使えるサーバじゃなくちゃダメだってわかったんです。 ほう。私の(利用する)サーバじゃ指定日投稿はできないとな。ふーん。へー。ふざけてやgまあいいやとポチポチやってましたら The blog of H.Fujimotoさんのページでcronがなくても指定日投稿できるmovable typeのプラグインが公開されてました!

こ、これは!すっげぇ痒いところに手が届きまくってますよ!ということで、仕様を読んでみましたら、投稿スクリプトをキックするのはユーザさんなんですね。

つまり、トップページなんかにjavascriptを仕込んでおいて、そっからcgiをコールする(のかな?)ということみたいです。うわぁー。これって、指定日投稿した時刻付近にこのページを見に来てくれる方が一人もいなかったら投稿されないってことかな。。orz

ちょっとmojalogそんなにユーザさんいないっすwww大丈夫かな。 というわけで、このエントリは指定日投稿されています。ので、事実上、あなたが投稿したエントリなのかもしれませんよ!(たぶん今ワタクシ群馬にいます)

★このコンテンツに目的の情報はありませんでしたか?


2007年09月03日

startforceの使い道

夏休み終わりました。だるいです。。。

スタートフォースってご存知でしょうか。

"スタートフォースは、インターネット接続さえあればブラウザを便利な作業環境に変えてしまう、「ブロードバンドデスクトップ」です。"

というものです。

startforce.jpg

ウェブブラウザ上でリモート端末を操作するような感覚で、例えば、
・メディアプレイヤーを操作できる
・テキストエディタを使える
・ファイルを外部に共有できる(アップローダに近い感覚で使える)
・ウェブブラウザを利用できる(もちろん、それだけでプロキシみたいな役割をするわけではありません。たぶん)
・エクセルライク(というかエクセルも)なアプリケーションを利用できる
-> OpenOffice のことを言っています。
[ *.doc ] (Microsoft Word)
[ *.odt ] (OpenOffice文書)
[ *.rtf ] (RTF文書)
[ *.xls ] (Microsoft Excel)
[ *.ods ] (Open Office Spreadsheet)

と至れり尽くせりなのですが、リモートデスクトップとしてこれを使う理由ってなんだろなーと考えた結果、やっぱりストレージとして扱うくらいなんですよね。うーん。

あ!ローカル端末に置いておけないお宝ファイルの外部記憶装置としてつかえr痛い。やめてちがうんです誤解だ刑事さんオレはなにもやってねぇ

刑事さんはどうでもよいのですが、効果的な使い道が思い浮かびませんね。ミクシィなんかのSNSでアカウントとパスワードを公開してコミュニティなんかの共有ストレージとして扱うとかってどうかな。

"第7条(禁止事項)(2)ユーザの共有、本サービスは一個人に付き1ユーザを提供しており、一個人が複数ユーザ保有したり、2人以上で1ユーザを共有する事は禁止します。"

だめだった。駄目です。やっちゃだめ。共有カッコワルイ。

ちょっとFAQをよく読んでみたらフリーのグループウェアとして活用できそうですね。チャットやメッセンジャーなどで他のアカウントとつながることが出来るようですので、アカウントの共有自体意味がないのか。

他にもアプリケーションを作って適用することも出来ます。StartForceAPIが公開されているのでこちらを参照してみるといいと思います。

1.JavaScriptの基礎知識
2.Htmlの基礎知識
(3.開発者ガイドに沿ったソースコード書き方)

が必要ですが、勉強がてらいじってみるのもいいかもしれませんね。

★このコンテンツに目的の情報はありませんでしたか?


タグクラウドと形態素解析エンジン

タグを打つと何かいいことあんの?

mojalogは「ストップモーションアニメの製作とその作り方なんかを紹介する!」というのがメインコンテンツなわけですが、一方ではソフトウェア技術の紹介や、ペーパークラフト、面白かったムービーの紹介の他、ブックレビューや料理の紹介まで取り留めなくエントリを増やしてしまい、なにがしたいのか判らなくなってきましたのでタグクラウドを追加しました。

静的なカテゴリページを構築していくより、お手軽にカテゴリ分けできるし、その嵩みがどんなだか直感(見た目)でわかるってのはかなり便利ですね。

そういうわけで、タグをちょこちょこ追加していたのですが、エントリを遡って適当に付与していたため不十分なところもあるかと思います。

でも、まぁ、こうやって出来上がってきたタグクラウドを見ればなんとなくこのブログの方向性も見えてきますね。ませんね。節操ないですがいいです。そういうわけでして、タグクラウドもご利用いただければと思います。

形態素解析エンジン

で、こういうタグって、エントリから単語を抜いたり、あるいは要約したものを使うことになると思いますが、それは当然、当人が考えて作成するものです。

ですが、例えば"兆し"などで見られる「話題になった単語」ってどうやって自動的に拾うんでしょうか。まさか兆しの中の人が人海戦術でブログを読んで集計するんじゃないだろうな?などとエンジニアとは思えない発想をしてしまいましたが、もちろんシステムが自動的に単語を拾うわけです。

ところで、どうして「プログラムで単語を拾う」という発想に直結しないのかといいますと、単純にその方法が全く見当もつかないからです。

普通、英文は以下のように単語ごとに空白を置いて文章が作られますよね。
"love actually is all around."
ですので、単語をプログラムで拾う際に空白などをデリミタ(区切り)とすればよいと思うのですが、夏季のようになるかと思います。

love
actually
is
all
around

日本語はどうすればよいのでしょうか。明示的な区切りが(素人目ですが)見た目ではないですよね。うーん。わからない。

で、いろいろ検索していましたらMecab(和布蕪)というオープンソース形態素解析エンジンを見つけました。形態素解析エンジン??(一覧も一応。)ってなんだ?ワタシも実はよく判りません。が、どういうものかは使ってみれば判ると思います。

例えば「すもももももも」をこのエンジンにかけると以下のような出力がされます。

すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
EOS

failure.jpg

うわーあったまいいなこれ。
でもスクリーンショットの「にわにはにわにわとりがいる」は失敗しているような。。。はにわ?

使ってみると、日本語を単語ごとに区切ってくれるではないですか。どうやってんだこれ。辞書ファイル的なものを引いて抽出するにしても限界があるだろうし、その仕組みはあるわけです。

日本語はどうやって成り立っているかってところから考えなきゃいけないのかな。わからない。ふーん。でもブラックボックスでいいから使えたらいろいろなウェブサービスが展開できそうですね。すげー。

で、話は戻りますが、"兆し"がこれを丸ごと使っていると言っているわけではありませんし、使ってないかもしれません。単語をひとつ拾うにしてもプログラムで行うと、日本語の場合かなり大変だなぁと思ったわけです。



というわで、ずぼらなワタシは、カテゴリの振り分けもままならないため、「じゃあタグを使おう」ということで現在に至ります。

で、このタグ生成すらプログラムで自動的に出来ないかなーなんて思い、この形態素解析エンジンにたどり着いたわけですが、タグぐらい自分で打たなきゃ駄目ですね。

楽をしたいが為に、ものすごい苦労するところでした。でも勉強になったからいいや。何か作ろうかな。あ、そうだタグを自動的につくtt(文頭に戻る)

★このコンテンツに目的の情報はありませんでしたか?


2007年09月04日

誰でも出来る!エントリがスクロールするRSSリンクの貼り方の紹介です

以前、ブログのリンクに、エントリをロールしなから表示するRSSを装備しました!ってのをやったのですが、そのときはPHPなんかを使わなくちゃならないし、エンコードの修正なんかも気にしなければならなくて、少し取っ付きづらい内容だったかもしれません。

ですが、もう少し簡単な方法が(同じく)ダイナミックドライブにありますので、紹介させていただきます。
尚、現在このページのナビゲーションバーで表示されているリンクはこの方法を適用しています。

今回の方法で必要な知識や制限は

  1. HTMLタグについて理解している
  2. javascript少し判る
  3. スタイルシート(css)が少し判る
  4. グーグルにアク禁くらってない
です。

4.はどういうことかといいますと、「人に聞いてばかりいないで少しは自分で調べてくれよ!」という暗喩ではなくて、実際にGoogle AJAX Feed APIというサービスを利用するためです。アク禁くらってる人なんていませんよね。へへへ。

<適用までの概要>

では概要を簡単に説明します。
まず、Google AJAX Feed APIで”API Key”というものを取得します。
次に用意されている javascript に API Key を貼り付けます。
ちょっとスタイルシートを修正や変更するなどして、
ご自身がリンクしたいページ( html )に script を書き込んであげます。

いかがでしょうか。簡単そうですね。では詳細説明に移ります。スクリーンショットなどを用意しておりますので、こちらも参考にしてください。

それではまず、ダイナミックドライブで公開しているgAjax RSS Pausing Scroller (hosted)を開いてください。
英文ですね。ちょっと見てみます。

”Description: gAjax RSS Pausing scroller is a flexible RSS scroller that's extremely easy to set up to boot. Using the gAjax RSS Displayer script engine, there's nothing to install or host on your server. Furthermore, you can display results from multiple feeds intermixed, sort them in a variety of ways, specify how many entries to show at once, what portion of each entry to show etc. There is simply no more versatile script RSS scroller out there!”

要約すると、

「この"gAjax RSS Pausing scroller"はセットアップが簡単。gAjax RSS Displayer script engine(外部API)を使ってるので、あなたが使っているサーバに何かインストールするようなことはありません。
カスタマイズにも富んでいて、例えば様々なサイトフィードを一度にまとめて見せるようなことまで出来ます。」

といった感じでしょうか。至れり尽くせりですね。

<STEP1 - 資材集め>

ダイナミックドライブの資材

それではここで必要な資材をダウンロードしちゃいましょう。

  • gfeedfetcher.js
  • gajaxscroller.js
  • indicator.gif : なんかオレンジのくるくる回ってる gif 画像です。右クリックでダウンロードしましょう
  • htmlのコピー : HTML文書を記述したフィールドが、リンク先のページの step1 と step3 にありますのでコピーして、エディタにでも貼り付けて任意の名前(*.html)で保存してください。これは実際にスクリプトを実行する箇所ですね。

ダイナミックドライブでの資材は上記のとおり4つです。

google ajax apiの適用1

そうしましたら、次にGoogle AJAX Feed APIへ移動して、API Keyを取得します。

規約に同意するチェックボックスにチェックを入れて、ご使用するページのURLを入力しGenerate API Keyを押下します。



google ajax apiの適用2

すると
your key is の下に発行された API KEY が表示されます。これをまたエディタにでも貼り付けて置いてください。
その下部に表示されているのは、ご自身が入力したURLとサンプルスクリプトです。今回は"gAjax RSS Pausing Scroller"のスクリプトを使用するためこれらは特に必要ありません。

これで必要な資材5点がすべて整いました。

それではスクリプトの中身を見てみましょう。主だった注意点としては、これらの資材を置くパスくらいなので、ご自身の環境に合わせて読んでください。

<STEP2 - スクリプトの修正>

まず indicator.gif ですが、これはフィードを待ち受けている状態時に表示されるインジケーターイメージです。ご自身で用意したイメージファイルと差し替えることも出来ます。

差し替える場合は gajaxscroller.js の7行目

var gfeedfetcher_loading_image="indicator.gif"

のパスやファイル名に注意してスクリプトを変更してください。
ワタシが置いているパスはこんな感じになりました。

var gfeedfetcher_loading_image="http://mojalog.backdrop.jp/mojascript/indicator.gif"

同様に、 gfeedfetcher.js の6行目でも同じように修正してください。

用意されている2つのスクリプトは他にいじるところはありません。

<STEP3 - 呼び出しスクリプトの作成>

それではダイナミックドライブでコピーしたHTML文書を見てみましょう。
ここに記述されているのは

  1. Google AJAX Feed APIの呼び出しタグ
  2. gfeedfetcher.jsの呼び出しタグ
  3. gajaxscroller.jsの呼び出しタグ
  4. 適用スタイルタグ
  5. gAjax RSS Pausing Scrollerの起動スクリプトタグとスクリプト

です。

まず、1.の「Google AJAX Feed APIの呼び出しタグ」についてですが、<head>タグ内の

<script type="text/javascript" src="http://www.google.com/jsapi?key=YOUR-API-KEY"></script>

というところを探してください。そのまま貼り付けていれば4行目になるかと思います。
このタグの後方YOUR-API-KEYという記述をGoogle AJAX Feed APIで取得した API KEY と差し替えます。差し替えると下記のようになるかと思います。

<script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAwDsQ33V9LWoWEupLBOM7fxTAn6B-3LYIdG1Qoai9MNolrihdFhSUR1QatK5Tv4****************"></script>

修正が済みましたら、次は2~3の「呼び出しタグ」です。6行目から17行目にわたって記述されています。
"This notice MUST stay intact for legal use" とあるのでコメントも残します。使わせて頂いておりますよ。ありがとうございます(゚∀゚)ノシ

<script type="text/javascript" src="gfeedfetcher.js"></script>
<script type="text/javascript" src="gajaxscroller.js">

/***********************************************
* gAjax RSS Pausing Scroller- (c) Dynamic Drive (www.dynamicdrive.com)
* Requires "gfeedfetcher.js" class
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/

</script>

RSSフィードの表示例

とりあえず、ここまででスクリプトが動くかどうか確認が取れるはずです。このHTMLファイルをローカルに保存して、ブラウザで開いてみましょう!

いかがでしょうか。下から上に受けながs動いておりますね。すごい!

では、ご自身が拾いたいRSSフィードを用意して、起動メソッドの部分を見ていきましょう。
宣伝させていただきますと、 mojalog の RSS フィードは
http://mojalog.com/index.xml
で取得できます。いらないすか。そうすか。へへへ。

そうしましたら、とりあえず、4の「スタイルの適用」を飛ばして5に行きます。多分そうしたほうが流れが判りやすいと思ってのことです。
77行目あたりからこのスクリプトの起動メソッドが記述されています。

例が3つほどありますね。
今ご自身が作られたhtmlファイルをブラウザで開きながらみたら判りやすいかもしれません
77行目の"Example 1"がワタシが適用しているスクリプトです。
94行目に"Example 2"、112行目に"Example 3"とありますね。動きはブラウザで見たとおりなのですが、ちょっと解説を入れてみます。

[ Example 1 ]
これは1つのRSSフィード(1サイト)を2秒毎に10個のエントリでスクロールし続ける例です。
スクロールは表示エリアに1つずつですね。日付( date )もあわせて表示しています。
そして、この例では判りにくいですが(例2で判ると思います)エントリごとに div タグでラップしています。

[ Example 2 ]
これは、2つのRSSフィードを3秒毎に合計20個のエントリで、交互に5エントリーずつ表示させています。
さらにエントリのラベル(サイト名などを自分でラベリングできます)と日時( datetime )を表示しています。
ラベルでソートしているため、サイトごとのフィードでかわりばんこに表示されます。
そして、エントリごとに li タグでラップしています。(「・」が文頭に打たれていますね。)
頻繁に更新されるニュースサイトなどのRSSを設定するといいかもしれませんね。

[ Example 3 ]
これは3つのRSSフィードを2.5秒毎にに合計8個のエントリで、交互に2エントリーずつ表示させています。
さらにエントリの要約を表示させています。日時でソート(規則的に並び替え)しているためそれぞれのフィードが新着順で表示されます。
そして、エントリごとに p タグでラップしています。
これはエントリの要約が入ってくるので、大きめのスペースを作ってあげる必要がありますね。

ということで、カスタマイズできる内容が盛りだくさんです。いろいろあわせ技でご自信のサイトにあった形で適用できますね!

一応カスタマイズできる要素を列挙しておきます。

  • 表示時間
  • ラベル
  • 表示順
  • 表示数
  • 日付と日時表示
  • 表示毎のラッパータグ
  • 表示スタイルシート
  • エントリクリック時の挙動

と、こんなところでしょうか。

では、[ Example 1 ] の実装を見てみましょう。

01:> <script type="text/javascript">
02:>
03:> var cssfeed=new gfeedpausescroller("example1", "example1class", 2000, "_new")
04:> cssfeed.addFeed( "CSS Drive", "http://www.cssdrive.com/index.php/news/rss_2.0/") //Specify "label" plus URL to RSS feed
05:> cssfeed.displayoptions("date") //show the specified additional fields
06:> cssfeed.setentrycontainer("div") //Wrap each entry with a DIV tag
07:> cssfeed.filterfeed(10, "date") //Show 10 entries, sort by date
08:> cssfeed.entries_per_page(1)
09:> cssfeed.init()
10:>
11:> </script>

まず3行目で gfeedpausescroller を生成しています。
引数が4つありますね。

    第1引数:"example1"は適用されるタグのidです。(実際に使われるのは div タグなのですが、この id となります。つまり一意でなくてはなりませんね。※スタイルシートの適用の説明で後述します)

    第2引数:"example1class"は適用されるタグの class です。

    第3引数:2000は何秒ごとにスクロールされるかですね。msecで与えてあげてください。

    第4引数:"_new"はエントリをクリックしたときに新しくブラウザを立ち上げるようになっています。えーと、リンクターゲットですね。

4行目のaddFeedメソッドは読んで字のごとく、フィードの追加処理です。 引数が2つあります。

    第1引数:"CSS Drive"はラベルです。ラベルを表示する場合はこの引数が表示されます。サイト名などを設定してあげれば言いと思います。

    第2引数:"http://www.cssdrive.com/index.php/news/rss_2.0/"はRSSフィードのURLですね。間違えないようにしてください。

5行目のdisplayoptionsメソッドも読んで字のごとくですが、ディスプレイオプションです。
引数が1つあります。

    第1引数:"date"は日付(例 9月2日)表示がエントリに追記できます。他にも"date", "time", "datetime", "label", "snippet", "description"が設定でき、文字列内でスペースで区切って複数指定できます。
    例)"date label snippet"

6行目setentrycontainerメソッドはエントリごとにラップできるタグを与えることが出来るようです。

    第1引数:"div"タグが与えられています。うーん説明しづらい。区切りですね。区切り。。っていっても、うーん。"li"を与えればわかると思います。「・」が文頭につきますよ。

7行目のfilterfeedメソッドはエントリの表示数とソートを決定する処理です。

    第1引数:10は、全部で10エントリをスクロール数として持つということです。

    第2引数:"date"は、日付順(新着順)でスクロールされます。

8行目のentries_per_pageメソッドは1スクロールごとにいくつのエントリを表示させるかです。

    第1引数:1は1スクロールごとに1つのエントリを表示させるということですね。

9行目のinitメソッドは初期化メソッドのようです。必ず最後に呼び出さなければならないみたいですね。

尚、上記のメソッドの解説はダイナミックドライブでも詳しい解説があります。
英文で且つ技術的な説明ですが、このページと読み比べたりすれば多分プログラマじゃなくとも大丈夫だと思います。

ソースの解説はこんな感じになりますが、1つ注意しておくべき点は、インスタンスの変数名です。
ちょっとプログラムをやってない方は敷居が高いことかもしれませんが、一応記しておきます。

[ Example 1 / 2 / 3 ] の冒頭箇所にインスタンスの生成をしている箇所がありますが、もし、このように複数のスクリプトタグを1つのページに埋め込みたい場合は、スクリプトタグのスコープ(範囲)毎にこの変数名をそれぞれ異なった(任意の)ものにしてください。
下記のように、 Example のなかでも変数名が異なっていますね。また、このインスタンス(変数)からメソッドを呼び出すので、任意に作った変数を使う場合は、その箇所も合わせて変更してください。

[ Example 1 ]
var cssfeed=new gfeedpausescroller("example1", "example1class", 2000, "_new")
cssfeed.addFeed("CSS Drive", "http://www.cssdrive.com/index.php/news/rss_2.0/")
・・・以下すべての変数名に注意

[ Example 2 ]
var socialfeed=new gfeedpausescroller("example2", "example2class", 3000, "")
socialfeed.addFeed("Slashdot", "http://rss.slashdot.org/Slashdot/slashdot")
・・・以下すべての変数名に注意

[ Example 3 ]
var newsfeed=new gfeedpausescroller("example3", "example3class", 2500, "_new")
newsfeed.addFeed("BBC", "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml")
・・・以下すべての変数名に注意

最後に飛ばした4適用スタイルタグについてです。

これは実際にブログなどに適用する際、*.cssファイルとしてもったほうが、場合によってはいいんじゃないかと思います。また、デザイン上の説明は特にいたしませんので、ご自身でいじくってみてください。

それでは、説明ですが、注意点がひとつだけありまして、スクリプトのコンストラクタである
gfeedpausescrollerメソッドの第1引数と、idとなる名称を合わせてください。
また、スクリプトをまたいで同じ id を指定すると、1番初めに取得した id 以降のスクリプトは正しい挙動が得られないようです。
わかりにくい説明ですね。。。
つまり、以下のようになります。

<style type="text/css">
#example1{
/* なんかデザインして */
}
</style>
<script type="text/javascript">
/* 第1引数のid名をスタイルから選ぶ "example1" */
var hogefeed=new gfeedpausescroller( "example1", "example1class", 2000, "_new" )
・・・
</script>

<script type="text/javascript">
/* 第1引数のid名を既に使われているスタイルから("example1")選ぶとこれは動かない(みたい) */
var mogefeed=new gfeedpausescroller( "example1", "example1class", 2000, "_new" )
・・・
</script>

とこんな感じです。なので、この生成するインスタンスごとに id を作成してください。
インスタンスを2つ使用するのであれば、別名の id をもった#example2を作成する必要があります。
尚、第2引数のクラス名はちょっとメソッドとスタイルの関係が読みきれていませんで(すみません)、とりあえず、例のようにサフィックスとしてclassと付与してあげるようなカタチで、第1引数名+classとしてあげればいいと思います。

それでは、ご自分でカスタマイズしたhtmlファイルを保存して動かしてみてください。

<STEP4 - サイトやブログに適用>

各々の環境の違いがありますので深くは説明しませんが、流れはおそらく以下のようになるかと思います。

  1. gfeedfetcher.jsのアップロード
  2. gajaxscroller.jsのアップロード
  3. indicator.gifのアップロード
  4. (cssファイルのアップロード。直接 html ファイルにスタイルタグを打つ場合はいらないです)
  5. blog や html にスクリプトを記述。

  6. <script type="text/javascript" src="http://www.google.com/jsa~
    <script type="text/javascript" src="gfeedfetcher.js~
    <script type="text/javascript" src="gajaxscroller.js~
    ご自身のカスタマイズスクリプトを記述。

※それぞれ、ファイルのパスの指定には注意してください。

うーん。いかがでしょうか。なるべく平易に書いてるつもりですが、わからなければコメントに記載いただければ、ワタシもわかる範囲でお答えします。ただ、ワタシはこのgAjax RSS Pausing scrollerを作成した本人ではありませんので、スクリプトの中身の動きについての質問はご容赦ください。
ほいでわ。

★このコンテンツに目的の情報はありませんでしたか?


2007年09月06日

SyntaxHighlighterを適用したよ!

ソフトウェア技術のエントリが増えてきましたので、SyntaxHighlighterを導入しました。GoogleCodeのサービスですね。
プログラムコードをエントリにする際に、preタグを使って見やすくしたりしますが、さらにそのコードの予約語などをフォントカラーでハイライトしてくれる仕組みになっています。

言語も下記のようにたくさんサポートされています。

  • C++ : cpp, c, c++
  • C# : c#, c-sharp, csharp
  • CSS : css
  • Delphi : delphi, pascal
  • Java : java
  • Java Script : js, jscript, javascript
  • PHP : php
  • Python : py, python
  • Ruby : rb, ruby, rails, ror
  • Sql : sql
  • VB : vb, vb.net
  • XML/HTML : xml, html, xhtml, xslt

import javax.swing.*;

public class SampleSwing {
	public static void main(String[] args)
	{
		JFrame frame = new JFrame( "SampleSwing" );
		final JLabel label = new JLabel( "Hello World" );
		frame.getContentPane().add( label );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.pack();
		frame.setVisible( true );
	}
};

こんな感じになります。便利ですね。
適用は、javascriptのダウンロードを行って、適宜サーバにあげるだけです。
ソフトウェア技術やってる方が必要になるものかなと思いますので、特に詳しい説明はしなくて大丈夫ですね。

★このコンテンツに目的の情報はありませんでしたか?


2007年09月08日

つくるぶのサイトスカウターを追加してみました。