imakaraでやりたかったことなど

昨日、imakaraっていうアプリをリリースしてみた。

play.google.com

きっかけ

「いまから行くからね〜」って言ってから、

「いまどこ?」「○○過ぎたとこ〜」

「いまどこ?」「電車が遅れてて、△△駅でとまってる」

f:id:YusukeIwaki:20170525110500p:plain

↑相手のイメージw

みたいなやりとりをいちいちメッセンジャーでやるのは面倒だ。 そんなやり取りをする時間があるなら、ふつうにネットサーフィンしていたい。

位置情報はべつにいつ抜かれても構わないから、相手が自分の位置を知りたいときに知れるシステムを作ろう、というのがきっかけでした。

やりたかったこと

いわゆる「待ち合わせアプリ」などは、常時測位している。これはものすごく効率が悪い。

GPS測位というのはスマホにおいては非常に電力を食う操作なので、 相手が私の場所を知りたいというのはせいぜい2,3秒であるとすると、その前後数秒だけ測位を行うようにするのが最も効率がいいのです。

サーバーの設計

カッコいいアーキテクチャを使おうとかは全然考えてなくて、 シンプルにRailsでHTTPサーバー1つ作るだけで完結させたい、という意図が強かった。Workerとかは状態管理が面倒なのでなるべく動かしたくない。ということで、

f:id:YusukeIwaki:20170525103823p:plain

イメージ的にはこんな感じでプッシュを使いつつ実現する、ということをやってみました。

アプリの設計

常時測位しない、というのが最大の特徴なのですが、AndroidFLP(Fused Location Provider)のAPI

のように、常時測位を前提としたものしかありません。 なので、

requestLocationUpdateして、1回でも位置情報が取れたらそこでremoveLocationUpdateする という測位サービスを作り、 「測位して〜」プッシュを受け取ったときに、そのサービスを一発叩くようにしました。

あとは、画面ベースでてきとうにつくりました。

より広く使ってもらうために

追跡URLにはディープリンクが仕込んであって、アプリがインストールされていたら、位置をワンショットで示すだけでなく「新しい測位結果」プッシュを受け取って最新の位置情報をつねに見ることができるようになっています。

ただ、「Google playからimakaraっていうアプリをインストールして、それからこのURLを見てね」っていうと、大抵の人はGoogle playでimakaraを見つけられず、単純にブラウザでURLを見て満足してしまいます。 そこで、Firebase Dynamic Linksというのを使って、「アプリが入っていない人にはストアに飛ばし、アプリインストール後、ディープリンクを開く」というのを実現しました。

これにより、Androidにそこまで詳しくない人とか面倒くさがりな人でも、Google Playに飛ばされたときに「インストール」するだけなので、かなりスムーズに追跡URLをアプリで見るところまで到達できます。

さいごに

デザインは超絶適当なんで、フィードバックとかぷるりとかお待ちしています(てきとうw

github.com

Android用のGitHubのIssue Viewerを作ってみた

実に1年11ヶ月ぶりの投稿。
Qiitaなんて使い始めたら、自分のブログを放置気味になってしまっていけませんね。
自分のことは自分のブログの上に書かないと。

2015年4月に転職してから本格的なアプリ開発を始めたものの、1年半でもう完全に飽きてきました。
もう自分のためになるアプリしか作りたくない、最近。
とはいっても、アプリ開発をしている以上は、ポートフォリオ的なものは持っておいたほうがいい。

ということで、とりあえず自分のためのGitHubのIssue Viewerつくりました。




明言しますが、やってることはJasperのパクリです。
あらかじめ検索クエリをいくつか登録しておいて、定期的にフェッチしてるだけっす。


  • スマホで通知がほしかった
  • Jasperは自分にはToo muchだった
ので、自分でてきとうに作りました。

表向きは自分用のアプリでしたが

  • GitHub OAuthの練習
  • 「Realm使ってます( ー`дー´)キリッ」の実績づくり
  • Kotlinの練習(をしようとしたけど面倒すぎたのでやめた)
  • Fastlaneの導入練習
  • iOSでも同じようなモノをつくるための前練習
という裏の目的もあります。
もちろんソースは公開です。
https://github.com/YusukeIwaki/GitHub-Issue-Viewer-2

ということで、2016年も今日で終わりですね。みなさま良いお年を!

sdeditでシーケンス図をかきかきして、Sphinxドキュメントに貼り付ける

Sphinxでインラインでシーケンス図を書くには、sphinxcontrib-seqdiagのほかに、sphinxcontrib-sdeditという選択肢もあります。

seqdiagの直感性は最強なのですが、ちょっといろいろ省略が入った図とか、条件文が入った図とかをつくろうとした時につまづいてしまうことが多いので、とりあえずsdeditのほうも試してみました。

(ちなみに、sdeditはすごく書きにくい上に、絵がダサいです。なので、ほんとに凝った図を作りたいとき以外はおすすめしません)


LinuxMacだとそんなにハマることはない気がしますが、
Windows上のPython3でだと、いろいろとハマりどころがあります。

ハマりどころ1
 pip install しようとすると、PILのインストールが出来ずにコケる
Downloading/unpacking PIL
Could not find any downloads that satisfy the requirement PIL
Some insecure and unverifiable files were ignored (use --allow-unverified PIL to allow).
Cleaning up...


https://github.com/liori/sphinxcontrib-sdedit.git に、Pillowを使うよううまく改造した(らしい)sphinxcontrib-sdeditがあります。
pip install git+https://github.com/liori/sphinxcontrib-sdedit.git
とすれば、この特殊なsphinxcontrib-sdeditをインストールすることができます。

ハマりどころ2
 Unicode系のエラー。bytesとstrは足し算できんぞ!てきな。
@@ -70,10 +70,10 @@
"""
Render sequence diagram into a PNG or PDF output file.
"""
- hashkey = code.encode('utf-8') + str(options) + \
+ hashkey = code + str(options) + \
str(self.builder.config.sdedit_args)
- ofname = '%s-%s.%s' % (prefix, sha(hashkey).hexdigest(), format)
- ifname = '%s-%s.sd' % (prefix, sha(hashkey).hexdigest())
+ ofname = '%s-%s.%s' % (prefix, sha(hashkey.encode("utf-8")).hexdigest(), format)
+ ifname = '%s-%s.sd' % (prefix, sha(hashkey.encode("utf-8")).hexdigest())
infn = os.path.join(self.builder.outdir, ifname)
if hasattr(self.builder, 'imgpath'):
# HTML
@@ -92,8 +92,6 @@
ensuredir(os.path.dirname(outfn))
ensuredir(os.path.dirname(infn))
- inputfile = open(infn, "w")
- if isinstance(code, unicode):
- code = code.encode('utf-8')
+ inputfile = open(infn, "w", encoding="utf-8")
inputfile.write(code)
inputfile.close()

こんなかんじでPython3対応させます


ハマりどころ3
 except OSError, err の構文エラー

sdedit.pyの例外構文をPython3対応すればよいです。
except XXError, err → except XXError as err


ハマりどころ4
 PILで「TypeError: integer argument expected, got float」

これはPILが悪いわけではなくて、使う側(sdedit.py)が悪い。
Python2では 3/2 = 1,  3.0/2 = 1.5
 のようになっていたのが
Python3では 3//2=1,  3/2 = 1.5
 のように'/'の意味が変わっているので、/を//に修正します。

@@ -161,7 +161,7 @@

def html_tag_with_thumbnail(self, code, fname, new_width, image, imgcls):
width, height = image.size
- new_height = height * new_width / width
+ new_height = height * new_width // width
image.resize((new_width, new_height), Image.ANTIALIAS)
image.filter(ImageFilter.DETAIL)
dir, file = os.path.split(fname)

これで、グラフが出力されるようになると思います。

sdedit.pyの修正結果はアップしておきます→https://gist.github.com/yi01/9d5a0480a50271c3794f