2011年10月24日月曜日

rexsterを使ってみよう!


rexsterを使うことで、OrientDBやNeo4jのデータをRESTで取得することができます。
今回はOrientDBのデータを取得してみることにしました。

導入方法は、下記参照。
http://code.google.com/p/orient/wiki/Rexster

モジュールのダウンロードと解凍
$ wget https://github.com/downloads/tinkerpop/rexster/rexster-0.6.zip
$ unzip rexster-0.6.zip

OrientDBのバージョンが1.0rc5でない場合は、これもダウンロードして解凍しておく
$ wget http://orient.googlecode.com/files/orientdb-graphed-1.0rc5.zip
$ $ unzip orientdb-graphed-1.0rc5.zip -d orientdb_rc5

OrientDBからRexsterへ下記2つのjarをコピ-する。

  • orientdb-client-1.0rc5.jar
  • orientdb-enterprise-1.0rc5.jar

これをやるのというのは、上記のOrientDBのWikiサイトにしか書かれていないので、
Rexsterのほうを見てるとおそらくハマります。(ハマりました…)
cp orientdb_rc5/lib/orientdb-client-1.0rc5.jar  ~/rexster-0.6/target/rexster-0.6-standalone/lib/
cp orientdb_rc5/lib/orientdb-enterprise-1.0rc5.jar  ~/rexster-0.6/target/rexster-0.6-standalone/lib/
なんでこんな事をするのかは下記をご覧ください。
http://groups.google.com/group/orient-database/browse_thread/thread/f0d4ed39366396b7/02afb7c9017d9ade?#02afb7c9017d9ade


定義ファイルの編集
$ vi /home/tiffany/rexster-0.6/target/rexster-0.6-standalone/bin/rexster.xml 
1) 接続するOrientDB部の編集
   localでは上手く行かず…。
<graph>
  <graph-enabled>true</graph-enabled>
  <graph-name>orientdbsample</graph-name>
  <graph-type>orientgraph</graph-type>
  <graph-file>remote:10.3.216.204/demo</graph-file>
  <properties>
    <username>admin</username>
    <password>admin</password>
  </properties>
</graph>
2) localhost以外でつなげるなら、適宜変更。
<base-uri>http://IP</base-uri>
起動スクリプトの修正
rc5とrc6ではスクリプトが違うみたいですね。

読み込ませるrexster.xmlを-configureで指定する必要があります。
$DIR/target/rexster-*-standalone/bin/rexster.sh $@ -webroot $DIR/target/rexster-*-standalone/bin/public -configuration /home/tiffany/rexster-0.6/target/rexster-0.6-standalone/bin/rexster.xml 
起動
$ ./rexster.sh -s
その他のコマンドは下記のとおりです。
usage: rexster
 -h,--help                  print this message
 -s,--start <parameters>    start rexster (learn more with start -h)
 -u,--status <parameters>   status of rexster (learn more with status -h)
 -v,--version               print the version of rexster server
 -x,--stop <parameters>     stop rexster (learn more with stop -h)

Rexster起動中は下記ページにあるAPIが実行可能です。
https://github.com/tinkerpop/rexster/wiki/Basic-REST-API

2011年10月20日木曜日

OrientDB: record

レコードを見るにはいくつかの方法があります。
1clusterに1classのみ紐付いてる場合は、下記4つとも同じ結果が返ります。
> browse class OUser
> select * from OUser
> browse cluster OUser
> select * from cluster:OUser
実際にレコードを作ってみましょう。


レコードの作成
classを作って、レコードを入れて、入れたレコードを見てみるには、こんな感じになります。
> create class Person
> insert into Person(id, name) values (1, 'Andy')
> browse class Person

カラムの追加
例えば、電話番号を追加したいときは下記のように電話番号のカラムphoneを入れてあげるだけです。
> insert into Person(id, name, phone) values (2, 'Betty', '03-2222-2222')
> insert into Person(id, name, phone) values (3, 'Charlie', '03-3333-3333')   
この時点で、カラム名が表示されないのはバグ??

レコードの削除
> delete from Person where id = 1  
レコードを削除してみたら、カラム名が表示されました。
なお、RIDを条件にして削除する場合は、ridではなく、@ridになります。
> delete from Person where @rid = #11:0


さらに追加する場合は、空いたRIDに順に追加されますね。
> insert into Person(id, name, phone) values (4, 'Denny', '03-5555-5555')  


OrientDB: class と cluster

classとclusterはお互い関係しあってます。

class一覧の表示
>classes
classの作成
> create class [クラス名]
Class created successfully with id=3

class名の変更
> alter class [変更前] NAME [変更後]

NAMEだけでなく、[NAME, SHORTNAME, SUPERCLASS, OVERSIZE]の変更もできるらしいですが、他3つが何なのか分からないので、いつか分かった頃に…。
classの名前を変えると、clusterの名前も変更されます(再接続時に確認可能)。

cluster一覧の表示
>clusters
clusterの作成
> create cluster [クラスター名] physical append
physical の他にも、logicalで生成もできます。

以下、なんとなく分かったこと。
  • classは必ず何かのclusterに所属しています。
  • 1cluster に、複数のclassを所属させることができます。
  • classを作ると自動的に同じ名前のclusterが作成され、紐付けられますが、clusterを作成してもclassはできません。
    • class作成後に、一旦disconnectして、再度接続するとclusterにもできていることが確認できます。(原因は分かりませんが…)
    • clusterは複数のclassが所属できるので、classができないのだと思います。
  • clusterを作り、その後に同名のclassesを作ると、自動的に紐付けてくれます。

classを他のclusterに所属させるにはどうすれば良いのだろう、というのが分かりません…。


classとclusterの一覧を表示させるとこんな感じです。


2011年10月19日水曜日

OrientDB: remoteのDB作成と接続

demoという名のdatabaseを作ってみましょう。
前回はlocal版でしたが、remoteからもアクセスできるようにします。

ここで必要な設定と情報は2つ。
configでIPの設定 config/orientdb-server-config.xml にあります。

1) rootのパスワード確認
orientdbを初回起動した際に生成されます。毎回異なります。
 <user name="root" password="AED2DBECFF6C499D7E5CE8EA729E3C7A02F171EEA31A67C245F941FB925B2D86" resources="*"/>

2) IPの設定
 <listener ip-address="10.20.30.40" port-range="2480-2490" protocol="http">

作業するには、./console.shを起動します。
作成
> create database remote:10.20.30.40/demo root AED2DBECFF6C499D7E5CE8EA729E3C7A02F171EEA31A67C245F941FB925B2D86 local
Creating database [remote:10.20.30.40/demo] using the storage type [local]...
Connecting to database [remote:10.20.30.40/demo] with user 'admin'...OK
Database created successfully.
Current database is: remote:10.20.30.40/demo
接続
> connect remote:10.20.30.40/demo admin admin
Disconnecting from the database [demo]...OK
Connecting to database [remote:10.20.30.40/demo] with user 'admin'...OK
情報確認
> info
Current database: demo (url=remote:10.20.30.40/demo)
Total size: 9.76Kb

remoteで接続できることが確認できました。
作成されたデータベースは、databaseディレクトリ以下にdemoのフォルダがあります。

Rubyでカレントディレクトリのモジュールのrequire

Ruby1.9.2より、current directoryにあるモジュールを
requireするには、絶対パスにしないとならないようです。
LOAD_PATHから「.」が削除されたそうです。

絶対パス以外の方法では、require ではなく require_relative を使用することも可能ですが、
逆に1.8系では、require_relative がないので、両バージョンで使うとエラーになるので
注意が必要です。

1.8と1.9系なら、こんな書き方になるでしょうか。
require File.expand_path(File.join(File.dirname(__FILE__), 'moduletest'))

1.9系なら、これだけでもありですね。
require_relative 'moduletest'

1.9系では使えません。
require 'moduletest'

1.9系でrequireが絶対パスになっていない場合はこんな感じのエラー。
$ ruby test.rb
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- moduletest (LoadError)

1.8系でrequire_relativeを使うとこんな感じのエラー。
$ ruby test.rb
test.rb:5: undefined method `require_relative' for main:Object (NoMethodError)

参考サイト:
http://stackoverflow.com/questions/2900370/why-does-ruby-1-9-2-remove-from-load-path-and-whats-the-alternative

Flag drop charge?

タクシーの"flag drop charge"って何のこと?
タクシー乗った時に、"空車"の札が落とされるじゃないですか。
あれがflag drop。
その時にチャージされることは、というと"初乗り料金"ってことですね!

2011年10月18日火曜日

RubyでHTTP通信

OrientDBのサンプルを用いて、RubyでHTTP通信(GET)をしてみました。
こんな感じで OGraphVertex のデータが取得できます。
require 'net/http'
req = Net::HTTP::Get.new('/class/tinkerpop/OGraphVertex')
req.basic_auth 'admin', 'admin'
Net::HTTP.start(@IP,@PORT) {|http|
  response = http.request(req)
  return response.body
}

2011年10月17日月曜日

OrientDB: コンソール(full ver)

基本はシンプルバージョンと同じですが、ここではremoteについて触れてみます。

remoteを使う場合は、OrientDBのserverを起動しておく必要があります。
localの場合は、直接databases以下を見に行くので、起動しなくても大丈夫です。
$ ./console.sh 

tempに接続&切断
> connect remote:127.0.0.1/temp admin admin
Connecting to database [remote:127.0.0.1/temp] with user 'admin'...OK
> disconnect

tinkerpopに接続&切断
> connect remote:127.0.0.1/tinkerpop admin admin
Connecting to database [remote:127.0.0.1/tinkerpop] with user 'admin'...OK
> disconnect



OrientDB: Studio

いまだ使いかたがよくわかっていないStudioですが…
localhost以外からつなげる場合は、下記の変更が必要です。
OrientDBのサーバーはシャットダウンし、変更後に再起動してください。
起動中に変更するとサーバーのシャットダウンがうまくいかないことがあります。

$ vi ~/orientdb/config/orientdb-server-config.xml
<listener ip-address="127.0.0.1" port-range="2480-2490" protocol="http">

ここのlocalhostのIPを変えないで、マシンのIPに接続すると
「503 Service Unavailable」のエラーが出ます。

下記にアクセスすると、
http://マシンIP:2480/studio/

こんな画面が開きます。

2011年10月14日金曜日

OrientDB: コンソール(simple ver)

シンプルバージョンを用いています。
demoが入っていなかったので、いろいろ苦戦しました。。

コンソールを触って見ました。 bin以下にあります。
$ ./console.sh 
  • 「help」や「?」を入力すると、コマンドリストが表示されます。
  • 「exit」でコンソールを終了させます。

DBの作成と削除、起動と切断について動かしてみます。(ひとまずlocal版)

DBの作成
Syntax: create database <database-url> <user> <password> <storage-type>
> create database local:../databases/demo/demo admin admin local
Creating database [local:/home/tiffany/orientdb/databases/demo/demo] using the storage type [local]...
Database created successfully.
Current database is: local:/home/tiffany/orientdb/databases/demo/demo
DBの削除
Syntax: create database <database-url> <user> <password>
> drop database  local:../databases/demo/demo admin admin

接続
Syntax: connect <database-url> <user-name> <user-password>
> connect local:../databases/demo/demo admin admin
Connecting to database [local:../databases/demo/demo] with user 'admin'...OK

切断
Syntax: disconnect
> disconnect

Disconnecting from the database [demo]...OK

DB情報の参照
Syntax: info
> info

OrientDB: インストールから起動まで


Neo4jの次は、OrientDBを試してみることにしました!
試行錯誤で試すので、やや間違えてるところもあるかもしれませんのでご了承くださいませ…。

Javaが入ってることを確認
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)


ダウンロード~インストール
http://code.google.com/p/orient/wiki/Download
二種類のモジュールがあるようです。

  • orientdb-1.0rc6-distribution.tar.gz
    • 必要最低限のみのシンプルバージョン
  • orientdb-graphed-1.0rc6.zip (現時点ではzipしかありませんでした)
    • gremlinやサンプル(demo)が含まれているフルバージョン
    • gremlinを使うならこっちが良い気がしています。最初は知らずにシンプルバージョンの方を使ってました…。

$ wget http://www.orientechnologies.com/listing/m2/com/orientechnologies/orientdb/1.0rc6/orientdb-1.0rc6-distribution.tar.gz
$ tar -xvzf orientdb-1.0rc6-distribution.tar.gz
$ mv orientdb-1.0rc6 ~/orientdb
パーミッション確認
bin以下のファイルに実行可能のパーミッションが付与されているか確認してみてください。
付与されていない場合は、下記のように.sh全部に(UNIX環境の場合)付与してください。
$ cd ~/orientdb/bin
$ chmod +x *.sh 
起動
$ cd ~/orientdb/bin
$ ./server.sh
orientdb/log/以下には、下記のようにログファイルがいくつかできあがるのが確認できます。
orientdb/log$ ls
orient-server.log.0  orient-server.log.0.lck
終了
$ cd ~/orientdb/bin
$  ./shutdown.sh
Sending shutdown command to remote OrientDB Server instance...
Shutdown executed correctly


エラー?!
もし、起動時にこんなエラーが出た場合は、server.shを実行する場所をbin内に変更しましょう。
Can't load log handler "java.util.logging.FileHandler"
java.io.IOException: Couldn't get lock for ../log/orient-server.log
java.io.IOException: Couldn't get lock for ../log/orient-server.log

あるいは、下記のパスを変更するか、ですね。
"../log/orient-server.log"これは、実行先から見たファイルです。
$ less orientdb/config/orientdb-server-log.properties*
java.util.logging.FileHandler.pattern=../log/orient-server.log


ひとまず、ここでは、インストールからOrientDBの起動と終了までにします。
次回は、console.shについて見てみます。

2011年10月8日土曜日

第1回GraphDB勉強会レポ


第1回のGraphDB勉強会に参加してきました。
少しばかり、スタッフとしてのお手伝いも。

neo4jは最近使い始めてるので、GraphDBの概要やneo4j説明に関しては飲み込めてる感じです。
@doryokujinさんが頑張って発表した3セッション!
資料作りが大変だっただろうなぁ、と思いました。
http://www.slideshare.net/doryokujin/the-definition-of-graphdb
http://www.slideshare.net/doryokujin/an-ingtroduction-to-neo4j
http://www.slideshare.net/doryokujin/an-introduction-to-tinkerpop

neo4jとLuceneの関係について、結構「ん?」となってる方もいらっしゃったようですが、
私も昔はその中の一人でした。
初めてneo4jを使った時にどうすれば作成したノードを後から見つけるんだろう?と思い、こんな時にLuceneを使うんだ、と分かった時にへ~、となった記憶があります。


TinkerPopの説明では、Gremlinの存在は知っていたけど、
まぁ、なくてもneo4jは使えるしと思ってるくらいで利用に関しての知識はなかったですが、
APIが便利そうな気がしました。
http://www.odbms.org/blog/2011/06/applying-graph-analysis-and-manipulation-to-data-stores/
http://japan.internet.com/webtech/20110709/1.html

TinkerPopの説明では、ロゴのキャラクターのかわいさについて、
かわいいとかかわいくないとか(笑)

最後にデモをしてくださった、@bibrostさんの資料です。
http://www.slideshare.net/fungoing/enjoy-graphdb-graphdb-jp-1japanese


今回の参加者は、100人オーバーだったと思うのですが、女性が4-5名?(^^;
どこもそんな感じなんですね。。。

Togetterはこちら↓
http://togetter.com/li/197970

2011年10月5日水曜日

ActiveRecordで取得した日本語の文字化け


Rails2系ではあまり気にしたことがなかったのですが、
(今まで日本語文字を出力させたことがないから?)、
現在使っているRails3でActiveRecordから取得した日本語を
出力させようとすると文字化けしました。

ちょっと前の投稿で書いた
ファイルの頭に # encoding: utf-8 を記載するのとは別に
ActiveRecordではもうワンステップ必要のようです。

必要なのはこれ。
force_encoding('UTF-8')
@user.firstname.force_encoding('UTF-8')
というふうに記載しなければなりません。

2011年10月4日火曜日

MySQLに他のサーバーから接続したい

MySQLにlocalhost以外の他のサーバーからアクセスするには設定が必要です。
ユーザ(tester/pass)だけ作って、アクセスしようとすると、こんなエラーになります。

$  mysql -u tester -ppass -h 10.20.30.40
ERROR 1045 (28000): Access denied for user 'tester'@'10.20.30.40' (using password: YES)

接続したいサーバーにて、権限を付与します。
いろいろごそごそやってるとおかしなことになるので、一旦クリーンな形にします。
% DELETE FROM mysql.user Where user = 'tester';
% REVOKE ALL PRIVILEGES ON xxx_db.* FROM tester@'%';
% FLUSH PRIVILEGES;

改めて下記を設定。
% GRANT USAGE ON *.* TO tester@'%' IDENTIFIED BY 'pass';
% GRANT ALL PRIVILEGES ON xxx_db.* to 'tester'@'%';
% SELECT USER,HOST FROM mysql.user;
権限の確認
% SHOW GRANTS for tester;
GRANT USAGE ON *.* TO 'tester'@'%' IDENTIFIED BY PASSWORD '*945E2AF30B5AA2DC36C9B6363D9B1D52A3E5CD1B'
GRANT ALL PRIVILEGES ON `xxx_db`.* TO 'tester'@'%'

上記まで行ったら、つながりました!
$ mysql -u tester -ppass -h 10.20.30.40
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 5.1.37-1ubuntu5 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

これでも繋がらない?!という場合は、iptableやufwを疑ってみるのもありかもしれません。
私はufwで引っかかってました…。

2011年9月27日火曜日

JavaScriptのイコール演算子


時々見かけるイコール3つの演算子(===)、これは何だろう?ということで調べてみたところ、
下記のページにたどり着きました。
http://js.tank.jp/javascript/post_9.html

イコール2つ(==)は、等価演算子
イコール3つ(===)は、厳密等価演算子
だそうです。

2つの違いは、イコール3つのほうは「厳密」ということからも
型の比較も行います。
例えば、数字の「5」と文字の「"5"」を比較した場合
イコール2つのほうでは、trueが返りますが
イコール3つのほうでは、型が違うためfalseになります。

2011年9月16日金曜日

neo4jとLucene


neo4jでは、Luceneをインデックスに使ってますが、
何のためにあるんでしょうか?

今は、ノードを作ったり、Traverseしたり、削除したりできているんだけど。。
よくよく考えていると分かりました!

作ったノードを取り出す際に必要なのです。
同じコンソールで作っていると、作ったノードを変数に入れておいたり、
登録したノードIDを用いて探しだすことができますが、
何十何百と登録していくうちに、ノードを探せなくなります。
そんな時にノードを作成した際に、インデックスにノード名等を登録しておくと、
そのノード名を元に、ノードを返してくれるのです。(なるほど!)
他にも、プロパティ等を登録することもできます。


ところで、Luceneのインデックスってどうやってoptimizeされるんだろう?という疑問。

とりあえずインデックスにどんどん追加してみたら、
勝手に11個目くらいでoptimizeされることが分かりました。
賢いのね(笑)

2011年9月15日木曜日

invalid multibyte char (US-ASCII)


Ruby1.9系を用いる場合の注意点として、
マルチバイト文字をソースに入れる場合(コメントは大丈夫)に
ソースの先頭に下記のいずれかを入れる必要があります。(なぜかいろいろな書き方あり)

  • # encoding: utf-8
  • # -*- encoding: utf-8 -*-
  • # -*- coding: utf-8 -*-

magic commentと言われるそうです。
入れることで、RubyのインタプリタにUTF-8のエンコーディングであることを知らせます。

上記を入れないと
invalid multibyte char (US-ASCII)
が発生します。


Ruby1.9やらRails3やら、バージョンアップするといろいろ問題が発生してます…

Rails3のNo route matchesエラー


rails3のNo route matchesエラー

フォーム作って、ボタンを押したら、遷移されるはずの所に遷移せず
No route matches [POST] /issue/show
といったエラーが出ました。

はて…(・・?

$ rake routes
issue_show GET /issue/show(.:format) {:controller=>"issue", :action=>"show"}


解決策としては、config/routes.rbを見てみると、
すべてコメントアウトされてるではないですか!

ひとまず、最終行にある下記のコメントを外すして再起動することで動きました!
   match ':controller(/:action(/:id(.:format)))'

下記のルートにも追加されるようになりました。
$ rake routes
issue_show GET /issue/show(.:format)                  {:controller=>"issue", :action=>"show"}
               /:controller(/:action(/:id(.:format))) 



ちなみにrails2のほうを見てみると、下記2行がちゃんとコメントされずに存在してました。
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

ここの表示もRails3になると変わったようですね。
$ rake routes
  /:controller/:action/:id          
  /:controller/:action/:id(.:format) 


なんでコメントアウトされてるんでしょうか?

2011年9月14日水曜日

Rails3のJSON問題


Rails2からRails3に移植したアプリでJSONを扱っていたのですが、動かなくなりました。

今までこんな感じになっていたデータが
{"nodes":{"center":{"type":"center","text":"200"},
こんな感じに変換されるようになってしまってます。
{&quot;nodes&quot;=&gt;{&quot;center&quot;=&gt;{&quot;type&quot;=&gt;&quot;center&quot;, &quot;text&quot;=&gt;&quot;200&quot;},

こちらを参考にしたところ
http://stackoverflow.com/questions/5038897/rails-3-json-problem-on-the-client-side


.html_safeを追加すれば解決できることがわかりました!
Rails2
<%=@data.to_json%>
Rails3
<%=@data.to_json.html_safe%>
この.html_safeは、escape関連でJSON以外にも登場してきそうですね。
view templateにHTMLを生成する際に使われるそうです。

2011年9月13日火曜日

はじめてのarbor.js


Execelなんかにある棒グラフ、折れ線グラフとかじゃない、NodeとEdgeのグラフを表示させるために
arbor.jsを使ってみました。
http://arborjs.org/

Webにもある3つのサンプルソースがあるにはあるのですが、
初めての私には理解できず、落としてきたモジュール内にあるsample-projectのほうが
取っ付きやすかったです。
arbor-v0.92/docs/sample-project

あれこれググってもなかなか良いサンプルがなく、、、
結局は自分でごそごそいじるだけに…。

HTML5のCanvasを使うことになってちょっと嬉しかったです!
こんな時に勉強会へ行っておいて良かった!って思いました(^^)

2011年9月12日月曜日

第6回Solr勉強会レポ

Solr勉強会にはこれで3回参加しました。
いつもお邪魔しているECナビさん。

フロアの何階か忘れてしまって、本当は8Fなのに
勘で7Fに行ったら違った(^^;

今回は特にCookpadさんのお話が聞きたかったのです。
こちらに資料を公開してくださいました!
http://d.hatena.ne.jp/code46/20110913/p1

各発表については、他の方のブログでも参考にしてください。
半分以上話が難しすぎてついていけず…。

★関口さん

  • Solr3.1-3.3はバグが入ってしまってるので、3.4が公開されたらそちらを使うこと
  • ドキュメントの親子関係の検索ができるようになった。(子が該当すると親を返すような←曖昧…)
  • Carrotでクラスタリングの結果を表示してくれる


★Cookpadさん

  • CookpadはRuby on Rails on AWS上で動作
  • 人気順検索でSolrを利用(Tritonnから移行)
  • Tritonnはパフォーマンスが悪かったり、フィールド追加が大変
  • Solr4 nightly on Oracle JVM上で稼働
  • analyzerを作らない(バッチを書く)
  • optimizeをすると20%程度速くなる
  • インデックスのみを格納し、本文はMySQLから検索することでインデックスサイズを小さくしている
  • 監視については、クエリ(QTime/QPS 1インスタンスでどのくらい捌くか)、キャッシュ(hit/eviction)、インデックス(サイズ/ドキュメント数)、、レプリケーションの所要時間をチェックしている
  • 便利だった機能はDynamicField、Facet、HTTPで検索・更新が可能、分散検索(shadingができる)


★データセクションさん

  • Bobo Solr pluginを使っている
  • メモリ不足になることが多かった
  • Solr1.4系ではレプリケーションに問題があった
  • さまざまなプラグインを利用


★Anuenue(mixiさん)

  • Solrにはクラスタ用のコマンドがなく、インスタンスごとに個別設定しなくてはならない
  • Hadoop上にOluolu(オルオル)とLikelike(リケリケ)
  • 今後はSolr Cloudを作ったり、Gosenを使ってみたい

★Apache Manifold CF

  • 2010年~のクローラー
  • Solrとの親和性があり、セキュリティを考慮した検索ができる
  • 例えば、共有サーバーのクロールでは、営業マンが営業資料を検索
  • MCFクロールをしてSolrに入れる
  • Solr Cellを利用


以上、適当ですみません(汗)


2011年9月8日木曜日

第1回品川Redmine勉強会レポ

品川Redmineの初の勉強会に参加してきました。
文京グリーンコートにあるIPAさんのオフィス。

(元)地元なので、迷わず辿りつけました♪

10分くらい前にたどりついて、コンビニで空腹を満たすためのバウムクーヘンをゲットして伺いました。
部屋に入ったらなんか雰囲気がおかたい(^^;
食べる雰囲気じゃなかったです…。(途中の休憩でこっそり食べましたが 笑)
なんとなく平均年齢がいつもより上のような気がしました。
30数名の参加者+スタッフの方々。

詳細は下記をご覧くださいませ。


Redmineの利用者は西に多く、東に少なかったんですね。
今まで何も気にせず使ってました。
いつもお世話になってるr-labsさんもいらっしゃいました♪

次回は品川で開催されるのでしょうか?!





2011年9月7日水曜日

neo4jを使ってみる


初めてのGraphDB。
GraphDBってデータベースなんですか?と聞いてるくらいのレベル…。

あれこれ調べた所、neo4jがなんか良さげだったので、とりあえず使って見ることにしました。


モジュールをダウンロードして、解凍して、インストールまで
http://neo4j.org/download/
(日本語のコミュニティサイトもあるみたいですが、英語版のほうが最新ですね。)
$ tar -xvzf neo4j-community-1.4.1-unix.tar.gz
$ mv neo4j-community-1.4.1 ~/neo4j
$ cd ~/neo4j
$ sudo ./bin/neo4j install
Graph-like power should be handled carefully. What user should run Neo4j? [neo4j] neo4j
User "neo4j" does not yet exist. Shall I create the account for you? [Yn]Y

ステータスの確認
$ ./bin/neo4j 
Usage: ./bin/neo4j { console | start | stop | restart | condrestart | status | install | remove | dump }
$ sudo ./bin/neo4j status
Neo4j Server is not running

起動
$ sudo ./bin/neo4j start
Starting Neo4j Server... process [2875]... waiting for server to be ready.................. OK.
$ sudo ./bin/neo4j status
Neo4j Server is running at pid 2875

終了
$ sudo ./bin/neo4j stop
Stopping Neo4j Server [2875].... done
$ sudo ./bin/neo4j status
Neo4j Server is not running

neo4jの削除
neo4jが要らなくなったら、下記コマンドを実行した後に、neo4jのフォルダを削除。
neo4jのディレクトリだけ削除すると、裏でプロセスが残ることがあります。
$ sudo ./bin/neo4j remove
Stopping Neo4j Server...
tpid: 9527
Waiting for Neo4j Server to exit...
Stopped Neo4j Server.

管理画面からノードの追加もできます。

ひとまず今日はここまで!

2011年9月2日金曜日

第2回JAWS-UGクラウド女子会レポ

楽しい勉強会に参加してきました♪
スポンサーの方々にスイーツ等をいただきました!
ありがとうございます☆

今回の勉強会のトピックは「セキュリティ」です。
以下、メモです。詳細はスライドをご覧ください!
  • 絶対に落ちないシステムより、いかに早く業務を再開させるかが重要!
  • 都市伝説1:パブリッククラウドより、プライベートクラウドのほうが安全だ
  • 都市伝説2:クラウド上のデータは、ベンダーが守るのだ
  • 都市伝説3:パブリッククラウドに業務システムは乗せられない
  • 都市伝説4:耐障害性を高めるにはパブリックは不向き
  • サーバー起動の例えとして、冷凍食品をレンジでチンすれば食べられる(動く)状態になる
  • Shared Responsibilityとは、AWSと利用者で責任分担
  • EC2はそれぞれが個室になっている感じなので、お隣のことは絶対に分からない!
  • S3はPUT/COPYしたら、3つの複製ができ、ひとつが壊れていると(Checksumで確認)、他をコピーして復旧してくれる。
  • Public AMIでは、公開時にチェックをしているが完璧ではないので、自分でも確認をする。
    SSHの調査例として、authorized_keysを確認して、不要なキーが書かれていないかを確認する

 休憩時間には、プリンやゼリーの差し入れも!

2011年8月30日火曜日

ufwの使い方

アクセス制限をかけるために、ufw(Uncomplicated Fire Wall)を使ってみよう!、ということで、はじめての設定を行います。
以前iptableを使ったことがあるのですが、使いづらく、ufwのほうが楽だと思いました。


ステータスの確認
初めてなので、非アクティブになっています。
$ sudo ufw status
状態: 非アクティブ

有効にする設定
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。

$ sudo ufw status
Status: active

無効にする設定
$ sudo ufw disable
ファイアウォールを無効にし、システム起動時にも無効にします
$ sudo ufw status
状態: 非アクティブ

すでに用意されているルールが2つあります。
$ cd /etc/ufw/applications.d
$ ls
apache2.2-common openssh-server

何が書かれているのか見てみましょう。
$ ls
apache2.2-common openssh-server

$ cat apache2.2-common
[Apache]
title=Web Server
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80/tcp

[Apache Secure]
title=Web Server (HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=443/tcp

[Apache Full]
title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80,443/tcp

ルールの設定
ためしにルールを設定を設定してみます。
ルールの設定には、 sudo ufw allow ARGS を利用します。
ARGSは、上記のファイルの[]かっこ内に定義した名称です。
% sudo ufw allow "Apache Full"
ルールを追加しました
% sudo ufw allow "OpenSSH"
ルールを追加しました

$ sudo ufw status
Status: active

To Action From
-- ------ ----
Apache Full ALLOW Anywhere
OpenSSH ALLOW Anywhere

追加した定義の削除
削除するには、ufw delete allow RULE を用います。
$ sudo ufw delete allow "Apache Full"
ルールを削除しました

$ sudo ufw status
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere

特定のIPとPortを追加する場合
あるIP:Portからのアクセスを許容することもできます。
$ sudo ufw allow from 10.20.30.40 to any port 2011
ルールを追加しました
$ sudo ufw status
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2011 ALLOW 10.20.30.40

追加した特定のIPとPortを削除する場合
$ sudo ufw delete allow from 10.20.30.40 to any port 2011
ルールを削除しました
$ sudo ufw status
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere

コマンドがわからなくなったらヘルプを見ましょう!
$ sudo ufw help

2011年8月25日木曜日

パスワードなしでサーバーにログイン

あるサーバーへパスワードなしでログインする場合の方法です。
ここでの例は、AのコンピュータからBのサーバーへ
パスワードなしでログインします。


0. サーバーBへログインできることを確認します。
ログインできなかった、では話になりませんので…。
この時はパスワードが求められます。
$ ssh userb@serverb
userb@serverbs password:


1. 公開キーと秘密キーのペアを生成します。
ログインなしにするため、パスワード(passphrase)部分は
何も入力しないでEnterを押します。
例) Aのコンピュータにて実行

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/servera/.ssh/id_rsa):
Created directory '/home/servera/.ssh'.
Enter passphrase (empty for no passphrase): ★何も入力しない
Enter same passphrase again:         ★何も入力しない
Your identification has been saved in /home/servera/.ssh/id_rsa.
Your public key has been saved in /home/servera/.ssh/id_rsa.pub.
The key fingerprint is:
c3:e2:e5:c8:4b:b3:dd:d3:e2:a9:09:3c:c4:ad:8a:71 usera@computera
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . o |
| + S |
| = * . |
| . E @ . . |
| + o B oo.. |
| . . o +o+o |
+-----------------+

2. 生成された公開キーのほうをSCP転送します。
例) AのコンピュータからBのサーバへ転送
$ scp id_rsa.pub userb@serverb:/home/userb/id_rsa.pub

3. 転送されてきた公開キーをauthorized_keysにマージします。
例) BのサーバーでAから送られてきた公開キーをauthorized_keysにマージ
$ cat id_rsa.pub >> authorized_keys 

4. authorized_keys のファイル権限は600にします。
$ chmod 600 authorized_keys

5. ログインしてみて、パスワードを求められないことを確認します。
$ ssh userb@serverb

2011年8月23日火曜日

MySQLでカラム型を知りたい

焦ってる時にいきなり思い出せないカラム型を見るコマンド。
それはDESC または DESCRIBE

Redmine1.1のusersテーブルをのぞいてみました。
mysql> desc users;

2011年8月22日月曜日

LVMの構築 ~6. LVのサイズ変更~

最初の図にはありませんが、LVのサイズ変更をする方法についてです。


アンマウント
一旦アンマウントしてから作業を行います。

fstabに記載していれば、下記コマンドでOK
$ sudo umount /home/LV_1

記載していない場合は、
$ sudo umount /dev/VG_1/LV_1

アンマウントされていれば、先ほどマウントしたものが、こちらに表示されなくなります。
$ df -h
ファイルシステム サイズ 使用 残り 使用% マウント位置
/dev/sda1 7.5G 1.3G 5.9G 18% /
none 242M 192K 242M 1% /dev
none 247M 0 247M 0% /dev/shm
none 247M 48K 247M 1% /var/run
none 247M 0 247M 0% /var/lock
none 247M 0 247M 0% /lib/init/rw

LV増加
もともと12GBだったのを1GB増やして13GBにする場合

$ sudo lvextend -L +1G /dev/VG_1/LV_1
Extending logical volume LV_1 to 13.00 GiB
Logical volume LV_1 successfully resized

lvdisplayで見てみると、LV Sizeが13GBになってますね。

$ sudo lvdisplay
--- Logical volume ---
LV Name /dev/VG_1/LV_1
VG Name VG_1
LV UUID Jl8OQb-Y3iS-iQas-1ko9-TNqZ-uB2j-yrHFg5
LV Write Access read/write
LV Status available
# open 0
LV Size 13.00 GiB
Current LE 3328
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:0

ファイルシステムの変更
LVにあわせてファイルシステムも変更します。

$ sudo resize2fs /dev/VG_1/LV_1
resize2fs 1.41.11 (14-Mar-2010)
Please run 'e2fsck -f /dev/VG_1/LV_1' first.

e2fsckを先に実行せよ、とのことなので、実行してみます。
$ sudo e2fsck -f /dev/VG_1/LV_1
e2fsck 1.41.11 (14-Mar-2010)
Pass 1: Checking iノードs, blocks, and sizes
Pass 2: Checking ディレクトリ structure
Pass 3: Checking ディレクトリ connectivity
Pass 4: Checking reference counts
Pass 5: Checking グループ summary information
/dev/VG_1/LV_1: 11/786432 files (0.0% non-contiguous), 89841/3145728 blocks

改めて再実行
$ sudo resize2fs /dev/VG_1/LV_1
resize2fs 1.41.11 (14-Mar-2010)
Resizing the filesystem on /dev/VG_1/LV_1 to 3407872 (4k) blocks.
The filesystem on /dev/VG_1/LV_1 is now 3407872 blocks long.

再マウント
$ sudo mount -t ext3 /dev/VG_1/LV_1 /home/LV_1/

13Gになっていることが確認できますね。
$ df -h
ファイルシステム サイズ 使用 残り 使用% マウント位置
/dev/sda1 7.5G 1.3G 5.9G 18% /
none 242M 192K 242M 1% /dev
none 247M 0 247M 0% /dev/shm
none 247M 48K 247M 1% /var/run
none 247M 0 247M 0% /var/lock
none 247M 0 247M 0% /lib/init/rw
/dev/mapper/VG_1-LV_1
13G 159M 12G 2% /home/LV_1

今回試したのはここまでです。
初歩的なことばかりですが、いろいろ勉強になりました!

LVMの構築 ~5. マウント~

つくったLVMを使うのに、マウントする必要があります。

フォーマット
作成したLVを使う前に、フォーマットする必要があります。
$ sudo mkfs.ext3 /dev/VG_1/LV_1
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
786432 inodes, 3145728 blocks
157286 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3221225472
96 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

マウント
マウントポイントを適宜作成します。
$ mkdir /home/LV_1
マウントします。
$ sudo mount -t ext3 /dev/VG_1/LV_1 /home/LV_1/
マウントされたか見てみると、下記のように12G利用できるようになったのが分かりますね!
$ df -h
ファイルシステム サイズ 使用 残り 使用% マウント位置
/dev/sda1 7.5G 1.3G 5.9G 18% /
none 243M 192K 243M 1% /dev
none 247M 0 247M 0% /dev/shm
none 247M 48K 247M 1% /var/run
none 247M 0 247M 0% /var/lock
none 247M 0 247M 0% /lib/init/rw
/dev/mapper/VG_1-LV_1
12G 159M 12G 2% /home/LV_1

fstabへの記載
毎回起動してもマウントされる状態になるようにfstabに記載しておきます。
$ sudo vi /etc/fstab
/dev/VG_1/LV_1 /home/LV_1 ext3 defaults 0 0

一旦rebootしてみて、問題ないようでした完了です!

LVMの構築 ~4. LVMの作成~

そして、LVMの作成。
ようやくLVMの作成です。
LV_1に12GBを割り当てることにしました。

lvcreate
論理ボリュームの新規作成を行います。
ボリュームグループ VG_1 上に12Gの論理ボリュームをLV_1のな前で
作る場合は下記のようなコマンドを実行します。
$ sudo lvcreate -n LV_1 --size 12G VG_1
Logical volume "LV_1" created

lvdisplay
論理ボリュームの情報を見ます。
$ sudo lvdisplay
--- Logical volume ---
LV Name /dev/VG_1/LV_1
VG Name VG_1
LV UUID Jl8OQb-Y3iS-iQas-1ko9-TNqZ-uB2j-yrHFg5
LV Write Access read/write
LV Status available
# open 0
LV Size 12.00 GiB
Current LE 3072
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:0

LVMの構築 ~3. VGの作成~

ここではVolumeGroup(VG)の作り方です。
あっというまにできます。

1個目と2個目をまとめて、1つのVGにした場合。

vgcreate
VGを定義し、それと同時にPVの中にPEが作成されます。
PVの1個目と2個目を合わせてVG_1にし、
3個目だけをVG_2にした場合は下記のようになります。
$ sudo vgcreate VG_1 /dev/sdb1 /dev/sdc1
Volume group "VG_1" successfully created

$ sudo vgcreate VG_2 /dev/sdd1
Volume group "VG_2" successfully created


どんなものができたかは下記コマンドで見てみました。
PVの時と同じように、それぞれが何のコマンドなのかは想像がつくと思います。

vgscan
$ sudo vgscan
Reading all physical volumes. This may take a while...
Found volume group "VG_2" using metadata type lvm2
Found volume group "VG_1" using metadata type lvm2

vgs
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
VG_1 2 0 0 wz--n- 15.99g 15.99g
VG_2 1 0 0 wz--n- 8.00g 8.00g

vgdisplay
$ sudo vgdisplay
--- Volume group ---
VG Name VG_2
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 8.00 GiB
PE Size 4.00 MiB
Total PE 2047
Alloc PE / Size 0 / 0
Free PE / Size 2047 / 8.00 GiB
VG UUID Xlel3X-rMSJ-4rvV-XV8f-PZNz-dMSe-Gh03SJ

--- Volume group ---
VG Name VG_1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 15.99 GiB
PE Size 4.00 MiB
Total PE 4094
Alloc PE / Size 0 / 0
Free PE / Size 4094 / 15.99 GiB
VG UUID 0qKvI6-z0sL-O62h-TzYB-EdxC-j1o0-a2R4Tu

LVMの構築 ~2. PVの作成~

Physical Volume(PV)の作成についてのメモです。

1パーティションが1PVになるので、pvcreateコマンドで、PVを作成します。
今回はパーティションを細かくわけなかったので、3つのPVができることになります。

その前に、lvm2をインストール必要あります。
$ sudo apt-get install lvm2

インストールしないとこんなエラーが出ます。
$ pvcreate /dev/sdb1
プログラム 'pvcreate' はまだインストールされていません。 次のように入力することでインストールできます:

lvm2をインストールして、いざ実行!
あっという間にできました。
これで、PVの初期化が完了しました。

$ sudo pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
$ sudo pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created
$ sudo pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created

どんなものができたか、下記コマンドで見てみました。

pvscan
物理ボリュームの一覧を表示します。
今回は3つあるので、3行表示されていますね。
$ sudo pvscan
PV /dev/sdd1 lvm2 [8.00 GiB / 8.00 GiB free]
PV /dev/sdb1 lvm2 [8.00 GiB / 8.00 GiB free]
PV /dev/sdc1 lvm2 [8.00 GiB / 8.00 GiB free]
Total: 3 [23.99 GiB] / in use: 3 [23.99 GiB] / in no VG: 0 [0 ]

pvs
pvscanのように物理ボリュームの一覧を表示していますが、
pvsでは、書式制御ができます。
たとえば、「-o pv_name,pv_size」のオプションをつけることで
物理ボリュームの名前とサイズだけ表示させることも可能です。
なお、下記は全情報を表示しています。
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 a- 8.00g 8.00g
/dev/sdc1 lvm2 a- 8.00g 8.00g
/dev/sdd1 lvm2 a- 8.00g 8.00g

pvdisplay
各物理ボリュームについての詳細を出力します。
下記では、それぞれのPVが複数行の詳細を出力していますね。
$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sdd1
VG Name
PV Size 8.00 GiB / not usable 3.98 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID VPS27O-yOVJ-MuPZ-hsz4-4Ub9-hzt9-Nbni73

--- Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 8.00 GiB / not usable 3.98 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID CXBHn0-GhSL-WTGP-woo2-UeHv-tDJC-C2T16U

--- Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size 8.00 GiB / not usable 3.98 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID DWnZGi-rdt5-8Tlg-n07f-4WRY-K0Cj-dRw7df

LVMの構築 ~1.ディスク追加とフォーマット~

LVMを構築するのに、まずはディスクを追加してHDDの容量を増やしておきます。

ディスクの追加
ディスクを追加するごとに
 /dev/sdb、
 /dev/sdc、
 /dev/sdd
というように、sd* の命名規則で増えていきます。
今回は8GBを3つ追加しました。

# デフォルト
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5

# 1つ目追加
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb

# 2つ目追加
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdc

# 3つ目追加
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdc /dev/sdd


フォーマット
fdiskのコマンドでフォーマットを行います。
初めてだと意味不明な文言が…。
「m」がヘルプなので、とりあえず「m」を選択。

$ sudo fdisk /dev/sdb

デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x61dc093d で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。

警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
強く推奨します。 and change display units to
sectors (command 'u').

コマンド (m でヘルプ): m
コマンドの動作
a ブート可能フラグをつける
b bsd ディスクラベルを編集する
c dos 互換フラグをつける
d 領域を削除する
l 既知の領域タイプをリスト表示する
m このメニューを表示する
n 新たに領域を作成する
o 新たに空の DOS 領域テーブルを作成する
p 領域テーブルを表示する
q 変更を保存せずに終了する
s 空の Sun ディスクラベルを作成する
t 領域のシステム ID を変更する
u 表示/項目ユニットを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する
x 特別な機能 (エキスパート専用)

領域の作成
新領域の作成なので「n」を選択し、プライマリパーティションの作成なので、次は「p」。
とりあえずデフォルト値を利用することで、最初と最後のシリンダの所ではEnter押下
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-8192, 初期値 1):  [←Enter押下]
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-8192, 初期値 8192):  [←Enter押下]
初期値 8192 を使います

パーティションのタイプ変更
「t」を選択してタイプ変更を行います。
デフォルトの「Linux(83)」ではなく、「Linux LVM(8e)」を選択します。
Linux LVMにすることで、VGの作成ができるようになります。
コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): L
== 一部抜粋==
83 Linux
8e Linux LVM

16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました



変更確認
変更したかどうかは、「p」で表示します。
コマンド (m でヘルプ): p

ディスク /dev/sdb: 8589 MB, 8589934592 バイト
ヘッド 64, セクタ 32, シリンダ 8192
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x61dc093d

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 8192 8388592 8e Linux LVM

終了
最後は「w」で書きこんで終了
コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

ここでフォーマットは終了。
どんなふうにできたか見てみると、/dev/sdb1 が追加されてますね。
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5
/dev/sdb /dev/sdb1 /dev/sdc /dev/sdd

同じように他の2つのディスクも変更します。

ちなみに変更前と変更後は、こんな感じです。

(変更前)
ディスク /dev/sdd: 8589 MB, 8589934592 バイト
ヘッド 64, セクタ 32, シリンダ 8192
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x32b6d984

デバイス ブート 始点 終点 ブロック Id システム

(変更後)
ディスク /dev/sdd: 8589 MB, 8589934592 バイト
ヘッド 64, セクタ 32, シリンダ 8192
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x32b6d984

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 8192 8388592 8e Linux LVM

LVMの構築 ~0. はじめに~

初めてのLVMの構築ということで、下記の5ステップに分けてメモに残しました。

  • 1.ディスク追加とフォーマット
  • 2.PVの作成
  • 3.VGの作成
  • 4.LVMの作成
  • 5.マウント

上記のステップでこんな感じのものを構築してみます。

今回参考にしたのは、こちらのサイトです。ありがとうございました!
http://sourceforge.jp/magazine/07/09/04/0115239

ログアウトをしてもscpが切れないようにする方法

SSHで時間のかかるscpでファイルを転送してると、SSHが切れるとファイル転送も切れてしまう。これでは転送が終わるまで帰れなくなってしまうことになります。
このような問題を解消するためにはどうすれば良いのでしょう?

scpを行うときは相手のサーバーパスワードが必要になるので、cronで実行ができないし、コマンドの最後に&をつけてもうまくいかない…。
(公開キーを使えばという案もありますが…)
そんな時は、nohup bg コマンドで対応できることを知りました。
どちらも初めてのコマンドです。


$ nohup scp -r xyz root@10.3.2.1:/opt/xyz
nohup: appending output to `nohup.out'
root@10.3.2.1's password: <パスワードを入力する>

Ctrl+z でジョブをサスペンド
[1]+ Stopped nohup scp -r xyz root@10.3.2.1:/opt/xyz
実行中のジョブを確認する。
$ jobs -l
[1]+ 19003 停止しました nohup scp -r xyz root@10.3.2.1:/opt/xyz

サスペンドしたジョブ「1」をバックグラウンドで実行再開する方法がbgコマンド。
$ bg 1
[1]+ nohup scp -r xyz root@10.3.2.1:/opt/xyz

ジョブの状態を確認する。
$ jobs -l
[1]+ 19003 Running nohup scp -r xyz root@10.3.2.1:/opt/xyz

とすると、ログアウトしても scp は止まらずに転送を継続してくれるのです。


こちらはまさに参考になりました。ありがとうございます。
http://d.hatena.ne.jp/yohei-a/20100212/1265950974

2011年8月19日金曜日

MySQLのSHOWコマンド

MySQLのSHOWコマンドでいろいろな情報が見れます。
私自身よく使うのがこちらです。
他にもまだまだたくさんありますが、メモとしてこのくらいに。。

show databases;
データベース一覧を表示

show tables;
テーブル一覧を表示

show columns from [テーブル名];
指定したテーブルのカラム情報を表示

show index from [テーブル名];
指定したテーブルのインデックス情報を表示

show variables [like キー];
MySQLのシステム変数を表示します。
例)show variables like "%max%";


2011年8月18日木曜日

第2回GTUG-girls(HTML5 Canvas編)

第2回のGTUG-girls@ニフティに参加してきました♪
今回はHTML5のCanvas編。
HTML5、ずっと気になっていたのです。

レポートはこちら。


◆なごみタイム
今回はポットラック式。
女性が多いので、お菓子がいっぱい(笑)
第1回に来た人も、今回初めての方もいて、新たな交流ができました。

◆説明タイム
講師は山崎大助さん。イケメンです(^^)
Canvasってどんなもの?ということからまずはデモ。

Canvas要素

<canvas id="***" width="" height="">

Canvasを描きたい所に下記のタグを追加します。

属性はこれだけ。
・id: ユニークID
・width:幅
・height:縦

※サイズ指定はstyle属性でも使用できるが、違ったふうになってしまうらしいです

コンテキスト
canvas要素はgetContext()のメソッドを持っている。引数は1つで、現在は"2d"のみです。将来"3d"出るのかな?といった所です。

var can = document.getElementById("drowarea"); //CanvasElement
var context = can.getContext("2d"); //描画するための描画Objectを準備!

座標と短形
座標は左上の(0,0)から相対的に数えます。

Canvasでは点、線、3角形、4面体の表現ができます。
3つの関数があり、それぞれx,y,width,heightの引数を取ります。
・fillRect(x,y,width,height)
・strokeRect(x,y,width,height)
・clearRect(x,y,width,height)


スクリプトは、上から順に読み込みますので、下の方に書かれた要素を上のほうで呼んでしまうとエラーになるので、それを防ぐために window.onload を利用します。
window.onload=function(){
drawShape();
}
最近ではスクリプト部を下の方に書くことも多いそうです。


HTML5で作られた歯医者さんのカルテを見せてもらい、
こういう使い方があるんだぁ、と思いました。

パス(線)
線を描くには下記の関数を順に呼び出します。

context.beginPath();//初期化処理で、始点が(0,0)になる
context.moveTo(); //始点の座標
context.lineTo(); //終点の座標
context.stroke(); //線をつなぐ
context.closePath(); //閉める

始点(moveTo)と終点(lineTo)を設定して、線を描く(stroke)を書けば、線を引いてくれるのです。
開始と終了はbeginPath と closePath が必要です。

Local Storage
ブラウザにデータを保存することができます。
保存に関しては、下記ファンクションを呼び出すだけです。

localStorage.getItem(KEYネーム); //データ取得
localStorage.setItem(KEYネーム, 値) //データ登録or更新
localStorage.clear();// データを全削除
localStorage.removeItem(KEYネーム); //1レコードのデータを削除


◆ハンズオンタイム
講師が用意したサンプルを用いながら、
お絵かきキャンバスの作成+クリアボタンの追加を行いました!

今回も新しいことが学べて楽しかったです♪

2011年8月11日木曜日

Ubuntuでのバージョンチェック

入れたモジュールのバージョンをチェックする場合のコマンドです。
Ubuntuインストール時にLAMPでついでに入れてしまおう、といった場合、
バージョンいくつだっけ?という時に必要になりました。

◆ Apache2
$ apache2 -v
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Nov 18 2010 21:19:09
他のLinuxだとhttpd -vとかあって統一されてないようです…


◆ MySQL
$ mysql --version
mysql  Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (x86_64) using readline 6.1


◆ Ubuntu
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.04.3 LTS
Release:        10.04
Codename:       lucid


◆ ruby
$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]

2011年8月10日水曜日

VMWareのUbuntuのクローン作成後の作業(ネットワークエラー対応)

vSphere Clientというツールを使ってVMのクローンを作ったら
ネットワーク周りでエラーが発生…。

なにこれ…。
eth0: ERROR while getting interface flags: No such device


IPを設定するのに、下記ファイルを編集

$ vi /etc/network/interfaces

その後

$ sudo /etc/init.d/networking restart

を実行したら

eth0: ERROR while getting interface flags: No such device

という経緯。


下記ファイルを開いてみると、コピー元のMACアドレスがeth0にあって、
eth1には、エラーのあるサーバーのMACアドレスが記載されてました。

$ vi /etc/udev/rules.d/70-persistent-net.rules

とりあえず、両方とも(SUBSYSTEM=="net"で始まる部分)コメントアウト。

$ sudo reboot

したら、無事認識!
70-persistent-net.rules のファイルにはeth0とeth1がうまくマージされた行が
1行追加されてました。
昔のMACアドレスが残っていたのが問題だったみたいなので、
きっとそれだけ削除すれば良かったのかも、と後から思い
昔のMACアドレスが定義されていた行(eth0)を削除して、
新規に追加された行のeth1をeth0に変更したら大丈夫でした。


こちらのサイトを参考にさせていただきました!
http://namahage.dip.jp/blog/2107

◆ VMをクローンしたら何したら良いのかをまとめると

・hostnameの変更
$ sudo vi /etc/hostname

・hostsの変更
$ sudo vi /etc/hosts
新IPと新hostnameに合わせましょう。
合わせないとsudoした時にsudoはできますが、エラーメッセージが出ます。

・IPの設定
$ sudo vi /etc/network/interfaces

・ethデバイスの再定義
$ vi /etc/udev/rules.d/70-persistent-net.rules
eth0とMACアドレスをあわせ、不要のものは削除 (上記の対応)

・reboot
$ sudo reboot

2011年8月9日火曜日

ある階層以下を検索結果に表示させない

Linuxのコマンドを使って、あるディレクトリ以下を検索させないようにするには、どうすれば良いのでしょうか?
よくあるのが、Subversionからチェックアウトしてきたファイルに .svn が含まれていて、それを省きたい場合です。

◆カレントディレクトリのファイル全部を見る場合
find . -type f

◆一部のディレクトリを省く場合
-prune のオプションを使うことで、指定したディレクトリ以下は対象にしません。
find . -name '.svn' -prune -o -type f

しかし、これだけだと、
./.svn
がまだ残ってしまうのです…。

そんな時は、最後に-printを付けます
理由はmanを見てね(^^;
find . -name '.svn' -prune -o -type f -print   

◆ 複数ディレクトリを対象にする場合
ORを用いて、-o -name 'XXXXX' -prune のセットを追加していきます。

find . -name '.svn' -prune -o -name 'XXXXX' -prune -o -type f -print   


2011年8月5日金曜日

MySQLの文字コード設定

mysqlコマンドでMySQLのデータベースに接続する際に設定と異なるキャラクターセットでログインする場合は
 --default-character-set={文字コード}
のオプションを利用することができます。

mysql --default-character-set=utf8 -u root -pXXXXX 


毎回つけるのが面倒な場合は、my.cnfの設定で変更が可能です。

% sudo vi /etc/mysql/my.cnf

[client]
port        = 3306
socket        = /var/run/mysqld/mysqld.sock
default-character-set = utf8   # ★追加

[mysqld]
#
# * Basic Settings
#
default-character-set = utf8   # ★追加

[mysql]
#no-auto-rehash    # faster start of mysql but no tab completition
default-character-set = utf8   # ★追加
 


設定されたかどうかを確認するには下記コマンドを用います。
SHOW VARIABLES LIKE 'char%';


MySQLに用意されている文字コードはこちらのコマンドで確認できます。
show character set;


MySQLインストール後に、特に何も変更していなければ
デフォルトでは latin1 が設定されます。

<注意>
上記はMySQL5.1の場合の設定ですが、
MySQL5.5以降では、[mysqld]セクションのdefault-character-setがなくなり、
character-set-serverに変わったそうです。


MySQLのバージョンチェックするにはこちら
select version();

+-----------------+
| version()       |
+-----------------+
| 5.1.37-1ubuntu5 | 
+-----------------+
1 row in set (0.02 sec)

2011年7月29日金曜日

gem dependenciesのバージョンの見方

~> というちょっと変わった記号を見かけることがありますが、
これは何なの?ということで下記のサイトを教えてもらい、以下に抜粋しました。
http://stackoverflow.com/questions/3492772/gem-dependencies-versions-meaning
Specification From ・・・ To (exclusive)
">= 3.0"     3.0    ・・・ ∞
"~> 3.0"     3.0    ・・・ 4.0
"~> 3.0.0"   3.0.0  ・・・ 3.1
"~> 3.5"     3.5    ・・・ 4.0
"~> 3.5.0"   3.5.0 ・・・ 3.6


~>を検索で引っ掛けるのも難しいですよね…
ちなみにこの記号の読み方は下記のRubyGemsのマニュアルより、
「approximately greater than」だそうです。
http://docs.rubygems.org/read/chapter/16
"tilda greater than" でなんとかこちらのサイトがひっかかりました。

2011年7月26日火曜日

proxy経由のwget

proxy経由でwgetする場合、Ubuntuでは下記の設定を行います。

% sudo vi /etc/wgetrc

そのファイルにて、下記を追加します。

# httpのサイトから取得
http_proxy = http://10.20.30.40:8000/

# httpsのサイトから取得
https_proxy = http://10.20.30.40:8000/

2011年7月20日水曜日

svn switch コマンド

SVNのコマンド "svn switch" と "svn switch --relocate" の扱いで
ちょっとハマったのでメモ。

◆svn swtich
作業コピーが同じリポジトリ内の違うディレクトリに変更する場合に利用します。
例えば、trunkからbranchへ参照を変更する場合です。

※ 引数は変更先を指定

例) https://10.10.10.10/trunk/aaa/bbb から https://10.10.10.10/branch/aaa/bbb にしたい場合
正しい利用
% svn switch https://10.10.10.10/branch/aaa/bbb 

間違った利用①
% svn switch --relocate https://10.10.10.10/trunk/aaa/bbb https://10.10.10.10/branch/aaa/bbb
svn: Relocate can only change the repository part of an URL

間違った利用②
% svn switch https://10.10.10.10/trunk/aaa/bbb https://10.10.10.10/branch/aaa/bbb
svn: 'https://10.10.10.10/branch/aaa/bbb' is not a working copy

◆svn swith --relocate
作業コピーが異なるリポジトリに変更する場合に利用します。
例えば、リポジトリサーバーのIPが変わった時に利用します。

※ 引数は現状と変更先の2つを指定します。
例) https://10.10.10.10/trunk/aaa/bbb から https://1.2.3.4./trunk/aaa/bbb にしたい場合
% svn switch --relocate https://10.10.10.10/trunk/aaa/bbb https://10.10.10.10/branch/aaa/bbb
svn: Relocate can only change the repository part of an URL

2011年7月19日火曜日

第9回 AWS User Group - Japan 東京勉強会

女子枠で参加してきました♪
AWSはまだ使い始めたばかりなので、あまり濃い話は書けないし、
他の皆さんが書いているので、自分向けのメモとして、
気になったトピックについて一言二言。

◆fluxflex
RedmineやWordpressをあっというまにAWS上に構築してくれるらしい

◆zmanda
クラウドバックアップをする企業だそうです。
US本社はSunnyvaleにあります。
今度行ってみたいな~

◆教育機関でのAWS利用
チューニンガソンでAWSを用いたとのこと。
→たしかに一時的なイベントではAWSは便利!
AWSは、ITスクールでも用いることができる

◆飛行石
話題の飛行石が見れた!
ドライアイスを使うと、緑色のレーザーが見えてすごい!
Google SketchUpというアプリで設計してるらしい?

◆常連枠2つ
・Amazonが提供しているサービスの名称から通信プロトコルが分かるそうです。
→サービスを全部知らない私には…(^^;
・大石さんの「アフター7パスポート!」には笑った

2011年7月14日木曜日

Redmineプラグインの設定・管理画面ラベル名の日本語化

Redmineでは、日本語なら、{プラグイン}/config/locales/ja.yml以下に
ラベル名等を記載していますが、設定画面のモジュールタブの所や、
権限の所はどうやって日本語にすれば良いのでしょうか?
と、いろいろ調べていたら、下記のように書けばできました。

・設定画面のモジュール部
project_module_xxx のように "project_module_"をprefixにつける。

・権限部
permission_view_yyy のように、"permission_"をprefixにつける。

init.rbにある下記部分からの命名のようです。
project_module :xxx do
    permission :view_yyy, {:zzz => [:update]}
  end

2011年7月13日水曜日

空チェック(empty? と blank?)について

変数等の中身をチェックする際に、
Rubyでは、プログラムの処理によっては、empty? と nil? の両方をチェックすることがあります。
例えば、nil?の可能性があるものに対して、empty?チェックだけを行うと下記のエラーが出ますよね。

> a = nil
> a.empty?
NoMethodError: undefined method `empty?' for nil:NilClass


Railsでは、両方をまとめてチェックしてくれる便利な blank? があります。
ただし、Rails以外で利用するには、モジュールを require する必要があります。

irbで実行するとこんな感じです。

> require 'rubygems'
> require 'active_support'
>
> a = nil
> b = ""
> c = []
>
> a.blank?
=> true
> b.blank?
=> true
> c.blank?
=> true

ちなみにrequireしなかった場合はこんなエラーになります。
> a.blank?
NoMethodError: undefined method `blank?' for nil:NilClass
> b.blank?
NoMethodError: undefined method `blank?' for "":String

なお、Rails2とRails3ではRequireするモジュールが異なるようなので、ご注意ください。
上記はRails2の例です。
Rails3はまだ入れていないので確認できていません…。

2011年7月12日火曜日

Railsのバリデーションチェック

モデルに書くバリデーションチェックのifオプションの記述方法では、
下記のような2通りの書き方ができます。
どちらも同じ動作をします。

①Procオブジェクトを利用
 
validates_numericality_of :value, :only_integer => true, :if => Proc.new { |p| p.name == "xxx"}
 

②メソッド切り出し
この時のメソッド名には「?」マークをつけるのは決まりのようです。
 
validates_numericality_of :value, :only_integer => true, :if => :is_num?

def is_num?
"xxx" == name
end
 

2011年7月7日木曜日

Railsのチェックボックスタグ

railsのチェックボックスタグ

railsのタグでよく迷うのが、
check_box と check_box_tag というような タグ名に"_tag" ありかどうか。

今回ハマったことは、
check_box_tag タグを用いた際に、チェックボックスにチェックが入ってないと
パラメータとして送信されないので、paramsの中に含まれなず、
コントローラ側の受け取りでparamsにあるかどうかチェックしたりしなくてはならないこと。

でも、check_box タグを使うとラクにできます。
こんなふうにかくと、単一の送信チェックボックスを作った場合。

<%= check_box("post","send",{:checked=>@xxx == "1"})%>

こんなふうに解釈されるのです。
チェックなし
<input id="post_send" name="post[send]" type="checkbox" value="1" />
<input name="post[send]" type="hidden" value="0" />
   
チェックあり
<input id="post_send" name="post[send]" type="checkbox" value="1" checked="checked" />
<input name="post[send]" type="hidden" value="0" />

もし、check_box_tag タグを使う場合は、hidden_field_tag タグと併用すると良いそうです。
参考: http://d.hatena.ne.jp/bottleneck/20070927/1190872024

2011年7月6日水曜日

Rubyのクォーテーションの扱い

サンプルコードでシングルクォーテーションとダブルクォーテーションが
混ざってる場合に、どう使い分ければ良いのだろう?と思った時、
下記を考えると、ダブルクォーテーションのほうが扱いやすいな、と思いました。

ダブルクォーテーションは#{}の式展開や特殊文字(\n、\t等)を
解釈してくれますが、シングルクォーテーションは、文字列として扱われます。

以下、サンプルです。
◆シングルクォーテーションの場合
> foo = "abc123"
> puts 'foo'
foo
> puts '#{foo}'
#{foo}

> puts 'a\n\tb'
a\n\tb

◆ダブルクォーテーションの場合
> foo = "abc123"
> puts "foo"
foo
> puts "#{foo}"
abc123

> puts "a\n\tb"
a
        b

2011年6月27日月曜日

Apacheインストール "E: Couldn't find package apache2"

UbuntuにApacheをインストールしたら、見たことのないエラーがでた。
 
$ apt-get install apache2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Couldn't find package apache2
 
調べてみると、apt-get update を実行すれば良いとのこと
 
$ apt-get update
$ apt-get install apache2
$ which apache2
/usr/sbin/apache2
 
無事入りました!

PoderosaからEC2への接続

こちらのサイトを参考にさせていただきました!
http://saifis.net/?p=116

自分用にも以下にメモしておきます。

Poderosaからアクセスするには、公開キーを別途生成する必要があり、
Puttyを用います。

◆用意するもの:
1. PuTTY Key Generator (puttygen.exe)
puttyのダウンロードサイトから落とせます。
2. Amazonからダウンロードした鍵ファイルxxx.pemファイル

◆生成方法
1. puttygen.exe を起動します。

2. [Load]ボタンを押下して、Amazonからダウンロードした鍵ファイルxxx.pemを読み込ませます。

3. 読み込ませた後は、メニューの[Conversions]→[Export ssh.com key]を選択します。
とりあえず、「key」という名前で保存します。


4. Poderosaからは下記のように設定をすればアクセスが可能です。
認証方法を「公開鍵」にし、
鍵ファイルのところでは、上記で作成した「key」ファイルを設定

いぇぃ!アクセスできた!

2011年6月23日木曜日

初めてのGAS

Google Technology Group Users (GTUG) の女子部 GTUG-girls の
第1回Meet upイベントに参加してきました。

申し込んでみたものの、Google Apps Scrips (GAS) なんて知らないんだけど…
という感じで、大丈夫かなぁ、と心配でしたが、
終わってみれば楽しく充実した時間が過ごせました♪

さて、内容は…

19時開始で、まずはネットワーク接続の確認
19時15分からサンドイッチ懇親会で、その前にTシャツをいただきました。
19時45分からハンズオン開始!
初心者用のEntryレベルと、上級者向けのExpertレベルの課題が2つ。

そもそもGASってなに?Spread Sheetなんて使わない私はEntryレベルから。
結構皆Entryレベルから初めてた感じがしました。

講師のAtusiさんが用意してくれたサンプルを自分の環境にコピーして
最初は見ながら書くものの、たかだがダイアログ表示とはいえ、動くと嬉しいですね☆
その他、メニュー/サブメニューの作成、メール送信やセルの値の取得、
GUIの作り方について学びました。

気づけばあっというまに21時半。
こんなにも勉強会が楽しかったなんて♪

ハンズオンがあるのは、本当に素敵でした。
準備してくださった皆さま、ありがとうございました!

◆GASについて習ったことをハンズオンと絡めてメモ…(講義資料からも抜粋)
・メリット
-学習コストが低いこと。
⇒ APIが分かれば、とっつきやすかった。
-ブラウザだけで開発/利用が出来る
⇒ メモ帳が必要かと思いきや、すべてブラウザ上だった
・デメリット
-超刻速ではない
⇒ サーバー側に問い合わせをするので、先生のサンプル実行を見ても、
たしかに若干もっさり感はあったかな
-ソースコード管理がないので大規模には不向き
⇒メモ帳もないし、共有機能を使うくらいかしらね?
-たまに挙動が変わる
⇒自動的に追加されることはメリットでもあり、
挙動が変わるのはデメリットでもあるんですね。
でも、互換性のない言語もあったりするから、しょうがないのかしら。
・できること
-テンプレートへの値の挿入が可能

・コード
-始めるには、[ツール] → [スクリプトエディタ]
⇒ まずはここから!
-実行するには2通り
⇒ 関数のプルダウンから選択して三角ボタン押下
⇒ [実行]メニューから選択
-メールを送るときに必要なコードはこれだけ!
MailApp.sendEmail(address, subject, body)
-セルの数え方は、1から開始して、getRange(縦, 横)
var sheet = SpreadsheetApp.getActiveSheet();
var cell_data = sheet.getRange(2,1).getValue();

◆ お写真♪
mixiさんのオフィスは素敵でした

2011年6月21日火曜日

remote_functionでAjax実装

function copy_memo(){
  <%= remote_function(:url => {:action => "copy_memo"}, 
                      :complete => "$('memo_area').value = request.responseText",
                      :with =>"'year='+$('year').value+
                '&month='+$('month').value+
                '&day='+$('day').value+
                                '&user='+$('user').value") %>
}


<input type="button" name="button" value="<%=l('copy_memo')%>" 
    onclick="copy_memo()" >


上のremote_functionで、下記を生成してくれます。
function copy_memo(){
new Ajax.Request('/xxx/copy_memo', 
                 {asynchronous:true, 
                  evalScripts:true,
                  onComplete:function(request){$('memo_area').value = request.responseText}, 
                  parameters:'year='+$('year').value+
                             '&month='+$('month').value+
                             '&day='+$('day').value+
                             '&user='+$('user').value +
                             '&authenticity_token=' +
                              encodeURIComponent('e2uxmpaqqD3l+bMWYOm3r+Yl7KKJuy4WbyNea1Wsc1E=')})
}

Rails2.3.11(あたり?)からCSRF対応で、authenticity_token が自動的にパラメータに追加されるようになったそうです。

remote_functionを使ってない場合は自分で実装を追加する必要があるのでremote_functionを利用するのが便利ですね。
最初は、remote_functionを使わずに実装していたのでログイン情報が消えてハマりました…。

ちなみにパラメータを渡すときは上記のように:with を使います。

2011年6月15日水曜日

Ubuntuでzipを解凍

Ubuntuでは、zipとunzipのパッケージを別途インストールする必要があります。
% sudo apt-get install zip unzip
解凍するには、unzipコマンド用います。
% unzip xxx.zip

2011年6月14日火曜日

BloggerにSyntaxHighlighterを追加する方法

ソースコードを載せたブログを書きたくて、SyntaxHighlighterを導入しました。
SyntaxHighlighterは各種ソースを読みやく表示します。

いろいろ検索したところ、下記を</head>の直前に入れると良いようです。
今回入れるのは、SyntaxHighlighter 3.0.83

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/> 

<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode=true;
SyntaxHighlighter.config.clipboardSwf='http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>

使うときはこんな感じに
<pre class="brush: xxx">
 ソースコードはここに
…
</pre>


<pre>タグの中の<と>タグはそれぞれ、&lt; と &gt; でエスケープします。

xxxの部分にいれるのは、こちらを参照してください。

なお、Bloggerに追加するときは、「HTMLの編集」を選択します。「作成」のほうだとうまく適用されません。

MySQL processlist


mysql> show processlist;
+--------+------+--------------------+-------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+--------------------+-------------+---------+------+-------+------------------+
| 379844 | xxx | localhost | NULL | Query | 0 | NULL | show processlist |
| 383550 | xxx | 172.16.1.151:40526 | redmine_xxx | Sleep | 7 | | NULL |
| 383551 | xxx | 172.16.1.151:40527 | redmine_xxx | Sleep | 7 | | NULL |
| 383552 | xxx | 172.16.1.151:40528 | redmine_xxx | Sleep | 7 | | NULL |
| 383553 | xxx | 172.16.1.151:40529 | redmine_xxx | Sleep | 7 | | NULL |
| 383554 | xxx | 172.16.1.151:40530 | redmine_xxx | Sleep | 6 | | NULL |
| 383555 | xxx | 172.16.1.151:40531 | redmine_xxx | Sleep | 6 | | NULL |
| 383556 | xxx | 172.16.1.151:40532 | redmine_xxx | Sleep | 6 | | NULL |
+--------+------+--------------------+-------------+---------+------+-------+------------------+