iPhoneアプリ開発

iPhoneアプリ開発でこんなことやりたいのだけど、どうやるんだっけ?ってのがちょくちょくでてきます。逆引きのリファレンス逆引きiPhoneSDK – WIKIが参考になります。

Posted in Article (記事) | Tagged | Leave a comment

「ビジュアライジング・データ」 日本の郵便番号をマッピング

ビジュアライジング・データ サンプルアメリカ

ビジュアライジング・データ サンプルアメリカ

“ビジュアライジング・データ ―Processingによる情報視覚化手法” にアメリカの郵便番号の緯度経度を平面上にマッピングし、キーボードからの郵便番号入力にしたがって、入力した郵便番号に部分一致するポイントをインタラクティブに表示するサンプルが載っています。

例えば、「2」と入力すると、郵便番号が「2」から始まるエリアがハイライトされ、それ以外が暗くなります。続けて「1」と入力すると「21」と続くエリアが絞り込まれてハイライトされます。

ズーム機能をオンにすると、一致したエリアになめらかにズームし、郵便番号の緯度経度といった無機質なデータをとても美しく表示してくれます。

本書はProcessingによるデータ表示の手法だけでなく、オンライン上にあるデータを取得し、解析し、不要なデータを削除するフィルタリングの手法についても書かれており、自分で応用してさまざまなデータを視覚化していくことができるようになるでしょう。

このサンプルを参考に日本の郵便番号で試してみることにしました。アメリカの郵便番号は5桁ですが、日本は7桁なのでより精緻なマップを得ることができることを期待しています。

郵便番号から緯度経度データ取得

郵便番号は郵政局のwebサイトからダウンロードできますが、残念なことに緯度経度情報が含まれていません。GoogleMapsAPIのGeocordingを使って地名から緯度経度情報を取得する簡単なスクリプトをRubyでつくりました。

データ量が多いので、同じIPからリクエスト続けていると5000件程度でGoogleMapsから拒否されるようになるので、自動的にプロキシを変更するように、データ取得をどこからでもレジュームできるように作っておくとよいでしょう。

郵便番号リストは住所に(その他)と入っていたり(1丁目〜10丁目)、(ビル名何階)と書いてあったり表記がばらばらなので、Geocordingに投げて緯度経度が戻ってこないものは今回は無視することにしました。マッピングに必要なデータは十分な得られました。

Processingプログラム修正

本書のサンプルが外部データを取得して表示するようにつくられているため、ほとんどそのままで利用できます。アメリカの郵便番号が5桁なので、日本の郵便番号7桁に合うようにいくつか修正します。

実行

日本が浮かび上がりました。人口の密な地域はポイントもたくさんありますし、郵便番号の緯度経度だけから山脈がなんとなくわかったりとおもしろいです。9からはじまる郵便番号は沖縄と北陸、南東北まとめて割り振られたりします。

いくつかGeocordingが突飛な緯度経度を返しているようで、7からはじまる郵便番号がぽつっと関東にあったりするので、はずれ値をフィルタリングする処理を追加する必要がありそうです。
もうひとつの問題はデバイスフォントをつかって日本語が表示できない。。vlwというフォントファイルを日本語含めて作成することはできるようなのですが、フォントも配布となるとサイズが大きくなってしまうので。

ビジュアライジング・データ 日本1

ビジュアライジング・データ 日本1

ビジュアライジング・データ 日本2

ビジュアライジング・データ 日本2

ビジュアライジング・データ 日本3

ビジュアライジング・データ 日本3

データビジュアライジング

この本とても勉強になります。いろいろと刺激されてなにか作りたくなります。おすすめです!

“ビジュアライジング・データ ―Processingによる情報視覚化手法”

追記:

・いくつか外れ値がある

・日本語表示できない。

と問題がありますが、アプレットをアップしましたのでぜひお試しください。フォーカスがあたっている状態で郵便番号を入力すると、一致したエリアがハイライトされます。ズームモードに入るには右下の「ZOOM」をクリックします。

Posted in Article (記事) | Tagged , | Leave a comment

GAEOアプリをDashcodeでiPhone/iPodTouch対応


dashcode2Dashcodeすばらしい。iPhone/iPodTouch向けのWEBサイトを簡単に作ることができます。GUIでパーツを配置するだけでデザインの編集ができます。

デバッガ機能も充実していて、ブレークポイント、スタックトレースなど豊富なデバック機能を活用することができます。

今回はGoogleAppEngineOil(GAEO)で作成していたアプリケーションのフロントにiPhone/iPodTouch用のテンプレートを作成しました。

GAEOではBaseControllerに_is_iphoneというフラグを持っているため、今回はiPhone/iPodTouchからのアクセスは/touchというアドレスにリダイレクトします。if self._is_iphone: self.redirect(“/touch”)

TouchControllerのindexテンプレートにDashcodeで作成したindex.htmlを設定します。

app.yamlでDashcodeで生成したjsやcss、画像などを正しく読めるように設定します。

iPhone/iPodTouchでデータを取得するには、Dashcodeでmain.jsからXMLHttpRequestを通してデータを取得するようになるため、GAEOからはテキスト/JSON形式でデータを返すようにしました。

[code]

def get_hello_data(self):

self.render(text=Hellodata.getTestData())

[/code]

Posted in Article (記事) | Tagged , , | Leave a comment

OSXにLaTeX環境(Emacs+YaTex+LaTex+TeXShop)を構築してPDFプレビューする

めんどうなことはせずにとにかくTeX環境をOSX上に構築したい人向けです。OSX10.5(Leopald)にMacPort環境を構築していて既に、CarbonEmacsを使っている前提で書いています。

もしも、以前にteTeXやpTeXなどをインストールしようとしていた場合はすべてアンインストールしておいてください。残っているとインストール途中にエラーが発生します。

インストール

portも最新になるようにsudo port selfupgradeしておきます。

pTexをインストールします。かなり時間がかかります。

[code]
sudo port install pTeX +hiragino +otf +utf8 +motif +macosx
[/code]

TeXShopをダウンロードしdmgをバインドし、アプリケーションにコピーしてインストールします。

TexShopを起動して、環境設定を開きます。

「設定プロファイル」からTexShop標準を選択し標準のプロファイルをロードします。

「エンコーディング」をUTF-8に変更します。

「プレビュー」タブの「外部エディタ」「プレビューの自動更新」にチェックを入れます。

「内部設定」タブの「パス設定」(pdf)、Distiller(Ghostscript)両方を/opt/local/binに変更します。

「TeX + dvips + distiller」の「TeXプログラム」を~/Library/TeXShop/bin/ptex2pdf-utf8に変更します。

下の「LaTexプログラム」を~/Library/TeXShop/bin/platex2pdf-utf8にします。

「タイプセット」タブを開いて「ディフォルトのスクリプト」を「TeX + Ghostscript」に変更します。

ターミナルを開いて

[code]
$ cp ~/Library/TeXShop/bin/ptex2pdf-euc ~/Library/TeXShop/bin/ptex2pdf-utf8
$ cp ~/Library/TeXShop/bin/platex2pdf-euc ~/Library/TeXShop/bin/platex2pdf-utf8
[/code]
と入力します。

TexShopを再起動します。

TexShopで動作確認

TeXShopが起動したら、テキスト入力画面に

[code]
\documentclass[12pt]{jarticle}
\begin{document}

\title{タイトル}
\author{テスト}
\date{\today}
\maketitle

ハローLaTeX

\end{document}
[/code]
と入力し、保存します。上部にある「タイプセット」をクリックすると、TeXがコンパイルされPDFが表示されます。

Emacs+YaTeX設定

Emacsを起動し、「Help」-「Carbon Emacs Package」-「Net-Install」-「YaTeX」を選択し、YaTeXをインストールします。

~/.emacs.elに次の行を追加します。

[code]

;;Tex
(setq auto-mode-alist
(cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
(setq tex-command "~/Library/TeXShop/bin/platex2pdf-utf8" dvi2-command "open -a TexShop")
[/code]

emacsを起動し、hellotex.texファイルを作成します。

先ほどと同じように
[code]
\documentclass[12pt]{jarticle}
\begin{document}

\title{タイトル}
\author{テスト}
\date{\today}
\maketitle

ハローLaTeX

\end{document}
[/code]
と入力し保存します。

C-t jでコンパイルした後、C-t pでプレビューができることを確認してください。

YaTexには様々な便利な機能がありますので「YaTeX World」の野鳥入門を一通り試してみるとよいでしょう。

texファイルの変更後はC-t jでコンパイルし、プレビュー画面に移動することで自動更新してくれますが、バックグラウンドで再読み込みしたい場合はSKIMがよさそうです。

SKIMをダウンロードして、インストール。「Preference」の「Sync」タブの「Check for file changes」にチェックを入れ、「PDF-TeX Sync support」の「Preset:」から「Emacs」を選択します。

~/.emacs.eldvi2-command “open -a TexShop”dvi2-command “open -a Skim”に変更します。

これでC-t jするだけでバックグラウンドでPDFを更新してくれるようになります。

※追記

OMakeをつかって自動コンパイル

OMakeを使うことで、texファイルが更新される度に自動的にコンパイルさせることができます。

OMakeをインストール

[code]

sudo port install omake

[/code]

texファイルを作成しているディレクトリに移動して、omake設定します。

[code]
omake --install
[/code]
OMakefile と OMakerootが出来上がるので、OMakefileを次のように編集します。ここではbook1.texというファイル名の場合の設定です。
[code]
LATEX = platex
DVIPDFM = dvipdfmx
DVIPDFMFLAGS = -p a4

LaTeXDocument(book1, book1)

.DEFAULT: book1.pdf book1.dvi
[/code]
ここまでできれば、
[code]
omake -P --verbose
[/code]
を実行します。あとはEmacsなどで変更中のtexファイルを保存するだけで、自動的にコンパイルされます。上のSKIMを使っている場合は保存するだけで、PDFが更新されます。

参考

Posted in Article (記事) | Tagged , | Leave a comment

GoogleAppEngineOil 0.1安定板 0.2アップデート

ようやくベータが外れ、GoogleAppEngineOil(GAEO)のバージョン0.1の安定板リリースされています。

更に進行中の0.2には次のような機能が追加されています。

1. respond_toサポート

ルーティングルールに r.connect(‘:controller/:action/:id.:format’)と書くことで、次のようにrespond_toメソッドを利用できます。

[code]
self.respond_to(
html=lambda: self.render('<h1>Hello World</h1>'),
js=lambda: self.render(script='alert("hello, world")')
)
[/code]

http://www.example.com/foo/bar.htmlの場合は<h1>Hello World</h1>の行をhttp://example.com/foo/bar.jsの場合はjavascriptの行を実行させることができます。

2. XHRリクエスト判別

GAEOはX-Requested-WithをつかってXMLHttpRequestオブジェクトによってリクエストされたか調べます。

self._is_xhrでTRUE/FALSEを判別できます。

3. renderメソッドにscriptタイプ追加

self.render(script=”alert(‘!’”)のようにして、text/javascriptデータを送信できます。

4. RESTメソッド

self._request_methodを使用して’get’, ‘put’, ‘head’などのリクエストメソッドを判別できます。

Railsにできるだけ近づこうとしているのでしょうか。今後ともGAEO楽しみです。

Posted in Article (記事) | Tagged , | Leave a comment

Google App Engineで予約管理アプリケーションを作ってみた

GoogleAppEngine(GAE)とGoogleAppEngineOil(GAEO)がだいたいわかったところで、簡単な顧客&予約管理アプリケーションを作ってみました。

RubyonRailsになれていると、ちょっとしたことに詰まったりしてしまいます。RoRとGAEOの対応表なんかがあればよいな。
リレーションモデルではないとされているGAEのデータストレージもGAEOのBaseModel.belongs_to()を使うことで、RoRっぽく簡単にリレーションを利用できました。

最後にjQueryをつかって使いやすいUIにしてみました。

GoogleAppEngineかなり使えます。

Posted in Article (記事) | Tagged | Leave a comment

Google App Engine Oil入門1

GoogleAppEngineを使い始めたらぜひGoogleAppEigineOilを導入してみましょう。

このオイルはGoogleAppEngineをより簡単に利用するためのMVCフレームワークを提供してくれるため、より少ない設定、コーディングでアプリケーションを作成できるようになります。

Google App Engine Oilのサイトにチュートリアル基本編が用意されているので、それに従ってすすめてみます。

Google App Engine Oilインストール

まずはGoogle App Engine Oilのサイトからgaeo-trunk-rxx.zipファイルをダウンロードし、適当なディレクトリに配置します。私は ~/sdk/gaeoに配置しました。

実行権限を付加します。

[code]
chmod +x ~/sdk/gaeo/bin/*
[/code]

環境変数設定

~/.bashrcを開いて次のようにパスを設定します。
[code]
export GAEO_HOME='/home/ericsk/sdk/gaeo' # put your installation directory here.
export PATH='${GAEO_HOME}/bin:${PATH}'
[/code]

ターミナルを開いて変更を反映します。
[code]
source ~/.bashrc
[/code]

gaeo.pyとタイプして、実行してみましょう。次のように表示されたら正常にインストールできています。エラーが発生した場合は、Pythonのバージョンが2.5以上か確認してみてください。
[code]
Usage: /home/ericsk/sdk/gaeo/bin/gaeo.py &amp;amp;amp;amp;amp;amp;amp;lt;project name&amp;amp;amp;amp;amp;amp;amp;gt;
[/code]

ハローワールド

新しいアプリケーションを早速作成してみましょう。ワーキングディレクトリに移動し、gaeo.py helloとタイプします。
[code]
&amp;amp;amp;amp;amp;amp;amp;gt;gaeo.py hello

The &amp;amp;amp;amp;amp;amp;amp;quot;hello&amp;amp;amp;amp;amp;amp;amp;quot; project has been created.
[/code]

これだけで基本的なアプリケーションが準備されています。

自動生成されたファイル

app.yaml, favicon.ico, main.py

app.yamlとmain.pyがApp Engineアプリケーションのメインファイルとなります。app.yamlmain.pyを編集してアプリケーションの設定を変更することができます。 favicon.icoは〜のファイルです。ブラウザによって最初にfavicon.icoを取得しようとするので、エラーにログが残るのを防ぐために作成されています。

application/

アプリケーションコード(コントローラー、モデル、テンプレート)がこのディレクトリに配置されます。

assets/

app.yaml内で、画像、スタイルシート、Javascriptファイルのような静的なファイルをそれぞれ、assets/img、assets/css、and assets/js
ディレクトリに配置すると設定しています。foo.pngをassets/imgディレクトリに配置したら、http:///img/foo.pngでアクセスすることができます。スタイルシートやJavascriptファイルも同様です。

gaeo/

Google App Engine Oil(GAEO)のコアライブラリです。新しいGAEOがリリースされれば、このディレクトリを新しいものに置き換えるだけでアップデートすることができます。SVNをつかって常に最新版を利用することもできます。
最新のGAEOライブラリはhttp://google-app-engine-oil.googlecode.com/svn/trunk/gaeo にあります。

GoogleAppEngineLuncherでこのhelloアプリケーションを指定して実行します。

http://localhost:8080/ にアクセスし、正しく動作している事が確認できます。

初期画面に表示されているファイルは/application/template/welcome/index.htmlに置かれています。

Posted in Article (記事) | Tagged , , | Leave a comment

OSXでGoogle App Engineをはじめる

GoogleAppEngineとはGoogle社拡張性に飛んだサーバーを利用してアプリケーションを配置することのできるサービスで、非常に簡単にwebアプリケーションを数百万規模のユーザーへ提供することができます。

現在はPythonを使ってアプリケーションを開発することができます。

早速OSXに開発環境を用意してみます。

開発環境

OSX LeopardであればPython2.5が標準でインストールされてます。

ターミナルを立ち上げ

[code]
python
[/code]

と入力。

[code]
Python 2.5.1 (r251:54863, Mar  7 2008, 03:19:34)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
[/code]

と表示されればOK。GoogleAppEngineにはPython2.5以上が必要ですので、2.4以下であればpythonのウェブサイトから最新版をダウンロードしてインストールしてください。

GoogleAppEngineのインストール

http://code.google.com/intl/ja/appengine/downloads.html

GoogleAppEngineサイトからOSX版をダウンロードし、dmgを開いてGoogleAppEngineLuncherをApplicationsフォルダに移動します。GUIのランチャーを起動して簡単に、ローカルサーバーの起動、停止、appspotに配置できるようになっています。

本家のチュートリアルがわかりやすいので、これに従って進みましょう。

helloworldディレクトリは ~/appengine/helloworldとしました。

GoogleAppEngineLuncherの+アイコンをクリックして、作成したディレクトリを指定します。RunボタンとStopボタンでローカルサーバーを起動してアプリケーションをテストすることができます。

ローカルでテストが終われば、Deployボタンを押すだけでアプリケーションをインターネット上に公開することができます。

公開されているAPIの中でしかプログラムを作成できませんが、ユーザー管理、データ管理、画像編集、メール送信など基本的なAPIは用意されており、これほど簡単にGoogleのサーバーインフラを利用できるのはとても魅力的です。

Posted in Article (記事) | Tagged , | Leave a comment

あなたのコードに使うべき21のRubyトリック

rubyinside.comに 21 Ruby Tricks You Should Be Using In Your Own Codeという記事が掲載されていました。

よりRubyコードをシンプルに読みやすくするために覚えておいて損はないですね。

勉強になりましたので抄訳しました。

1 – 正規表現にマッチした文字を抜き出す簡単な方法

文字列から正規表現にマッチした文字を抜き出す場合、通常はmatchもソッドを使いますが、次のようなショートカット方法もあります。

email = "Fred Bloggs <fred@bloggs.com>"email.match(/<(.*?)>/)[1]            # => “fred@bloggs.com”email[/<(.*?)>/, 1]                  # => “fred@bloggs.com”email.match(/(x)/)[1]                # => NoMethodError [:(]email[/(x)/, 1]                      # => nilemail[/([bcd]).*?([fgh])/, 2]        # => “g”

2 – Array#joinのショートカット

配列に数値を渡し、要素を複製するArray#*メソッドはよく知られていますが、Array#*に文字を渡すことで、文字列を結合させる方法はあまり知られていないようです。

%w{this is a test} * ", "                 # => “this, is, a, test”h = { :name => "Fred“, :age => 77 }h.map { |i| i * "=" } * "\n"              # => “age=77\nname=Fred”

3- 小数の簡単なフォーマット方法

価格の表示に小数点のフォーマットをそろえるにはsprintfの代わりに次の方法を使うことができます。

oney = 9.5"%.2f" % money                       # => “9.50″

4 – テキストを囲む簡単な方法

#3のフォーマットテクニックと同様に文字列を他の文字列の中に差し込むことができます。

"[%s]" % "same old drag"             # => “[same old drag]”

配列をつかうこともできます。

x = %w{p hello p}"<%s>%s</%s>" % x                    # => “<p>hello</p>"

5 – ファイルツリーを削除

簡単にShellを使ってはいけません。Rubyは使いやすいファイルユーティリティライブラリを持っています。

require 'fileutils'FileUtils.rm_r 'somedir'

このメソッドを使う時は十分ご注意を!

6 – Enum要素を爆破

*はArrayやHashのようなEnum要素を*爆破*することができます。なんの事をいっているかは次の例をみてください。

a = %w{a b}b = %w{c d}[a + b]                              # => [[”a”, “b”, “c”, “d”]][*a + b]                             # => [”a”, “b”, “c”, “d”]
a = { :name => "Fred“, :age => 93 }[a]                                  # => [{:name => “Fred”, :age =>93}][*a]                                 # => [[:name, “Fred”], [:age, 93]]
a = %w{a b c d e f g h}b = [0, 5, 6]a.values_at(*b).inspect              # => [”a”, “f”, “g”]

7 – ローカル値の定義をやめる

空のHashやArray でローカル値の定義する代わりに、次のように定義と同時に使うことができます。

(z ||= []) << 'test'

8 – ハッシュキーに文字やシンボルじゃないものをつかう

シンボルや文字列以外のものをハッシュキーに使っているのをみることはほとんどありませんが、つかうことができ、時に使いやすいでしょう(次の例はあまりよい例ではないですが)。

does = is = { true => 'Yes', false => 'No' }does[10 == 50]                       # => “No”is[10 > 5]                           # => “Yes”

9 – ‘and’ と’or’を使って一行に処理をまとめる

より自信のあるRuby開発者がコードを短くして、ifやunlessなど短い複数行を省くためのトリックです。

queue = []%w{hello x world}.each do |word|queue << word and puts "Added to queue" unless word.length <  2endputs queue.inspect# Output:#   Added to queue#   Added to queue#   [”hello”, “world”]

10 – requireされた時ではなく直接実行されていた場合に何かを行う

このパターンは上級Ruby開発者にはよく使われています。ライブラリとしてや、コマンドラインからディレクトリの下から呼ばれているのではなく、直接rubyコードが呼ばれている場合のみ処理を行います。

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

11 – 複数データの簡単割り当て

複数データの割当はRuby開発者が早期に学ぶことですが、簡単な割にほとんど使われていないのには驚きです。

a, b, c, d = 1, 2, 3, 4

要素数の指定がないメソッドの引数として配列を*でバンドルするのは特に役立ちます。

def my_method(*args)a, b, c, d = argsend

つぎのような賢い使い方も

def initialize(args)args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] }end

12 – 数値の比較に複数の比較ではなくrangeインスタンスを使う

もうif x > 1000 && x < 2000 を使わないで次のコードをつかいましょう。

year = 1972puts  case yearwhen 1970..1979: "Seventies"when 1980..1989: "Eighties"when 1990..1999: "Nineties"end

13 – 配列をつかって重複したコードをカット

%w{rubygems daemons eventmachine}.each { |x| require x }

14 – 比較演算子

比較演算子もまた、Ruby開発者が早期に学ぶトリックですが、ほとんどみることがありません。

puts x == 10 ? "x is ten" : "x is not ten"# Or.. an assignment based on the results of a ternary operation:LOG.sev_threshold = ENVIRONMENT == :development ? Logger::DEBUG : Logger::INFO

15 – ネストされた比較演算子

トラブルを引き起こすでしょうが、比較演算子はネストすることができます。

qty = 1qty == 0 ? 'none' : qty == 1 ? 'one' : 'many'# Just to illustrate, in case of confusion:(qty == 0 ? 'none' : (qty == 1 ? 'one' : 'many'))

16 – Rubyの論理式を簡素に

よくつぎのようなメソッドパターンをみますが、

def is_odd(x)# Wayyyy too long..  if x % 2 == 0    return false  else    return true  endend

おそらく次のように比較演算子を使って、よい短くできるのでは?

def is_odd(x)# Don't EVER put false and true in a ternary operator!!x % 2 == 0 ? false : trueend

確かに。このパターンはよく見ますが、もう一歩すすめてください。

def is_odd(x)# Use the logical results provided to you by Ruby already..x % 2 != 0end

17 - 例外のバックトレースのすべてをみる

def do_division_by_zero; 5 / 0; end  begin    do_division_by_zero  rescue => exception    puts exception.backtraceend

18 – 配列とシングルオブジェクト両方で繰り返し処理

# [*items] はシングルオブジェクトを配列に置き換えます。[*items].each do |item|# …end

19 – Rescueブロックはbeginでくくる必要はない

def x  begin    # …  rescue    # …  endend
def x  # …  rescue    # …end

20 – ブロックコメント

これは古いRuby学校のコードでよくみますが、あまりつかわれていないようです。ポンドマークのついた巨大な行よりも見やすいのでは?

puts "x"=beginthis is a block commentYou can put anything you like here!puts “y”=endputs "z"

21 – rescueの救出

一行でrescueを使う事で例外が発生した場合に値を返すことができます。

h = { :age => 10 }h[:name].downcase                         # ERRORh[:name].downcase rescue "No name"        # => “No name”

原文のコメント欄にも他のTipsや意見等が投稿されていました。

おまけ1 – 6と11を組み合わせるとこんな風にかけます。特にArray#splitと一緒に使うと特に便利です。

> a, b, *c = 1, 2, 3, 4, 5, 6
a => 1
b => 2
c => [3, 4, 5, 6]

おまけ2 – 最初から12個のフォボナッチ数を求める

10.times { (fib ||= [1, 1]) << fib[-1] + fib[-2] }

他にもRubyコードのTipsがあれば知りたいです。

Posted in Article (記事) | Tagged | Leave a comment

Arduinoコンテスト2008

Arduinoをつかった各種ハードウェアのコンテスト結果優勝者の映像が公開されています。

Arduinoを使ったドアのロックシステムやGPSと連動した方向指示機、ロボットなどおもしろいソリューションが公開されています。

Posted in Article (記事) | Tagged , | Leave a comment