hiragram no blog

iOSとか

iOSのバージョンによってはUIAlertControllerのボタンの並びが変になるかもしれない

古いiOSだとUIAlertControllerにaddActionした順に左から表示されるっぽい。 たまたま古いテスト機で触ってて違和感があって発見。

こんなコードが

import UIKit

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }
  
  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    showDialog()
  }

  func showDialog() {
    let message = "OK,キャンセルの順" // ↓ここのaddActionする順番を逆にしたりすると
    let alert = UIAlertController(title: "title", message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
    presentViewController(alert, animated: true, completion: nil)
  }
}

iOS8.4

f:id:hiragram:20160105222254p:plain

f:id:hiragram:20160105222303p:plain

iOS8.1

f:id:hiragram:20160105222314p:plain

f:id:hiragram:20160105222323p:plain

iOS8.1だと足した順に左からになってて、8.4だと常にOKが右に来てる。

シミュレータではiOS9.0を動かしてたので、たまたま古いiPhone5でテストしなかったら気づかなかった。

こういうの他にもありそうで怖い。

UIViewのアニメーション中にタップイベントが発生しなくてハマった自戒

起きたこと

  • UITableViewをスクロールしてると、たまに指が滑る(縦にスワイプしてもtableViewが追従してこない)ような違和感があった
  • 最近、UITableViewのセル内の画像をUIViewのtransitionWithViewを使ってフェードインさせるように改修してた
  • フェードインが怪しいと思ってdurationを10秒とかにして試してみたら案の定アニメーション中に画像を触ってもなにも反応しなかった
  • 直すぞ
  • 直らん

やったこと

UIResponder周りかな…?

もともとタッチの判定をUIResponderのtouchesBeganをオーバーライドしてやってたのでその辺から疑ってかかった。

確かにフェードインのアニメーション中に画像をタップしても、touchesBeganが呼ばれてない。

じゃーアニメーションしてる間のタップイベントはどこに通知されてるんだと思い子やら親やらいろいろ見たけどどこにも行ってないっぽい。

「こいつがイベントを受け取ってないなら、どっかで受け取ってるビューがいるはず」と思い込んでしまい、そいつを探しはじめてハマってしまった。

transitionWithViewからanimateWithDurationに変えてみる

結果同じ。

UIResponderじゃなくてUITapGestureRecognizer使ってみる

てっきりUIResponderが悪いと思っていたので、recognizer作ってイベント貼ってやれば通知来るだろうと思ったけど来なかった。これ結構がっくりきた。

UIViewAnimationOptionsのドキュメントもっかい見た

UIViewAnimationOptions ここ

struct UIViewAnimationOptions : OptionSetType {
    init(rawValue rawValue: UInt)
    static var LayoutSubviews: UIViewAnimationOptions { get }
    static var AllowUserInteraction: UIViewAnimationOptions { get } // <- あっ
    static var BeginFromCurrentState: UIViewAnimationOptions { get }
    static var Repeat: UIViewAnimationOptions { get }
    static var Autoreverse: UIViewAnimationOptions { get }
    static var OverrideInheritedDuration: UIViewAnimationOptions { get }
    static var OverrideInheritedCurve: UIViewAnimationOptions { get }
    static var AllowAnimatedContent: UIViewAnimationOptions { get }
    static var ShowHideTransitionViews: UIViewAnimationOptions { get }
    static var OverrideInheritedOptions: UIViewAnimationOptions { get }
    static var CurveEaseInOut: UIViewAnimationOptions { get }
    static var CurveEaseIn: UIViewAnimationOptions { get }
    static var CurveEaseOut: UIViewAnimationOptions { get }
    static var CurveLinear: UIViewAnimationOptions { get }
    static var TransitionNone: UIViewAnimationOptions { get }
    static var TransitionFlipFromLeft: UIViewAnimationOptions { get }
    static var TransitionFlipFromRight: UIViewAnimationOptions { get }
    static var TransitionCurlUp: UIViewAnimationOptions { get }
    static var TransitionCurlDown: UIViewAnimationOptions { get }
    static var TransitionCrossDissolve: UIViewAnimationOptions { get }
    static var TransitionFlipFromTop: UIViewAnimationOptions { get }
    static var TransitionFlipFromBottom: UIViewAnimationOptions { get }
}

あっ

UIView.transitionWithView(self, duration: 1.0, 
  options: [.TransitionCrossDissolve, .AllowUserInteraction], 
  animations: { () -> Void in
    self.alpha = 1
  },
  completion: nil
)

これでいけた(.TransitionCrossDissolveは元から渡してた)

反省

ドキュメントを読みましょう

メソッドにoptionとか渡してたらまずそこを見ましょう

反省します。

さよなら2015年

あんまりテレビが面白く無いのでTwitterの全ツイート履歴を見ながら1年を振り返ってみる。

ちなみに月ごとのツイート数はこんな感じ。

f:id:hiragram:20151231200646p:plain

←1月           12月→

1月

初めて自宅にサーバーを置いた。

アニメ録画環境を作った。

2月

21歳になったけどTwitterで全く言及してなかった。

仕事の表目標とプライベートの裏目標を立ててたんだけど、どっちも未達のまま22歳になりそう。

3月

Swift書き始めた。

仕事もほとんどPHPからObjective-Cに変わってたと思う。

4月

初めてクラブイベントに行った。

秋葉原のMOGRAに連れて行ってもらった。

5月

Twitter Flock Tokyoに参加。

初めてデベロッパーカンファレンスみたいなのに参加した。

Twitterの財力にびびった。

6月

社員旅行で北海道に行った。

今回は救急搬送されなかった。

7月

自作のSwift製UIライブラリをGitHubに公開したりした。

8月

初めてYAPC::Asiaに参加した。

9月

一般道で東京から仙台までドライブした。

10時間かかった。

もともとご飯たべる予定で集まったメンバーでいきなり頭悪い旅行をしてしまったけど楽しかった。

10月

デレステのスクショ解析するアプリを作り始めた。

まだ完成してない。

11月

ついにCharlotteを見た。はまった。

12月

港区から埼玉に引っ越した。

家賃が4万さがった。

総括

正直上半期の出来事は全然覚えてないというか、記憶に残るような出来事が全然なかった気がする。 エンジニアとしては、初めてライブラリをOSSにしたり、外部の勉強会とかカンファレンスとかに行きまくったりして、インターネットぽいエンジニアにつま先浸かった感じなので、来年はどっぷり浸かれるようにがんばりたい。

2016年の抱負みたいなのも考えてるけど、それは年明けにでもまとめようと思う。

僕の中のすてにゃん

僕とすてにゃん

この記事は、すてにゃん Advent Calendar 5日目 の記事です。すてにゃんまじごめん。

みなさんはすてにゃんを知っていますか?

すてにゃんというのは猫のことなんですが、僕は最初プログラマの人間だと思っていました。

今日は僕の中のすてにゃんの印象の変遷をつらつらと書いていこうと思います。

すてにゃんを知った日

これからのエンジニアとしての自分 - すてにゃんのガチ勢日記

確かこの記事だったと思う。当時はブログの名前が違ったような。

Twitterに流れてきたのをみてたまたま読んで、僕と同い年(か1個違い?)であること、帰国子女っぽいこと、文章を書くのが上手いことなどがわかった。

あと、

開発が終了するのはユーザーが完全に満足したときです

このフレーズが激刺さりしたのを覚えています。

「アメリカに留学してるめっちゃ頭いい人」という印象がこの時形成されました。

Twitterフォローしたのはこの時?あんま覚えてない。

すてにゃんと会った日

すてにゃんとTwitterで繋がって数ヶ月、YAPC::Asia Tokyo 2015が開催され、すてにゃんと初邂逅を果たすチャンスがやってきた。

一番でかいホールで、遠目にすてにゃんの姿を確認。

ぼく「つよそう」

なんだろう。何を喋ったかあまり覚えてないけど、「はてな強い」っていう話をした気がする。気がする。

すてにゃんは背がでかい。

今の僕の中のすてにゃん

すてにゃんははてにゃんで、外から見てもとがった人の多いはてな勢のなかでも一際異彩を放っている感じがします。

個人的にちょろっとScalaに興味がでてきたお年ごろ(主に関数型プログラミングの文脈で)なので、Scalaにゃんにいろいろ教えてもらえたらなと思ってます。

開発が終了するのはユーザーが完全に満足したときです

開発が終了するのはユーザーが完全に満足したときです

開発が終了するのはユーザーが完全に満足したときです

これ強烈すぎん?

超カッコええやんな

なんかアドベントカレンダーめっちゃ遅れたのもあってめっちゃすてにゃんヨイショになってしまった感あるけど堪忍な

ユーザーが満足してどっか行っちゃわないように、常にワクワクを提供できるエンジニアになりたいなあと、自分を振り返り見つめるきっかけになったフレーズでした。

なんか勉強会とかで会う機会あったらまた挨拶したいぞ〜

よろしゅうな〜

近況(8月~)

仕事がいろいろ変わって(not転職)、SwiftiOSアプリを作り始めました。これまでは既存のObjcなアプリをメンテナンス&機能追加していくような感じでしたが、今度はゼロから全部をひとりで。めちゃめちゃ周りの力を借りながらやってます。

Apple Watch買いました。良いです。1日だけ裸で使ったけど、普段腕時計をしないのでうっかりぶつけまくりでやばいと思ったのでSpigenのGショックみたいなケースを買いました。画面保護フィルムもついてるし現状良いです。

facebook辞めたい。友達かもみたいなところに弟が出てきたし。Twitter黒歴史クリーナーみたいに過去の投稿をゴリゴリ消すスクリプトを書いたりしたんだけど、どうやら投稿したアプリからじゃないと消せないっぽい。やめて欲しい。

引っ越しを迷っている。今年の年末で部屋が更新になるので、更新するかどうか。もうちょっと都心から離れて、車買いたい。けど今のところ普通に気に入ってる。うーむ。

そんなかんじ。

YAPC::Asia2015のトートバッグに書いてあるコードをいじいじする #yapcasia

どうもどうも。1日に2度ブログを書くのは初めてです。

YAPC::Asia 2015のお土産でみんなもらったトートバッグにPerlのprint文が書いてありますよね?

f:id:hiragram:20150820224732j:plain

おみやげの内容については、さっき僕が書いた記事を御覧ください。

YAPC::Asia 2015のお土産を紹介するぞー #yapcasia

YAPCにいる最強のPerlプログラマのみなさんはおそらく実行するまでもなく出力を読み取ることができたんだろうなあと思うんですが、僕はPerl力が無いので得体のしれないコードを無防備に実行してしまいました。すみません。

さて、トートバッグに書いてあったコードはこんな感じです。

print 115.117.112.112.111.
114.116.101.100.32.98.
121.32.76.105.118.101.
115.101.110.115.101.32.
73.110.99.46.10;

これらのピリオドで連結された数字一つ一つがアスキーコードで、それぞれがアルファベット1文字に対応しています。

アスキーコードについてはWikipediaを。

ASCII - Wikipedia

ほかにも色々試してみた。

#!/usr/bin/perl

use strict;
use warnings;

print 115.117; # -> 115.117
print "\n";

print 115.117.112.
112.111.
114.116.101.100; # -> sup112.111rted
print "\n";

print 115 . 117 . 112 . 112 . 111; # -> 115117112112111
print "\n";

print 192.168.0.1; # -> �
print "\n";

結合する数字が2つだと小数点、スペースが入ると文字列結合とみなされる。

以下のコードで任意の文字列が表示されるYAPCトートバッグが作れるはずです。

#!/usr/bin/perl

use strict;
use warnings;

my $message = $ARGV[0];
my @ascii = unpack("C*", $message);
print "print ". join('.', @ascii). ";\n";

引数に文字列を渡します。

$ perl yapc.pl "にっこにっこにー♪
あなたのハートににこにこにー♪
笑顔届ける矢澤にこにこー♪
にこにーって覚えてラブにこー♪"
print 227.129.171.227.129.163.227.129.147.227.129.171.227.129.163.227.129.147.227.129.171.227.131.188.226.153.170.10.227.129.130.227.129.170.227.129.159.227.129.174.227.131.143.227.131.188.227.131.136.227.129.171.227.129.171.227.129.147.227.129.171.227.129.147.227.129.171.227.131.188.226.153.170.10.231.172.145.233.161.148.229.177.138.227.129.145.227.130.139.231.159.162.230.190.164.227.129.171.227.129.147.227.129.171.227.129.147.227.131.188.226.153.170.10.227.129.171.227.129.147.227.129.171.227.131.188.227.129.163.227.129.166.232.166.154.227.129.136.227.129.166.227.131.169.227.131.150.227.129.171.227.129.147.227.131.188.226.153.170;

確認します。

$ perl -e "print 227.129.171.227.129.163.227.129.147.227.129.171.227.129.163.227.129.147.227.129.171.227.131.188.226.153.170.10.227.129.130.227.129.170.227.129.159.227.129.174.227.131.143.227.131.188.227.131.136.227.129.171.227.129.171.227.129.147.227.129.171.227.129.147.227.129.171.227.131.188.226.153.170.10.231.172.145.233.161.148.229.177.138.227.129.145.227.130.139.231.159.162.230.190.164.227.129.171.227.129.147.227.129.171.227.129.147.227.131.188.226.153.170.10.227.129.171.227.129.147.227.129.171.227.131.188.227.129.163.227.129.166.232.166.154.227.129.136.227.129.166.227.131.169.227.131.150.227.129.171.227.129.147.227.131.188.226.153.170;"
にっこにっこにー♪
あなたのハートににこにこにー♪
笑顔届ける矢澤にこにこー♪
にこにーって覚えてラブにこー♪

これでトートバッグも作り放題です。

Twitterもよろしく

YAPC::Asia 2015のお土産を紹介するぞー #yapcasia

今日前夜祭でした。明日からが本番です。

id:y_uukiさんのブログ論、とてもおもしろかったです。

僕は個人スポンサーチケットで参加したので、スポンサー特典も含めて頂いたノベルティを紹介しますー。

トートバッグ

YAPC::Asiaの缶バッチもついてます。

f:id:hiragram:20150820224729j:plain

Perlのprint文がべろべろ書いてある。気になる人は自分で実行してみてください。

追記: 記事書きました YAPC::Asia2015のトートバッグに書いてあるコードをいじいじする #yapcasia

f:id:hiragram:20150820224732j:plain

イベントパンフ

と、タイムテーブル。

f:id:hiragram:20150820224736j:plain

クリアファイル

ステーションメモリーズ

モバイルファクトリーさん。実はこれ貰ったの2枚め。

f:id:hiragram:20150820224822j:plain

pixiv/岸田メル

裏には「お絵かき楽しす」って書いてありました。

f:id:hiragram:20150820224809j:plain

アカツキさん

「ゲームには世界を変える力がある」かっこいい

f:id:hiragram:20150820224813j:plain

Tシャツ

茶色Tシャツ(一般)

両面プリント。背番号はみんな10です。

f:id:hiragram:20150820224754j:plain f:id:hiragram:20150820224758j:plain

赤Tシャツ(個人スポンサー)

鮮やかな赤です。何日目にどっちを着て行こうか迷う。 こちらは背面はプリント無し。

f:id:hiragram:20150820224819j:plain

パーカー(個人スポンサー)

着る季節はもう少し先ですが。

f:id:hiragram:20150820224801j:plain

シンプルかつキャッチーで素敵です。

f:id:hiragram:20150820224804j:plain

タンブラー(個人スポンサー)

アルミ製のタンブラー。YAPC::Asia TOKYO 2015と刻印されていてめっちゃかっこいい。

会社の机に置こう。

f:id:hiragram:20150820224739j:plain

ステッカー/企業チラシなど

いろいろ。

f:id:hiragram:20150820224816j:plain

ステッカーは他にも。 YYCは予想外でしたよmixiさん。

f:id:hiragram:20150820224742j:plain

その他

サイリウム

なんでw

f:id:hiragram:20150820224745j:plain

Seesaaさんの手ぬぐい(?)

長い薄い布が入ってたけど手ぬぐいであってるのか

f:id:hiragram:20150820224749j:plain

シャノンさんの付箋と@typeのウェットティッシュ。

f:id:hiragram:20150820224751j:plain

おいしかったです。

f:id:hiragram:20150820224726j:plain

明日からが本編

今日も夜なのにわざわざビッグサイトまで人が集まってすごい熱気でした。

実は今年YAPC初参加で、今年で最後なのが非常に残念ですが、楽しみたいです。

Twitterもよろしく