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
設定をコメントアウトすれば、メール転送も上手くいきます。

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

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

2011年6月30日木曜日

Redmine - undefined method `name' for "abstract":String

gem update --systemすると、Redmineが動かなくなる。
「undefined method `name' for "abstract":String」エラー。

Ruby : 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux], MBARI 0x6770, Ruby Enterprise Edition 2011.03
Rails : Redmine vendor - 2.2.2?
Redmine: 1.2.0

gemのバージョンを差し戻すと動作するようになったのでメモ。

http://www.redmine.org/issues/8325
一ヶ月程前からチケット上がってるけど、今日(2011-06-30)時点ではクローズされてない。

「yum -yで色々インストールすればいけますよー」みたいな報告がされてResolvedされたチケットが、「どう解決したってんだよ、バカ!結局原因は何なんだよ!」的なツッコミと共にNewに差し戻されたのは余談。

最新のgem1.8.5に更新してしまうとRedmineが動かなくらしいです。
1.6.2なら動作する、という報告もありますが、1.7.2でも動きました。

$ gem update --system 1.7.2
$ gem -v
1.7.2

参考までにgem list。

$ gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.9, 3.0.7)
actionpack (3.0.9, 3.0.7)
activemodel (3.0.9, 3.0.7)
activerecord (3.0.9, 3.0.7)
activeresource (3.0.9, 3.0.7)
activesupport (3.0.9, 3.0.7)
arel (2.0.10, 2.0.9)
builder (3.0.0, 2.1.2)
bundler (1.0.15, 1.0.13)
daemon_controller (0.2.6)
erubis (2.7.0, 2.6.6)
fastthread (1.0.7)
i18n (0.6.0, 0.5.0, 0.4.2)
mail (2.3.0, 2.2.19)
mime-types (1.16)
mysql (2.8.1)
passenger (3.0.7)
polyglot (0.3.1)
rack (1.3.0, 1.2.2, 1.1.2, 1.0.1)
rack-mount (0.8.1, 0.6.14)
rack-test (0.6.0, 0.5.7)
rails (3.0.9, 3.0.7)
railties (3.0.9, 3.0.7)
rake (0.9.2, 0.8.7)
rdoc (3.6.1)
rubygems-update (1.8.5, 1.8.4, 1.8.1, 1.8.0, 1.7.2, 1.6.2, 1.4.2)
thor (0.14.6)
treetop (1.4.9)
tzinfo (0.3.28, 0.3.27)

原因はよく分かりませんが、Redmineが動かないのは仕事に支障が出るので、取り合えずgemを巻き戻して対応することに。

2011年4月16日土曜日

EclipseからJavadocを生成する時のエラー

ま、エンコーディングの話しだけなのですが、備忘録として。

Project > Generate Javadoc...
からJavadoc生成。

で、エラー。

java.nio.BufferOverflowException
 at java.nio.Buffer.nextPutIndex(Buffer.java:495)
 at java.nio.HeapCharBuffer.put(HeapCharBuffer.java:145)
 at com.sun.tools.javac.util.DefaultFileManager.decode(DefaultFileManager.java:830)
 at com.sun.tools.javac.util.DefaultFileManager.access$300(DefaultFileManager.java:76)
 at com.sun.tools.javac.util.DefaultFileManager$RegularFileObject.getCharContent(DefaultFileManager.java:1353)
 at com.sun.tools.javac.util.DefaultFileManager$RegularFileObject.getCharContent(DefaultFileManager.java:1252)
 at com.sun.tools.javac.main.JavaCompiler.readSource(JavaCompiler.java:483)
 at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)
 at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:541)
 at com.sun.tools.javadoc.JavadocTool.parsePackageClasses(JavadocTool.java:203)
 at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:145)
 at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
 at com.sun.tools.javadoc.Start.begin(Start.java:128)
 at com.sun.tools.javadoc.Main.execute(Main.java:41)
 at com.sun.tools.javadoc.Main.main(Main.java:31)

Google先生に聞いてみる。

BufferOverflowException when generating Javadoc?
Eclipse 上で UTF-8 のソースから javadoc を生成する方法

EclipseからJavadocを生成する際にVM実行オプションを指定

-encoding "utf-8" -charset "utf-8"

以上。

2011年1月19日水曜日

JAXB xs:intに文字列を入れてみる

JAXBでJava - XMLを相互変換したい。

・JAXB
Java Architecture for XML Binding(Wikipedia)

ということで実装していたのですが、xs:intなXMLのエレメントに文字列や空を渡した場合の挙動が不安定であることが判明。

サーバによって同じ文字列でもパース出来るときと出来ないときがある。
文字列からintへの変換の挙動が環境に依存する。

例えば、こんなXSDを用意。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="hoge">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="fuga" type="xs:int"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

こいつをxjcコマンドでコンパイルしてObjectFactoryや以下のようなXMLエンティティを表現するObjectを生成。

@XmlRootElement(name = "hoge")
public class Hoge {

    @XmlElement(name = "fuga", required = true)
    protected int fuga;

これにXMLを噛ましてパースさせる。

<?xml version="1.0" encoding="utf-8" ?>
<hoge>
 <fuga>123</fuga>
</hoge>

Hoge hoge = (Hoge)unmarshaller.unmarshal(reader);

これはまぁ、普通にパースできて、Hoge#fugaに123が入ってくる。

問題は、以下のようなXML

<?xml version="1.0" encoding="utf-8" ?>
<hoge>
 <fuga></fuga>
</hoge>

<?xml version="1.0" encoding="utf-8" ?>
<hoge>
 <fuga>abc</fuga>
</hoge>

これらをunmarshalするとJAXBExceptionが出る場合と0に変換されてパースされる状況がある。

ローカル(Windows7)で実行するとJAXBException、リモートのWindows Server上で実行すると0に変換。

全く同じソースをデプロイして、さらにはアプリ付きのサーバ(Jetty)ごとリモートに移しても挙動が一致しない。

差異はjavaのバージョンか、Windowsのバージョンぐらいしか思いつかない。。

・java -version
ローカル:1.6.0_21
リモート:1.6.0_23

・OS
ローカル:Windows7
リモート:Win2003Server R2 64bit、Win2008 Server 64bit、32bit

いずれにしてもこれぐらいの差異で環境によって異なる結果を返されると困る。。

Google先生に聞いてみたり、色々ダンプしてみたりと結構調べたのですが、原因が分からず、xs:intな項目を使わない方針に変更。

こんな感じでxs:intからxs:integerに変更

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="hoge">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="fuga" type="xs:integer"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

@XmlRootElement(name = "hoge")
public class Hoge {

    @XmlElement(name = "fuga", required = true)
    protected BigInteger fuga;

こうしておくと、文字列などパースできないXMLエレメントは環境に依存せずにnullにパースされてるっぽい。今のところ、、。