2010年03月22日 00:46

Scalaのメモ

JavaプログラマがScalaを始めたときのメモ。



再代入できない変数(定数?)の設定は、val を使い、再代入できる変数は var で宣言する。
val a = 3;
var b = 4;



ifは文じゃなくて式なので、以下のようにできる。
println(if(1 > 2) 3 else 4)



インクリメント演算子はないみたい。i++ってのでエラーになる。



for文は、構文がJavaと違い、
for(index <- 1 until 100){
}
という感じ。until を使うと99まで。to を使うと100まで。
for(index <- 1 to 100)[
}
で100まで実行される。



2重ループはfor文を入れ子にしなくても、以下のようにforの中にセミコロンで連続して書ける。
for(ii <- 1 to 3; ij <- 1 to 4){
	println( ii + ", " + ij);
}



関数の定義は以下のよう。関数本体の最後の式が関数の返値になる。関数本体のブロック { の前にイコールを忘れないように。イコールを忘れるとなぜか関数本体の中で意味不明なコンパイルエラーが出て、イコールを忘れていることにしばらく気づかなかった。
def summation(n: Int): Int = {
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	sum;
}
println(summation(100));



関数本体に式が1つしかなければブロックにする必要がない。{ } が不要。以下の2つは同じ意味になる。
def gcd(x: Long, y: Long): Long = {
	if (y == 0)
		x;
	else
		gcd(y, x % y);
}
def gcd(x: Long, y: Long): Long =
	if (y == 0)
		x;
	else
		gcd(y, x % y);



クラスの定義は以下のように。メソッドをオーバーライドするときは、overridedef の前に付ける必要がある。toString はJavaのObjectクラスに定義されているのでオーバーライドになる。
class ComplexNumber {
	var real: Double = 0;
	var imaginary: Double = 0;
	override def toString(): String = {
		if(imaginary == 0)
			real.toString();
		else if(imaginary > 0)
			real + " + " + imaginary + " i";
		else
			real + " - " + (-imaginary) + " i";
	}
}
val c = new ComplexNumber();
c.real = 1;
c.imaginary = -1;
println(c.toString());



不変オブジェクトの例。コンストラクタの引数はクラス定義自体に書く。
class ComplexNumber(r: Double, i: Double){
	val real: Double      = r;
	val imaginary: Double = i;
	override def toString(): String = {
		if(imaginary == 0)
			real.toString();
		else if(imaginary > 0)
			real + " + " + imaginary + " i";
		else
			real + " - " + (-imaginary) + " i";
	}
}
println(new ComplexNumber(100, 120));



2010/03/23追記
その2に続く
タグ:scala
カテゴリ:テック
2010/03/22 Mon 00:46 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月12日 20:49

巨大なファイルを一定のサイズで分割する方法

splitというコマンドが使える。大きなファイルをサイズを指定して分割できる。

巨大なファイルをWindowsパソコンの外付けハードディスクにダウンロードしたら、4GBぐらいで書き込みエラーになる、という罠にはまって、調べた。

以下の例では、巨大な backup.tar.gz というファイルを1GBごとに分割するコマンド。分割して結果できたファイルは、backup.tar.gz-00backup.tar.gz-01backup.tar.gz-02…というファイル名になる。元のファイルは削除されずに残る。
split -b 1073741824 -d --verbose backup.tar.gz backup.tar.gz-
-b はサイズを指定する。1073741824というのは、1GBが1073741824バイトだから。
-d は生成されるファイル名に連番を付ける。これがないとアルファベットがつくが、日本人には数字のほうがいい。
--verbose があると途中経過が表示される。なくてもいいけど、大きいファイルの処理だと時間がかかるので、あった方が安心する。
その後は、元のファイル名と、分割後のファイル名のプレフィックス。

結合するのは単純で、以下のようにする。backup2.tar.gz を生成している。
cat backup.tar.gz-* > backup2.tar.gz
タグ:Linux
カテゴリ:テック
2010/03/12 Fri 20:49 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月09日 20:34

Ubuntu に nagios をインストール

Ubuntu に nagios を apt-get でインストールした。
sudo apt-get install nagios2 nagios-images nagios-plugins

ブラウザでアクセスするためのBASIC認証のパスワードが /etc/nagios2/htpasswd.users に設定されているので、このファイルに適当なIDとPWを設定する

これで http://localhost/nagios2/ にアクセスすればいいと思ったが、アクセスするとページによっては以下のメッセージが出てしまう。赤字ボールドで表示される。(そんなに強調しなくてもいいのに。)

It appears as though you do not have permission to view the configuration information you requested...



いろいろ調べたら、/etc/nagios2/cgi.cfg の中にたくさん nagiosadmin というIDが設定されており、これと /etc/nagios2/htpasswd.users で設定するIDを一致される必要があるみたいで、 /etc/nagios2/htpasswd.usersnagiosadmin を設定しなおしたら、エラーメッセージが表示されなくなった。


あとは、/etc/nagios2/conf.d の中のファイルを適当にいじれば良さそうだ。ファイルをいじったら、
sudo /etc/init.d/nagios2 reload
とする必要あり。
タグ:nagios Linux
カテゴリ:テック
2010/03/09 Tue 20:34 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月07日 00:51

JavaScriptを使って画像を回転させる方法

CSS3を使うと画像や任意の要素を回転して表示させることができる。それを使ってJavaScriptで画像をくるくる回転させられる。

以下のコードは、画像をクリックするごとに左上の位置を固定したまま90度ずつ回転させる例。

CSSで transform: rotate(90deg) を設定すると、90度回転して表示される。そのままだと画像の中心を軸に回転するので、左上の位置を変えずに回転するには軸の位置を画像サイズから計算して、CSSで transform-origin を指定する。img.attr("rotate", "2") は何度回転したかを保存するために一時的に使っているもので、CSSでもHTMLでもない。

ここで使っているCSS3のtransform は WebKit, Mozilla, Opera で先行実装されているので、-webkit-, -moz-, -o- を先頭に付ける。IEで動くかどうかは試していないがたぶん(まちがいなく)動かない。Firefox, Google Chrome, Opera で動作確認した。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.js"></script>
<script type="text/javascript">
$(function(){
	$("img").click(function(){
		var img = $(this);
		var r = img.attr("rotate");
		var w = img.attr("width") / 2;
		var h = img.attr("height") / 2;
		if(r==1){
			img.css("-webkit-transform", "rotate(180deg)");
			img.css("-moz-transform", "rotate(180deg)");
			img.css("-o-transform", "rotate(180deg)");
			img.css("-webkit-transform-origin", w + "px " + h + "px");
			img.css("-moz-transform-origin", w + "px " + h + "px");
			img.css("-o-transform-origin", w + "px " + h + "px");
			img.attr("rotate", "2");
		} else if(r==2){
			img.css("-webkit-transform", "rotate(-90deg)");
			img.css("-moz-transform", "rotate(-90deg)");
			img.css("-o-transform", "rotate(-90deg)");
			img.css("-webkit-transform-origin", w + "px " + w + "px");
			img.css("-moz-transform-origin", w + "px " + w + "px");
			img.css("-o-transform-origin", w + "px " + w + "px");
			img.attr("rotate", "3");
		} else if(r==3){
			img.css("-webkit-transform", "rotate(0deg)");
			img.css("-moz-transform", "rotate(0deg)");
			img.css("-o-transform", "rotate(0deg)");
			img.attr("rotate", "0");
		} else {
			img.css("-webkit-transform", "rotate(90deg)");
			img.css("-moz-transform", "rotate(90deg)");
			img.css("-o-transform", "rotate(90deg)");
			img.css("-webkit-transform-origin", h + "px " + h + "px");
			img.css("-moz-transform-origin", h + "px " + h + "px");
			img.css("-o-transform-origin", h + "px " + h + "px");
			img.attr("rotate", "1");
		}
	});
});
</script>
</head>
<body>

<img src="test.jpg" />

</body>
</html>

このままだと、周辺のレイアウトを変更せずに単に画像を回転させるので、画像が正方形でない場合に、画像が回転した際に周辺と重なってしまう。

その問題に対応したのが以下。imgの外側にdivを囲んで、divのサイズを強制的に変更している。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.js"></script>
<script type="text/javascript">
$(function(){
	$(".rotateimg").click(function(){
		var div = $(this);
		var img = $("img", this);
		var r = img.attr("rotate");
		var width = img.attr("width")
		var height = img.attr("height");
		var w = width / 2;
		var h = height / 2;
		if(r==1){
			img.css("-webkit-transform", "rotate(180deg)");
			img.css("-moz-transform", "rotate(180deg)");
			img.css("-o-transform", "rotate(180deg)");
			img.css("-webkit-transform-origin", w + "px " + h + "px");
			img.css("-moz-transform-origin", w + "px " + h + "px");
			img.css("-o-transform-origin", w + "px " + h + "px");
			img.attr("rotate", "2");
			div.width(width);
			div.height(height);
		} else if(r==2){
			img.css("-webkit-transform", "rotate(-90deg)");
			img.css("-moz-transform", "rotate(-90deg)");
			img.css("-o-transform", "rotate(-90deg)");
			img.css("-webkit-transform-origin", w + "px " + w + "px");
			img.css("-moz-transform-origin", w + "px " + w + "px");
			img.css("-o-transform-origin", w + "px " + w + "px");
			img.attr("rotate", "3");
			div.width(height);
			div.height(width);
		} else if(r==3){
			img.css("-webkit-transform", "rotate(0deg)");
			img.css("-moz-transform", "rotate(0deg)");
			img.css("-o-transform", "rotate(0deg)");
			img.attr("rotate", "0");
			div.width(width);
			div.height(height);
		} else {
			img.css("-webkit-transform", "rotate(90deg)");
			img.css("-moz-transform", "rotate(90deg)");
			img.css("-o-transform", "rotate(90deg)");
			img.css("-webkit-transform-origin", h + "px " + h + "px");
			img.css("-moz-transform-origin", h + "px " + h + "px");
			img.css("-o-transform-origin", h + "px " + h + "px");
			img.attr("rotate", "1");
			div.width(height);
			div.height(width);
		}
	});
});
</script>
</head>
<body>

<div class="rotateimg"><img src="test.jpg" /></div>
<br />
<div class="rotateimg"><img src="test2.jpg" /></div>

</body>
</html>
タグ:HTML javascript
カテゴリ:テック
2010/03/07 Sun 00:51 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月01日 21:09

svnで認証情報をキャッシュさせない方法

コマンドラインでsvnを使うときに認証情報をキャッシュさせたくない場合は、svnコマンドをたたくごとに、オプションに --no-auth-cache を付ける。

例:
svn export --no-auth-cache リポジトリURL

タグ:Linux
カテゴリ:テック
2010/03/01 Mon 21:09 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年02月15日 23:59

Firefoxの検索バーからGmailを検索できるようにする方法

Firefoxの検索バーからGoogleやらWikipediaで検索できるようになっていますが、Gmailのメールを素早く検索出来るようにするには次のようにします。

Firefoxのプロファイルのフォルダの中の searchplugins というフォルダの中にXMLファイルを設置する。例えば WindowsXP の場合、以下のパスになる。
C:\Documents and Settings\アカウント名\Application Data\Mozilla\Firefox\Profiles\???\searchplugins\gmail.xml

このファイルに以下の内容を書く。

<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
<os:ShortName>Gmail</os:ShortName>
<os:InputEncoding>UTF-8</os:InputEncoding>
<os:Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg42v84ONr/p6f5/6en+f+np/n/p6f5/6en+f+np/n/p6f5/6en+f+np/n/p6f5/6en+f+np/n/ODja/zg42v84ONr/ODja/+Li////////////////////////////////////////////////////////4uL//zg42v84ONr/ODja/zg42v+np/n/4uL/////////////////////////////////////////////4uL//6en+f84ONr/ODja/zg42v84ONr/4uL//6en+f/i4v////////////+BgfL/gYHy////////////4uL//6en+f/i4v//ODja/zg42v84ONr/ODja///////i4v//p6f5/7a2//+BgfL/Wlrp/1pa6f+BgfL/trb//6en+f/i4v///////zg42v84ONr/ODja/zg42v///////////7a2//+BgfL/Wlrp/zg42v84ONr/Wlrp/4GB8v+2tv////////////84ONr/ODja/zg42v84ONr///////////+BgfL/Wlrp/zg42v+2tv//trb//zg42v9aWun/gYHy////////////ODja/zg42v84ONr/ODja//////+BgfL/Wlrp/zg42v+2tv////////////+2tv//ODja/1pa6f+BgfL//////zg42v84ONr/ODja/zg42v+BgfL/Wlrp/zg42v+2tv///////////////////////7a2//84ONr/Wlrp/4GB8v84ONr/ODja/zg42v84ONr/ODja/zg42v+2tv//////////////////////////////////trb//zg42v84ONr/ODja/zg42v84ONr/ODja/zg42v+BgfL/p6f5/6en+f+np/n/p6f5/6en+f+np/n/p6f5/6en+f+BgfL/ODja/zg42v84ONr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA//8AAA==</os:Image>
<os:Url type="text/html" method="GET" template="https://mail.google.com/mail/#search/{searchTerms}">
</os:Url>
</SearchPlugin>

gmailsearch.jpg

って自分でやった後で、
http://hirohirotest.hp.infoseek.co.jp/Plugin/
にもあることに気づきました。
カテゴリ:テック
2010/02/15 Mon 23:59 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年02月07日 02:00

Gmailの古いメールを消す方法

Gmailの容量がいっぱいになってきたので古いメールをまとめて削除する方法を探った。

例えば、2009年より前(2008年以前)のメールを消すには、まず日付で検索して消すメールを絞り込む。
before:2009/1/1

この中にはスレッドのうちの一部のメールでもこの期間に該当するスレッドがひっかかるので、これを全部消してしまうとこれらのスレッドに含まれる新しいメールも消してしまう。なのでいきなり削除せずに、いったんこのスレッドに特定のラベルを割り当てる。すべてを選択し、さらに検索条件にマッチするすべてのスレッドを選択し、例えば"gomi"というラベルを割り当てる。すべてに処理してよいか確認を求められるので、OKする。

次に、左のメニューから"gomi"ラベルをクリックする。ここには確かに2009年以降のメールも含まれてしまっているので、ここから2009年以降のメールを検索する。
label:gomi after:2009/1/1

この検索結果は2009年以降のメールが少しでも含まれるスレッドなので、すべてを選択し、さらに検索条件にマッチするすべてのスレッドを選択し、"gomi"ラベルを解除する。

もう一度、左のメニューの"gomi"ラベルをクリックする。この中には、2008年以前のメールしか含まれないスレッドのみが残る。すべてを選択し、さらに"gomi"のすべてのスレッドを選択し、削除ボタンを押す。すべてを削除してよいか確認を求められるので、OKする。

容量が足りなくなってきて古いメールを削除する場合は、削除したメールがまだゴミ箱に残っていて容量を食っているので、ゴミ箱を選択し、ゴミ箱を空にする。

これで完了。
タグ:google
カテゴリ:テック
2010/02/07 Sun 02:00 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年01月23日 19:58

ディレクトリごとの容量を調べる方法 (du)

duのオプションが覚えられないのでメモです。

容量の単位をわかりやすくしたい場合
du -chs *

容量をバイト単位にしたい場合
du -cbs *
タグ:Linux
カテゴリ:テック
2010/01/23 Sat 19:58 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年01月21日 13:03

ディレクトリの中にあるたくさんのファイルの文字列を全置換する方法

いまのディレクトリにある全てのHTMLファイル・JSファイル・CSSファイルにあるテキスト ABC を検索してそれをすべて DEF に置換するコマンド。

find . -name "*.html" -o -name "*.js" -o -name "*.css" | sed "s/^\(.*\)$/echo \\1; sed -e \"s\\/ABC\\/DEF\\/g\" < \\1 > rNM3dFBk.txt; cp rNM3dFBk.txt \\1/" | sh
rm rNM3dFBk.txt

・findで対象となるファイルを検索して、1つ目のsedで全置換するスクリプトを生成して、最後のshでそれを実行する。2つ目にあるsedは生成するスクリプトから実行する全置換のためのコマンド。
・rNM3dFBk.txt というのは、既存のファイル名と衝突しなさそうなランダムなファイル名。これを実行したら、このファイルがゴミで残るので、全置換後、このファイルを消す。
・対象となるファイルは、検索するテキストがあるかどうかに関わらず、上書きするため、タイムスタンプが置き換えられることに注意。
・検索するテキストを指定する箇所に記号を入れる場合は、エスケープ処理の回数に注意。sedでの全置換のコマンドをはき出すためにsedを実行しているため。
・最後の "| sh" の部分を削除して、最初に実行し、生成された全置換のスクリプトを確認した方が安全。

2011/12/11追記
こっちの方法のほうがシンプル
タグ:Linux
カテゴリ:テック
2010/01/21 Thu 13:03 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年01月11日 13:48

Google Spreadsheets のファイルを HTTP GET で取得する方法

CSVファイルで取得
https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=spreadsheet_id&exportFormat=csv

TSVファイルで取得
https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=spreadsheet_id&exportFormat=tsv

フォーマットについて詳しくは、
http://code.google.com/apis/documents/docs/2.0/developers_guide_protocol.html#DownloadingSpreadsheets

取得する前に認証が必要で、こちら参照。
http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html
タグ:google
カテゴリ:テック
2010/01/11 Mon 13:48 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。