同じApacheをコピーして複数動作させる。

要件によって、同じサーバ上で複数でHTTP/HTTPSサービスを起動しなければならない場合が生じます。
そうした場合には、Apacheで仮想ホストを作成するか、別のApacheコンパイルしてインストールする必要がありますが、それぞれ次のような問題点が存在します。

  • 仮想ホストの場合

それぞれのApacheを個別に起動/停止することができない。

既存のApacherpmパッケージなどからインストールしている場合、もう一つのApacheコンパイルオプションが変わってしまう場合がある。

上記2点をカバーするため、既存のApacheをコピーして別のApacheインスタンスとして起動することができます。
こうすれば、全く同じコンパイルオプションを持ったApacheを個別に起動/停止することが可能です。

前提

  • rpmコマンド等でインストールされたhttpdが動作していること。
  • 既存のApacheと別のポート/またはIPでListenさせる。

構成例

今回は下記の通り起動されることとします。

項目 既存Apache Apache
IPアドレス 192.168.1.1 192.168.1.2
ポート 80 80
configディレクト /etc/httpd /etc/httpd2
logディレクト /var/log/httpd /var/log/httpd2

以下、手順です。

続きを読む

配列、連想配列(ハッシュ)について

配列と連想配列(ハッシュ)についてメモしておきます。

配列

複数のオブジェクトをまとめて使う方法です。
1つの変数に複数の要素を格納することができます。

配列の書き方

配列用の変数に、[]の中の要素を格納します。
要素はカンマ(,)で区切って表記します。

array = [1,2,3,4,5]

こんな感じでしょうか。

連想配列(ハッシュ)

配列の要素に名前を付けて覚えやすくしたもの、というイメージです。
配列と同様、[]の中に要素を記述します。
要素の名前は""で括り、=>のあとに要素を書きます。

連想配列の書き方

numberという変数に、数字の英名(one, twoなど)とそれに対応した数字(1, 2など)を持った要素を格納します。

number = {"one" => 1, "two" => 2, "three" => 3, "four" => 4}

一つずつ変数を定義するのと何が変わるのかいまいちわかっていませんが、
理解しやすいとかいちいち変数の名前を考えなくても良いとかそういう理由
なのでしょうか。
もしかしたら配列を使うのと一つずつ変数を定義するのでは、メモリの使い方とかも、変わってくるのでしょうか。

配列にもハッシュにも、それぞれ要素を操作するためのメソッドが多数用意されているようです。
そういったものについては、追々書きます。
とりあえず、しばらくは基本ですね。

TeraTermに背景画像を表示する。

Windows端末から別のホストにCUIログインを行う場合、TELNET/SSHクライアントを使用します。
TELNET/SSHクライアントの定番がTeraTermです。

そういったソフトもやはり自分好みに変更したいのがエンジニア。
私はよく背景画像をどこからか拾ってきて半透明にして表示させています。

今回はそのやり方のメモです。

TeraTermの背景に画像を表示させる。

TeraTermの背景に画像を表示させるには、TERATERM.INIを編集する必要があります。

たいていこんな場所にあります。

C:\Program Files\teraterm\TERATERM.INI

C:\Program Files (x86)\teraterm\TERATERM.INI

私の場合、Windows 7 64bitを使用しているので後者を開きます。

こんな感じで編集していきます。

多分2,3行目の部分です。

; Use Background extension (on/off)
BGEnable=off

となっているのを

; Use Background extension (on/off)
BGEnable=on

と、変更。
続いて22行目あたり。

; wildcard => random select
BGThemeFile=theme\*.ini

これを

; wildcard => random select
BGThemeFile=theme\bg.ini

こんな感じで変更します。名前は任意です。
一旦、TERATERM.INIの編集は終了。
同じディレクトリにthemeディレクトリがあるので、そこにあるScale.iniを、bg.iniとしてコピーします。

次はこれを編集します。10行目あたりにこんなのがあります。

BGPictureFile = scale\*.*

書き換えます。

BGPictureFile = bg\*.*

themeディレクトリ内にbgディレクトリを作成します。
bgディレクトリ内に背景に表示させたい画像を配置し、TeraTermを起動させれば、背景への設定完了です。
既に起動している場合は、読み込み直せば大丈夫です。

メソッドの書き方

言葉だけやってても何も面白くないので、言葉の方は時間かけながらちょいちょい覚えつつ、簡単なコードを書いてみています。
先日既にこっそりメソッドを呼び出す例を書いていましたが、一応メソッドの書き方をメモしておきたいと思います。

メソッドの書き方

メソッドとは機能です。
何か処理を行う場合は、メソッドを呼び出します。
プログラムが処理を行うとき、処理を行う機能(メソッド)の他に、メソッドに処理して貰う対象のオブジェクトが必要です。
このオブジェクトをレシーバといいます。
また、メソッドによっては、処理に対する追加要素を指定しなければならない場合があります。
その追加要素を引数といいます。

さて、基本的な構文はこんな感じでした。

レシーバ.メソッド(引数)

Rubyでは、引数が無い場合、括弧を完全に省略してこんな書き方をしてもよいそうです。

レシーバ.メソッド

例によってメソッドの書き方を車でたとえてみたいと思います。
「ブレーキを強く踏む」という処理を行う場合はこうなります。

ブレーキ.踏む(強く)

そろそろ説明が合ってるかどうか不安になってきました。
引数を指定するようなものを書いていないのが原因でしょうか。。
もう少し理解を進めて、間違っていたら修正したいと思います。

リテラルだの継承だの。

通常業務が忙しくなってきて、なかなかRubyの勉強が進まない中、テキストを読んでいるといくつか新しい単語が出てきていたので、メモしておきます。
体系的に勉強するのって大事ですねぇ。。

リテラル

プログラム中に記述する値のことをリテラルというそうです。
先日の記事に書いていた"Ruby"は文字リテラル、10などの数字は数値リテラルというようです。
また、ハッシュや配列もリテラルと呼ぶようです。
どういう場合に使うのかわかりませんが、とりあえず概念は覚えておきたいと思います。

継承

オブジェクト指向の考え方として、継承というものがありました。
以前の記事で書いた、クラスの概念に関連しているようです。

クラスは、設計図、或いは概念であるということを書きました。
先日挙げた車を例にすると、このような性質があります。

「前進」、「速度を上げる」、「ワイパーを動かす」などの機能(メソッド)が備わっている。

しかし車にもいくつか種類があり、普通車であったり、大型車であったり、或いは特殊車両なども車に属しています。
これらの車の設計図(クラス)を作成する場合を考えてみます。
どのような種類の車であっても、前進したり速度を上げたりする機能は同じなので、「車」クラスを再利用することで、より簡単に新しい設計図(クラス)を作成することができます。
つまり共通部分に同じ設計図を使用し、異なる部分のみを新しく作成することで作成効率がアップするということですね。

この様な考え方を継承と呼ぶそうです。

普通車は、車を継承している。

という風に使うみたいです。

そして、このような方法を差分プログラミングというそうです。

LinuxでCIFS領域をマウントする。

検証のため、Windows ServerのCIFS領域をLinuxにマウントする機会があったのでメモしておきます。

手動でマウントする

下記コマンドで一発です。

mount -t cifs //マウント元ノードのIP Address/Directory /マウント先のディレクトリ -o user=ユーザ名,password=パスワード

起動時にマウントする

/etc/fstabに書きます。

//マウント元ノードのIP Address/Directory /マウント先のディレクトリ cifs user=ユーザ名,password=パスワード 0 0

アンマウントする

umoutコマンドで。

umount /マウント先のディレクトリ

Rubyは変数の型を宣言しない。

Rubyのコードを書いていて思ったのですが、この言語では変数の型を宣言しないようです。
大学時代にC言語を学んだ時には必ず変数の型の宣言から入っていましたが、これが無いのです。

例えばこんなの。

int A;

シェルスクリプトでもそうですが、これは仕様であり、投入された内容の型を自動で判別しているようです。
スクリプト言語だと、PerlにしろPHPにしろ、だいたいこんな仕様みたいですね。

さて、Rubyでは全てのデータは何らかのインスタンスとして扱われるようです。
つまり、数値型、文字列型という「型」ではなく、数値クラスのインスタンス、文字列クラスのインスタンスということになるとのことです。
変数に格納されたデータがどのクラスに所属するのかを調べるメソッドがあったので、やってみました。

変数を宣言したあと、

変数.class

とするだけです。

  • 数値(Fixnumクラス)
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a.class
=> Fixnum
  • 数値(Bignumクラス)
irb(main):003:0> b = (10000000000000000 * 10000000000000000000)
=> 100000000000000000000000000000000000
irb(main):004:0> b.class
=> Bignum
  • 文字列(String クラス)
irb(main):005:0* c = "Ruby"
=> "Ruby"
irb(main):006:0> c.class
=> String

上記の変数aに格納した1はFixnumクラス、変数bに格納した100000000000000000000000000000000000はBignumクラス、変数cに格納した"Ruby"はStringクラスといった感じです。