2012年2月16日木曜日

CentOS6.2 KVM環境構築

CentOS5.4で運用してきましたがそろそろ6.xにアップデート。
Xenで管理してきた仮想化環境を6系からCentOS標準になったKVMに移行。

以下、その記録。

http://www.oss-d.net/virt/kvm
こちらを参考に。

■環境

$ cat /etc/redhat-release
CentOS release 6.2 (Final)

$ cat /proc/version
Linux version 2.6.32-220.4.2.el6.x86_64 (mockbuild@c6b18n3.bsys.dev.centos.org) (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Feb 14 04:00:16 GMT 2012

■KVMインストール

$ yum groupinfo kvm
Loaded plugins: fastestmirror, refresh-packagekit
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: rsync.atworks.co.jp
 * extras: rsync.atworks.co.jp
 * updates: rsync.atworks.co.jp
Warning: Group kvm does not exist.

おっと、いきなりダメじゃん。

ここまで辿り着くまでにRAID組んだりX入れたりVNC入れたり色々用意してたんですが、CentOS6.2で管理されてるパッケージがこれまでと地味に色々変わってる。

$ yum groupinstall Virtualization "Virtualization Client" "Virtualization Platform" "Virtualization Tools"

が正解。
参考 http://unix.stackexchange.com/questions/18802/how-to-install-kvm-on-centos-6

後は基本的に書かれてある通り。

■ブリッジ設定

$ cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0
$ vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
BOOTPROTO="static"
BROADCAST="192.168.12.255"
DNS1="192.168.12.1"
GATEWAY="192.168.12.1"
#HWADDR="00:22:19:0B:6F:F0"
IPADDR="192.168.12.51"
NETMASK="255.255.255.0"
#NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"

$ vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
#BOOTPROTO="static"
#BROADCAST="192.168.12.255"
#DNS1="192.168.12.1"
#GATEWAY="192.168.12.1"
HWADDR="00:22:19:0B:6F:F0"
#IPADDR="192.168.12.51"
#NETMASK="255.255.255.0"
#NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"

$ service network restart

$ vi /etc/sysctl.conf
# 恐らく変更の必要ない

ここまででブリッジを見るように設定できた。
ただ、rebootしたりするとWANが見えなくなる。
何でかよく分からないけどservice network restartすると見える。

■仮想マシンマネージャー起動

X上で
$ virt-manager

Error polling connection 'qemu:///system': internal error Cannot find suitable
emulator for x86_64

となれば、恐らくBIOSのVirtualizationが無効になっている。
BIOS設定からVirtualizationをenableに変更すればOKだった。

■ゲストOSインストール(失敗)

virt-managerからGUIで仮想マシンをインストールしようとすると、ネットワーク越しのインストールが出来ない。
URIを指定してインストールを試みると
The location must be the root directory of an install tree.
とかって言われる。

検索してみてもバグ?とか何とか、よく分からない。
しょうがないのでローカルメディアからインストーラを起動してネットワークインストール。

■仮想マシンインストール(続き)

CDROMにネットワークインストールのメディアを焼いてそこからインストールを試みた。
途中までは良かったけれど、インストール中にUSB接続キーボードのアンダースコアが表示できない。

keymapとか色々あるんだろう。

ググってみてもVmwareの場合はいくつか出てくるけど、KVMはよく分からない。

仕方がないのでUSのキーボードレイアウトでインストール実行。
「ほ」の辺りのキーをShift押しながらでアンダースコア。

無理やり感漂うけれど、まぁ、インストールはできた。

インストール後日本語レイアウトに変更。

$ vi /etc/sysconfig/keyboard

KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"

↓

KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"

アンダースコアも大丈夫。

・ゲストOS環境

$ cat /etc/redhat-release
CentOS release 6.2 (Final)

$ cat /proc/version
Linux version 2.6.32-220.el6.x86_64 (mockbuild@c6b18n3.bsys.dev.centos.org) (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Dec 6 19:48:22 GMT 2011

2012年2月1日水曜日

Android, Viewにstyleを動的に設定する方法

AndroidアプリのButtonやViewに動的にstyleを設定したい。
例えばActivityからnew Button()したようなオブジェクトに共通で使っているstyleを設定したい。

かなり探したけど全然見つからなかった。
唯一ここに発見。
ソースコード内で生成したViewインスタンスにStyleを適用

はじめは書いてある内容が理解できなかったので、備忘録として以下メモ。
#リンク先と同じこと書いてるだけ。

・アウトライン

Viewのコンストラクタを見てると
View(Context context)
View(Context context, AttributeSet attrs)
View(Context context, AttributeSet attrs, int defStyle)
こんな風に定義されている。

Contextはクラスのオブジェクトを指定。この辺りを参照。
AttributeSetはXMLで指定した場合のプロパティが渡ってくる。
style指定は3つ目のdefStyle。

なので、Activityから生成したViewオブジェクトにstyleを指定した場合は、3つ目のパラメタにR.foo.barのリソースIDを渡せばよい。
っていうのは比較的すぐ分かるんですが、具体的にどうやるのかは一苦労。

以下。

・styleの指定

R.styleというのがあるので、こいつを指定すればいいんだろうと格闘してましたが、どうやら違ってR.attrでないとダメな模様。
このstyleリソースIDを直接指定できれば楽なんだけどなー、というのが最初のリンク先で触れられていた内容。

・R.attrについて

R.attrのドキュメント

ドキュメントを見る限り、R.attrはwidthやcheckedのようなAndroidのXMLエレメントのアトリビュートを定義してるものらしい。
R.attrの中にはdialogLayoutやbuttonStyleのようなレイアウト周りのリソースIDを指定していると思われるものも存在しますが、本来styleとは直接は関係ない(はず)。
なのでR.attrの指定からしかstyleを適用できない、というのは勘違いかAndroidのバグだと思う。

でも他にやり方が分からないので以下進めます。
#詳しい方、教えて。。

・R.attrを指定する

XMLはres/values/style.xmlで指定する。
#ここじゃないとダメなのかはよく分からない。

1. 適用させるstyleを作成
<!-- <item name="android:layout_*">の要素はR.attrでスタイル適用出来ないっぽい -->
<style name="MyButtonStyle" parent="android:style/Widget.Button">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_marginBottom">2dp</item>
    <item name="android:textColor">@color/foo</item>
    <item name="android:textSize">16dp</item>
    <item name="android:background">@drawable/bar</item>
    <item name="android:textStyle">bold</item>
</style>

作ったstyleをR.attrで参照可能なように設定。

2. テーマの適用

theme属性としてstyleを設定するので、先にテーマをアプリケーションに適用させておく。
AndroidManifest.xml
  <application
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
+     android:theme="@style/MyApplicationStyle" >


3. テーマの設定

<style name="MyApplicationStyle" parent="android:Theme">
</style>


4. styleのテーマへの組み込み

+ <attr name="myButtonStyle" format="integer|reference" />
  <style name="MyApplicationStyle" parent="android:Theme">
+      <item name="myButtonStyle">@style/MyButtonStyle</item>
  </style>

これでR.attr.myButtonStyleが参照可能になった。

5. Activityでの適用

Button btn = new Button(this, null, R.attr.myButtonStyle);

でstyle定義済みのViewオブジェクトが生成可能。
後は如何様にも。

btn.setText("foo");
LinearLayout layout = new LinearLayout(this);
layout.addView(
    btn,
    new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.WRAP_CONTENT,
        LinearLayout.LayoutParams.WRAP_CONTENT));
setContentView(layout);

とか。

2012年1月26日木曜日

Zend HeadLink ヘルパーでコンディショナルCSS

ZendViewヘルパーを使って<head>タグや<meta>タグを管理すると嬉しいことが一杯。

・layoutファイルがすっきりする(場合によっては全てのmoduleに同じlayoutファイルを適用できるようになる)
・ベタ書きしてれば微妙に大変な<title>の変更なんかも一発
・コントローラで設定すれば、継承してサブクラスでどんどんappendできる

CSSのlink設定でのTipsをメモ。

標準的には以下のような感じで設定。

Controllerで設定
{
public function preDispatch()
{
    parent::preDispatch();
    $this->view->headTitle('MyWEB', 'SET');
    $this->view->headLink()->appendStylesheet($this->view->baseUrl('path_to_css/css1.css'))
                           ->appendStylesheet($this->view->baseUrl('path_to_css/css2.css'));
    $this->view->headMeta()->setCharset('UTF-8'); //こんなのはbootstrapとかどこか固定で設定してもいい
}
Viewで出力
<?php echo $this->doctype(); ?>
<html>
<head>
<?php echo $this->headTitle() ?>
<?php echo $this->headMeta() ?>
<?php echo $this->headLink() ?>
<?php echo $this->headScript() ?>
</head>
<body>

コンディショナルな指定をする場合。
例えばIE7だけで適用するCSSの設定。

こんな感じ。
public function preDispatch()
{
    parent::preDispatch();
    $this->view->headLink()->appendStylesheet($this->view->baseUrl('path_to_css/common.css'))
                           ->appendStylesheet($this->view->baseUrl('path_to_css/ltIE7.css'), 'screen', 'lt IE 7');
    // <!--[if lt IE 7]> <link href="/path_to_css/ltIE7.css" media="screen" rel="stylesheet" type="text/css" ><![endif]-->
}

参考)
Zend Viewヘルパー

2011年12月25日日曜日

DELL Studio17をSSDに換装(を試みて失敗)

Studio17/1747をSSDに換装しようとしてコールド負け。

http://urakaze.com/post-379.html
ここなどを参考にSSDに換装しようとして、結果、敗北。。

SSDが安くなってて256GBで2万円ちょっと。
ここいらでタイミングだろうと思い立ち、換装を試みましたがリカバリが上手くいきませんでした。

結論から言うと、大容量512GBのSSDにするべき。

以下、敗北の記録。

1. リカバリできない

Dellはリカバリ用のOSを添付してくれなくなりました。
購入直後にリカバリ用ディスク作成を推奨され、そこからリカバリするのですが、OSのインストーラではなく、ディスクイメージのダンプのようなものっぽいです。

元のHDDが512GBだったのですが、SSD付けてリカバリしようとすると「ドライブの容量が小さいのでリカバリできません」のようなエラーが表示され、工場出荷時の状態に戻せません。
リカバリディスクは10GBも無いくせに、元のHDDと同容量程度はないとリカバリできないっぽいです。

 2. Windowsのシステム修復ができない

Dellのリカバリが効かないのでWindows7のシステムイメージ作成とシステム修復からSSDへのインストールを試みました。

システム修復ディスクでブートするも、「erro 0X4001100200001012」というエラーが表示され、システム修復のメニューが表示されません。

http://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E4%BF%AE/2f804e74-e6ed-4059-a0fd-8328823e7e11
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1452430939

このあたりに言及もありますが、DellかWindowsかどちらかのバグのようです。

3. システム修復ディスクのISOを焼いて再挑戦

上記の問題を回避するために、 システム修復ディスクのISOを焼け、という情報があったので試してみました。

Windows-7-64-bit-Repair-Disc.iso
こんな名前のシステム修復ディスクイメージが出回っています。

なんか怪しいサイトにあるので、ウイルス怖え~、とか思いながらも挑戦してみましたが、これもダメでした。

リカバリのメニューは表示され、外付けUSBに落としておいたWindowsのバックアップイメージも認識して選択できるのですが、いざ、リカバリを実行しようとすると原因不明のエラーになります。

エラーのdetailを見る限り「USBが認識できてないかもしれないよ」といったインフォメーションが表示されてるのですが、そもそもバックアップイメージ選択できてます。

ただ、USBストレージを表していると思われるドライブ文字が「\\?\」と文字化けしてるのが気になります。よく分かりませんが、マルチバイト環境とかドライバとか色々あるんでしょう、きっと。。

4. 諦めた

後のやりようとしては、別のバックアップソフトからシステムイメージ丸ごとコピーする、とかでしょうけど、SATAでSSD繋げる箱が無かったり、Studio17の2ndベイの形状が特殊で繋げなかったりして、もう面倒なので諦めました。

これ以上時間使うより、Windows単体で新しく買った方がよい。

Windows新たに買う費用考えたら512GBのSSD買えた、というコールド負け。

2011年10月19日水曜日

Poeditで登録されていない拡張子ファイルでカタログ作成

Poedit : http://www.poedit.net/
使い方
http://wp.mmrt-jp.net/plugin-japanization-project/poedit/
http://ideasilo.wordpress.com/2006/08/14/edit-language-files-with-poedit/
http://www.koikikukan.com/archives/2007/03/29-032523.php

Poedit Version 1.4.6
登録されていない拡張子のファイルでカタログ生成したい場合。

例えば、PHPファイルだけど、「.php」拡張子ではなくて、「.phtml」や「.ctp」や「.php5」だったりした場合、デフォルトではカタログ生成ができない。(無視される)

それらもPHPファイルですよ、と教えてあげて、パースしてもらう設定。

1. ファイル > 設定 > パーサ
2. [ソースコードのパーサ] > PHP > 編集
3. パーサ設定
・対象拡張子
- *.php
+ *.php;*.phtml;*.ctp;*.php5
・パーサのコマンド
- xgettext --force-po -o %o %C %K %F
+ xgettext --force-po -o %o %C %K %F --language=PHP

これで出来るハズ(PHPなら)。

2011年8月24日水曜日

Zend Framework default module prefix

default moduleは標準的には
class IndexController extends Zend_Controller_Action
のようなクラス名でモジュール名プレフィックスが付かない。
application
 - modules
   - foo
    - controllers
    - views
    - ...
   - bar
    - controllers
    - views
    - ...
のような構成を取っていて、fooモジュールをデフォルトモジュールとしたい場合、
#application/configs/application.ini
resources.frontController.defaultModule = "foo"
のような設定を行うが、そのままだと、
class Foo_IndexController extends Zend_Controller_Action
のクラス名でディスパッチできない。

デフォルトモジュールにもプレフィックスを付けたい場合、
#application/configs/application.ini
resources.frontController.defaultModule = "foo"
resources.frontController.prefixDefaultModule = TRUE
とするとOK。

プレフィックス付いていた方が管理しやすいし、動的なデフォルトモジュール切り替えとかもやりやすい。

http://framework.zend.com/manual/ja/zend.controller.dispatcher.html
#Zend_Application_Resource_Frontcontroller
http://framework.zend.com/manual/ja/zend.application.available-resources.html
#概要

メモメモ。

2011年7月6日水曜日

お名前.comVPSのマルチドメイン環境でメール受信が出来なくなる

yum updateかけようとすると、clamv周りでエラーが出て更新できなくなったので、関係パッケージ全て削除しました。

・・・すると、マルチドメイン環境でメール受信が出来なくなる。

clamd再インストールしようとしても登録されてるリポジトリが古いのか何なのか、とにかくパッケージ入りません。

$ yum install clamd
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.kddilabs.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
base                                                               | 2.1 kB     00:00
epel                                                               | 3.7 kB     00:00
epel/primary_db                                                    | 3.7 MB     00:00
extras                                                             | 2.1 kB     00:00
lg-ce5x-main-arch                                                  | 1.9 kB     00:00
lg-ce5x-main-noarch                                                | 1.9 kB     00:00
updates                                                            | 1.9 kB     00:00
updates/primary_db                                                 | 664 kB     00:00
128 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package clamd.x86_64 0:0.97-13.el5 set to be updated
--> Processing Dependency: clamav = 0.97-13.el5 for package: clamd
--> Processing Dependency: libclamav.so.6(CLAMAV_PRIVATE)(64bit) for package: clamd
--> Processing Dependency: libclamav.so.6(CLAMAV_PUBLIC)(64bit) for package: clamd
--> Processing Dependency: libclamav.so.6()(64bit) for package: clamd
--> Running transaction check
---> Package clamav-lib.x86_64 0:0.97-1.r1.lg.ce5 set to be updated
--> Processing Dependency: data(clamav) for package: clamav-lib
---> Package clamd.x86_64 0:0.97-13.el5 set to be updated
--> Processing Dependency: clamav = 0.97-13.el5 for package: clamd
--> Running transaction check
---> Package clamav-data.x86_64 0:0.97-1.r1.lg.ce5 set to be updated
--> Processing Dependency: clamav-filesystem = 0.97-1.r1.lg.ce5 for package: clamav-data
---> Package clamd.x86_64 0:0.97-13.el5 set to be updated
--> Processing Dependency: clamav = 0.97-13.el5 for package: clamd
--> Running transaction check
---> Package clamav-filesystem.x86_64 0:0.97-1.r1.lg.ce5 set to be updated
---> Package clamd.x86_64 0:0.97-13.el5 set to be updated
--> Processing Dependency: clamav = 0.97-13.el5 for package: clamd
--> Finished Dependency Resolution
clamd-0.97-13.el5.x86_64 from epel has depsolving problems
  --> Missing Dependency: clamav = 0.97-13.el5 is needed by package clamd-0.97-13.el5.x86_64 (epel)
Error: Missing Dependency: clamav = 0.97-13.el5 is needed by package clamd-0.97-13.el5.x86_64 (epel)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest

マルチドメイン環境にすると、自動的にamavisdというウイルスチェックソフトにメールのスプールの中身が転送される設定になるようですが、メールチェックはクライアントですればいいので、設定を外す。

こちらを参考にclamdへのスプール転送を外す。
http://d.hatena.ne.jp/pasela/20100420/postfix

が、メール受信できず。

postsuper -r ALL
すれば、メール配信されてくるのですが、
/etc/postfix/main.cf
の
content_filter
設定をコメントアウトしても、
/var/log/maillog
には
connect to 127.0.0.1[127.0.0.1]:10024: Connection refused
みたいなClamAVが見つかりません的なエラーが出続ける。

どうやら、
/etc/postfix/main.cf
以外にもamavisd関係の設定が残っているらしい。

ということで
grep 'content_filter' ./*

結果、
/etc/postfix/master.cf
/etc/postfix/postfix-pkg-main.cf
という2つのファイルにも
-o content_filter=smtp-amavis:[127.0.0.1]:10024
のような設定がされているので、コメントアウトしてpostfix再起動。

無事にメール受信できるようになりました。

===============
2011-07-11追記

上記だけだとメールの転送が効かなくなります。

/etc/postfix/main.cf
の
receive_override_options = no_address_mappings
設定をコメントアウトすれば、メール転送も上手くいきます。

が、どうしてそれで上手くいくのかはよく分かりません。
何か弊害が出るようであればお知らせ下さい。

仔細はコメント欄参照。
===============