2009年2月7日土曜日

APT/パッケージ詳細

こんにちは、モリモルです。

しばらく、APT関連のメモが続きます。。


apt-cache show パッケージ名
パッケージの詳細をapt-lineから取得します。

Package: rails
Priority: optional
Section: web
Installed-Size: 12940
Maintainer: Adam Majer <adamm@zombino.com>
Architecture: all
Version: 1.1.6-3
Depends: ruby, ruby1.8 (>= 1.8.2-3), rake (>> 0.7.0), rdoc (>> 1.8.2), libpgsql-ruby1.8 | libmysql-ruby1.8 | libdbi-ruby1.8, libredcloth-ruby1.8, liberb-ruby
Recommends: irb (>> 1.8)
Suggests: libapache2-mod-ruby | libapache-mod-ruby | libapache2-mod-fcgid, libfcgi-ruby1.8
Conflicts: libdevel-logger-ruby1.8
Filename: pool/main/r/rails/rails_1.1.6-3_all.deb
Size: 1777424(省略)

Priority
パッケージの重要度らしいです。
optional(自由選択)/require(Debianに必須)/important、standard(インスコした方がよい)

Maintainer
アダムさんがメンテナンスしてくれているようです。

Version
【オリジナルバージョン番号】-【Debianのリビジョン】

Replaces
このパッケージをインストールすると削除されるパッケージ(APTの場合のみ)

Depends
依存パッケージ(APTがすべてインストールしてくれます。)

Recommends
インストールしないと、機能の一部に不具合がでるかもしれないパッケージ(APTはインストールしてくれません。)

Suggests
一緒にインストールすると便利なパッケージ

Conflicts
競合パッケージ、APTが削除してくれます。
Replacesとは異なり、代わりをしてくれません。

Filename
apt-lineのURL上のディレクトリ
ここからDLしてることになります。
http://ftp.jp.debian.org/debian/pool/main/r/rails/

APT/パッケージを検索

こんにちは、モリモルです。

引き続き、パッケージ関連のメモです。
前回は、apt-lineを追加したので各apt-lineからパッケージを探します。

sudoを探してみようと思います。


apt-cache search "検索文字"

検索文字を"sudo"にするより、" sudo "と前後に空白を入れると絞りやすいようです。

debian:~# apt-cache search " sudo "
(省略)
sudo - Provide limited super user privileges to specific users
sudo-ldap - Provide limited super user privileges to specific users



apt-cache show パッケージ名

「apt-cache show sudo」で各apt-line上にある、sudoパッケージの詳細情報を調べられます。

debian:~# apt-cache show sudo
Package: sudo
(省略)
Version: 1.6.9p17-2 <-----1コ
(省略)
Package: sudo
(省略)
Version: 1.6.8p12-4 <-----2コ
(省略)

パッケージが2コ選出されました。
これは、私がapt-lineに「testing」と「stable」の両方を入れているからです。

debian:~# apt-cache policy sudo
sudo:
Installed: (none)
Candidate: 1.6.9p17-2
Version table:
1.6.9p17-2 0
500 http://ftp.jp.debian.org testing/main Packages
1.6.8p12-4 0
500 http://ftp.jp.debian.org etch/main Packages

基本的にバージョンの新しい方がインストール候補になるので、
このまま、apt-get install sudoをすると、testingが入ってしまいます。

APT/apt-lineについて

こんにちは、モリモルです。
Debianをインスコしたので、メモです。

Debianはパッケージ管理に、APT(Advance Package Tool)を使ってます。

apt-line
APTでパッケージを拾ってくる先です。
/etc/apt/sources.listで設定ができます。
debian:~# cat /etc/apt/sources.list
#deb cdrom:[Debian GNU/Linux 4.0 r6 _Etch_ - Official i386 NETINST Binary-1 20081220-23:12]/ etch contrib main
#deb cdrom:[Debian GNU/Linux 4.0 r6 _Etch_ - Official i386 NETINST Binary-1 20081220-23:12]/ etch contrib main

deb http://ftp.jp.debian.org/debian/ etch main
deb-src http://ftp.jp.debian.org/debian/ etch main

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib
deb http://security.debian.org/ stable/updates main contrib
deb-src http://security.debian.org/ stable/updates main contrib

deb http://ftp.jp.debian.org/debian/ testing main
deb-src http://ftp.jp.debian.org/debian/ testing main


「etch/updates」だと、apt.confでのAPT Priorityの設定がうまくいかなかった、
「stable/updates」に変更。


書式は、deb[-src] 「ベースURI」 「Debianバージョン」 「コンポーネント」

「deb」がバイナリ、「deb-src」がソースファイルです。
私の場合、ソースファイルはまず必要ないと思いますが、とりあえず入れてあります。

ベースURI
deb cdrom:、はインストール初期設定のAPTの設定において、cdromを選択したので記述されてました。
もう使わないので#でコメントアウトしてあります。

Debianバージョン
コードネーム(sarge、etchなど)もしくは、バージョン名(stable、testing、unstable)を指定できます。
インストールした現時点では、etchがstableなので、etchを指定すると安定版になるようです。

コンポーネント
・main/公式Debianパッケージ
・contrib/依存ファイルがDebianガイドラインに沿ってない
・non-free/このパッケージ自体も再配布できない
まず再配布など考えてないので、、特に気にせずすべていれました。


パッケージ情報を取得
#apt-get update
パッケージ情報を各apt-lineから取得してきます。
testingを追加したら、「メモリ不足です」と言われたので、
/etc/apt/apt.confに「APT::Cache-Limit "50000000";」を記述したら無事すべて取得できました。

「ftp.jp.debian.org」の「etch」と、「security.debian.org」の「etch/updates」を追加して、
定期的に、「apt-get update」、「apt-get upgrade」をしておけばセキュリティが最新な状態で保てるようです。
私の場合、apt-lineに「testing」が入ってますが、apt.confでベースのDebianバージョンがstableになっています。

2009年1月23日金曜日

RubyGemsについて

こんにちは、モリモルです。


morimoru@ubuntu:~$ ruby -e '$:.each{|path| puts path}'
/usr/local/lib/ruby/site_ruby/1.8
/usr/local/lib/ruby/site_ruby/1.8/i686-linux
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/vendor_ruby/1.8
/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/local/lib/ruby/vendor_ruby
/usr/local/lib/ruby/1.8
/usr/local/lib/ruby/1.8/i686-linux
.




morimoru@ubuntu:~$ gem environment gemdir
/usr/local/lib/ruby/gems/1.8


morimoru@ubuntu:~$ gem environment gempath
/home/morimoru/.gem/ruby/1.8:/usr/local/lib/ruby/gems/1.8

編集中・・・

2009年1月10日土曜日

クラスとか

こんにちは。モリモルです。

Rubyのクラスについて頭の中のイメージを図にしてみました。
これで良いのかな?間違ってるかもしれません。。


Objectクラス
Objectクラスはすべてのクラスのスーパークラスです。
Class#superclassでさかのぼって行くとObjectクラスにたどり着きます。

irb(main):251:0* String.superclass
=> Object
irb(main):252:0> Class.superclass.superclass
=> Object
irb(main):254:0> Fixnum.superclass.superclass.superclass
=> Object


ObjectクラスにClass#superclassをするとnilが返ってきます。

irb(main):261:0* Object.superclass
=> nil


Classクラス
Classクラスは「クラスのクラスです」
この「クラスのクラス」といのがイメージしにくいですよね。。

「クラスがクラスを持つ」ということは、Rubyではクラスもオブジェクトということになるようです。

irb(main):303:0* String.class
=> Class
irb(main):304:0> String.object_id
=> -605238788


つまり、SringクラスはClassクラスのインスタンスということになります。
Classクラスに定義されたClass#superclassインスタンスメソッドをSringをレシーバーとして使えるわけですよね。

Classクラスもオブジェクトで、そのクラスは自身を指しているようです。
なので、Classをレシーバーとしてsuperclassメソッドが使えるということかな。

irb(main):289:0* Class.class
=> Class
irb(main):290:0> Class.superclass
=> Module



Class#superclass

ごくごく当然なのですが、"abc"だったり、KernelをレシーバーにするとClass#superclassには辿り着けないようです。クラスじゃないからスーパークラスを返せないというより、そのメソッドにたどり着けないということですよね。


irb(main):318:0* "abc".superlcass
NoMethodError: undefined method `superlcass' for "abc":String
from (irb):318
from :0
irb(main):319:0>
irb(main):320:0* Kernel.superclass
NoMethodError: undefined method `superclass' for Kernel:Module
from (irb):320
from :0
irb(main):321:0>



Module#ancestors

Moduleクラスに定義されたインスタンスメソッドは、すべてのモジュール&クラスをレシーバーにして使えるようです。
Moduleがレシーバの場合はClass経由でグルっと回って使えるというイメージなのかな。

irb(main):349:0* Module.ancestors
=> [Module, Object, Kernel]


"abc"からはたどり着けないようです。

irb(main):368:0* "abc".ancestors
NoMethodError: undefined method `ancestors' for "abc":String
from (irb):368
from :0



Objectクラスのインスタンスメソッド
Object#object_id、Object#class、Object#instance_of?、Object#kind_of? とか。


Objectクラスのインスタンスメソッドはすべてのオブジェクトをレシーバーとして使えるようです。


irb(main):358:0* "abc".object_id
=> -605469638
irb(main):359:0> Object.object_id
=> -605233518
irb(main):360:0> Kernel.object_id
=> -605233578

2009年1月3日土曜日

WEBrick::HTTPServlet::CGIHandlerを使ってみました。

こんにちは、モリモルです。

WEBrickでCGIを動かしてみます。
使い方は、以前の自作サーブレットと同じような感じで、

HTTPServer#mount("URL", HTTPServlet::CGIHandler, "Rubyスクリプトへのパス")

第一引数のURLにアクセスがあるたびに、
第二引数のインスタンスを生成して、HTTPServlet::AbstractServlet#serviceを呼び出すようです。
第三引数のRubyスクリプトはHTTPServlet::CGIHandlerのコンストラクタに引数として渡されます。


では、簡単なCGIを作ってアクセスしてみます。
/var2/www/cgi/foo.rb

1 #!/usr/local/bin/ruby
2
3 require 'cgi'
4
5 cgi = CGI.new
6 print cgi.header({"type" => "text/html", "status" => "OK"})
7 print DATA.read
8
9 __END__
10 <html>
11 <body>
12 <h1>foo.rb</h1>
13 </body>
14 </html>


server.rb

1 #! /usr/local/bin/ruby
2 require 'webrick'
3 include WEBrick
4
5 server = HTTPServer.new(
6 :DocumentRoot => "/var2/www/html",
7 :Port => 20080,
8 :BindAddress => "myhost")
9
10
11 server.mount("/cgi", HTTPServlet::CGIHandler, "/var2/www/cgi/foo.rb")
12
13 trap("INT"){server.stop}
14
15 server.start


ブラウザから“http://192.168.91.128:20080/cgi”にアクセスしてみます。


表示されましたね。

2009年1月2日金曜日

WEBrickで“Cannot assign requested address”

明けましておめでとうございます。モリモルです。

正月休みを利用して、CentOSからUbuntuに乗り換えました。
乗り換えた後のWEBrickサーバーを起動で、“Cannot assign requested address”とエラーが出た際のメモです。

今までは、直接IPアドレスを入れていたのですが、
/etc/hostsに記述してあるホスト名に変更したら問題なく動きました。

server = HTTPServer.new(
:DocumentRoot => "/var2/www/html",
:Port => 20080,
:BindAddress => "myhost")
# :BindAddress => "192.168.91.128")