wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

Ruby(本体)のビルドとデバッグ

はじめに

Ruby本体にコミットし、あわよくばコミッターになるというのが、私の人生の目標です。

そのためには、C言語で実装されているRubyのビルドやデバッグが最低限必要になります。

とは言え、基礎知識はあるものの、OSS開発に慣れているわけではないので、gccgdb、makeやconfigureなど、覚えるべきことが沢山あります。

というわけで、メモしておきます。

情報収集

開発者メーリングリストruby-devとか眺めていて、気になる挙動があったら、内部をデバッグして追ってみタイト思います。

bugs.ruby-lang.org

あと、issueに関しては、ここに記載があるので、ざっと眺めてみるのも良さそう。

内部実装の基礎知識

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

Rubyのランタイムの仕組みを知るには、今はこの本が秀逸だと思う。本当に難しい実装の内容を、すごく絶妙なレベル感で説明してくれる。

クラスの仕組みから、ハッシュの構造や、最後はJRubyなどの解説まで、すごく分かった気にさせてくれる。

Rubyのコミッタになる人だけじゃなくて、Rubyを扱う人全員に基礎知識として是非読んでよ欲しい。それくらわかりやすいし、勉強になる良い本だと思う。

Rubyソースコード完全解説

Rubyソースコード完全解説

昔は、Rubyのランタイムを知るとなれば、まずはこの青木さんの本だったが、今は少し内容が古い。

特に、バージョン1.9で入ったYARVよりも前だったこともあり、内部の設計がかなり現実と乖離してしまっているのが残念。

それでも、基本的なところで変わらないところもあると思うし、最終盤でなければWebで公開されているので、一度読んでみるのは良いこと。

ビルド

techlife.cookpad.com

で、そのRubyの仕組みを勉強して、実際に中身を追ってみたいと思った時には、この記事を参考にして、ビルドとデバッグをしてみるのが良い。

#!/bin/bash

make clean
./configure optflags="-O0" debugflags="-g3"
make
mkdir bin
mv ruby bin/ruby
./bin/ruby -v

内容をざっとスクリプトにしてみると、こんな感じかな。

git clone http://github.com/ruby/ruby
cd ruby

当然ですが、一応補足すると、ソースコード自体はこんな感じで取得できます。

あとは、余裕があれば簡単な動作確認をしてみると良いでしょう。

rubyソースコードGitHubが大元ではないので、厳密な最新版が必要な場合は注意。

make check

これで、ruby単体テストを一通り実行することができます。

が、大体いつもopensslがない!ってエラーで怒られたりします。

 # Running tests:

Finished tests in 2.272786s, 97.2375 tests/s, 200.6348 assertions/s.                                  
221 tests, 456 assertions, 0 failures, 0 errors, 0 skips

ruby -v: ruby 2.5.0dev (2017-02-08 trunk 57577) [x86_64-darwin16]
/Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_bundled_ca.rb: cannot load such file -- openssl
Skipping `gem cert` tests.  openssl not found.
/Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_gem_remote_fetcher.rb:84:in `<class:TestGemRemoteFetcher>': uninitialized constant TestGemRemoteFetcher::OpenSSL (NameError)

< exception call stack >

make: *** [yes-test-almost] Error 1

そこでこのあたりを参考にして、opensslを指定してビルドしなきゃいけないことに気づきます(汗 qiita.com

openssl_dir=`brew --prefix openssl`
./configure --with-openssl-dir=$(openssl_dir)
make
make check

デバッグ

デバッグオプション付きでビルドできたら、あとは通常のC言語プログラムと同じようにデバッグできます。

gdb ./ruby -e "print 1"

のようにデバッガで起動して、見たいところにブレークポイントをはって、ステップ実行するとかかな。

詳しくはgdbのヘルプを見れば書いてあるけど、よく使うコマンドとしては

  • b:ブレークポイントをセットする
  • c:処理を継続実行する
  • n:ステップ実行する
  • l:現在のソースコードをを表示する
  • p:変数などを表示する
  • s:ステップインをする(関数の中に入る)

あたりでしょうか。

まとめ

rubyをビルド、デバッグの方法に関する概要を紹介しました。

Developers Summit 2017

全体を通して

毎年行っているデブサミに今年もなんとか(業務に無理を言って)行ってきました。

全体的にエモい話が増えた印象ではあるけど、それでも気持ちを新たにすることのできる貴重な刺激の場であることには変わりがない。

今年の特色の1つに、技術系同人誌を販売するというのがあって、従来はコミュニティのブースであまり盛り上がっていないところも多かったけど、普段は見れないものが見れてよかったと思う。

登壇者の目玉を選ぶのは難しいのだけど、つい先日炎上(本人とは関係ないところだけど)していたちょまどこと千代田まどかさんだろうか。

初日は、A会場がYAHOO!のTech Conference扱いになっていて、企業色のないデブサミに似つかわしくないと思っていたけど、セッションを聞いてみるとかなり骨太な感じで、先入観を反省しました。

あとは、自分が効いたセッションをざっと紹介。

講演資料が追加でアップされたのに気づいたら、なるべく更新します。

Day 1

Web フロントエンドの変遷とこれから(仮)

speakerdeck.com

speakerdeck.com

最近気になっているフロントエンド話。歴史から振り返っていてわかりやすかった。

変遷が早いけど、コンテキストを考えると仕方ないので、変化に適用して頑張ろう、ということ。

Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること

Yahoo!ブラウザという微妙な(失礼)立ち位置のブラウザアプリの戦略を、プロダクトマネージャの視点で語る。

とても理論的で、明確で、すごく勉強になった。会社で、同じようなミッションを与えられている人に聞かせて、心改めて欲しい。

パネルディスカッション「エンジニアが創るプロダクトの未来 ~エンジニアからプロダクトマネージャーへ~」

www.slideshare.net

プロダクトマネージャとは今年のバズワードなのだろうか。

パネルディスカッション形式で、プロダクトマネージャとは何か、どうしてなったのか、何が重要なのか、について語っていた。

海外ではもともとあるポジションが、ようやく日本に入ってきたということだろうけど、同じような仕事をしていた(すべきだった)人はいるはずで、名前をつけ直したということになるかな。

市場で勝ち続けるための品質とテストの技術

テスト自動化を推進するために、何が必要か、という話。色々な誤解や不安を、落とし穴を交えながら丁寧に説明してた。

最終的には、自動化のコーチングがなくても自走できるチームになっていくべきで、それを後押ししていくという、素晴らしい流れ。夢のよう。

新しいビルドターゲットとしての Webブラウザ。もしくは C/C++ で書く Web フロントエンドプログラム

今回一番技術っぽい話。主にWebAssembly:WASMの紹介。

C/C++で実装したプログラムをWASMに変換して実行するやり方を紹介。難読化はされないなど、夢のような技術でないことを説明しつつ、これによってまたWebの世界観が広がる可能性がある気がした。

位置づけ的には、RubyPythonにおけるC拡張のような、ピンポイントでのC/C++実装というのが現実的なのではないか。

事業成長にコミットするエンジニア組織への道のり

リクルートの組織が、数名のエンジニアだった時から、急激に拡大していく中で、エンジニアの文化を試行錯誤した話。

基本的には、俺たちやってやった!成功した!どやっ!って感じの内容ではある。

しかし、その取り組み1つ1つが具体的で、参考になるので、全体通して面白く聞けた。

Day 2

自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?

www.slideshare.net

自動化はなぜ消耗するのか?というテーマでの割と抽象的な話。

私のように導入に苦労している人が聞いていると、すごく勇気をもらうというか、考えるヒントや道しるべになるような話が多かった。

反面、どうしても抽象的であったり、言葉としては当たり前(手段が目的化するな、とか)に聞こえるので、実感を持っていない人が聞くと、ちょっと物足りなかったのではないか。

サーバーレスアーキテクチャにしてみた - エンタープライズチャットアプリでの挑戦

チワワというチャットアプリを作る過程で、Firebaseを活用した事例を紹介。

mBaaSは試したことがなかったけど、データの同期や認証など、とても便利そう。

ママセキュリティエンジニア奮闘記 ~ 子供と一緒にラズパイで遊んでみた♪

文字通り、エンジニアとしての欲求と、子供の教育という観点から、ラズパイを子供と一緒に遊んでみた経験談

自分も子育て世代に、なかなか勉強する時間が取れなかったりするのは共感できるし、子供にエンジニアリングをやらせたいというのもよくわかる。

ただ、仕方ない部分も多いとは思うけど、後半尻すぼみというか、消化不良感があった。

リーンスタートアップとスマートなエンジニアリングの葛藤

www.slideshare.net

リーンスタートアップという手法と、アジャイル(主にスクラム)開発という手法の両立を考えたセッション。

どちらも導入するに至っていない職場の人間としては、2つともやっているだけで眩しいくらいだけど、図を見るとちょっと複雑(オーバースペック)のように感じてしまった。

本質的には、ビジネス的観点でのみ考えられたリーンという手法と、開発の観点でのみ考えられたアジャイルでは、ビジネス・開発両面から見た場合には、どちらも片手落ちになってしまうのではないかと感じた。

もしそれが正しいのであれば、どうしてもリーンとアジャイルを融合したようなプロセスというのは、ちょっと無理があるように思えてしまった。

C#で簡単にモバイルアプリを作ろう!

ちょまど人気(とXamarin人気)で会場に多数の立ち見が出るほどだった。

さすがのMSエバンジェリスト、なんだかんだ言いながら会場をちょまどワールドで包みこみ、時に爆笑、時にハラハラさせながら全力で駆け抜けた感じ。

C#やXamarinの紹介ということもあり、スライドだけ見るとほとんど内容がない(失礼!)のだけど、それでもあれだけ観衆を惹きつけるのだから、これはもうエンターテイメントと言っても良いだろう。

Xamarinはもともと興味があって一度は試してみたいと思っていたし、.NETcoreには期待しているし、C#も言語としてすごいのは理解しているし、Visual Studio 2017には是非期待したい。

コミニュティとエンジニアの生き方

www.slideshare.net

コミュニティを運営している2名の方が体験談を交えながら、コミュニティを運営するということの大切さとメリットを熱く語った。

運営に関わると、エンジニアとしていいことがたくさんあるよ!というのは知っているつもりでも、それを再確認した感じ。

それ以上に、好きな技術を使うだけで、使い尽くしたら捨てるだけで、それでいいのか?という問いには本当にドキッとさせられた。

コミュニティの運営だけじゃない思うけど、好きな技術にはきちんと貢献しなければと、襟を正さなければと改めて思った。

『もしもスクラムマスターがテストエンジニアだったら』(もしテス)

会社の説明、新しく開発したツールと、その開発や意図の説明に多く時間を使って、あまり面白い(一般的に参考になる)話がなかったように感じた。

品質保証を専門に扱う会社というのは、重要だし、注目されるべき企業だと思うけど、セッションとしては残念だった。

おじちゃん

f:id:wolfmasa:20081016112550j:plain

本日、おじちゃんこと、私の大叔父さんが亡くなりました。

長い間療養中で、大きな手術もし、遅かれ早かれこの日が来るとは思っていました。

中学生、高校生の時に、休日時間があれば遊びに行き、トランプや花札で遊びながら、多くのことを学びました。

旅行にも、本当に数え切れないほどたくさん連れて行ってもらい、色々なものを経験させてもらいました。

人生の師匠であり、

友人であり、

祖父であり、

兄弟であるような、

そんな不思議な関係だったと思います。

英語の教師だったこともあり、カナダへの短期留学を一番後押ししてくれたのもおじちゃんでした。

だからといって、勉強しろとか、うるさく言われたことは記憶にありません。

祖母と3人で山陰横断、九州縦断などもしましたし、2人でハワイにも行きました。

はた目には、祖父と孫の旅行でしたが、私からすると、ちょっと英語の得意な友達と旅行しているような、そんな気分でした。

ここ数年はずっと病気や手術のせいで、体調が思わしくないというか、何度も生死の境をさまよっている状態でした。

それでも、意識がはっきりしているときは、政治の話や野球の話など、他愛もない話する、いつものおじちゃんがいました。

亡くなる前日まで、好きなコーラを飲み、よく喋り、自分の人生を、自分の意思で最後まで生き抜いたと聞きました。

何よりそれがおじちゃんらしくて、どこか誇らしく思えてきます。

おじちゃんから学んだものを次の世代に伝えるべく、今はただ冥福を祈りたいと思います。

チャントをちゃんと覚えよう 2017年開幕版

今年ももう少しで始まります。

新加入選手のチャントが決まってようなので、気持ちを新たにして覚えましょう!

GK1 / チョン ソンリョン

川崎フロンターレ応援歌2016 GK1 チョン ソンリョン - YouTube

DF2 / 登里享平

川崎フロンターレ応援歌 23 登里享平 - YouTube

DF3 / 奈良竜樹

川崎フロンターレ応援歌2016 DF3 奈良竜樹 - YouTube

DF4 / 井川祐輔

川崎フロンターレ応援歌2011 井川祐輔 - YouTube

MF5 / 谷口彰悟

川崎フロンターレ 谷口彰悟選手 応援歌 - YouTube

MF6 / 田坂祐介

川崎フロンターレ応援歌 06 田坂祐介 - YouTube

DF7 / 車屋 紳太郎

川崎フロンターレ応援歌2015 DF 20 車屋紳太郎 - YouTube

MF8 / 阿部 浩之

川崎フロンターレ応援歌2017 MF08 / 阿部浩之 - YouTube

FW9 / 森本貴幸

川崎フロンターレ応援歌2016 FW9 森本貴幸 - YouTube

MF10 / 大島僚太

川崎フロンターレ 16 大島僚太チャント - YouTube

FW11 / 小林悠

【川崎フロンターレ】小林悠のチャント - YouTube

MF13 / 三好 康児

川崎フロンターレ応援歌2017 MF13 / 三好康児 - YouTube

MF14 / 中村憲剛

川崎フロンターレ応援歌 14 中村憲剛 - YouTube

MF16 / 長谷川 竜也

川崎フロンターレ応援歌2017 MF16 / 長谷川竜也 - YouTube

DF17 / 武岡優斗

川崎フロンターレ応援歌2014 DF17 武岡 優斗 - YouTube

DF18 / エウシーニョ

川崎フロンターレ応援歌2015 DF 18 エウシーニョ - YouTube

MF19 / 森谷賢太郎

川崎フロンターレ応援歌2013 森谷賢太郎 - YouTube

FW20 / 知念 慶

なし

MF21 / エドゥアルド ネット

川崎フロンターレ応援歌2016 MF21 エドゥアルド ネット - YouTube

FW22 / ハイネル

川崎フロンターレ応援歌2017 FW22 /ハイネル - YouTube

DF23 / エドゥアルド

川崎フロンターレ応援歌2017 DF23 / エドゥアルド - YouTube

GK24 / 安藤駿介

[川崎フロンターレ]VSアビスパ福岡戦 安藤専用チャント - YouTube

DF25 / MF25 / 狩野健太

川崎フロンターレ応援歌2016 MF25 狩野健太 - YouTube

DF26 / タビナス ジェファーソン

なし

FW27 / 大塚翔平

川崎フロンターレ応援歌2016 FW27 大塚翔平 - YouTube

DF28 / 板倉滉

川崎フロンターレ応援歌2017 DF28 / 板倉滉 - YouTube

DF29 / 舞行龍 ジェームズ

川崎フロンターレ応援歌2017 DF29 / 舞行龍ジェームズ - YouTube

GK30 / 新井章太

30 新井章太チャント(歌詞+メロディ) - YouTube

GK31 / ポープ ウィリアム

なし

MF32 / 田中 碧

川崎フロンターレ応援歌2017 MF32 / 田中碧 - YouTube

MF41 / 家長昭博

川崎フロンターレ応援歌2017 MF41/ 家長昭博 - YouTube

DeNA TechCon 2017

techcon.dena.com

楽しみにしていたDeNAのイベントに行ってきた。

サーバサイド、モバイルなどはもちろん、テストエンジニアの話なども聞ける貴重な機会ではあったのだが、子供のお迎えが発生し、途中で泣く泣く帰宅。。。

昨年同様、ほとんどのセッションは後で動画で見れるようなので、見逃したやつは後で絶対に見るぞ!

Opening

執行役員の木村さんの挨拶。

Perlハッカーで有名な人だが、挨拶だけなので、全体の概要的な話に終始。

多少緊張していたのか、癖なのか、手がモジモジしていたのが、どうも気になって仕方なかった(何

基調講演―実世界の人工知能

Preferred Networksの岡野原さん

機械学習やDeepLearningのこれまでの流れや、利用方法などの全体的な紹介。

また、Preferred Networksで取り組んでいる課題や解決に向けたアプローチなどの紹介。

Deep Learningの技術紹介自体は、だいたい知っているもので時に目新しいものはなかったが、その応用例の紹介については、いくつか新しい取り組みもあって、興味深かった。

ふーんって聞いていたけど、最後の方で、Preferred Networksの開発者の一人が、DeepLearningで有名なライブラリChainerの作者であることを聞いて、思わず声をあげそうになるくらいびっくりした。そんなにすごい会社だとは知りませんでした。。。

その後のDeNAネイティブアプリ開発

執行役員の池田さんの講演。ずっとゲームを開発してきており、現在もゲーム開発を統括する立場で、根っからのゲームエンジニアという印象。

“その後"とついているように、昨年度の発表の延長を紹介。

正直、昨年の資料の振り返りが多く、私は見たことがなかったのでまだ良かったけど、少し期待外れであったことは否めない。

後半は、DeNAという会社が、Webアプリ・サービス開発から、ネイティブ・バックエンドサーバ開発にシフトするにあたり、組織として色々難しい課題があって、1つ1つクリアしてきたという話。

特に、JSをはじめとしたWebプログラミングと、C/C++から続くクライアントアプリ開発では、確かにリソースや非同期の考え方など、マインドチェンジが必要なのはよくわかる。また、サーバ側だけ見ても、似ているようで求められるスキルセットが違うので、どうしてもオーバーヘッドがかかってしまうという話は印象的だった。

強化学習を利用した自律型GameAIの取り組み ~高速自動プレイによるステージ設計支援~

AIを使って、ゲームを自動プレイし、QAに用いたり、ユーザの対戦相手(NPC)に利用できないかという取り組み。

ターゲットはFinal Fantasy Record Keeperというアプリで、戦闘シーンをAIがプレイするというものだった。

結論から言えば、学習時間が長いのを置いておけば、一般の人と遜色ないレベルまではプレイできるようになるが、ランダム要素や補助魔法などの評価などにまだ課題があるとのこと。

聞いている側からすれば、なぜいかにも難しそうなゲームをいきなり対象にしたのか?という疑問はあった。

古いマリオを機械学習でクリアしたという実験もあったし、もっと入出力、そして評価(報酬)がわかりやすいものから取り組んだ方が良かったのではないか、と思った。

また、ゲームをAIでプレイするためには、時間がかかりすぎるので、シミュレータなどで効率的に試行できる環境を整えた方が良いというアドバイスは印象に残った。

こういう取り組みは面白いので、もっとやってほしい。

サービスの成長を支えるフロントエンド開発

JS界隈の技術動向と、最近流行っている技術の紹介。

前半は、いかにJS界隈が毎年のようにいろんなライブラリやフレームワークが出てきては消えていくのかを紹介し、その中で開発当時のトレンドがその後の運用不可に博打的な影響を与えてしまう可能性があるという点を確認。

たかだか、HTMLとCSSJavascriptを生成するだけなのに、なんでこんなにいろんなツールが必要で、それがまた時代とともに大きく入れ替わっていくのか、という素朴な疑問が印象的だった。

主に、React + Reduxの紹介と、Vue.jsの紹介をしていたが、それを動かすのはRuby on Railsの上で動かしているのはちょっと変な感じ。

Vue.jsは確かに最近聞くようになった気がしていたけど、その人気急上昇っぷりを再確認。

おまけ

会場に早く着いたので、置いてあったノベルティをいくつか貰うことができた。

期待通り楽しかったので、来年はもっとゆっくり参加したいな。

GitLabメモ

GitLabについて、まだまだ情報が少ない気がしたので、ざっとメモを残しておきます。

設定に困ったら、まずはgitlab.rbを見るべし

GitLab、特にomnibusの場合には、いろいろなモジュールが含まれており、それぞれの設定を管理する必要があります。

そのためにまず覚えるべきは、gitlab.rbの存在です。基本的には/etc/gitlab/gitlab.rbとかにあるはずなので、開いて設定しましょう。

gitlab.rbは様々なGitLabに含まれる設定項目を1まとめにしたものですが、変更するだけでは反映されないので、コマンドを実行し、各モジュールに反映させてあげる必要があります。

sudo gitlab-ctl recofigure
sudo gitlab-ctl restart

注意としては、gitlab.rbを使わずに直接モジュールの設定を変更している場合には、その設定が上書きされて消えてしまう可能性があります。以前、コード中に固定値で格納されていたあるMax値を直接変更していた際に、recofigureをした瞬間に上書きされて消えたということがありました。

GitLabはRailsである

忘れがちですが、GitLabはRailsアプリです。そのため、基本的にはRailsの知識がほぼ同じように使えます。

例えば、rake routesは、GitLabコマンドに置き換えられていて

sudo gitlab-rake routes

になるだけです。サーバ全体のコントロールはgitlab-ctlですし、rakeを使う場合にはgitlab-rakeです。

デバッグしたい時

うまく動かなくてデバッグしたい時もあるでしょう。(普通ないかな?)

その際には、rails consoleではなく、

sudo gitlab-rails console

をすればirbが起動して、サーバの中で動いているコードをデバッグすることができます。

ちなみに、起動後の問題であればirbで良いのですが、何かのエラーで起動しない場合には

sudo gitlab-ctl tail

を実行することで、ログを見ることができます。もし対象のモジュールが分かっている場合には、

sudo gitlab-ctl tail unicorn

などとすることで、フィルタリングできるようです。

バックアップ・リストアをマスターすべし

サーバとして運用する上で、バックアップとリストアの機能は必要不可欠です。

定常的にバックアップを保存するのであれば、gitlab.rbのバックアップの項目を設定するべきです。

何かの事情で、手動でバックアップを実行する場合には、

sudo gitlab-rake gitlab:backup:create

とすれば、保存されたフォルダにバックアップ作ることができます。その場合でも、出力フォルダをgitlab.rbを参照して確認するべきでしょう。もちろん、編集したらrecofigureを忘れずに。

SKIPオプションを設定すれば、db以外とか設定も可能ですが、通常の用途ではあまり使わないような気がします。

リストアするときは、バックアップしたtarファイルを保存先フォルダに格納しておきます。

その上で、ファイル名ではなく、ファイル名中のタグを使って、リストア対象を指定します。

sudo gitlab-rake gitlab:backup:restore BACKUP=1393513186_2014_02_27

困ったら、だいたいここに書いてあります。 https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/backup_restore.md

インストール、アップデートは簡単

2、3年前は、非常に手間のかかる作業だったものが、最近は一発でインストール、アップデートできるようになりました。

# install GitLab Community Edition
sudo apt-get install gitlab-ce

# update
sudo apt-get update

これじゃ、何も言うことはありません。素晴らしい。

Apple Watch アプリを作る WKInterfaceTimer編

はじめに

Apple Watch用のアプリを作ってみようと思います。

まずは手始めに簡単なタイマーアプリを作ってみます。

準備

とりあえずiOSアプリと同じような準備が必要です。

MacXcodeが必要なのは周知の事実です。私が使っているのは2013年モデルということもあり、Xcodeが重い重い・・・特にシミュレータの起動が遅いので困っていますが、それでもなんとか開発はできています。(気長にいきましょう)

開発をしていると、当然実機でうごかしたい、動かす必要があるので、Apple Watch本体や、本体にデプロイするためのDeveloperアカウント(有料)が必要です。

確か、最近のiOS開発では、無料のアカウントでもiPhoneで動かすことができると聞いた気がしますが、私の調べた範囲ではWatchは無理らしいです。らしい、と書いたのは、記事の書かれた時期や、そのiPhone開発者に向けた権限の変更をふまえてもWatchは無料ではできない言及している記事が見つからなかったためです。

Story Board

まずStory Boardをいじってみます。

基本的にいつものiOS開発と同じですが、Viewの制約が思っていた以上に大きい。

特に、ボタンやラベル並べようとすると、サイズを小さくしても縦方向にしか追加できず、横に並べるやり方がわからなくて少し困った。

幸い、調べたらGroupというオブジェクト?を使って、サイズを小さくする事で横にはならんだけど、それでも3つ以上のボタンを並べたりはできないらしい。

Timerの表示

タイマーを作成するのにうってつけのViewがあります。

WKInterfaceTimerというもので、配置すれば"59:59"のようないかにも時間が表示されるようなViewがあらわれます。

あとは、このWKInterfaceTimerをコードから制御すればよいだけです。

(もちろん制御するためのボタンも追加しましょう)

Timerの制御

これから私の書いたサンプルをベースに、制御の仕方を簡単に紹介します。

@IBOutlet var timerView: WKInterfaceTimer!

WKInterfaceController(UIKitで言う所のViewController)でこのように定義しておくことにします。

スタート

timerView.start()

これだけ、あら簡単。これでカウントアップが開始されます。

カウントダウン

カウントダウンするためには、カウントする時間をセットする必要があります。

セットするためにはsetDateを使うのですが、引数はDate型なので、それを作ってあげる必要があります。

var countDownSecond: int = 30
timerView.start()
timerView.setDate(Date(timeIntervalSinceNow: TimeInterval(countDownSecond+1)))

ここで注意なのは、スタートしてからセットしないと秒数が飛んだように見えるということです。

あとは、時間をセットするためにDateが必要で、そのDateを作るためにさらにTimeIntervalが必要になるということくらいでしょうか。あとTimeIntervalの引数も0はじまりなのか、1ずれるので加算しています。

ストップ

timerView.stop()

基本的にはこれで止まります。あら、かんたん。

が、

問題はここからです。

表示上は止まっているのですが、実はこれ表示の更新を止めているだけ。

もう一度スタートを実行をすると、止まったところからではなく、ずっと裏で動いていた時間分だけ先に進んだ表示になります。

これは少し考えればわかりますが、Dateを指定しているということは、目標の日時を設定しているため、現在の日時との差分をただ表示するという動作になっているからです。

なので、stopをじっこうしても、目標の日時は変わらないので、再度startをした際に飛んで動き出すような表示になってしまいます。

一時停止

そのままstart/stopを読んでも一時停止にはならないので、一時停止をしたい場合には自分で実装してあげる必要があります。

正しい方針はわかりませんが、とりあえず私はシンプルな方法を試しました。

  • stopされたときに、残りの時間を記憶しておく
  • startされたときに、残りの時間と今の時間との差分(止まっている間に消費した時間)計算し、差分を目標時間に加算する

という感じです。

func stopTimer(){
  suspendedTime = targetDate.timeIntervalSinceNow
  timeView.stop()
}

func startTimer(){
  timeView.start()
  if(suspendedTime != nil){
    targetDate = targetDate.addingTimeInterval(suspendedTime! - targetDate.timeIntervalSinceNow)
    suspndedTime = nil
  }else{
    targetDate = Date(timeIntervalSinceNow: TimeInterval(targetSec))
  }
  timerView.setDate(targetDate)
}

サンプルなので一部省略していますが、基本的にはこの流れで一時停止っぽいことができました。

まずはめでたしめでたし。