2013年6月30日日曜日

iPad 3rd、iPad mini、Nexus7、iPhoneでKindleの比較をしてみた



iPad miniがひょんな事で手に入ったので、ちょっとKindleの見た目がどうかを比較してみました。

表紙

左から、iPad 3rd、iPad mini、Nexus 7、上がiPhone 4Sです。
全部画面輝度を最高にしてます。
絵だとどれも代わり映えはあまりしないかなって感じです。見た目的にはiPad達は背景が白い感じに見えるのですが、Nexus 7は少し黄色味がかった感じ。ただ、Nexus 7だけ見てるのであれば気にならないかな。

白黒のコマ
iPad 3rdとiPad miniで明るさに差が有るように見えるけども、視野角のせいです。
色温度はほとんど同じ。やっぱりNexus 7は少し黄色味がかった感じ。
意外にもiPad 3rdがRetinaなせいなのか、文字がぼんやりして見える。引き伸ばした感じになってるので、元画像の解像度がそこまで高くないのかも。


KindleはiOSでもAndroidでも同期がとれるので、すごく便利と思ったけども、
そもそも本の種類が少なすぎて読みたい本が無いってのが現状。
しばらくは、進撃の巨人と攻殻機動隊ARISEだけになりそうな予感。
個人的には電子書籍端末として使うならNexus 7≧iPad mini>iPad 3rdかなと。
Nexus 7は一番横幅が狭いので、持ちやすい。カバー付けなくてもすべり止めなボディってのもGood。ただ、色が少し黄色味がかって居るのと、画面の非表示エリア(操作ボタン)が気になるかな。それらが気にならないのであれば値段的に見ても電子書籍用に新しく買うならAndroid端末がいいのかも。

#以下アフィリエイト用の広告です

-->

2013年5月19日日曜日

USBに入れたUbuntu 13.04が遅かったのでちょっと対策してみた

安物のUSBだったのが、問題なのかファイルアクセスするとちょくちょく固まってしまうので、ファイルアクセス時間を記録しないようにするのと、Ramdiskを使うように設定を買えた。 あと、chromeのキャッシュもramdisk上に置くように設定変更

 /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/sdb5 during installation
UUID=ed0ac91c-c17f-4cd7-a9bb-ebdb735b1496 /               ext4    errors=remount-ro,noatime 0       1
# /dos was on /dev/sdb2 during installation
UUID=B371-17EE  /dos            vfat    utf8,umask=007,gid=46 0       1
/dev/sr0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
tmpfs /tmp tmpfs defaults 0 0

,noatimeがアクセス時間の記録を無効化するオプションで、tmpfsの行がramdiskを作ってくれるオプション。ramdiskのサイズは物理メモリの半分が自動で割り当てられるらしい

次に、chromeのキャッシュの設定

 ~/.xprofile
export XDG_CACHE_HOME="/tmp/.${USER}/cache"
[[ ! 0d "${XDG_CACHE_HOME}" ]] && install -dm0700 "${XDG_CACHE_HOME}"


小手先だけな対策だけども、とりあえず効果はありそうな感じがしてるので、しばらくはこれでいってみる

#以下アフィリエイト用の広告です

-->

2013年4月27日土曜日

Djangoでデータベースの位置を相対パスにする

備忘録

Djangoのチュートリアルを参考にデータベースの設定をしようと思ったら、チュートリアルには絶対パスで指定しろと書かれている。
でも、デフォルト状態のデータベースをバージョン管理したかったので相対パスにする方法を調べた



/settings.pyの初めの方を以下の様に編集(DB名は好きな名前)
from os import path
basepath = path.dirname(__file__)

DATABASE_NAME = path.join(basepath, 'DB名')

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': DATABASE_NAME,                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}


#以下アフィリエイト用の広告です

-->

2013年3月27日水曜日

Google Apps Scriptを使ってみた

さくらのレンタルサーバー上のメーリングリストをちょっと使うことになったが、
このメーリングリスト、mailmanのメーリングリストと違い、登録ユーザーの情報は
メールアドレスのみしかひもづけれない。

管理する側としては、メールアドレス+名前(or何か識別出来る情報)で扱いたい状態だったので、Google Driveのスプレッシュシートと紐付けてみる。
それで、ついでにGoogle Apps Scriptを使い、自動でメーリングリストへの登録が出来るようにしてみた。
コードは以下な感じ。スクリプトマネージャーからentry_mlを実行すれば自動で登録メールを投げてくれる。
さくら側の設定で、スプレッシュシートを編集するGoogleアカウントのアドレスを管理者アドレスに追加する必要がある。


/**
 * メーリングリストへの登録
 */
function entry_ml() {
  var password = "hoge";
  var adminAdress = "hoge@hoge.sakura.ne.jp";
  
  var sheet    = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // チェックするデータの開始行
  var numRows  = 100;  // チェックするデータの数
  
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 2, numRows, 7);
  
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    if (row[0] == "") {
      break;
    }
    var name = row[0];
    var emailAddress = row[1];
    var confirmed = row[6];
    var subject = "";
    if (confirmed != "") {
      var message = "approve " + password + " add " + emailAddress;
      //Browser.msgBox(name + "\n" + emailAddress + "\n" + message);
      MailApp.sendEmail(adminAdress, subject, message);
      sheet.getRange(startRow + parseInt(i), 9).setValue(1);
    }
  }
  
}

#以下アフィリエイト用の広告です

-->

2012年9月1日土曜日

オレオレLinuxメモ


自分用のLinuxコマンドメモ

コマンド


lsusb
認識してるUSB機器を表示

ifconfig XXX up
インターフェースを起動する

ifconfig -a
繋がってないインターフェースも表示する
wlan1とかになってた場合に確認する

タイムゾーンの変更

  • # mv /etc/localtime{,.org}
  • # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


操作

無線LANの設定

# chmod 0600 /etc/network/interfaces
# vi /etc/network/interfaces
ファイルに以下を追加or編集
auto wlan1
iface wlan1 inet static
  address 192.168.0.113
  netmask 255.255.255.0
  network 192.168.0.0
  broadcast 192.168.0.255
  gateway 192.168.0.1
  dns-nameserver 192.168.0.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
/etc/wpa_supplicant/wpa_supplicant.confは以下の感じ
network={
    ssid=""
    psk=""
}


#以下アフィリエイト用の広告です

2012年8月5日日曜日

Arduino+USBホストシールドでBluetoothドングルを使う

Circuits@Homeで公開されているUSBホストのライブラリに、BTドングル使ってSPP通信をするためのライブラリが追加されたぜ的なことがあったので試してみました。

必要なもの

  • Arduino本体
  • USBホストシールド(Sparkfun製は要改造)
  • Arduino IDE 1.0.1
  • ライブラリ

出来上がったもの

BTの子機側はAndroidのBluetoothChatのサンプルを使いました。

Sparkfunのシールドは使えない!?

どんだけ頑張っても「OSC did not start」となってしまいUSBの初期化ができない。
なぜかと思って調べてみるとUSBホストシールド2.0からリセット信号の回路上での取り回しが変わっている(D7からRSTへ)
そのため、ライブラリ2.0はSparkfun製のシールドでは使えないとのことです。
しかし、ここでも記載がありますが、配線を変えることでSparkfun製のシールドでも使えます。
D7から伸びる信号線をカットし、RSTから信号を取り回す改造をすることで無事初期化ができることを確認しました。





DTR信号でハマる

ArduinoはUSBシリアルから受け取ったデータをBTのSPPで送信しています。
ちょっとハマったところで、Arduinoはシリアル通信のDTR信号を利用してリセットを行なっていることです。
問題になるのは以下の様なシーケンスで動作した場合です。
  1. シリアルオープン
  2. データ送信
  3. シリアルクローズ
  4. 1へ戻る

1のシリアルオープンのたびにリセットがかかってしまいBTの接続が切れてしまいます。
なので、PythonのコードではTCPのリクエストハンドラ内でシリアル接続を保持して、
TCP経由でデータを送るようなことをしてます。


Pro miniへの対応

pro mini用のUSBホストシールドでも使ってみたのですが、
こちらはシリアル経由の3.3Vでは電圧が低くてUSBドングルが動作しませんでした。
しかし、冒頭のリセットしない問題は起きていないのでもしかしたらRAWピンに5V入れて、USBに5Vまわす改造をしておけば動くかも

まとめ

むちゃくちゃ簡単にSPP通信が使えるようになりました。


#以下アフィリエイト用の広告です

2012年7月5日木曜日

MacPortsでpython+opencvの環境を作る

MacPortsの環境でPython+OpenCVの環境作りでハマったメモ
pythonでimport cvがうまく行かなかったのが、単純にMacPortsがインストールするOpenCVはmac標準のpythonの環境がセットアップされないのが問題だった。
MacPortsでインストールしたpythonではちゃんと動いた。


$ sudo port install python
$ sudo port install opencv +python27
$ vi ~/.bashrc
〜略〜
alias python=/opt/local/bin/python2.7 ← aliasでごまかす。PATHの方がいいかも



#以下アフィリエイト用の広告です

2012年6月25日月曜日

Retina対応していないアプリをむりくりRetina対応させる方法

いろいろ調べてたらRetina対応していないアプリを自前でRetina対応する方法がありました
といっても文字などが綺麗になるだけで、アイコンなどのリソースを使っている箇所は変わりません。
Eclipseなどのメニューまでしょんぼりだったプログラムには有効な手段かと。

追記

以下の方法でVirtualBoxの設定を変更するとVirtualBoxが起動できなくなります。

未対応アプリ
VirtualBox
Inkscape
Google日本語入力(そもそもどのappをいじればいいのかわからん)

/* 追記ここまで */

やり方


ほげほげ.appなどをFinderで表示し、右クリックで「パッケージの内容を表示」を選択
(今回は例でArduino.appで行います)

info.plistをお好きなテキストエディタで開きます

選択されている行のようにの直前に
<key>NSHighResolutionCapable</key> </true>

を追記。

追記したら、エディタで保存して閉じます。
その後、ほげほげ.appの複製を作成するか、ログアウトしてログインし直すとRetinaに対応してくれます。

情報を見ると「低解像度で開く」のチェックが外れている。


ArduinoでBlinkのサンプルをRetina対応IDEで開いてみた


#以下アフィリエイト用の広告です

2012年6月24日日曜日

Mac Book Pro with RetinaでAndroid開発環境を構築する

MBPRでAndroid開発環境を構築したメモ

環境構築自体は今まで通りで全く問題なし。
Retina特有だと思う問題を以下にメモる

  • EclipseはRetina非対応でメニューもぼやける
  • エミュレータはRetinaの画面上で起動するとウィンドウの1/4でしか表示されない
  • Retinaの画面上で起動したエミュレータではソフトウェアキーボードの位置の認識がおかしい
  • HDMI出力でつないだ外部ディスプレイ側でエミュレータを起動すると今まで通りに起動
  • 外部ディスプレイ側で起動したエミュレータをRetina側に持って行くとエミュレータが異常終了


エミュレータ周りがおかしいので、プレゼンなどでエミュレータをよく使う方はGoogleが対応するまで待ちになりそうです。

#以下アフィリエイト用の広告です

2012年6月23日土曜日

Node.jsでC2DMっぽい何かを作ってみた

Node.jsのsocket.ioを使ってC2DMっぽい何かを作ってみた。

http://iwatan.dip.jp:8001/
(apacheの設定が面倒なのでポート番号直入)

機能としては、chrome to phoneのパクリ
ただ、chrome to phoneと違って1対多が可能
同じキーワードを設定したブラウザに一斉に送信するので、
設定したブラウザが一斉に画面遷移します。


#以下アフィリエイト用の広告です

2012年6月22日金曜日

Mac Book Pro Retinaの対応具合を調べてみた

発表の当日朝一でMac Book Pro Retina版をメモリ16Gにしてポチりました。
先日届いたのでいろいろなアプリのRetina対応状態を調べてみました

対応状況:×:アイコン・文字ともにぼやける(動作は正常) △:一部ぼやける ○:美しい

アプリ名バージョン対応状況備考
EclipseIndigo Service Release 2×ぼやける
Android SDK18.0.0.v201203301601-306762×エミュレータが1/4サイズで表示される
Arduino1.0.1×ぼやける
MPLAB X1.2.0△アイコンが一部ぼやけるがほぼ○と言って良い
Evernote3.1.2 (257203)△アイコンがぼやける。文字は○
MacVim7.3 (KaoriYa 20120509)△アイコンがぼやける。文字は○
DropBox?△Finderのアイコンは○、メニューバーのアイコンは×
WindowFlow?△ほぼ○なのだが、デスクトップ番号の表示の文字がぼやける
夜フクロウ2.74 (2.74)△アイコンがぼやける
RDC2.1.1×リモートデスクトップの表示もぼやける
chrome21.0.1180.4 dev△ファビコンなどはぼやける。そもそもDevチャンネルじゃないと文字がぼやける
VirtualBox4.1.16×ゲストOSの表示もぼやける
Skype5.8.0.865△アイコンがぼやける
Google日本語入力1.5.1109.1△入力はできるが、表示位置がおかしい。表示文字はぼやける
Inkscape0.48×文字、アイコンともにぼやける
VLC2.0.1 Twoflower (Intel 64bit)△アイコンがぼやける


#以下アフィリエイト用の広告です

2012年5月22日火曜日

gVimで警告音を消した際のメモ

gVimで警告音を消すオプションを設定する際にちょっちはまったのでメモ
set visualbell
set vb t_vb=
上の設定をvimrcに書くとgVimで音は消えるが画面のフラッシュがオフにできない。
正しくはgvimrcに上記の設定を書く必要がある。

 #以下アフィリエイト用の広告です

2012年5月20日日曜日

さくらのVPS上のJenkinsでArduinoのプログラムをビルド

忘れそうなのでφ(..)メモメモ。

Jenkinsでビルドするにはコマンドでビルドができるようにする必要がある
さくらのVPS上でJenkinsを動かすには以前やったので割愛

ビルドに必要なパッケージを入れる
yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
次にここからMakefileの元と、ツールをダウンロード

wget http://mjo.tc/atelier/2009/02/acli/arduino-mk_0.8.tar.gz
tar zxvf arduino-mk_0.8.tar.gz 
sudo cp arduino-mk-0.8/ard-parse-boards /usr/local/bin

# Arduino.mkをどこか固定の場所に置く
# 自分はスケッチの保存ディレクトリ直下にする
cp arduino-mk-0.8/Arduino.mk /


そしたら、適当にサンプルを作る


cd 
mkdir sample
cd sample
vi sample.ino

コードはこんなので十分

/*******************************************************************************
 *
 * @brief テスト用
 *
 ******************************************************************************/

#define LED_PIN       (2)   //!< @brief LEDの接続ピン
#define DELAY_TIME    (500) //!< @brief PWM待ち時間

/******************************************************************************
 * @brief  setup
 * @param  なし
 * @retval なし
 *****************************************************************************/
void setup()
{
    pinMode(LED_PIN, OUTPUT);
}

/******************************************************************************
 * @brief  loop
 * @param  なし
 * @retval なし
 *****************************************************************************/
void loop()
{
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

お次にMakefileを作る
ARDUINO_DIR    = /usr/local/lib/arduino-1.0
ARDMK_DIR      = /usr/local
AVR_TOOLS_PATH = /usr/bin
BOARD_TAG      = uno

AVRDUDE_CONF = $(ARDUINO_DIR)/hardware/tools/avrdude.conf
AVRDUDE_ARD_PROGRAMMER = arduino

MCU            = atmega328p
VARIANT        = standard

include ../Arduino.mk
これでmakeするとYAMLがどーたらこーたらとエラーがでるので、perl-YAML-Libを入れる sudo yum install perl-YAML 入れればmakeが通るようになるはず


#以下アフィリエイト用の広告です

2012年5月18日金曜日

Android ADKの本を出します

2012/5/12にソシム社からAndroid ADKの本を出版します。
東京+神戸のAndroider達でArduinoの入門〜ADK+応用な網羅的な内容を書きました。
自分はブログに書いていることなどなどを書きました。
なかなか貴重な体験です。ご協力いただいたみなさまありがとうございました。

Amazon調べでは日本語で書かれたArduinoでのADK用の専門書としては日本初ではないでしょうかね。
もし、みなさん興味ありましたら買ってください。

Android ADK プログラミング&電子工作バイブル (smart phone programming bible)
Amazonで¥ 3,129です。


俺、この本が売れたら新しいmacを買うんだ!

#以下アフィリエイト用の広告です

2012年5月2日水曜日

[memo]FedoraでArduinoのスケッチをコンパイルする

Ubuntu12.04をインストールしたら不調になったので、Fedoraへ乗り換えた。
そこで、Arduinoの環境を構築した際のメモ


yumでインストールする場合

普通はこのやり方で問題なし
sudo yum install -y arduino


バイナリを公式から落としてきて使う場合

ちょっと込み入った使い方をしたいのでこっちで構築した
sudo yum install -y java
sudo yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
wget http://arduino.googlecode.com/files/arduino-1.0-linux64.tgz
tar zxvf arduino-1.0-linux64.tgz
cd arduino-1.0
./arduino        ←起動確認
rm -R __MACOSX/  ←arduinoチームはmacで開発しているようだ。不要なので削除
./arduino        ←年のため削除しても問題ないか起動確認

普通に起動すると以下のエラーが出た。どうやら/var/lockにロックファイルが作れていないようだ。(スーパーユーザーで起動していないから無理な話なのだが。。。)
./arduino 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL

やはり、sudoで起動するとエラーは出なかった。

sudo ./arduino 
[sudo] password for naoki: 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7


で、ユーザーで起動した場合と、スーパーユーザーで起動した場合の違いとしては、
シリアルでArduinoを認識できるかどうかだけのようだった。
ビルドするだけであればユーザー権限で起動しても問題はなさそうだった。
とりあえず、自分の用途ではビルドさえ出来れば問題無いので、このままにしておく。


#以下アフィリエイト用の広告です

2012年4月25日水曜日

CentOSにJenkinsを入れる その1

さくらのVPSを借りたのでJenkinsやらなんやらを入れて遊ぼうと思ったので環境構築をしててハマったのでまとめる

環境

以下の環境で作業

  • CentOS 6.2 x86_64
  • メモリ 1G
  • ディスク 100G

Jenkinsのインストール

yumで突っ込めるようにさくっとやる
公式を参考に

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
そんで、
$ sudo yum -y install jenkins

ポートを開放する必要があるからiptablesの設定を編集
$ sudo vi /etc/sysconfig/iptables


設定内容はこんな感じ
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [82:13644]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT 
-A FORWARD -j RH-Firewall-1-INPUT 
-A RH-Firewall-1-INPUT -i lo -j ACCEPT 
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 
-A RH-Firewall-1-INPUT -p esp -j ACCEPT 
-A RH-Firewall-1-INPUT -p ah -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8009 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20021 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20025 -j ACCEPT 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
COMMIT

で、jenkinsの起動
$ sudo service jenkins start
Starting Jenkins                                           [  OK  ]


はい。この[  OK  ]に騙されていました。
プロセスを確認してみるとjenkinsが動いとりません。
$ sudo ps -x


なんでかなぁと思い、みやびーに聞いた所、直接jenkinsを起動してみろとのこと。
$ cd /usr/lib/jenkins
$ java -jar jenkins.war
Running from: jenkins.war
webroot: $user.home/.jenkins
2012/04/25 23:36:19 winstone.Logger logInternal
INFO: Beginning extraction from war file
2012/04/25 23:36:22 hudson.WebAppMain contextInitialized
SEVERE: Failed to initialize Jenkins
java.lang.ExceptionInInitializerError
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.installLogger(WebAppMain.java:256)
   at hudson.WebAppMain.contextInitialized(WebAppMain.java:107)
   at winstone.WebAppConfiguration.(WebAppConfiguration.java:875)
   at winstone.HostConfiguration.initWebApp(HostConfiguration.java:129)
   at winstone.HostConfiguration.(HostConfiguration.java:71)
   at winstone.HostGroup.initHost(HostGroup.java:87)
   at winstone.HostGroup.(HostGroup.java:47)
   at winstone.Launcher.(Launcher.java:177)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NullPointerException
   at com.thoughtworks.xstream.core.JVM.isOpenJDK(JVM.java:72)
   at com.thoughtworks.xstream.core.JVM.canUseSun14ReflectionProvider(JVM.java:198)
   at com.thoughtworks.xstream.core.JVM.bestReflectionProvider(JVM.java:175)
   at com.thoughtworks.xstream.XStream.(XStream.java:431)
   at com.thoughtworks.xstream.XStream.(XStream.java:385)
   at com.thoughtworks.xstream.XStream.(XStream.java:323)
   at hudson.util.XStream2.(XStream2.java:75)
   at jenkins.model.Jenkins.(Jenkins.java:3677)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...12 more
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Error during context startup for webapp webapp
java.lang.ExceptionInInitializerError
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.installLogger(WebAppMain.java:256)
   at hudson.WebAppMain.contextInitialized(WebAppMain.java:107)
   at winstone.WebAppConfiguration.(WebAppConfiguration.java:875)
   at winstone.HostConfiguration.initWebApp(HostConfiguration.java:129)
   at winstone.HostConfiguration.(HostConfiguration.java:71)
   at winstone.HostGroup.initHost(HostGroup.java:87)
   at winstone.HostGroup.(HostGroup.java:47)
   at winstone.Launcher.(Launcher.java:177)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NullPointerException
   at com.thoughtworks.xstream.core.JVM.isOpenJDK(JVM.java:72)
   at com.thoughtworks.xstream.core.JVM.canUseSun14ReflectionProvider(JVM.java:198)
   at com.thoughtworks.xstream.core.JVM.bestReflectionProvider(JVM.java:175)
   at com.thoughtworks.xstream.XStream.(XStream.java:431)
   at com.thoughtworks.xstream.XStream.(XStream.java:385)
   at com.thoughtworks.xstream.XStream.(XStream.java:323)
   at hudson.util.XStream2.(XStream2.java:75)
   at jenkins.model.Jenkins.(Jenkins.java:3677)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...12 more
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: HTTP Listener started: port=8080
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: AJP13 Listener started: port=8009
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Error during servlet context shutdown
java.lang.NoClassDefFoundError: jenkins.model.Jenkins
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.contextDestroyed(WebAppMain.java:339)
   at winstone.WebAppConfiguration.destroy(WebAppConfiguration.java:1149)
   at winstone.HostConfiguration.destroyWebApp(HostConfiguration.java:148)
   at winstone.HostConfiguration.destroy(HostConfiguration.java:156)
   at winstone.HostGroup.destroy(HostGroup.java:77)
   at winstone.Launcher.shutdown(Launcher.java:337)
   at winstone.Launcher.(Launcher.java:199)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: Winstone shutdown successfully
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Container startup failed
java.io.IOException: Failed to start a listener: winstone.ssl.HttpsListener
   at winstone.Launcher.spawnListener(Launcher.java:229)
   at winstone.Launcher.(Launcher.java:185)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NoClassDefFoundError: winstone.ssl.HttpsListener
   at java.lang.Class.initializeClass(libgcj.so.10)
   at java.lang.Class.forName(libgcj.so.10)
   at winstone.Launcher.spawnListener(Launcher.java:213)
   ...5 more
Caused by: java.lang.ClassNotFoundException: sun.security.util.DerValue not found in java.net.URLClassLoader{urls=[file:/tmp/winstoneplgbf6jar], parent=gnu.gcj.runtime.SystemClassLoader{urls=[file:jenkins.war], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}}
   at java.net.URLClassLoader.findClass(libgcj.so.10)
   at java.lang.ClassLoader.loadClass(libgcj.so.10)
   at java.lang.ClassLoader.loadClass(libgcj.so.10)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...7 more


わっさーとエラーが出てきました。どうやらjenkins自体のインストールがうまくいってない?
ここから問題を解決していきたいと思います。

#追記
コメントで指摘をもらったようにOpenJDKをインストールすると無事起動できるようになった。

#以下アフィリエイト用の広告です

2011年12月6日火曜日

【追記あり】DotsduinoをAndroidから操作してみた



Make: Tokyo Meeting 07に3日行ってきました。
そこで、以前からお世話になってるブログ(なんでも作っちゃう、かも。)の方が出展しており、 DotsduinotというArduino互換のオリジナル製品を売っていたので買っちゃいました。
それで、折角なのでAndroidからDotsduinoを制御できるようにしてみました。
正確に言うと、シリアル通信で、命令をDotsduinoが受け取り表示するといった流れなので、 そのままPCからも制御できちゃいます。

【追記】
動画をアップロードしました


  • Dotsduino側のソース

#include 

Dots myDots = Dots();

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  myDots.begin();
}


void loop()
{ 
  int msg[4] = {0};
  int i    = 0;
  int flag = 0;
  
  // 3バイトを超えてバッファされないと処理しないようにする
  if (Serial.available() > 3) {
    i = 0;
    
    while(i < 4) {
      msg[i] = Serial.read();
      if (msg[i] < 0) {
        break;
      }
      i++;
    }

    // 念のためのデータチェック用
    if (msg[0] == '@') {
      myDots.write(msg[1], msg[2], msg[3]);
    }
  }
}

とりあえずこれだけで、PCからでも"@111"や"@250"といった形のデータを送れば付けたり消したり出来ます。
ただ、msg[1]〜msg[3]は数値である必要があるのでASCIIコードで送ると、49とか50といったデータが送られてくるので、次のように変更するといいかもしれません。
      myDots.write(msg[1] - '0', msg[2] - '0', msg[3] - '0');
ただ、これはPCからASCIIコードで送る場合の処置です
数値として送る場合には不要です。

Android側のソースは後日綺麗にしたらGithub上に上げておきます。
https://github.com/iwata-n



#以下アフィリエイト用の広告です

2011年11月27日日曜日

さくっとfoursquareとGoogleカレンダーを同期する方法

TwitterでfoursquareとGoogleカレンダーを同期すると引きこもってた日がいっぱつでわかるとツイートしたらやたらRTされたんでやり方をメモ


  1. おもむろにfoursquareにログインします
  2. https://ja.foursquare.com/feeds/にアクセスします
  3. https://feeds.foursquare.com/history/○○.icsをコピー
  4. Googleカレンダーを開きます
  5. 左のメニューから「他のカレンダー」で小さい三角を押します
  6. 「URLで追加」にさっきコピーしたicsのURLを貼り付け
  7. (゚д゚)ウマー

これで自分の履歴がさくっと確認できます。
kmlをコピってGoogleマップでインポートすれば地図上で確認できるようになります


#以下アフィリエイト用の広告です

2011年11月6日日曜日

AndroidのUSB Host APIを使ってチョロQを動かす




前回と前々回に紹介したAndroidのUSBホストAPI。
これを使っていつものごとく日本が世界の誇るタカラトミー社製のチョロQ ハイブリッド を遠隔操作しました。
今回はそれのまとめ記事です。
ソースはGithub上でライブラリ化したものとサンプルソースで公開してます。

使用方法は、これまでに紹介したとおりAndroid 3.1以上が必要です。
自分はOptimus Padでのみテストしてますが、おそらく他のタブレットでもいけると信じてます。

ライブラリの方はまだ詰めが甘いのでUSBのパーミッション取得用のBroadcastReceiverを正しく開放できていない状態です。
また、シリアル通信のボーレートの計算方法がいまいちわかっていないので今の所9600で固定値になっています。
APIにはsetBaudrate()は実装しているのですが、中身は見てもらってもわかるとおり空っぽです。

ライブラリの使い方はgithub上のUSB_Lib_sampleがわかりやすいかと思ってます。
UsbSerialManagerを使ってUSBシリアル通信ができるデバイスの一覧をgetList()を使って取得します。
取得してデバイスの一番最初のデバイスの使用許可を要求します。
要求すると、要求ダイアログがでます。



    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
        manager = new UsbSerialManager(this);
        if (serial == null) {
            List list = manager.getList();
            if (list.size() > 0) {
                Log.d(TAG, "Device count=" + String.valueOf(list.size()));
                UsbDevice dev = list.get(0);
                manager.requestPermission(dev, listener);
            } else {
                Log.e(TAG, "USB Serial Device not found");
            }
        } else {
            Log.e(TAG, "USB Serial Device has already got instance.");
        }
    }

要求が承認されるとコールバックが呼ばれるので、あとは、UsbDeviceからUsbSerialを生成して、オープンしてあげます。
この辺はちょっと苦肉の策を使っています。
    /** USBシリアル通信デバイスを使用するパーミッションを取得した際のコールバックリスナー */
    UsbSerialManager.OnGetPermissionListener listener = new UsbSerialManager.OnGetPermissionListener() {
        @Override
        public void onGetPermission(UsbSerial device) {
            Log.d(TAG, "onGetPermission");
            UsbDevice dev = device.getDevice();
            Log.d(TAG, "DeviceName=" + dev.getDeviceName());
            Log.d(TAG, "id=" + String.valueOf(dev.getDeviceId()));
            serial = device;

            try {
                serial.open();
            } catch (IOException e) {
                e.printStackTrace();
            }
            threadStart();
        }
    };

オープンすれば、あとはread()、write()で読み書きができます。
本当はストリームで実装しようと思ったのですが、ちょっとオーバーヘッドが大きかったので、手抜きしました。

今後はボーレートの計算とか調べようかと思います。

#以下アフィリエイト用の広告です

2011年11月5日土曜日

Arduino IDEのフォントを変える


ちょっとArduinoの開発環境のフォントがアンチエイリアスなしでギザギザして見難かったし、Ubuntuだと豆腐現象(日本語が文字化けして□に見える)に悩まされていたのでフォントを変えました。

その際の手順をまとめておきます。

Arduinoを立ち上げてFile > Preferenceを選ぶ


そうするとここでフォントサイズは変更できます。でもフォントを変えることができないので、画面内の「/home/<ユーザー名>/.arduino/preference.txt」をクリックする。
そうすると詳細設定を行えるテキストファイルの場所が開きます。

そうしたら、preference.txtはArduino IDEが起動していると編集しても、終了時に上書きされてしまうので、Arduino IDEを終了しておく。

Arduino IDEを終了したら、preference.txtを開きます。
開いたら、editor.fontとeditor.antialiasを以下のように編集します。
<フォント名>は使用したいフォント名を選びます。


editor.font=<フォント名>,plain,16
editor.antialias=true



編集したら保存してArduino IEDを再度立ち上げればOK

記事の先頭にある画像のように日本語も大丈夫です。


#以下アフィリエイト用の広告です