Pepperロボアプリ開発に向けて

ブログを再開しました

ブログを再開します。WordPressの研究も再開です。どこの変更がまずかったのかこのブログの表示が変です。会社の顔であるWebsサイトのデザインがこれではまずいと思いますが、このブログを見て私のスキルを推し量る目安にする方もいますので自力で直します。

新たな出会いは無し

人と会っていないわけではなく、懇親会、勉強会など参加しているが人脈に繋げるための一歩を踏み出せてない。まぁ、そんな時期もあります。

サーバ環境をmBaasに切り替え中

iPhoneアプリ開発環境のプログラミング言語をSwift2に移行しました。最近プロジェクトの中断という痛手がありましたが、代わりに貴重な知見が残りました。今後のスマホアプリのサーバ作り込みにはmBaaSを使うことにします。もっと前からmBaaSを利用するシステム構成にすれば状況は変わったかもしれませんが、この教訓は次回に生かします。

Pepperロボアプリやります

サイドプロジェクトとしてPepperのロボアプリを開発します。いろいろ調査して見た結果、Pepperのアプリケーション開発にはWeb開発とスマホアプリ開発で培ったスキルが流用できます。ここでもサーバ処理はmBaaSで対応できます。Pepper基本ソフトがベースにしているLinuxは得意分野ですし、フレームワークのROSはPepper以外の他のロボットとも共通するので、Pepper以外のロボット開発への転用できる見込めます。ロボット分野はビジネスというよりも研究目的の方が色合い強いのでいつまでニーズがあるかわからないし、Pepperもブームともに消える可能性があります。しかし、そんなことは移り変わりが激しいのはこの業界でそんなことを気にしていたら何もできません。

この本に、ここ10年くらいロボットの一つとしてPepperが紹介されてます。歴代のロボットと比べてPepperが一番の違いは何かいうとネットワーク接続されているというです。それまで全てスタンアローンで動いてました。スマホのようにネットワーク経由でソフトウェア更新も行えます。会話機能はIBMのメインフレームコンピュータにもつながります。攻殻機動隊に出てくるタチコマ達のAIが人口衛星のコンピュータに搭載されてたみたいな感じでしょうか。

Pepper、欲しいなぁ。早くロボアプリ開発を仕事にしたいなぁ。そうだ、すでにPepperを持っている人でボロアプリ開発者を探している人がいたら連絡ください。サーバ処理で困っているとか、オリジナルのボックス作るとか。こちらで開発を請け負ってもいいし、すでに内製しているなら訪問対応とかスポット対応の依頼も請けます。どうぞよろしくお願いします。

速攻で開発環境をiOS9に切り替えてみた

iPhone4s

前夜の準備作業

  • 開発機iMacのバックアップ(time machine):10分くらい
  • Xcode7へバージョンアップ:15分くらい
  • 最後にiOS9にアップデートするiPhoneを充電器につないまま放置。

朝から作業開始

使用するのは機種はiPhone4s。今回のiOS9のアップデートの対象機種です。この前までiOS9 bate版を入れて使ったやつ。正式リリースなので何も考えずに設定画面からソフトウェアアップデートをクリックしたらあとは待つだけ。途中でiCloudの容量が足りなくてやり直しはあったが、昼前には無事にアップデート完了。

アップデート後に最初に求められる設定がSiriのチューニングでした。短いテキストを読み上げて自分の声を覚え込ませる。賢いことに日本語で口語的な表現が通じる。面白くてひたすら遊んでみた。

  • 「いま、何時?」(時刻を読み上げてくれる)
  • 「5分たったら起こして」(アラームをセットします)
  • 「クラシック音楽をかけて」(わかりました。そして再生)
  • 「XXの試合の結果を教えて」(結果を表示し、読み上げもしてくれる)

ようこそぉぉぉ!未来へ!

他にも機能が変わったところがある。beta版を触っていたし、AppleTVのニュースが大きすぎてかすんでしまった。iOS9で不具合も出てるらしい。OSの入れ替えには常に危険が伴います。バックアップとリストアの練習しておきましょう。

iPhone6+の大画面に慣れてしまった私には3.5インチサイズの操作が辛くなってきた。iMacに向かってXcodeを立ち上げて、オンラインマニュアルを流し読み。すぐに諦めてWebを探してまわる。良記事を発見。

shu223氏のブログ:「iOS 9 の新機能のサンプルコード集『iOS-9-Sampler』を公開しました」より引用

http://d.hatena.ne.jp/shu223/20150917/1442440780

githubからcloneしてbuild。さっきまでおもちゃにしてたiPhoneをケーブルでつなげてアプリを転送。実に簡単に実機できた。再びxcodeのオンラインマニュアルに戻りコードを変更しては実行を繰り返す。あとから気がついたらコードはSwiftだった。Appleのサイトを見てもそれは同じ。しかし既にリリース中のアプリはまだまだObjective-Cで開発されたものが大多数のはず。iOSのバージョンアップのたびに改修の必要に迫られる状況が続くのは頭が痛いとこでしょうね。

Xcode 7 + Swift 2環境をインストールした

コーヒーマシン

天気の悪い日が続いてます。ジメジメです。コーヒーメーカー(ネスカフェのバリスタ)の中でコーヒー豆が固まってました。このコーヒーメーカーは工具無しで分解できる構造になってます。ピラ一枚だけの説明書通りに洗って乾かしたら復活しました。構造的に素人が組み立てしても部品の向きも間違えないように設計されてます。良くできた商品だと感心しました。機械は故障しないにこしたことはないですが、もしトラブっても誰でも復旧作業がきる。ここが素晴らしいです。我が身に置きかえてみると、システム開発もオープンで柔軟にできないものでしょうか。レゴで遊ぶみたいにコーヒーメーカーを組み立てながら思いました。

本日、メインの開発機にXcode 7 + Swift 2の環境を作りました。ダウンロードはここからで、Xcode 7 beta 2 Release Notesにあるリリースノートに目を通してます。

お約束のwatchOS 2.0のSDKが入っていました。WatchKit Appのプロジェクトも作れます。しかし、まだ腕時計に何をさせればいいのか全く思いつきません。それとiOS9のシュミレーターを含んでませんでした。新しいxcodeならiOS9用のSample Codeを実行できるものと期待してたので、ちょっと残念です。

失敗談:既存のプロジェクトファイルを開くとビルド環境とソースコードのコンバート処理が実行されます。逆向きのコンバーターはないです。ビルドするとエラーも警告もたくさん出るので、軽い気持ちでOKボボタンを押してしまうと大変です。私はとても修正しきれないと思ってtime machineから復元してからは、フォルダを分けました。

xcodeでプロジェクト作成時にCreate Git repository on のチェック忘れたときの対処

カフェ

とりあえずプロジェクトを作る時はCreate Git repository on にチェックしておけば問題ないのですが、何かの事情で後からチェックしたくなる状況もあります。例えば以下の3つです。

  1. ダウンロードしてきたサンプルコードを使う
  2. プロジェクトを作るときにチェックを忘れた
  3. すぐに使い捨てるつもりで書き始めた(Playgroundを含む)

私はまさに1のケースに遭遇してます。開発は1人だけども開発マシンが複数あるのでxcodeのプロジェクトはsource controlは使いたい。というかサンプルコードを使った学習ではもともと動くものを変更して動かしながら把握していくので状態をロールバックができないと学習効率悪すぎ。自分でソースコードをいじりすぎて壊してしまう前にやっておく。

ダウンロードしてきたプロジェクトを読み込むとxcodeのsource controlは以下のような状態になってます。設定が空白になってます。最初はxcodeの設定したいと思って調べてみたのですが、それらしきものは見つからず。どうせ内部的にgitコマンドをたたいているだけなら、手でコマンドを叩いても同じはず。
nosourcecontrol

このプロジェクトをCreate Git repository on にチェックした状態にしたい。

ダウンロードしたサンプルコードのプロジェクトのsource controlを有効する

ターミナルで作業する。

  • 解凍したソースコードをワークスペースにコピーする
  • プロジェクトファイルのフォルダへ移動
$ git init
$ git add .
  • ここでxcodeを再起動する(これ重要)。Source controlは以下のように変わってます。
    スクリーンショット 2015-06-06 11.15.17

xxcodeのsource controlメニューでもグレーアウトしていた機能が操作ができるようになりました。最初のcommitを実行します。
スクリーンショット 2015-06-06 11.15.29
+ 念のために正しくできたかtermで確認する。

$ git log
commit *************************
Author: iida masakatsu <*******@********>
Date:   Sat Jun 6 11:10:04 2015 +0900

    Initail commit on xcode

ここから先の操作はCreate Git repository on にチェックしたときと同じように操作できてます。gitホストィングサービスへリモートリポジトリの作成もできました。これで今までローカルでしか触れなかったプロジェクトファイルも外出先からアクセスできる。ということで続きはどっかでお茶でも飲みながらやりるとしますか。

Playgorund のソースコードも管理する

普通はplaygroundのソースコード管理しないと思いますが、プロジェクトと同じようにxxx.playgroundディレクトリの直下でgitコマンドを叩けばxcodeからSource Controlができるようになります。知っていればいつか役に立つこともあるかもしれません。外部のgitホスティングサービスを使えば仕事場続きを自宅することもでもきるしその逆とかね。

どのサンプルコードで学ぶのか迷いまくって結局はAppleのサイトに戻ってきた

PlaygroundでSwiftを把握したら次はアプリを作る。教材としてはAppleのサプンルプログラムが最適。

developer.apple.com

最新のビルド環境に合わせて提供される。環境を最新化すれば何も悩まないでビルドも実行も出来る。自分にとってはこの点は重要で、慣れていない開発環境でビルドでつまずくと、原因がXcodeにあるのかサンプルコードにあるのか聞き分けられない。今はそういう問題に足をすくわれて止まっている時間が惜しい。その点、このサンプルは全く同じ機能がObjective-CとSwiftの両方で提供されているので、どっち片方だけでも動けば作業は先に進められるところがいい。

使用したサンプルコード

title resource type topic framework date
UICatalog: Creating and Customizing UIKit Controls (Obj-C and Swift) Sample Code User Experience UIKit 2015-04-08 Minor Change

カタログされている機能一覧

UIkitフレームワークが使い方が網羅されている。
+ UIActivityIndicatorView
+ UIAlertController
+ UIButton
+ UIDatePicker
+ UIImageView
+ UIPageControl
+ UIPickerView
+ UIProgressView
+ UISegmentedControl
+ UISlider
+ UIStepper
+ UISwitch
+ UITextField
+ UITextView
+ UIWebView
+ UISearchBar
+ UISearchController
+ UIToolbar

スリーンショット

実行環境:xcode 6.3.2 OS X / Yosemite 10.10.3 / iMAC(late 2013)

app2

app3

app4

実機にインストール

iPhoneにインストールする。ライトニングケーブルで繋ぎxcodeのスキームで手持ちの実機を選ぶだけで出来た。やっぱりAppleのサンプルコードはこういうとこもきちんとしている。猫のアイコンはテスト用のダミーでで。隣のアイコンはSpriteKit のサンプルコード:Adventure: Building a SpriteKit Game Using Swiftでゲームです。

app2

補足

最初に何もせずに実行できたと書いたが実は警告はでてた。具体的にはMain.storyboard画面で”Frame for xxx will be defferent at run time.”という警告がでてる。そのまま放置すておいtもビルドも実行は可能なのは確認してる、だけど気持ちが悪いので修正した。手順はMain.storyboardを開いてUpdate Framesを実行すればズレたレイアウトが自動で調整され警告は消える。

xcode

EXCELはフィボナッチ数を100回まで計算できない

電卓

Excel の仕様および制限 – ワークシートとブックの仕様と制限
「計算の仕様と制限」-「処理できる正の最大値」は9.99999999999999E+307。「有効桁数」は15 桁となってます。

エクセルのセル内での有効桁数が15桁ということは、京(けい:10の15乗)を超える計算の結果は保障されないということ。具体的には
498454011879264(72回目)

+ 806515533049393(73回目)

1304969544928657(74回目)

とはならずに、結果が、1304969544928650、または、1304969544928660 のように末尾の桁が0になります。プログラムが出来上がったら答え合わせに使おうと思ってたのこの方法は使えない。

Excelの有効桁数が15桁ということは内部的にはInt32なんでしょうか。こうなると計算にはプログラムを使おうと考えますが、ちょっと待って。INT32は15桁(73回)、2倍の大きさのInt64を使っても19桁(92回)までが限界。その上のInt128なんて整数型はありません。もし、あっても38桁までが限界です。すぐに次の限界がきます。

解決策として「多倍長演算」のアルゴリズムを参考に、整数の配列のひとつの要素を32768進法で計算したのがこれ。例によってまた拙いSwift言語で書いていますが、整数は450桁までは溢れせずに結果がでる。フィボナッチ計算も千までやっても大丈夫。

PythonやRubyならこんな面倒なことをしないでも動的な多倍長整数が扱えます。それとプログラムの答え合わせには100番目までのフィボナッチ数列を使いました。

プログラマーなら1時間で出来るべき、そう言うならYouがやってみてよ

パソコン

最近、こういうのをよく見かけます。

1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に

有名なとこじゃ転職情報誌や人材マッチングサービス主催のがあります。

  • CodeIQ 本当にできる人は、見逃されない(リクルート)
  • paizaコードを書いてやりたい仕事選び(パイザ)

たいていは回答までの想定時間が5分です。問題文を読んでから回答を送信するまでを5分に想定するというのだから、30分の制限時間なら6問の回答できるレベルの出題ということです。私はいつも昼食後の休憩時間に挑戦してるのですが、1回に1問回答できれば良い方で、いつも時間オーバーします。最初は適当に時間設定をしてるんじゃないかと思ってましたが、流れてくるTwitterのタイムラインを見ていると割と妥当な設定のようで、出来る人は秒殺で回答してます。負け惜しみをいうわけではないですが、こいうのは受験と同じで出題傾向を研究して対策するほど結果は良い。逆にプログラミングの経験があっても何の準備もせずにやったら慣れない状況に翻弄されていい結果がだせません。

話を冒頭の記事にもどします。タイトルの「Software Engineer should be able to solve」や「エンジニア失格」の言い回しが煽りっぽくて嫌なのですが、まぁ、出題にどうのこうのと文句をつける前に、自分でやってみないことにはお話になりません。やりますよ、それもSwiftでね。

Swiftのバージョンは1.2。実行環境はYosemiteのターミナル。コーデイングはplaygroundで行いスクリプトはコマンドライン実行可能な形式でファイルに保存します。githubにコードを置いときますが、まだSwiftで自分がやりたいことがスラスラ書けるレベルではないので真剣に見ない下さい。Swift言語のスキルがあがったら直すつもりです。
問題1
for文、while文、再帰呼び出しの3パターンでリストの値を合計せよ。
コメントと解説
Swiftで再帰呼び出し処理を書けたことに気をよくするが、ここだけ作業時間は1時間を越えました。

問題2
二つのリストを交互にマージせよ。

問題3
100個のフィボナッチ数のリストを計算せよ
コメントと解説
100個までの計算できませんでした。Int64でもループ92回目(19桁)で溢れが発生。パス1です。またあとで再開するかも。

問題4
リストの数字を最大になるように並べよ
コメントと解説
ここで2日目に突入。もう自分でロジックを考えるのが面倒になってきたので、
はてなに「1時間以内に解けなければプログラマ失格となってしまう5つの問題」をPythonで解いてみたというのがあったので参考にさせてもらいました。

問題5
+とーを使った小町算の数式を全表示せよ
コメントと解説
小町算を効率よく導き出きだそうとするが良さそうなロジックの組み立てできない。書籍「C言語による最新アルゴリズム事典」にあったコードを単純にSwift言語に書き換えた。一番難しそうな問題が一番簡単に解決した。

実行結果

– 1 + 2 – 3 + 4 + 5 + 6 + 78 + 9 = 100
12 – 3 – 4 + 5 – 6 + 7 + 89 = 100
123 – 4 – 5 – 6 – 7 + 8 – 9 = 100
123 – 45 – 67 + 89 = 100
123 + 4 – 5 + 67 – 89 = 100
123 + 45 – 67 + 8 – 9 = 100
12 + 3 – 4 + 5 + 67 + 8 + 9 = 100
12 + 3 + 4 + 5 – 6 – 7 + 89 = 100
1 + 23 – 4 + 56 + 7 + 8 + 9 = 100
1 + 23 – 4 + 5 + 6 + 78 – 9 = 100
1 + 2 + 3 – 4 + 5 + 6 + 78 + 9 = 100
1 + 2 + 34 – 5 + 67 – 8 + 9 = 100

最初のSwiftの学習方法としてサンプルコードの写経もいいのですが、ほかに知っている言語があるなら、今回見たな言語の書き換え作業も有効です。例えばこの本にあったコードの書き換えは、Swift言語の仕様だけに集中して学習できる点でいい勉強になりました。

プログラミングの学習はひたすら反復あるのみ

パソコン画面

Swiftで実際に簡単なコードを書いてみた。例を挙げるとそれぞれは以下のようなもの。

・起動したら掛け算九九表を表示する
・乱数を発生させて実行するたびに吉、凶を表示する

研修でつかいそうな練習問題で実用性はゼロです。ビルドするとシンタックスエラーをだしまくるし、動いても期待した結果が出ない。ビルドして実機で動かすのはもどかしいので後回し。最初からplaygroundでやればよかった。

経験から言うとプログラム言語の学習は丸暗記しても役に立たないです。文章を書くがごとく構文を組み立てられるようになるまで何度もトライアンドエラーを繰り返すしかない。どうしても今まで使っていた他のプログラミング言語の構文の癖にひきづられます。いつかSwiftのカッコやセミコロンがないのも気にならなくなるし、変数の後ろに「!」や「?」を付けるのも慣れるとは思いますが、習慣が書きかわるまでには時間はかかります。

タプルと配列をどう使い分けるかとか、オプショナルってどう使えば安全なコードなのかとか、ジェネリクスって何さ、いつどう使うのか。疑問が増えるばかりです。どういうふうに書くのかチームとしてコーディング規約にまとめるたいのだけど、まだ先は長いです。

Swiftの勉強を継続中

パソコン画面

朝イチで雑用を片づける。そのあとはAppleサイトの動画を見る。

すでに文脈はわかってるのと資料はソースコードだけなので英語でも何とかなる。スマホに昼から雪が降るという警報が届いた。午後はそうそうに切り上げて帰宅。

自宅で「Swiftではじめる iPhoneアプリ開発の教科書」をペラペラとめくって読む。SWiftの仕様に関する部分は50ページほどで意外なほど少ない。クラスの話も出てこない。
説明はとても丁寧で良いのだけど、クラスやストラクチャは明日またおさらいする。明日の天気は大丈夫かな。

本日の学習時間
appleサイトの動画:2時間
解説本:2時間

Swiftをお勉強中

パソコン画面

スクリーンショット 2015-02-04 14.37.51

本日もSwiftにかかりきりです。プログラミング言語の学習速度に個人差があります。自分の場合、新しい言語なんてかなり久しぶり。まぁ兎だろうが亀だろうがゴールのない競争に勝ち負けは無し。苦労の先には良い未来が待っていることを信じて前進を続けます

この前は「Hello World」アプリを動かすことができた。Objective-CじゃなくてSwiftで動いている。あれから自作したアイコンを登録して、アプリの背景とメッセージを家族写真に入れ替えた。そういうアプリのをいくつも作って家族のiPhoneに転送。6歳の姪にだけはウケた。

Swiftで開発するためには統合開発であるXcodeの操作にも慣れておく必要がある。appleサイトを見ていたら開発者向けBlogに参考になりそうな動画を発見。やはりGUIの学習は動画の方が効率がいい。なるほどソースコード画面上にドラッグ&ドロップするのか、なんか新鮮だなぁ。

storyboardにも慣れてきたのでSwiftの言語の学習に取り掛かる。手早く言語の概要を学習するために「ドットインストール」をチョイス。このサイトにはいろいろお世話になってます。動画と音声解説してくれる(それも日本語)。前半はどんどん飛ばして、後半からじっくり自分のplaygroundで実行しながら確認していく。見たいとこだけ何度でも繰り返して見る。

ドットインストール Swift入門 (全24回)
レッスン「Swift入門」の視聴にはのpremium会員登録(月額880円)が必要。

Building Your First Swift App Video:2時間
ドットインストール Swift入門:4時間

次は「Swiftではじめる iPhoneアプリ開発の教科書」を実践する予定。