Mac用アプリの自動テスト

最近自動テストツールにはまっています。

さすがにはやりというかiOSやAndroid用のテストツールは山ほど(というほどでもありませんが)有るのですが、Macのアプリ用のテストツールはほとんど有りません。

ちなみにこちらにまとめて書いてあるので参考になります

http://iphone-dev.g.hatena.ne.jp/laiso/20120111/1326280021

KIFのMac版が有るとのことなのでちょっと試してみました。

こちらのサイトを参考に

http://d.hatena.ne.jp/laiso+iphone/20121013/1350134198

環境

  • MacOS10.9
  • Xcode 5

この組み合わせで少しはまりました。

http://d.hatena.ne.jp/laiso+iphone/20121013/1350134198

こちらのサイトのサンプルであるGITHubからダウンロードします

https://github.com/laiso/Mac-Samples/tree/master/KIFMac01

git clone https://github.com/laiso/Mac-Samples.git

このままではKIFがとれないので別途取得します

mkdir work
cd work
git init
mkdir Vendor
git submodule add https://github.com/joshaber/KIF.git	Vendors/KIF-Mac

先ほど取得したサンプルに上書きします

mv Vendors/KIF-Mac ../../Mac-Sample/.

Xcodeを起動しプロジェクトを取り込みます

IntegrationTestのターゲットを選んで実行。しても止まってしまいます。

ログを見ると、

System Preferences => Universal Access => Enable access for assistive devices

どうやらアクセシビリティがだめな模様。

システム環境設定のアクセシビリティを見ても設定項目なし。。

http://www.tekrevue.com/how-to-enable-access-for-assistive-devices-in-os-x-mavericks/

こちらに答えが書いていました。

システム環境設定のセキュリティとプライバシーの中から、プライバシータグのアクセシビリティにXCodeのチェックボックスをオン

これでサンプル通りに動きました

npmコマンドのproxy設定

iOSとAndroidのアプリのテストが自動でできるというappiumを試そうとしたときの話。

  • 環境
    • MacOS 10.9
  • インストール
$ brew install node
Warning: node-0.10.24 already installed
$ sudo npm install -g appium
Password:
npm http GET https://registry.npmjs.org/appium
npm http GET https://registry.npmjs.org/appium
npm http GET https://registry.npmjs.org/appium
npm ERR! network read ECONNRESET
npm ERR! network This is most likely not a problem with npm itself
npm ERR! network and is related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.	See: 'npm help config'
npm ERR! System Darwin 13.0.0
npm ERR! command "/usr/local/Cellar/node/0.10.24/bin/node" "/usr/local/bin/npm" "install" "-g" "appium"
npm ERR! cwd /private/tmp
npm ERR! node -v v0.10.24
npm ERR! npm -v 1.3.21
npm ERR! syscall read
npm ERR! code ECONNRESET
npm ERR! errno ECONNRESET
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!		 /private/tmp/npm-debug.log
npm ERR! not ok code 0

こんな感じでおこられてしまった

proxyの設定はbashの環境変数とは別の様でconfigで設定する必要が有ります

$ npm config set proxy http://proxyhost:8080

再度実行

$ sudo npm install -g appium
Password:
npm http GET https://registry.npmjs.org/appium
npm http 200 https://registry.npmjs.org/appium
npm http GET https://registry.npmjs.org/appium/-/appium-0.13.0.tgz
npm http 200 https://registry.npmjs.org/appium/-/appium-0.13.0.tgz
npm http GET https://registry.npmjs.org/grunt
npm http GET https://registry.npmjs.org/argparse
npm http GET https://registry.npmjs.org/uuid-js
npm http GET https://registry.npmjs.org/rimraf
..

load data local infile時にMySQLで文字化けしてしまう

ちょっとハマったのでメモ

  • MySQL5.1.71
  • CentOS 5.2

MySQLでSjisファイルをロードするときに文字化けしてしまう

$ export LANG=ja_JP.sjis	# 効かない
$ mysql -uroot -hhost -ppass --local-infile=1 --default-character-set=sjis << Eof
use mysql
;
set names sjis	# 効かない
;
load data local infile "sjis.txt" into table table
;
Eof

悩みました

$ mysql -uroot -hhost -ppass --local-infile=1 --default-character-set=sjis << Eof
use mysql
;
set character_set_database=sjis	 # これでOK
;
load data local infile "sjis.txt" into table table
;
Eof

どうやらDBの設定がおかしかったようです

mysql> show global variables like "%charac%";
+--------------------------+--------------------------------------------------------------+
| Variable_name						| Value																												|
+--------------------------+--------------------------------------------------------------+
| character_set_client		 | latin1																											 |
| character_set_connection | latin1																											 |
| character_set_database	 | latin1																											 |
| character_set_filesystem | binary																											 |
| character_set_results		| latin1																											 |
| character_set_server		 | latin1																											 |
| character_set_system		 | utf8																												 |

これを変更するにはmy.cnfに設定し再起動すればOKです

$ vi my.cnf
[mysql]
default_character_set = sjis
[mysqld]
character-set-server=sjis

グローバル変数もこうなります

mysql> show global variables like "%charac%";
+--------------------------+----------------------------+
| Variable_name						| Value											|
+--------------------------+----------------------------+
| character_set_client		 | sjis											 |
| character_set_connection | sjis											 |
| character_set_database	 | sjis											 |
| character_set_filesystem | binary										 |
| character_set_results		| sjis											 |
| character_set_server		 | sjis											 |
| character_set_system		 | utf8											 |

macを10.9.1にバージョンアップしたらmac->winのSynergyでバックスラッシュが効かなくなってしまった場合の対処

サーバ側

  • MacOS 10.9
  • SynergyKM

クライアント側

  • windows7
  • Synergy1.3.1a-ja

こちらを参考に、http://wiki.nothing.sh/page/memo/Synergy 上記構成でMacをサーバにWindowsをクライアントとしてSynergyを使っていたのですが、どうやら10.9.1にバージョンアップしたらWindows側でバックスラッシュ「¥」が効かなくなってしまいました。

10.9.1のReleaseNoteをチラッと見ると、日本語入力周りの修正等と書いてあったのでもしやこれに引っかかったか?

非常に不便なので、ダメ元でWindows側のSynergyを1.3.1-jaに変更。

どうせ一緒だものね。

と、なんと、これでバックスラッシュが効くようになったとさ。

今回のMacOSのアップデートで、どうやらずいぶんと前からある不具合を直したのでしょうか?

LinuxからMac10.9へリモートディスプレイでX上のFirefoxを動かす

ちょっとはまったのでメモ。

通常X-Windows同士はお互いに、リモートでディスプレイ上のものを映すことができます。

A:Linux

B:Linux

A->BへsshでログインしBのFirefoxを起動しAのX上で操作するということです。

意外とこれが便利。

X-Windowを搭載しているMacでも同じことが当然できるはず。

ということで試してみる

古い記憶を辿りながら

Local

mac 10.9(hostname:mac,ip:192.168.0.1)

remote

RedHat 5.8 (hostname:linux,ip:192.168.0.2)

Macでの設定

[mac] $ xhost +

Linux側での設定

[mac] $ ssh linux
[linux] $ export DISPLAY=192.168.0.1:0
[linux] $ firefox
Error: cannot open display: 192.168.0.1:0

これが起動しない。

こちらに解決法が。。

http://ruepprich.wordpress.com/2013/01/08/x11-forwarding-on-os-x-10-8-2-mountain-lion/

Macでの設定

[mac] $ sudo xhost + linux

Linux側での設定

[mac] $ ssh -X linux
[linux] $ firefox

見事にMac側にFirefoxのウインドウが。。

DISPLAYは必要ないのね。。

Mahoutでjava.util.NoSuchElementExceptionが出た時の対処

機械学習用のライブラリ、ApacheMahoutを使用していてちょっと困ったのでメモ

import java.io.*;
import java.util.*;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.*;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;

class test{

	public static void main(String[] argv){
		try{
			DataModel model=new FileDataModel(new File("test.csv"));
			ItemSimilarity similarity=new PearsonCorrelationSimilarity(model);
			Recommender recommender= new GenericItemBasedRecommender(model,similarity);
			List recommendations=recommender.recommend(1,5);
			for(RecommendedItem recommendation:recommendations){
				long recommendCode=recommendation.getItemID();
				System.out.println(recommendCode);
			}
		}catch(Exception e){}
	}
}

こんなかんじでアイテムベースのレコメンドを作成していたのですが、CSVファイルを読み込んだ際に

java.util.NoSuchElementException
				at com.google.common.base.AbstractIterator.next(AbstractIterator.java:75)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.processLine(FileDataModel.java:384)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.processFile(FileDataModel.java:340)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.buildModel(FileDataModel.java:239)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.reload(FileDataModel.java:208)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.(FileDataModel.java:194)
				at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.(FileDataModel.java:149)

こんなエラーが出て進まない時がある。実行したのはLinux64Bit環境のjdk1.6。

同じものをwindows7のjdk1.6で動かしてもエラーが出ない。。。

読み込んだCSVは600万行程度

よくわからないのですがCSVの最後に改行を入れるとエラーなく動作。

わけわからん

rubyでMongoDBにISODateを入れる試み

  • ruby1.9.3

apacheのログなどを解析する場合にはmongodbに一度入れると扱いやすくなります。

そこでこのプレーンテキストのapacheのログをrubyを使っていれる試みをしてみました

この辺りを参考に

http://mironal-memo.blogspot.jp/2012/07/mongodb-ruby.html

gem install mongo
gem install bson_ext

ログからip,時間、urlの3つ、必要なものを抽出します

zcat access.log.gz |awk '{print $1"\t"$4"\t"$7}' > log.txt
#!/bin/env ruby
require "mongo"

conn=Mongo::Connection.new
db=conn.db("database")
col=db.collection("logs")
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		col.insert({"ip"=>ay[0],"date":"ISODate(Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))","url":ay[2])
	}
}

こんな感じで入るのかと思ったのですがISODateにはなりません

仕方がないので一度ファイルにします

  • create.rb
#!/bin/env ruby
puts "use database"
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		puts 'db.logs.insert({ip:"'+ay[0]+'","date":ISODate("'+Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))+'"),"url":"'+ay[2]+'"))'
	}
}
ruby create.rb > mongo.dat
mongo < mongo.dat

これくらいしかわかりませんでした

20131225 追記

一度ファイルにせずともできました

#!/bin/env ruby
require "rubygems"
require "mongo"
require "time"
include Mongo
db=MongoClient.new("localhost",27017).db("database")
col=db.collection("test")
col.insert({"id"=>"id0","date"=>Time.parse("2013-12-25 00:00:00").utc})

Time型のオブジェクトを作成し、utcへ変換するとMongodbではISODateへとなっています

sshでsudoを使ってtomcatをスタートする

  • centos 5系
$ ssh user@server sudo /usr/local/tomcat/bin/startup.sh
sudo: sorry, you must have a tty to run sudo

どうやらttyがないとエラーになるらしいので以下のオプションをつける

$ ssh -t user@server sudo /usr/local/tomcat/bin/startup.sh

このままだとスタートアップしてもsshでログアウトするとTOMCATも終了してしまう

$ ssh -t use@server sudo nohup /usr/local/tomcat/bin/startup.sh

nohupを使うことによりログアウト後もTOMCATが終了しない

ちなみに/etc/sudoersは

root	ALL=(ALL)	 ALL
user ALL=NOPASSWD: /usr/bin/nohup /usr/local/tomcat/bin/startup.sh

さらにパスワードを入れるのが面倒な場合は

  • remotestart.sh
#!/bin/sh
restart(){
expect << Eof
set timeout -1
spawn ssh -t user@host sudo nohup /usr/local/tomcat/bin/startup.sh
match_max 100000
expect -exact "user@host's password: "
send -- "password\r"
expect eof
Eof
}
restart

このシェルを実行