Debian jessieでVMWareが起動しない。

VMWarePlayerをjessieにインストールしたが、起動しない。
厳密には、起動するが立ち上がった瞬間、落ちる。

VMWarePlayerの多言語化対応がイマイチなようで、それが原因のようです。

試しに、コンソールで以下のコマンドだと、正しく起動できる。


$ LANG=C vmplayer

でも、アクティビティのアイコンクリックだと、落ちる。
試しに、アクティビティの起動コマンドを以下に変更しても、落ちる。


/usr/bin/vmplayer %u

env LANG=C /usr/bin/vmplayer %u

じゃ、どうするかと言うと、vmplayerの起動スクリプトに直書きして対応。


# which vmplayer
/usr/bin/vmplayer

# vim /usr/bin/vmplayer
#!/usr/bin/env bash
(略)
set -e
export LANG=C # 追記
(略)

これで正しく起動できます。良かった。

Debian jessie にNVIDIAドライバーをインストールする。

毎回NVIDIAのドライバをダウンロードして「あー面倒くせー」と。

リーナス大先生の中指事件を真意に受けたかどうかは知らないが、NVIDIALinuxへのドライバを書くとか言ってなたなーと思いだし、ググるとありましたぜ。(すぐ出てきますw)

今までのNVIDIAのプロダクトドライバをインストールする手順よりも遥かに簡単で、おそらくこれからもお世話になるだろうから、忘却として。

1. まず、使用しているグラボを調べます。


# lspci | grep NVIDIA
02:00.0 VGA compatible controller: NVIDIA Corporation GF116 [GeForce GTX 550 Ti] (rev a1)
02:00.1 Audio device: NVIDIA Corporation GF116 High Definition Audio Controller (rev a1)
2. サポートしているグラボが使えるドライバのバージョンを調べます。
以下のURLを参照。現時点で一番新しいバージョンです。おそらくほぼすべての製品が対応しているかと思います。
http://us.download.nvidia.com/XFree86/Linux-x86_64/340.65/README/supportedchips.html
3. source.listに追加します。

// 追記
# vim /etc/apt/sources.list
deb http://http.debian.net/debian/ jessie main contrib non-free

// 反映
# aptitude update

4. インストールします。

# aptitude -r install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') nvidia-kernel-dkms
5. X11の設定ファイルを作成します。

// ディレクトリ作成
# mkdir /etc/X11/xorg.conf.d

// 設定ファイルの作成
# echo -e 'Section "Device"\n\tIdentifier "My GPU"\n\tDriver "nvidia"\nEndSection' > /etc/X11/xorg.conf.d/20-nvidia.conf

// 確認
# cat /etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device"
Identifier "My GPU"
Driver "nvidia"
EndSection

6. nouveauを殺します。

# vim /etc/default/grub
(略)
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
# 加筆
GRUB_CMDLINE_LINUX="nouveau.modeset=0 rdblacklist=nouveau"
(略)
7. 反映します。

# update-grub
8. 再起動します。お疲れさでした。楽しいLinux Lifeを!!

# reboot



参考URL
https://wiki.debian.org/NvidiaGraphicsDrivers

IISとファイアーフォールのクソ仕様。

環境はWindows Server 2012と、IIS 8。
FTPサーバーをインストールして、いざ公開。
はい、クライアントから繋がらない。
ファイアーウォールはデフォルトの状態で、FTPサーバーを許可するように設定されているのにね。
でもファイアーウォールを無効にすると、クライアントから繋がるのさ。
なんだこれ。

どうやらSSLを使用しない設定だと、デフォルトのファイアーウォールがブロックする仕様みたいね。

手動で21番ポートを許可する規則を追加。
デフォルトで21番ポートは許可されてるのにね。

で、クライアントからめでたく接続できました。
グボーン!!

参考サイト
http://www.ipentec.com/document/document.aspx?page=windows-server-2008-r2-ftp-firewall-tips

SimpleDateFormatとTimeZone

Javaで日付をフォーマットをかけて、出力したとき、何故か時刻が9時間ずれた。
よくあるタイムゾーンの設定かと思い、staticイニシャライザで設定しみた。


static{
Locale.setDefault(Locale.JAPAN);
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
}
これで問題なかろう、と出力してみると、やっぱり9時間ズレてる。
SimpleDateFormatオブジェクトは生成コストが高いので、static finalとして、クラス変数として生成。でも、日付は正しい時刻みたい。
おやおや?どういうこっちゃ?
どうやら、DateFormatにもタイムゾーン設定があるらしく、フォーマットをかける時は、こちらが優先されるみたい。
なんだかめんどさいぬー。
ちなみに、static finalで定義しているので、staticイニシャライザのデフォルトタイムゾーン設定変更が走る前の状態で、インスタンスが生成されてしまっていた。
staticイニシャライザ内でDateFormat.setTimeZone()を呼べばOK!!

検証コード


import java.util.*;
import java.text.*;

public class DateTest{

private static final DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args){
System.out.println("");
System.out.println(Locale.getDefault());
System.out.println(TimeZone.getDefault());
System.out.println(Calendar.getInstance().getTime());
System.out.println(format.format(Calendar.getInstance().getTime()));

System.out.println("");
Locale.setDefault(Locale.JAPAN);
System.out.println(Locale.getDefault());
System.out.println(TimeZone.getDefault());
System.out.println(Calendar.getInstance().getTime());
System.out.println(format.format(Calendar.getInstance().getTime()));

System.out.println("");
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
System.out.println(Locale.getDefault());
System.out.println(TimeZone.getDefault());
System.out.println(Calendar.getInstance().getTime());
System.out.println(format.format(Calendar.getInstance().getTime()));

System.out.println("");
format.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
System.out.println(Locale.getDefault());
System.out.println(TimeZone.getDefault());
System.out.println(Calendar.getInstance().getTime());
System.out.println(format.format(Calendar.getInstance().getTime()));
}

}

実行結果

$ java DateTest

en_US
sun.util.calendar.ZoneInfo[id="Etc/UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Wed Jul 10 13:38:29 UTC 2013
2013/07/10 13:38:29

ja_JP
sun.util.calendar.ZoneInfo[id="Etc/UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Wed Jul 10 13:38:29 UTC 2013
2013/07/10 13:38:29

ja_JP
sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
Wed Jul 10 22:38:29 JST 2013
2013/07/10 13:38:29

ja_JP
sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
Wed Jul 10 22:38:29 JST 2013
2013/07/10 22:38:29

ARMアーキテクチャ環境のJava7でRXTXをビルドする。

RXTX http://rxtx.qbang.org/wiki/index.php/Main_Page

OpenBlocksAX3にRXTXをインストールする時にハマった内容。
OpenBlocksAX3はarmv7lと言うアーキテクチャを使用しているので、
RXTXでダウンロードできるバイナリをそのままJRE配下へ持っていっても動かない。
以下のようなエラーが出る。


java.lang.UnsatisfiedLinkError: /usr/lib/jre/lib/arm/librxtxSerial.so: /usr/lib/jre/lib/arm/librxtxSerial.so: cannot open shared object file: No such file or directory (Possible cause: can't load IA 32-bit .so on a ARM-bit platform) thrown while loading gnu.io.RXTXCommDriver

これはarmv7l上でi686用のlibrxtxSerial.soを呼んでいるためであって、armv7l用のlibrxtxSerial.soを用意してやる必要がある。
Jim Connors' Weblog(https://blogs.oracle.com/jtc/entry/serial_port_communication_for_java)にビルド済みのarm用librxtxSerial.soが公開されているので、そこから取得すれば問題なく動作してくれる。

動作してくれるのだが、Java6でビルドしてあり、Java7で動かすにはどうにも気持ち悪いし、今後も同様に動作してくれるのか怪しいので、ソースからビルドする。
まず、OpenBlocksにはJREしか入っていないので、このJREを無効にする。
■すべてコメントアウトする。


$ sudo vi /etc/profile.d/java.sh
#JAVA_HOME=/usr/lib/jre
#PATH=$PATH:$JAVA_HOME/bin
#export JAVA_HOME PATH

■再起動する。


$ sudo reboot
javaコマンドが無効になっていることを確認。

$ java -version
bash: java: command not found

OracleよりARMアーキテクチャ用のJDK7をダウンロードする。
Linux ARM v6/v7 Soft Float ABI(jdk-7u21-linux-arm-sfp.tar.gz)

■解凍して/usr/localへコピー。


$ tar zxvf jdk-7u21-linux-arm-sfp.tar.gz
$ sudo cp -R ./jdk1.7.0_21 /usr/local/
■update-alternatives --installでjava、javacを登録する。

$ sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_21/bin/java 1
$ sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_21/bin/javac 1
■確認

$ java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) Client VM (build 23.21-b01, mixed mode)
$ javac -version
javac 1.7.0_21

RXTXからSource(rxtx-2.1.7r2.zip)をダウンロードし、解凍する。
■unzipコマンドをインストール


$ sudo aptitude install unzip
■解凍する。

$ unzip rxtx-2.1-7r2.zip
$ cd rxtx-2.1-7r2/
Installationを見ながら何も考えずにビルドを行う。

$ ./configure
$ make
Javaディレクトリ配下へコピーする。(シンボリックリンク張るのも忘れずに)

$ sudo cp RXTXcomm.jar /usr/local/jdk1.7.0_21/jre/lib/ext/
$ sudo cp ./armv7l-unknown-linux-gnu/.libs/librxtxSerial-2.1-7.so /usr/local/jdk1.7.0_21/jre/lib/arm/
$ sudo ln -s librxtxSerial-2.1-7.so librxtxSerial.so

そうすると以下のエラーが出る。


java.lang.UnsatisfiedLinkError: gnu.io.RXTXCommDriver.nativeGetVersion()Ljava/lang/String; thrown while loading gnu.io.RXTXCommDriver
java.lang.NoClassDefFoundError: Could not initialize class gnu.io.RXTXCommDriver thrown while loading gnu.io.RXTXCommDriver

RXTX自体が古く、JDKのバージョンを追えていないので、configureファイルとconfigure.inファイルへ以下の変更を加える。


$ vi configure
case $JAVA_VERSION in
1.2*|1.3*|1.4*|1.5*)

1.2*|1.3*|1.4*|1.5*|1.6*|1.7*)
※上記の場所を以下へ変更する。
configureファイル :21544、21614、21750、21802行目
configure.iniファイル:466、536、672、724行目

makeの以下のエラーを排除する。


error: 'UTS_RELEASE' undeclared (first use in this function)

■OSのバージョンを取得


$ uname -r
3.0.6
■version.hを編集する。最終行に以下を追加する。

$ sudo vi /usr/include/linux/version.h
#define UTS_RELEASE "3.0.6"
再ビルドする。

$ make clean
$ ./configure
$ make
コピーして、起動して確認する。

$ sudo cp RXTXcomm.jar /usr/local/jdk1.7.0_21/jre/lib/ext/
$ sudo cp ./armv7l-unknown-linux-gnu/.libs/librxtxSerial-2.1-7.so /usr/local/jdk1.7.0_21/jre/lib/arm/
$ java Test
実行結果

Experimental: JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
/dev/ttyUSB0
/dev/ttyS1
/dev/ttyS0

動作確認のサンプルコード
Test.java


import gnu.io.CommPortIdentifier;
import java.util.Enumeration;

public class Test{
public static void main(String[] args){
System.out.println("main method start.");
try{
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier port = null;
while (portList.hasMoreElements()) {
port = (CommPortIdentifier)portList.nextElement();
System.out.println(port.getName());
}
}catch(Exception e){
e.printStackTrace();
}
}
}

VS2010でDataSetのDesigner.vbが勝手に消える

.xsdファイルをVS上のデザイナから変更した後に、.Designer.vbが勝手に消える。
.xsdを右クリックして、「カスタムツールの実行(L)」をクリックすると、「カスタムツール'MSDataSetGenerator'が失敗しました。種類'System.Data.Design.InternalException'の例外がスローされました。」とかダイアログが出てどうにもならない。
こんな状況です。

まず、.xsdファイルのプロパティのカスタムツールの項目がMSDataSetGeneratorになっていること。
原因は生成時と接続情報が変わってしまった場合に起こるようです。
例えば、サーバーエクスプローラーから.xsdのデザイナーにテーブルを丸っとドラッグしてDataTableを作って、その後、何らかの理由でDBへの接続が変わったとか。
.xsdファイルは実際はxmlで定義されていて、接続先がしっかり記述されています。で、記された今はもうない接続先につなぎに行くと(略)、このおバカちゃんめ。

上記のダイアログが出てしまうとにっちもさっちも行かないので、.xsdファイルをxml形式で直接いじります。


変更前


変更後

接続情報さよなら計画ですね。

参考:http://forums.asp.net/t/1011934.aspx/

sshで秘密キーでログインする。

1 : ローカルマシンで公開鍵を作成します。


talisker:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/talisker/.ssh/id_rsa): (Press Enter Key)
Enter passphrase (empty for no passphrase): (秘密のフレーズ)
Enter same passphrase again: (秘密のフレーズ)
これで公開鍵が作成されました。

2 : 作成された公開鍵を確認します。


talisker:~$ ll ~/.ssh/
合計 20
drwx------ 2 talisker talisker 4096 6月 17 21:12 ./
drwxr-xr-x 48 talisker talisker 4096 6月 17 12:41 ../
rw------- 1 talisker talisker 1766 6月 17 21:10 id_rsa
rw-r--r-- 1 talisker talisker 399 6月 17 21:10 id_rsa.pub
rw-r--r-- 1 talisker talisker 2210 6月 17 20:57 known_hosts
id_rsa.pubがありました。OKですね。

3 : 公開鍵をサーバーにコピーします。


talisker:~$ scp -r ~/.ssh/ talisker@サーバーマシンのIP.com:~/
talisker@サーバーマシンのIP.com's password:
id_rsa.pub 100% 399 0.4KB/s 00:00
id_rsa 100% 1766 1.7KB/s 00:00
known_hosts 100% 2210 2.2KB/s 00:00
scpコマンドが手軽です。

4 : サーバーにログインしてアレコレ設定してやります。


// scpで送られているか確認。
[talisker@ServerMachine ~]$ cd .ssh/
[talisker@ServerMachine .ssh]$ ls
id_rsa id_rsa.pub known_hosts

// id_rsa.pub以外は消す。
[talisker@ServerMachine .ssh]$ rm -rf known_hosts
[talisker@ServerMachine .ssh]$ rm -rf id_rsa
[talisker@ServerMachine .ssh]$ ls
id_rsa.pub

// 名前を変更する。
[talisker@ServerMachine .ssh]$ mv id_rsa.pub authorized_keys
[talisker@ServerMachine .ssh]$ ls
authorized_keys

// 所有権の変更。
[talisker@ServerMachine .ssh]$ chmod 600 authorized_keys

// 確認。
[talisker@ServerMachine .ssh]$ ll
合計 4
rw------- 1 talisker talisker 399 6月 17 21:17 2012 authorized_keys

// sshdの設定を変更する。
[talisker@ServerMachine .ssh]$ sudo vi /etc/ssh/sshd_config
//以下の様に設定します。
PermitRootLogin no
PasswordAuthentication no
AuthorizedKeysFile .ssh/authorized_keys

// sshdをリスタートして設定を反映させます。
[talisker@ServerMachine .ssh]$ sudo /etc/rc.d/init.d/sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]

// ログアウトします。
[talisker@ServerMachine .ssh]$ exit

sshd_configの詳しい設定は下記を参照されたし。
http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html
5 : 接続して確認します。

// rootでログイン
talisker@talisker:~$ ssh root@サーバーマシンのIP.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

// 鍵を持っていない別のマシンから接続
[caolila@dns ~]$ ssh talisker@サーバーマシンのIP.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

// 鍵をコピーして別のマシンから接続
[caolila@dns .ssh]$ ssh -i ~/.ssh/id_rsa talisker@サーバーマシンのIP.com
Enter passphrase for key '/home/caolila//.ssh/id_rsa': (秘密のフレーズを入力)

以上です。