Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。2011年度からドワンゴ。載せてる自作コード片は何か書いてなければCC0で。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 |

April 09(Mon), 2012

[] Arduino UNOを初めて触ってみる日記

電子工作やらマイコンなるものはほぼ触ったことがないのだが初めてArduino UNOなるものをいじってみようと思う。前提知識が全くない。全くないのでとりあえずArduino公式サイトを見るとGetting Startedなる良さ気な文献があるのでそれに沿って進めてみる。このチュートリアル自身もCC3.0で公開してるし、Arduinoの人達は偉いなー。

インストール

丁寧に書いてあったのでそれに沿ってサクッと。

初めてのArduinoプログラム

Exampleの中にあった、LEDを点滅させるプログラム。

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

動かすと、Arduino UNOボードにのっているLEDの一つが1秒間隔ぐらいで点滅。

LEDに繋がっているピン13を出力ピンとして認識、HIGHを書いたときにLEDが点灯、LOWを書くと消灯するのだろう。

いくつか浮かんだ疑問と回答

LED: 13. There is a built-in LED connected to digital pin 13. When the pin is HIGH value, the LED is on, when the pin is LOW, it's off.
#include <Arduino.h>

int main() {
    init();
    setup();

    for (;;)
        loop();

    return 0;
}

void setup() {
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
}

void loop() {
    digitalWrite(12, LOW);
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(12, HIGH);
    digitalWrite(13, LOW);
    delay(1000);
}

12,13ピンを1秒間隔で交互にHIGHにする。LEDとか繋ぐと交互に点滅。

そんなこんなでArduinoプログラミングしていましたら4月9日になり28歳になっていました。もうすぐ30代だなー。

トラックバック - http://d.hatena.ne.jp/hogelog/20120409

January 25(Wed), 2012

[][] Facebookチャットを家庭の共通コミュニケーションインフラに採用した。

奥さんとのコミュニケーションにはfacebookチャットを活用しています。メールはやりとりの速度が遅い、SMSとかは特定の環境に依存している。というわけで、ブラウザからも使えるし各種専用クライアントもあるようなインフラを採用。以前はGoogleトークを使っていたのですが、最近Facebookチャットに移行。

Facebook専用メッセンジャー

Android
Facebookメッセンジャー - Google Play の Android アプリ
iPhone
App Store - Facebookメッセンジャー

XMPP対応メッセンジャー

Facebookチャット | Facebook

facebookチャットはXMPPを利用しているので、XMPP対応しているメッセンジャーアプリならだいたい利用できます。まあ色々あるわけですけど

Windows
Pandion | An easy to use XMPP and Jabber client
Mac
iChat
iPad
App Store - imo instant messenger

こんな感じのものを使っています。経路が多いし検索とかもウェブからサクッとできるので便利です。

XMPPから使うとグループチャットが扱えない(もしかしたら使えるのかもしれないけど知らない)のだけがちょっと不便なところかな。もうメールなんてシステム捨てましょう。

トラックバック - http://d.hatena.ne.jp/hogelog/20120125

January 23(Mon), 2012

[][] JavaでKestrelクライアントsimple-kestrel-clientを書いてみた。

hogelog/simple-kestrel-client ? GitHub

spymemcachedはKestrelで扱うとなんかどうもうまくない。xmemcachedはKestrel対応もしているとは書いてあるけど、なんだかどうもやっぱりpeekとかtimeoutとかを設定するとちゃんと動かない。とりあえず適当に書きなぐってみた。deleteとか他にも色々書いてないし色々適当。

こんな感じ。普通に使える。memcachedクライアントをkestrelクライアントとして使うのは悪手なのかなー。

public class SimpleKestrelClientTest {
    @Test
    public void set_peek_get_peektimeout_gettimeout() throws Exception {
        Socket socket = new Socket("127.0.0.1", 22133);
        SimpleKestrelClient client = new SimpleKestrelClient(socket);

        client.set("hoge", "hoge\r\nhoge");

        assertThat(client.peek("hoge"), is("hoge\r\nhoge"));
        assertThat(client.get("hoge"), is("hoge\r\nhoge"));
        assertThat(client.get("hoge"), is(nullValue()));

        new Thread(){
            @Override
            public void run() {
                try {
                    Socket socket = new Socket("127.0.0.1", 22133);
                    SimpleKestrelClient client = new SimpleKestrelClient(socket);
                    Thread.sleep(1000);
                    client.set("hoge", "hogefuga");
                    Thread.sleep(1000);
                    client.set("hoge", "hogemoge");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        assertThat(client.peek("hoge", 5000), is("hogefuga"));
        assertThat(client.get("hoge"), is("hogefuga"));
        assertThat(client.get("hoge"), is(nullValue()));
        assertThat(client.get("hoge", 5000), is("hogemoge"));
    }
}

xmemcachedでkestrelを叩くとなんか変な件

割とわけのわからない挙動をする。

    @Test
    public void xmemcached_set_peek_get_peektimeout_gettimeout() throws Exception {
        final XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:22133"));
        builder.setCommandFactory(new KestrelCommandFactory());
        SerializingTranscoder transcoder = new SerializingTranscoder();
        transcoder.setCharset("UTF-8");
        builder.setTranscoder(transcoder);

        final MemcachedClient client = builder.build();
        client.setOpTimeout(5000);

        client.set("moge", 0, "aaaaa");
        client.set("hoge", 0, "hoge\r\nhoge");

        assertThat(String.class.cast(client.get("hoge/peek")), is("hoge\r\nhoge"));
        assertThat(String.class.cast(client.get("hoge")), is("hoge\r\nhoge"));
        assertThat(String.class.cast(client.get("hoge")), is(nullValue()));

        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    client.set("hoge", 0, "hogefuga");
                    Thread.sleep(1000);
                    client.get("moge/peek");
                    client.set("hoge", 0, "hogemoge");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        assertThat(String.class.cast(client.get("hoge/peek/t=5000")), is("hogefuga"));
        assertThat(String.class.cast(client.get("hoge")), is("hogefuga"));
        assertThat(String.class.cast(client.get("hoge")), is(nullValue()));
        assertThat(String.class.cast(client.get("hoge/t=5000")), is("hogemoge")); // 何故かこここでmogeにセットした"aaaaa"という文字列が得られる
    }

追う気もしないので適当に自前で書いてみましたとさ。

トラックバック - http://d.hatena.ne.jp/hogelog/20120123

January 20(Fri), 2012

[][] Windows環境のAndroid開発で使うddms.batで無意味なコマンドプロンプト(黒いウィンドウ)が表示されてしまう。

WSH経由で起動して表示させないようにするのが楽。ddms.batに限らない。

ddms.jsなどとしてスタートメニューなりなんなり適当なところに置いてこのスクリプト経由で起動すると良い。

var shell = WScript.CreateObject("WScript.Shell");
shell.Run("C:/Android/android-sdk/tools/ddms.bat", 0);

当然だがddms.batの場所はインストール先により変わる。

トラックバック - http://d.hatena.ne.jp/hogelog/20120120

January 07(Sat), 2012

[][][] Wicket on dotCloud

なんかWicket ( http://wicket.apache.org/ ) がお手軽ウェブフレームワークらしいので触ってみることにしました。ついでにdotCloudとかいう最近有名なアレの上に乗っけてみることにしました。

ステップ0. dotCloudデプロイ準備

http://docs.dotcloud.com/firststeps/install/ 参考に適当に

$ pip install dotcloud
$ dotcloud setup

ステップ1. Wicketのプロジェクトの作成

プロジェクトはmavenで作成します。しかしmavenのプロジェクト作成コマンドはいつもいつもめんどくさくて覚えてられないですね。Wicketさんはその辺のフォローもしっかりしています。Apache Wicket - Create a Wicket Quickstartで作りたいプロジェクトのグループIDとアーティファクトIDを入力すれば実行すべきコマンドが出てきます。

$ mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.5.3 -DgroupId=org.hogel -DartifactId=wicket-test -DarchetypeRepository=https://repository.apache.org/ -DinteractiveMode=false
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype defined by properties
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.547s
[INFO] Finished at: Sat Jan 07 22:58:38 JST 2012
[INFO] Final Memory: 7M/133M
[INFO] ------------------------------------------------------------------------

簡単にできました。

$ cd wicket-test
$ mvn jetty:run
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building quickstart 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
いろいろたくさん...
INFO  - WebApplication             - [wicket.wicket-test] Started Wicket version 1.5.3 in DEVELOPMENT mode
********************************************************************
*** WARNING: Wicket is running in DEVELOPMENT mode.              ***
***                               ^^^^^^^^^^^                    ***
*** Do NOT deploy to your live server(s) without changing this.  ***
*** See Application#getConfigurationType() for more information. ***
********************************************************************
2012-01-07 22:59:56.017:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080 STARTING
2012-01-07 22:59:56.376:INFO:oejs.AbstractConnector:Started SslSocketConnector@0.0.0.0:8443 STARTING
[INFO] Started Jetty Server

起動しました。アクセスしてみましょう→ http://localhost:8080/

f:id:hogelog:20120107230250p:image

コマンド叩いただけなのになんかできてて最近のウェブフレームワークっぽいですね。中身はあとで触っていきましょう。

ステップ2. DEPLOYMENTモードにする

mvn jetty:runしたときにこんな表示をしていましたね。

INFO  - WebApplication             - [wicket.wicket-test] Started Wicket version 1.5.3 in DEVELOPMENT mode
********************************************************************
*** WARNING: Wicket is running in DEVELOPMENT mode.              ***
***                               ^^^^^^^^^^^                    ***
*** Do NOT deploy to your live server(s) without changing this.  ***
*** See Application#getConfigurationType() for more information. ***
********************************************************************

上記メッセージの通り、WicketApplication.javaにWicketApplication#getConfigurationType()を追加します。

package org.hogel;

import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.protocol.http.WebApplication;

/**
 * Application object for your web application. If you want to run this application without deploying, run the Start class.
 *
 * @see org.hogel.Start#main(String[])
 */
public class WicketApplication extends WebApplication
{
    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    @Override
    public Class<HomePage> getHomePage()
    {
        return HomePage.class;
    }

    /**
     * @see org.apache.wicket.Application#init()
     */
    @Override
    public void init()
    {
        super.init();

        // add your configuration here
    }

    @Override
    public RuntimeConfigurationType getConfigurationType() {
        return RuntimeConfigurationType.DEPLOYMENT;
    }
}

ステップ3. パッケージング

mavenWicketプロジェクトをwarファイルにパッケージング。

$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building quickstart 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
色々...

wicket-test/target/wicket-test-1.0-SNAPSHOT.warができている。おしまい。

ステップ4. デプロイ

dotCloud - Java Serviceを参考に先のwarファイルをデプロイしてみる。

dotCloud上にwickettestというアプリケーションを作成する。

$ dotcloud create wickettest
Created application "wickettest"

dotcloudディレクトリを作ってdotcloud用のファイルをまとめる。

$ mkdir dotcloud
$ cp target/wicket-test-1.0-SNAPSHOT.war dotcloud/ROOT.war

dotcloud/dotcloud.ymlに以下の内容を記述

www:
  type: java

デプロイ。

$ dotcloud push wickettest dotcloud

http://wickettest-hogelog.dotcloud.com/

f:id:hogelog:20120107230251p:image

デプロイ完了。うーん便利な時代ですねー。

トラックバック - http://d.hatena.ne.jp/hogelog/20120107
最近のコメント