MacPortsのインストール

最近Macプログラミングにはまっています。

ところでリソースからpngファイルをNSImageに取り込もうとしているのですがうまくいきません。

とりあえずpngを他の画像ファイルに変更するためにImageMagick を使おうとしたのですがデフォルトでは入っていない模様。。

http://distfiles.macports.org/MacPorts/

こちらからMacPortsなるものをインストール

/opt/local/binにインストールされるみたいです

自動で~/.profileも作成されるみたい。

プロキシ環境だと.profileに

export http_proxy=http://server:port

を付け加えておきます

これでいざ

$ sudo port search imagemagick
Warning: Can't open index file for source: rsync://rsync.macports.org/release/tarballs/ports.tar
Error: search for name imagemagick failed: No index(es) found! Have you synced your source indexes?
No match for imagemagick found

ないんかい!

素直にこれを入れればいいことが判明。

http://cactuslab.com/imagemagick/

Macをサーバに、windows7をクライアントにしてSynergyでつなげてみる

以前、Windows7をサーバに、Mac をクライアントにして Synergyで連携してみました。

そのときの構成は

  • Windows7+Synergy1.4.10
  • maxOX10.8 +SynergyKM1.3

この組み合わせで、Macのキーボード野設定をオーストラリアにすることにより、記号なども問題なく使えることを発見

今度は逆にMacをサーバにしてみることにします

  • Windows7+Synergy1.3.8
  • maxOSX10.8+SynergyKM1.3

Windows側はSynergyのバージョンを落とさないとつながらない模様。

ただしこの場合だとWindows側に入った際に日本語の切り替えがキーボードからできません。

CmdSpaceなるものをインストールしてみたもののうまくいかない。

そこで、WindowsのIMEの設定を変更します

http://www.relief.jp/itnote/archives/001818.phpこの記事を参考に

IMEのプロパティー全般の編集操作のキー設定を変更します。

ctrl+spaceを半角全角切り替えに設定すればOK

Xcode4.5ではまったのでメモ

最近XCodeのcocoaでmacアプリなんぞ作ろうとしています。

そこで

https://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjCTutorial/01Introduction/chapter_1_section_1.html#//apple_ref/doc/uid/TP40000863-CH13-DontLinkElementID_63などというページを参考にサンプルアプリケーションを作ることにします。

かなり古い資料なので、若干今のXcode4.5 と違っていたりしますがそこは心眼でよみつつ。

その中でも一番悩んだのがここ↓

https://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjCTutorial/06Controller/chapter_6_section_6.html#//apple_ref/doc/uid/TP40000863-CH8-DontLinkElementID_47

どう見てもこのインスタンスを作成することができない。。

悩むこと1日。ようやくわかりました

XCodeの右下にあるObjectLibraryから「Object」なるものをnibに追加。

Objectを選択し、CustomClassでControllerのクラス名を入れる。そうすれば

フィールドと接続できるようになりました。

もっとマニュアルやらチュートリアルを最新版にあわせて充実させてほしいものです。

Macでzcat

最近、UnixとWindowsのあいのこであるようなMacにすっかりはまってます

LinuxからMacへといろいろなシェルなどを移植中

zcatではまったのでメモ

Apacheのログを解析しようと、ZCATで解凍しようとしたのですが、何度やっても↓

$ zcat acc2012-03-01.gz
zcat: acc2012-03-01.gz.Z: No such file or directory

http://nomorework.fool.jp/wordpress/2012/01/28/macのzcatではgzを開けない/

いろいろ調べたところありました。こちらの記事を参考にzcatをgzcatに変更すればOK

$ gzcat acc2012-03-01.gz
...

DLLのデバッグを起動時から行うためには

Win32APIでDLLを開発していて一つ不便に思うことがありました。

本体側EXEの起動時にプロセスにアタッチしてデバッグしたい。。

そうなんです。本体側のソースコードがなくてDLLだけ開発しているようなときは、この起動時からのデバッグができません。

http://msdn.microsoft.com/ja-jp/library/a329t4ed%28VS.80%29.aspx

こちらに書いてある方法で試してみました。

レジストリを設定していざ起動。

いきなり例のダイアログが。。

XXX.exeは動作を停止しました
問題の解決をオンライで確認できます

あれ?失敗したか?

しばし悩む。。

ふと、プログラムをデバッグしますを押してみる。

なんてことはない、これでデバッガが起動し見事デバッグ成功

Macにffmpegをインストールしてみた

http://jungels.net/articles/ffmpeg-howto.html:このあたり]を参考にインストールしてみる。

  • 環境;MacOSX 10.8.2

lame

コーディックらしい。たぶん。。

# tar xcvfp lame-3.99.5.tar
# cd lame-3.99.5
# ./configure
# make
# make istall

faad2

# tar xvfp faad2-2.7.tar
# cd faad2-2.7
# ./configure
# make
# make install

ffmeg

# git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
# tar zxvfp ffmpeg-1.0.tar.gz
# cd ffmpeg-1.0
# ./configure --enable-libmp3lame --enable-shared --disable-mmx --arch=x86-64
# make
# make install

mp4からmp3に変換してみる

ディレクトリにXXXX.mp4というファイルを複数入れているとする

# for f in *mp4;do
> ffmpeg -i $f -ab 128 ${f%.*}.mp3
> done

POIでEXCELを操作してみる

javaでExcelに値を書き込むためにPOIを使用してみます。

POIをGET

このプログラムを作成したころはpoiの2.5だったのですが、現在では3.8が利用できるようです。何が変わったのかは未確認。

wget	http://ftp.riken.jp/net/apache/poi/release/bin/poi-bin-3.8-20120326.tar.gz
tar zxvfp poi-bin-3.8-20120326.tar.gz

この中のpoi-3.8-20120326.jarが本体となります

仕様

Excelに書き込むためにはあらかじめテンプレートを用意しておきその中にプログラムから値を書き込む仕様にします。

まずテンプレート用にtemplate.xlsを作成します

新規ファイルを作成し、B4に[a1]、B6に[a2]、D6に[e0-1]を記入しxls形式(2003までの形式)で保存。

サンプルプログラム

  • ExcelCellData.java
import java.util.GregorianCalendar;

import org.apache.poi.hssf.usermodel.HSSFCell;

/** セルに書き込むデータを保持するクラス */
public class ExcelCellData{
 public static int DOUBLE=1;
 public static int STRING=2;
 public static int CALENDAR=3;
 private int m_col;
 private int m_row;
 private int m_type;
 private Object m_val;
 private short m_enc;
 private int m_obj;

 /** コンストラクタ
	 @param col エクセルシートの行
	 @param row エクセルシートの列
	 @param val 書き込むデータ String or GregorianCalendar or double */
 public ExcelCellData(int col,int row,Object val){
	 m_col=col;
	 m_row=row;
	 if(val instanceof String){
		 m_type=HSSFCell.CELL_TYPE_STRING;
		 m_enc=HSSFCell.ENCODING_UTF_16;
		 m_obj=STRING;
	 }else if(val instanceof GregorianCalendar){
		 m_type=HSSFCell.CELL_TYPE_STRING;
		 m_enc=HSSFCell.ENCODING_COMPRESSED_UNICODE;
		 m_obj=CALENDAR;
	 }else{
		 m_type=HSSFCell.CELL_TYPE_NUMERIC;
		 m_enc=HSSFCell.ENCODING_COMPRESSED_UNICODE;
		 m_obj=DOUBLE;
	 }
	 m_val=val;
 }

 /** セルに書き込むデータのセル行を得る
	 @return 行番号 */
 public int getCol(){return m_col;}
 /** セルに書き込むデータのセル列を得る
	 @return 列番号 */
 public int getRow(){return m_row;}
 /** セルに書き込むデータの値を得る
	 @return 値 */
 public Object getCellValue(){return m_val;}
 /** セルに書き込むデータのタイプを得る
	 @return */
 public int getCellType(){return m_type;}
 /** セルに書き込むデータのエンコードタイプを得る
	 @return */
 public short getCellEncoding(){return m_enc;}
 /** セルに書き込むデータの種類を得る
	 @return ExcelData.Cell.DOUBLE,ExcelDat.Cell.STRING,ExcelData.Cell.CALENDAR	*/
 public int getObjectType(){return m_obj;}
}
  • ExcelData.java
import java.util.Calendar;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

 /**
	 Excel に書き込むデータを保持する
 */
 public class ExcelData {
	 private HSSFWorkbook m_wb;
	 private HSSFSheet hsheet;
	 private HSSFRow hrow;
	 private HSSFCell hcell;
 
	 /** コンストラクタ */
	 public ExcelData(){
		 m_wb=new HSSFWorkbook();
	 }
 
	 public ExcelData(HSSFWorkbook wb){
		 m_wb=wb;
	 }
 
	 public void addData(String sheet,int col,int row,String val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(String sheet,int col,int row,String val,
		 int top,int bottom,int left,int right){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート名
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(String sheet,int col,int row,String val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
 
	 public void addData(String sheet,int col,int row,boolean val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(String sheet,int col,int row,boolean val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート名
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ 
		 @param color 色 */
	 public void addData(String sheet,int col,int row,boolean val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
 
	 public void addData(String sheet,int col,int row,Calendar val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(String sheet,int col,int row,Calendar val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート名
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(String sheet,int col,int row,Calendar val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
	 public void addData(String sheet,int col,int row,double val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(String sheet,int col,int row,double val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート名
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ 
		 @param color 色 */
	 public void addData(String sheet,int col,int row,double val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
	 public void addData(String sheet,int col,int row,Date	 val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(String sheet,int col,int row,Date	 val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート名
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(String sheet,int col,int row,Date val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
	 public void addData(int sheet,int col,int row,String val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(int sheet,int col,int row,String val,
		 int top,int bottom,int left,int right){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(int sheet,int col,int row,String val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
 
	 public void addData(int sheet,int col,int row,boolean val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(int sheet,int col,int row,boolean val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ 
		 @param color 色 */
	 public void addData(int sheet,int col,int row,boolean val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
 
	 public void addData(int sheet,int col,int row,Calendar val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(int sheet,int col,int row,Calendar val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(int sheet,int col,int row,Calendar val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
	 public void addData(int sheet,int col,int row,double val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(int sheet,int col,int row,double val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ 
		 @param color 色 */
	 public void addData(int sheet,int col,int row,double val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
	 public void addData(int sheet,int col,int row,Date	 val){
		 addData(sheet,col,row,val,0,0,0,0);
	 }
	 public void addData(int sheet,int col,int row,Date	 val,
		 int top,int bottom,int left,int right ){
		 addData(sheet,col,row,val,top,bottom,left,right,(short)0);
	 }
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値
		 @param top 罫線フラグ
		 @param bottom 罫線フラグ
		 @param left 罫線フラグ
		 @param right 罫線フラグ
		 @param color 色 */
	 public void addData(int sheet,int col,int row,Date val,
		 int top,int bottom,int left,int right,short color ){
		 getcell(sheet,col,row);
		 hcell.setCellValue(val);
		 setstyle(bottom,top,left,right,color);
	 }
 
	 /** エクセルに書き込むセル単位のデータを追加
		 @param sheet シート
		 @param col 行
		 @param row 列
		 @param val 値 
		 @param style */
	 public void addData(int sheet,int col,int row,Object val,HSSFCellStyle style){
		 getcell(sheet,col,row);
		 if(val instanceof Boolean){
			 hcell.setCellValue(((Boolean)val).booleanValue());
		 }else if(val instanceof Calendar){
			 hcell.setCellValue((Calendar)val);
		 }else if(val instanceof Date){
			 hcell.setCellValue((Date)val);
		 }else if(val instanceof Double){
			 hcell.setCellValue(((Double)val).doubleValue());
		 }else if(val instanceof String){
			 hcell.setCellType(HSSFCell.CELL_TYPE_STRING);
			 //hcell.setEncoding(HSSFCell.ENCODING_UTF_16);
			 hcell.setCellValue((String)val);
			 if(((String)val).indexOf("\n")>=0){
				 style.setWrapText(true);
			 }
		 }
		 setstyle(style);
	 }
 
 
	 private void getcell(String sheet,int col,int row){
		 if(m_wb.getSheetIndex(sheet)<0){
			 hsheet=m_wb.createSheet(sheet);
		 }else{
			 hsheet=m_wb.getSheet(sheet);
		 }
		 hrow=hsheet.getRow((short)row);
		 if(hrow==null){
			 hrow=hsheet.createRow((short)row);
		 }
		 hcell=hrow.getCell(col);
		 if(hcell==null){
			 hcell=hrow.createCell(col);
		 }
	 }
	 private void getcell(int sheet,int col,int row){
		 hsheet=m_wb.getSheetAt(sheet);
		 if(hsheet==null){
			 hsheet=m_wb.createSheet();
		 }
		 hrow=hsheet.getRow((short)row);
		 if(hrow==null){
			 hrow=hsheet.createRow((short)row);
		 }
		 hcell=hrow.getCell(col);
		 if(hcell==null){
			 hcell=hrow.createCell(col);
		 }
	 }
 
	 private void setstyle(HSSFCellStyle style){
		 hcell.setCellStyle(style);
	 }
 
	 private void setstyle(int bottom,int top,int left,int right,
		 short color){
		 HSSFCellStyle style =m_wb.createCellStyle();
		 if(bottom>0){
			 if(bottom==1){
				 style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
				 style.setBottomBorderColor(HSSFColor.BLACK.index);
			 }
		 }
		 if(left>0){
			 style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			 style.setLeftBorderColor(HSSFColor.BLACK.index);
		 }
		 if(right>0){
			 style.setBorderRight(HSSFCellStyle.BORDER_THIN);
			 style.setRightBorderColor(HSSFColor.BLACK.index);
		 }
		 if(top>0){
			 style.setBorderTop(HSSFCellStyle.BORDER_THIN);
			 style.setTopBorderColor(HSSFColor.BLACK.index);
		 }
		 if(color>0){
			 style.setFillForegroundColor(color);
			 style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		 }
		 hcell.setCellStyle(style);
	 }
	 
	 public HSSFWorkbook get(){
		 return m_wb;
	 }
 }

  • ExcelSheetData.java
import java.util.Enumeration;
import java.util.Vector;

/**
	ExcelSheet に書き込むデータを保持する
*/
public class ExcelSheetData implements Enumeration{
 private Vector m_dat;
 private int m_cnt;
 private String m_sheet;	/* シート名 */

 /** コンストラクタ
	@param sheet シート名
 */
 public ExcelSheetData(String sheet){
	 m_sheet=sheet;
	 m_cnt=0;
	 m_dat=new Vector();
 }

 /** エクセルに書き込むセル単位のデータを追加する
	 @param cell セルデータ */
 public void addData(ExcelCellData cell){
	 m_dat.add(cell);
 }

 public boolean hasMoreElements(){
	 if(m_cnt
  • ExcelCreator.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Hashtable;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

 /** エクセルに書き込む */
 public class ExcelCreator {
	 private static String TEMPLATE="template.xls";	 
	 private String m_template;
	 private String m_file;
	 private ExcelData m_edat;
 
	 /** コンストラクタ
		 @param file ファイル名 */
	 public ExcelCreator(String file){
		 m_file=file;
		 m_template=TEMPLATE;
	 }
 
	 /**
		 @param template 雛形ファイル名
		 @param file ファイル名 */
	 public ExcelCreator(String template,String file){
		 m_file=file;
		 m_template=template;
	 }
 
	 public void create(ExcelData edat) throws Exception{ 
		 m_edat=edat;
		 try{
			 HSSFWorkbook wb=m_edat.get();
 
			 FileOutputStream fileOut = new FileOutputStream(m_file);
			 wb.write(fileOut);
			 fileOut.close();
		 }catch(Exception e){
			 throw e;
		 }
	 }
 
 
	 public	HSSFWorkbook read(){
		 HSSFWorkbook wb=null;
		 try{
			 POIFSFileSystem fs			=
				 new POIFSFileSystem(new FileInputStream(m_template));
			 wb = new HSSFWorkbook(fs);
		 }catch(Exception e){
			 e.printStackTrace();
			 wb=new HSSFWorkbook();
		 }
		 return wb;
	 }
 
 
	 /** テンプレートのデータを実際のデータに置き換える
		 @param wb
		 @param dat key:[key],val:value 
		 @return */
	 public ExcelData createdata(HSSFWorkbook wb,Hashtable dat){
		 HSSFSheet sheet=null;
		 HSSFRow row=null;
		 HSSFCell cell=null;
		 int sheet_max=0;
 
		 ExcelData ed=new ExcelData(wb);
		 for(int ii=0;ii=wb.getNumberOfSheets())break;
			 sheet=wb.getSheetAt(ii);
			 if(sheet==null)continue;
 
			 for(int jj=sheet.getFirstRowNum();jj<=sheet.getLastRowNum();jj++){
				 row=sheet.getRow(jj);
				 if(row==null)continue;
				 
				 for(int kk=row.getFirstCellNum();kk<=row.getLastCellNum();kk++){
					 cell=row.getCell(kk);
					 if(cell==null)continue;
 
					 String key=keycheck(cell.getStringCellValue());
					 HSSFCellStyle style=cell.getCellStyle();
					 if(key!=null){
						 Object val=dat.get(key);
						 if(val==null){
							 String wk="";
							 val=(Object)wk;
						 }
							ed.addData(ii,kk,jj,val,style);
					 }
				 }
			 }
			 sheet_max++;
		 } 
		 return ed;
	 }
 
	 private String keycheck(String key){
		 String ret=null;
		 if(key!=null && !key.trim().equals("")){
			 String wk=key.trim();
			 if(wk.indexOf("[")==0 && wk.indexOf("]")==wk.length()-1){
				 ret=wk.substring(1,wk.length()-1);
			 }
		 }
		 return ret;
	 }

 
	 public static void main(String[] args) throws Exception {
		 ExcelCreator ec=new ExcelCreator("template.xls","output.xls");
		 Hashtable dat=new Hashtable();
		 dat.put("a1","aaa");
		 dat.put("a2",new Double(2));
		 dat.put("e0-1","niao \n 1000 \n 日本語");
		 ExcelData ed=ec.createdata(ec.read(),dat);
		 try{
			 ec.create(ed);
		 }catch(Exception e){
			 e.printStackTrace();
		 }
	 }
 }

実行

poi-3.8-20120326.jarにCLASSPATHを通してExcelCreatorを実行します。template.xlsは同じディレクトリに入れておきます。

output.xlsというファイルが作成され、templateで指定したセルの部分に値が入っているのがわかります

Apache+mod_mem_cacheでキャッシュしてみる

Squidを使えば簡単にリバースプロキシを作ることができます。ただ、一つ問題がありキャッシュ時間が分単位となります。

リアルタイム性をできるだけ持たしたいのだが、数秒間のキャッシュを行いたいときにはSquidではちょっとできそうにありません。そこでApache+mod_mem_cacheで試してみます

参考にしたページ

  1. http://httpd.apache.org/docs/2.2/mod/mod_cache.html
  2. http://d.hatena.ne.jp/mhag/20070417/1176786290
  3. http://blog.as-is.net/2007/02/mt-searchcgi-modcache.html
  4. http://kamoland.com/wiki/wiki.cgi?mod_cache%A4%C7Wiki%28CGI%29%A4%CE%B9%E2%C2%AE%B2%BD
  5. http://d.hatena.ne.jp/rougeref/20090616

Apache2.2.22インストール

./configure --enable-so --enable-ssl --with-ssl=/usr/local/ssl/lib --enable-logio --enable-proxy \
--enable-rewrite --enable-cache --enable-mem-cache --enable-disk-cache
make
make install

httpd.confをこんな感じで設定します設定します。

どうやらmod_mem_cacheはメモリ上のキャッシュが変に効いているので最初はいいがそのうちダメになるので、mod_disk_cacheをつかいます

 
	 ProxyPass ajp://localhost:8009/jsp/
 
LoadModule perl_module modules/mod_perl.so


		 SetHandler perl-script
		 PerlResponseHandler ModPerl::Registry
		 PerlOptions +ParseHeaders
		 Options +ExecCGI
		 Order allow,deny
		 Allow from all


  
	 
		 CacheRoot /tmp
		 CacheEnable disk /
		 CacheEnable disk /jsp
		 CacheEnable disk /cgi
		 CacheDefaultExpire 5
		 CacheMaxExpire 5
		 CacheIgnoreCacheControl On
		 CacheIgnoreNoLastMod On
		 CacheIgnoreHeaders Set-Cookie
		 CacheDirLevels 5
		 CacheDirLength 3
		 CacheIgnoreURLSessionIdentifiers PHPSESSIONID jsessionid
	 
 

今回はJSPとperlのCGIを対象にしますので、mod_perlも設定しておきます

Perl

これらの設定でJSPは簡単にキャッシュが効いてくれたのですがどうもcgiはうまくキャッシュされていない模様です。

どうもHTTPHeaderにExpiresとCache-Control:max-ageがうまく入っていなかったようですのでcgi側で強制的に入れてやります

#!/usr/bin/perl
print "Content-type:text/plain\n";
print "Expires: 5\n";
print "Cache-Control: max-age=5\n";
print "last-Modified:	Tue, 15 Nov 1994 12:45:26 GMT\n";
print "\n";

結局のところ

apacheの設定

mod_disk_cacheを使うのが吉。

その場合、CacheDirをクローンで定期的に消す必要あり

cgiの設定

たぶん不要だがmod_perlを使うようにする

perlの書き方

HeaderにExpires:5 と Cache-Control: max-age=5 を入れておく

なぜか勝手にApacheがmax-age=0を返していたのでこれは必須

MacでHadoop(インストール)

http://www.ne.jp/asahi/hishidama/home/tech/apache/hadoop/pseudo.html:こちら]とhttp://d.hatena.ne.jp/daisuke-m/20110605/1307239347:こちら]を参考にインストールする

wgetのインストール

特になくてもいいのだが後々便利なので入れておく

$ cd /Users/UserName/Download
$ tar zxvpf wget-1.14.tar.gz
$ cd wget-1.14
$ ./configure
$ make
$ su -
# make install
  • これで/usr/local/bin以下にインストールされる

hadoopのダウンロード

http://www.apache.org/dyn/closer.cgi/hadoop/common/:このあたり]から好きなのを選んでwgetでダウンロード。今回は0.20.205をチョイス

$ cd ~/Download
$ wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-0.20.205.0/hadoop-0.20.205.0-bin.tar.gz
$ tar zxvfp hadoop-0.20.205.0-bin.tar.gz
$ su -
# mv hadoop-0.20.205 /usr/local
# cd /usr/local
# ln -s hadoop-0.20.205 hadoop
# chown -R admin:staff hadoop-0.20.205
# cd hadoop
# ln -s /var/log logs

面倒なのでパーミッションを自分にしておく。あとログのディレクトリも作成

hadoopの設定

  • /usr/local/hadoop/conf/hadoop-env.sh
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
export HADOOP_HOME_WARN_SUPPRESS="TRUE"

Javaの環境変数の設定と、HADOOP_HOME is deplicated のWarningが出るのでその対策を入れておく

  • /usr/local/hadoop/conf/core-site.xml


	fs.default.name
	hdfs://localhost:9000


	hadoop.tmp.dir
	/usr/local/hadoop/tmp


  • /usr/local/hadoop/conf/hdsf-site.xml


	dfs.replication
	1


  • /usr/local/hadoop/conf/mapred-site.xml


	mapred.job.tracker
	localhost:9001


	mapred.system.dir
	/mapred/system


  • ~/.bashrc
. /usr/local/hadoop/conf/hadoop-env.sh
export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

export CLICOLOR=1
export LSCOLORS=DxGxcxdxCxegedabagacad

alias dfsls='/usr/local/hadoop/bin/hadoop dfs -ls'			 
alias dfsrm='/usr/local/hadoop/bin/hadoop dfs -rm'			 
alias dfscat='/usr/local/hadoop/bin/hadoop dfs -cat'		 
alias dfsrmr='/usr/local/hadoop/bin/hadoop dfs -rmr'		 
alias dfsmkdir='/usr/local/hadoop/bin/hadoop dfs -mkdir' 
alias dfsput='/usr/local/hadoop/bin/hadoop dfs -put'	 
alias dfsget='/usr/local/hadoop/bin/hadoop dfs -get'		 
alias hadoop='/usr/local/hadoop/bin/hadoop'

これであっているのでしょうか。。

Hadoopを動かしてみる

$ cd ~/Documents/hadoop
$ cat > test.txt
test test test hoge hoge
$ dfsmkdir input
$ dfsput test.txt input
$ dfsls input
Found 1 items
-rw-r--r--	 1 admin supergroup					2 2012-10-02 10:11 /user/admin/input/users.txt

とりあえず動いているみたいだ

Hadoopのエラー

いろいろ試行錯誤しながらやっていると時々わけのわからないエラーが出ます。

$ dfsput test.txt input/
12/10/02 10:06:24 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File test.txt could only be replicated to 0 nodes, instead of 1
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1531)

対処法はごくシンプル

$ /usr/local/hadoop/bin/stop-all.sh
$ rm -rf /usr/local/hadoop/tmp/*
$ hadoop namenode -format
$ /usr/local/hadoop/bin/start-all.sh

macのビープ音を削除してみる

macでTerminalを使用しているとビープ音が耳障りです。

terminalのビープ音

ターミナルを起動して

$ cat > ~/.inputrc
set bell-style none
^C

ターミナルを再起動すればOK.ユーザごとに設定が必要です

VIのビープ音

$ cat > ~/.vimrc
set visualbell t_vb=
^C