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)アイコンがぼやける。文字は○
DropBoxFinderのアイコンは○、メニューバーのアイコンは×
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

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


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

2011年11月2日水曜日

【使い方編】AndroidのUSBホストを使ってArduinoとシリアル通信 その2

前回ここで紹介されているAndroidとArduinoをUSB Host APIを使ってシリアル通信させるソースの動作テストをしました。

今回はメーリングリストでリクエストがあったので、それの使い方編をやろうかと思います。

紹介しているサイトを拙い英語力で読んでいると
http://www.intra2net.com/en/developer/libftdi/
ここで、libftdiのソースやバイナリがあり、
FTDIのドライバの動作について詳しくしりたいならソース読めって感じだった。

あと、rootedな端末であれば
http://android.serverbox.ch/?p=285
ここにドライバをカーネルに入れる方法が書かれてた。


それでは本題。

必要なもの
・Android 3.1以上のタブレット(自分はOptimus Padを使った)
・マイクロUSBからホストAへ変換するコネクタ
自分はOptimusPadに付いてきたものを使用
また、動作確認はしてないですが、Amazonでも売ってる様子
ELECOM Micro-USB(Aメス-MicroA)アダプタ 延長 0.15m ブラック MPA-EMA015BK
USB2.0ホストケーブル Micro-USB(Aメス-MicroB)アダプタ
・FTDI製のUSBシリアル変換チップを使った製品
動作確認したもの
・Arduino Duemilanove
Arduino pro mini 3.3VFT232RL搭載小型USB-シリアルアダプタ
動かないもの
・Arduino Uno
※Arduino UnoはUSBシリアル変換のチップがFTDIのものから変更されているのでそのままでは動きません

ソースのダウンロード
USBシリアル通信の方法はまず紹介しているサイト
Download the Android source
からソースをダウンロードしてきます。

適当に解凍して、Eclipseにプロジェクトをインポート。

FTDI_USBActivity.javaがソースで、こいつがほぼすべて。
private static final String VID_PIDを必要があれば書き換える。
でもおそらくFTDI製のチップであればそのままでも動くはず。

デバイスのVID、PIDの確認
念の為にPCにデバイスを接続して確認してみる。

自分のUbuntu 11.10ではコマンドで、
$ usb-devices
と打てば接続されているUSBデバイスの詳細情報一覧が取得できたので、

## デバイスを接続していない状態
$ usb-devices > usb_none.txt
## デバイスを接続した状態
$ usb-devices > usb_connect.txt
$ diff usb_none.txt usb_connect.txt

を行って差分を見て新しく接続されたデバイスを見つけて
Driver=ftdi_sio
になっているものを探した。

そうすると

< T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 12 Spd=12  MxCh= 0
< D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
< P:  Vendor=0403 ProdID=6001 Rev=06.00
< S:  Manufacturer=FTDI
< S:  Product=FT232R USB UART
< S:  SerialNumber=A700eYen
< C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=90mA
< I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
こんなのが見つかったので、VIDはVendor、PIDはProdIDが一致してたので問題ない。

もし、これでDriverはftdi_sioなんだけどVendorとProdIDが違う製品であれば
FTDI_USBActivity.javaのVID_PIDを変更する必要があります。

アプリの実行
インポートしたプロジェクトを実行

[2011-10-31 23:53:26 - FTDI_USB] ------------------------------
[2011-10-31 23:53:26 - FTDI_USB] Android Launch!
[2011-10-31 23:53:26 - FTDI_USB] adb is running normally.
[2011-10-31 23:53:26 - FTDI_USB] No Launcher activity found!
[2011-10-31 23:53:26 - FTDI_USB] The launch will only sync the application package on the device!
[2011-10-31 23:53:26 - FTDI_USB] Performing sync
[2011-10-31 23:53:26 - FTDI_USB] Automatic Target Mode: using device '192.168.11.3:8000'
[2011-10-31 23:53:26 - FTDI_USB] Uploading FTDI_USB.apk onto device '192.168.11.3:8000'
[2011-10-31 23:53:27 - FTDI_USB] Installing FTDI_USB.apk...
[2011-10-31 23:53:31 - FTDI_USB] Success!
[2011-10-31 23:53:31 - FTDI_USB] /FTDI_USB/bin/FTDI_USB.apk installed on device
[2011-10-31 23:53:31 - FTDI_USB] Done!

実行すると普通のアプリと違いDone!となりそのまま起動しません。
なのでアプリ一覧から起動します。
ちなみにUSBポートはシリアル通信用のデバイスとつないでしまってDDMSからログが見れなくなるので、無線LAN経由でADBが使用できるようにしておくとデバッグが便利です。
やり方としてはPCとAndroidをつないだ状態で
adb tcpip <ポート番号>
と実行し、PCからAndroidを接続を切った状態で(繋がってても問題は無い)
adb connect :<ポート番号>
と実行すればつながるはず。2.X系だとrootedじゃないとダメかも。

なにもAndroidタブレットにつないでいない状態だとlogcatに

11-02 21:34:49.952: D/FTDI_USB(11875): >==< no more devices found >==<

と出力される。
ただ、自分の環境だと変換ケーブルが悪いのかよく認識しなかった。
抜き差ししたりするとたまに治る。

うまいこと認識すると次の画面が出るのでOKを押す


ここで注意!
OpenAccessoryでは接続した瞬間にブロードキャストのIntentが飛んでブロードキャストレシーバーがそれを捕まえることでアプリが自動で立ち上がる仕組みができてましたが、なぜかこのアプリはそれが動きません。Optimus Padが悪いのかサンプルが悪いのかまだ詳しく追っていないのでよくわかりません。
なので、接続する際は次の手順がうまく行きます
USBデバイスを接続 → アプリ起動
この順番を守らないと上記の画面が出てきてくれません。


アプリは1秒間隔で0〜15までを順にカウントアップしています。
なので、今回はテスト用にArduinoに次のようなスケッチを書き込みました。

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  int buf;
  
  if (Serial.available()) {
    buf = Serial.read();
    if (buf % 2 == 1) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
  }
 
}

単純に受信したデータを2で割り、あまりが1だったら基盤に実装されているLEDをつけるだけです。
なので、1秒間隔でオンオフを繰り返すようになっています。



こんな感じで比較的簡単に準備は出来ました。
今後はこのサンプルソースを改良してライブラリをちゃちゃっと作っちゃおうかと思います。


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

2011年11月1日火曜日

ブログタイトルを変えてみた

前々からブログタイトルを変えたかったので、
ちょっと思い切って変えてみました。

「傘に骨はあるけど、お肉はどこにあるの?」
これが、自分が親に子供の頃に聞いた質問だそうです。
全く覚えてないですがこういう発想を自分は出来るんだってのを
忘れないためにもブログのタイトルにしてみました。

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

2011年10月31日月曜日

AndroidのUSBホストを使ってArduinoとシリアル通信

Androidの会のメーリングリストを見ていると気になる投稿があったので、早速試してみた。



Android USBを用いてシリアル通信を行う方法

https://groups.google.com/forum/?hl=ja#!topic/android-group-japan/eox6wGtMOSY

投稿の中で紹介されていたサイト
http://android.serverbox.ch/?p=370

上記のサイトを読む感じだとハニコムのUSB Host APIを使ってFTDIのチップと通信してるみたい。
とりあえずデスマが近いのでさくっとした動作確認だけしました。

追記
アプリ側は紹介されているサイトのままなので、シリアルからカウントアップした値を常に出し続ける。Arduino側は受信したデータを2で割ってあまりが1ならLEDをオンにするスケッチを書き込んだ。



Android
Optimus Pad(L-06C) 3.1

Arduino
・Arduino Duemilanove
・Arduino Pro Mini 328 3.3V 8MHz + FT232RL搭載小型USB-シリアルアダプタ 3.3V

Arduino UNOはUSB-シリアル変換のチップがFTDI製のものからATmega8U2
に変わっているのでそのままでは認識しない様子。
この辺ももしかしたらどこかに仕様が落ちてるかも。


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


2011年10月8日土曜日

Thunderbirdの送信メールの自動改行を無くす方法

自分の備忘録


メニューから
「ツール」→「オプション」



「詳細」で、「一般」のタブを選ぶ。

「高度な設定」の「設定エディタ」を選ぶ。



「about:config」は内部の定数などを編集するので間違えると深刻な問題を引き起こすので、
最新の注意を払って変更する。


「フィルタ」に「mailnews.wraplength」を入力し検索する。

出てきた設定名「mailnews.wraplength」を右クリックし、「値を変更」を選ぶ



入力ボックスを「0」としてOKを押す。

「about:config」を閉じて、「オプション」でOKを押すと設定が反映される。



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

2011年10月2日日曜日

Channel APIを使ってブラウザ経由でlogcatを見る


TLやらデ部やらで@tomorrowkeyさんがWebSocket使ってブラウザでLogcat見れるようなのを、
作ったってのを見て二番煎じしてみました。


サイト
https://iwata-n.appspot.com/logcat
上のURLをお好きなブラウザから見ればOK。
ただし、Androidで使っているアカウントと同じGoogleアカウントでログインしている必要があります。

ubuntu11.04 + chrome
mac 10.6 + chrome
Android 3.1 + ブラウザ
で動作確認しました。


アプリ
RemoteLogcat(マーケットへのリンク)
残念ながらGoogleアカウントを使っているのでIS01は動作対象外にしてしまいました。
誰か1.6で端末に設定されているGoogleアカウントのとり方教えてください。


使い方
使い方は簡単で、

  1. PC等でサイトにアクセスして、Androidと同じGoogleアカウントでログイン
  2. Androidでアプリを起動
  3. アプリにサイトでログインしたGoogleアカウントを設定する
  4. サービスのチェックを入れてサービスを起動する
  5. サイトが(゚д゚)ウマー

取りあえずで公開してみました。
反応を見てつくり込むか決めようかと思います。



参考
 Android1.6でも動く「オレオレC2DM」の実装
明日の鍵


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

2011年9月6日火曜日

Ubuntu11.04にArduinoの開発環境を作る

ちょっとデスクトップの環境をWin7からUbuntuに変更したのでその際のメモがわり。

Winやmacと同じようにArduinoを公式から環境を落としてきたらコンパイルができなかった。
おそらくコンパイラの設定を特にしていない状態だからまずいようだ。
なので、
 sudo apt-get install arduino
 sudo apt-get install arduino-core
と実行したが、これだとランチャーにショートカットをおいても起動できなかった。
なので、Ubuntuソフトウェアセンターからダウンロードしてくると、
コンパイルもできるし、ランチャーにショートカットをおいても起動できた。
ただ、微妙にアイコンが標準と違う気がするけど、気にしない。


追記
ライブラリとかを置くフォルダは
/usr/share/arduino
の下にある。

さらに追記
なぜか標準のリポジトリからダウンロードできるIDE(22)でUnoが使えない。
しかたがないので、ダウンロードして解凍したのを使う

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

2011年8月30日火曜日

横浜Androidプラットフォーム部第12回勉強会 メモ


@checkela
ゲーム屋的パフォーマンスチューニング(仮) & NDK本サイン会
@tetsu_koba
Google TV add-onのemulatorをいじってみた
@androidsola
OrigenBoardPandaBoardの比較(仮)
@roishi2j2
Android開発者のためのSoC入門(のようなもの)
@hermit4
init以前 – フラッシュメモリとfastbootをさわりだけ」 



ゲーム屋的パフォーマンスチューニング
@chechela
出村

フリーランス
東北
黄色いト○ピーみたいなアイコンの人
黄色いとげとげ→黄色いチューリップ

NDK本の執筆者

普通の奴らの下を行け

1clockの削減に命を削る世界は存在する

1GHz -> 0が9個

その1つがゲーム開発

なぜ1clockにこだわるのか?

1clock削るとゲームの操作性とかに影響
 UI操作が気持ちいい!
 
1万回通るなら1万クロック削減できる
 ある部分の1クロックを削る

3Dグラフィックスが特にそう
 PS3など
  1回の描画で1万頂点演算する
   1頂点の処理時間を短くすれば全体の処理が早くなる

場所を見極めてチューニングする

全体で1番時間がかかるのは描画処理

3Dはそんなに処理は無いからチューニングしやすい、結果が見やすい


どんなパフォーマンスチューニングをする?
 10年くらい前の知識かも

ゲームプログラマを10年ほど
SFC末期〜PS2初期頃まで

ゲーム機の歴史


SFC時代
 H/Wの上でアプリが動いていた
 H/Wがマイナーアップデート入ると後期のソフトほど互換テストするのが大変だった

 ハード特性を極限まで利用する手法
 処理速度はアルゴリズム、DSP(ファミコンソフト側)でカバー
  CPUクロックは早くない
  変態コードは存在する

 H/W特性を利用した例
  ラスタースクロール(DQのワープで波打つエフェクトの事)
   テレビの走査線(H-SYNC 水平同期)の割り込みを利用
  1/60秒で処理する
   すべての画面を書き換える時間(NTSC規格)
   海外のテレビだと仕様が違うから作り直したりする 

PS時代
 H/W上でOSが動いてライブラリがあってアプリが動く
 OS、ライブラリのレイヤーは薄っぺらい
 開発ハードルが下がった

 家庭用ゲーム機に3Dの波が
 RISC CPU(32bit)を搭載
 3D演算に特化したプロセッサを搭載
  DC、PS2、PS3も

 開発スタイルが変化
  CPU、メモリが劇的に変化
  8割〜9割はC言語でつくっていた。一部asm
  昔はROM、RAMを意識してプログラムしていた


 ハードウェアの変化
  CPU性能
   キャッシュ
   パイプライン
  デバイス間のBUS幅
  コンパイラ性能
  3D描画性能
  メモリ管理
  CD-ROMアクセス
   ノウハウが溜まってBGロードができるようになった
   SFCではなかった要素

 組み込み開発で役立つ
  CPU、コンパイラの話

 CPU性能
  ・キャッシュ
  ・パイプライン
  実行効率を決める要素
  
 キャッシュ
  メインメモリから直接データ取得
   メモリから取得している間にidleする
    メモリのアクセス速度はCPUの数十倍遅いから
    CPUの速度向上にくらべメモリの速度向上していない
    刺す枚数を増やしてごまかす
   L1キャッシュからデータ取得
    CPUとL1きゃっすは同クロックで動作するからCPUのidle時間が発生しない
    L1キャッシュは容量が小さい(32K)
    コードをキャッシュに載せられるか、ヒットさせられるかは腕次第
     1ループを小さくして参照するデータ量を減らす
      似たメモリアドレスにあるデータを処理する
    L1キャッシュを意識したプログラムを書く

 パイプライン
  1命令を13のプロセスに分割して処理
  →命令の実行効率を上げる
   ちょっとずつ並行して処理する
  F:フェッチ
  D:デコード    解析
  E:エグゼキュート 実行

 パイプラインの効率化
  パイプラインストール
   パイプライン処理の間延びの事(少し止まる)
    結果の依存性がある箇所で発生
     c=a+b
     e=c+d
    コンパイラ利用すると発生しない
     asmで書くとうっかりやっちまう
     Cで書くとコンパイラがそのへん理解して自動でやってくれる
    CPUの特性把握は必須
    プロファイラを利用するのも手

 動的分岐予想
  true/falseの分岐を予測して先回りしてパイプラインでデコード処理
  ヒット率向上がカギ
  予想を外すと影響がでかい
   13clockのペナルティ
  なるべく外さないコードを書く

 コンパイラ性能
  なぜ重要視するのか?
   そもそものRISCの概念
    1命令を単純化 → 実行を高速化
    コンパイラが頑張って命令配置
     CPU特性を活かすため
    ハード・ソフトからアプローチ
   コンパイラがへぼいとCPUを生かしきれない
   GCCを利用する
    クロスコンパイラ=GCC
   -O3をしても昔は最適化が甘かった
   すべてasmで書くのか?
    →現実的な量では無い
  いかに実行効率がよいコードをはかせるのか?
   人間が頑張るしかない

まとめ
  機械は人間の思いを理解してくれない
  人間が機械の思いを理解するしか無い
  チューニングは細かい作業の積み重ね

おまけ(学習手法)
  97年 → 書籍がほぼすべての情報源
       ハイパフォーマンスコンピューティング(RISC特有のチューニング手法を解説 絶版)
       MMXテクノロジオフィシャルガイド(SIMDを学ぶ)

  今はこの手の情報が減ったからNDK本買ってね。

FAQ
どうやったらコンパイラの気持ちがわかるの?
 コンパイラがだしたコードを読んでみると特徴が分かってくる
  どこで無駄が出てるとか。
 コンパイラに色々な情報を追加して人間の思いをつたえる
 相手をよく知ること!

SIMDの考え方はNEONとかでも変わらない?
 実装されている命令は変わらない
 特徴的なのは、命令に合わせたアルゴリズムを考えないといけない。そうしないとNEONの特徴を生かしきれない。




Tweaking Google TV emulator
@tetsu_koba

Google TVのアドオン
KVMの説明
やってみたこと
 NDKが動かなっかったのはなぜか?

Google TVアドオン
 code.google.com/tv/android/docs/gtv_addon.html
 Android SDK上で動く
 Javaのアプリが動くけどUIを変えてねって趣旨のページ
 
 FAQページ
  Android 3.1
  NDK動かない
  chrome 11(Linux用)
  Flash 10.1
  Native Clientはあとで実装する
  HTML5のVideoタグのH.264サポートを続ける
  
 ターゲットCPU x86 atom
 KVMが必要
  リナックスの技術
  Windowとmacは今はサポートしない
   そんな簡単に移植できないだろ
 Open GLつかって描画
  GPUで動いていない
  画面サイズでかい、3Dガリガリ使うから遅い
   HOST側のGPUにエミュレータの情報を食わせるエミュレータを作ってる

 Kernel Based Viertual Machine
  VMとかViertual Boxみたいなもの
 Intel VTとかADM_V
 ゲストCPUとホストCPUが一緒である必要がある
 KVMはQEMUと一緒に使う
  www.linux-kvm.org/page/Main_Page

 KVMがどんなふうに動くか
  QEMU
   すべての命令をエミュレート
   MMU(仮想メモリのハードウェア支援)もソフトウェアでエミュレートしてるから遅い
  QEMU + KVM
   普通の命令はCPUでそのまま実行
   IO命令、状態を変えるような命令を何らかの仕組みでフックして特別な割り込みをしてKVMの本体が差し替えて動作さるようなイメージ
   95%くらいは普通のCPUで動いている
    だから速度向上が見込める
 
 KVMのセットアップ方法(Ubuntu)
  sudo apt-get install kvm

  Ubuntu 10.04
   sudo chmod a+rw /dev/kvm
  Ubuntu 11.04では必要ない
  gtv_emu**.html

 速度比較
  Ubuntu 10.04 KVM無効 52秒
         KVM有効 32
  Wubi  11.04 KVM無効 52
      11.04 KVM有効 17

  新しいカーネルを使ったほうが速度が上がるのかもしれない


NDK
 NDKr6からはx86をサポートしている
  armとx86を同時につくるとおかしくなる
 AOSPのマスターのソースからx86のエミュレータがビルドできる
 NDK for x86はちゃんと動いている

 Google TVのランタイムはandroidとだいぶ違っている
  Vynamic linkerとかlibcがbionicじゃない
  ソースを見た感じglibcじゃないかな?
  NDKr6はbionic向けだからglibcじゃ動かない

Google TV emulatorをWin7上で動かす
 KVM無効でも動くからwin7でも動くんじゃないか?
 
 eulator executable (QEMU + KVM)
 Linuxカーネル
 target file system
 Skin image files
 AVD file configure
 onley (1) depends on host OS

 起動方法
  Android SDK for windowsにはemulator-86.exeがある
  Linuxで作ったエミュレータをコピーする
  iniファイルにパスが入ってるからwin用にパスを変更する
  eclipseからは起動出来ないから、コマンドラインから起動する
   emulator -avd
  起動するけどむちゃくちゃ遅い

参考資料
 KernelVM探検隊
 てつこばさんのサイト

デモンストレーション
 仮想マシン上ではKVMが動かない
 画面構成はDirectFDからSurfeceフリンガーに変わった

FAQ
 QEMUのイメージをVM用のイメージに変えればいけるんじゃない?
  ぜひやってみてください


OrigenBoardとPandaBoardの比較(仮)
@androidsola

OrigenBoardとPandaBoard
似たようなスペックと価格だったから比較してみた

PandaBoard
 CPU:OMAP4430 Dual Core 1GHz
 メモリ:DDR2 1GB
 GPU:PowerVR SGX540
 無線・BTが付いている

OrigenBoard
 CPU:Exynos4210
 メモリ:DDR3 1GB
 GPU:Mali-400
 CPU基板が取り外しができる
 無線・BTが付いている
 
ベンチマークソフト
 Quadrant Standard
  CPU、メモリ、I/O、2Dグラフィック、3Dグラフィックの総合結果
 0xBenchmark
  村長がよく使ってる
 AnTuTu Benchmark
  Pandaで落ちたから不採用
 Neocore

結果
 PandaはNSに劣る
  解像度のせいかも・・・
 解像度を変えても遅い
  解像度が何故か1680×1080でだしてた・・・
 解像度を1024*600にしてもOrigineBoardの方がいい




Android開発者向けSoC入門(のようなもの)

目標
Xoomはギャラタブ10.1でNEON命令が使えなくなった事情を理解する

NEONとは
 ARMのSIMD拡張命令の1つ
 マルチメディア向けの命令

SoCとは?
 System on Chipの略
  昔はボード上に実装していた回路を1chip化したもの

Tegra2の構成
 CPU
 キャッシュ
 GPU
 バス AMBA
 などなど・・・

Tegra2のコピーを作ってみよう

そもそもどうやってSoCをつくるのか?
大規模ソフトを開発する場合は?
 まったくの新規開発でなければパッケージやライブラリを買ってきて手を加える
 新規開発でもOSを1からつくることはめったにないでしょ?

H/Wも一緒
 CPUはNVIDEAから買う
 DDR2 I/Fはxxx社から買う
 USB I/Fはyyy社から買う
  ・・・

なぜTegra2にNEONを入れなかったのか?
 NEON命令を処理する回路をレイアウト出来なかった。
  その分だけチップサイズをでかくしてもいいけどうまく収まるとは限らない
  矩形のフロアプラン問題はNP困難

SoCの製造って?
 シリコンウェーハから切り出す

課題
 チップをでかくするとどうなるのか?
 有効面積問題
  丸から四角を切り出すから使える面積な問題がある
   4.9mmから5.2mmに変更するとどうなるのか?
 歩留まり問題
  300mmウェハ1枚あたりに数十個の微細なゴミが落ちているとする。
  ゴミを含むチップは不良品
  4.9mmから5.2mmに変更するとどの程度影響するか?

ARMから買ってきたCPU
 TSMC 40Gハードマクロ実装で2GHzの標準動作を実現する卓越したパフォーマンス
 TSMCは世界的に有名な半導体製造メーカー
 40G : 40nmプロセスのハイパフォーマンス版

しかしTegra2はTSMC 40LPで生産
 40LP : 低電圧版

IP(Intellecual Property)
 知的財産権
 日経新聞では「設計済み回路ブロック」
 半導体業界では通信プロトコルは「TCP/IP」と読んで使い分ける
 ハードマクロ
  配置・配線が完了しているモジュール
  物理的な制約(デザインルール)が満たされている
   ゲートの大きさ、素子間の距離、配線間隔
   デザインルールを満たすラインでしか製造出来ない
   Tegra2の場合:TSMC 40LPのハードマクロが必要
 ソフトマクロ
  配置・配線を行う前のモジュール
  素子の間の接続情報だけが記述されている
   ネットリストと言うこともある
   手間暇かければ解析できるかもしれない

ソフトマクロとハードマクロ
 ソフトマクロ(Verilog等)
 ハードマクロ(GDS2等)

買ってきたIPを修正
 ソフトの場合、ソースコードを書き換えることで修正
 ハードマクロの場合は形状固定でブラックボックス
 ソフトマクロは自由にレイアウト、頑張れば解析可能
 IPベンダーはソフトマクロは売りたがらない

IPを組み合わせるには
 全体の仕様を決める
 接続部分のRTLを書く Register Transfer Level
 論理合成する 合成した出力はソフトマクロと等価
 配置配線する
 レイアウト後に検証

ハードの検証
 シミュレーション
  PC上でクロックを与えて回路を実際に動かす
   最新のハイスペックPCでもせいぜい100Hz
   遅いので回路全体を動かすのはまれ
   デバッグ用のコードを任意の場所に挿入できる
    買ってきたIPではできない
    IPにも普通にバグがあるのでIPベンダはソースに検証用のコードを入れておくのが一般的
 エミュレーション
  エミュレータという専用装置を使う
  数十KHzでる
  内部状態の参照に制限がある
 実機

Tegra2にNEONがない理由は?
 *根拠はない
 
 レイアウト上の制約
  そんなにNEONの実装面積でかいのか?
 ARMが「NEON入りのA9ハードマクロ」を高く売っている
  NEON無しIPって価値があるのか?
 実はNEONが載っているけど、マスクされているとか?
  ありそうな話:NEON命令を実行したらバグがでた