hiragram no blog

iOSとか

英語学習を初めて2ヶ月経ったのでやってることとやめたことを書く

私は英語チョットデキルになりたいので、そのためにチョットがんばることにしました。 去年の12月らへんからいろいろ始めて、だいたい2ヶ月くらい経ったので、やってることとかやったけどやめたこととか書く。

やってること

エンジニアが0から英語を勉強する為にした事 に多大な影響をうけた。

DMM英会話

http://eikaiwa.dmm.com/

DMM英会話以外のオンライン英会話は試してないので、的外れだったらごめんなさい。

やってる中で一番英語っぽい活動はこれ。まだ始めて2週間くらいだけど、めっちゃ楽しい。 月5000円で1回25分のレッスンを1日1回受けられる。無料体験が2回分ついてるのでとりあえずやればいいっす。

これは主観ですが、ITのエンジニアみたいな仕事してる人は多分日本人の一番英語できない層よりは100倍くらい英語できると思います。 DMM英会話の講師の方々は、我々よりも100倍英語できない人たちに教えるの慣れてる(と信じてる)ので、臆すること無く突っ込んでいって、そして大爆死しましょう。僕はしました。

弊社技術顧問のまつもとゆきひろさんも、DMM英会話を体験しています。


まつもとゆきひろ、初めてのオンライン英会話を体験【DMM英会話】

僕は勝手に社内でDMM英会話エバンジェリストを自称して騒いでるんですが、うまく乗せて始めさせた2人のエンジニアは既に無料枠を使い切り月5000円払ってレッスンを受けています。

DMM英会話はかなり自由度が高い印象で、テーマを指定しないフリートークだったり提供される教材を使ったレッスンだったり選択肢が広いです。

今までに僕がやったレッスンの内容は

  • フリートーク
    • こちらからガンガン話せないうちはあんまりおすすめしない。初回にこれやって普通につらかった。
  • 自己紹介の練習
    • 自身のこと、仕事のこと、住んでる場所のことなど。
  • 瞬間英作文
  • Dainy news / Daily news for beginners
    • http://eikaiwa.dmm.com/beginnerdailynews/
    • DMMが毎日更新するニュース記事を朗読したり、質問に答えたりする。
    • for beginnersがあるのを知らないで難しい方やっててつらい思いをした。それ以来簡単な方やってる。

こんな感じ。他にも教材めちゃめちゃあるので、自分に合ったのを探せばいいと思います。 http://eikaiwa.dmm.com/material/

個人的には、英会話初めての人には瞬間英作文の一番最初からやるのおすすめ。This is a penレベルからできるので、「とりあえず音を出す」ことに慣れるのにちょうどいい。

同じ音声を何度も聞く

いろんなのをめちゃめちゃ聞くって言うよりは、おんなじのを何度も何度も聞くのがいいと思う。 よく聞いているのは、

特にRebuildの方は、二人が対談している音声なので、生の会話という感じがしてよい。 あと文字起こしが非常に秀逸。"You know,"とか"I mean,"みたいな「いや、」「えっと、」みたいなキャッチしなくていい単語は文字起こしに無いので、「無視していい部分」がわかるようになりました。会話の端々に"you know"って言われて「俺いまなんか聞かれた?」と混乱しなくて良くなります。 文字起こしに出てきた知らない単語はそのままiPhoneの辞書でしらべてQuizletに登録。

書く

流石にコード書くだけで英語書けるようにはならないので、英文を生み出す作業も意識してやっています。 例えばライブラリの挙動がようわからんときにIssueを立ててみたり、サービスの使い方がわからんときにサポートにチャットを投げてみたり。 直近ではAppseeのサポートの人とかなり長くやりとりをしました。どういうふうにインストールしたか、どういう実装か、他にどんなライブラリが入ってるか、みたいなのをうまく説明する英文を書くのはとても勉強になります。 テクニカルな文脈だと普段の英語学習で触れないような長い単語とかに触れるので、エンジニアとしてはここのスキルも伸ばしておきたい。

Siriを英語にする

Siriで発音チェックできる。 発音記号どおりの綺麗な発音じゃなくても結構聞き取ってくれるので、「これくらい雑でも通じるもんだな」という感覚を得られる。 逆に、Siriでも拾えないとなるとやべえぞという感じ。 1単語だけだといけるけど、文章になるととたんに認識しなくなる、みたいなのはよくあると思う。 僕はもともとSiriをよく使う習慣があったので、いい発音練習の機会になってる。

  • Turn on all alerms(めざまし全部オンにして)
  • Wake me up at 8 tomorrow(明日8時に起こして)
  • How is the weather today(今日の天気は)

みたいなかんじ。

やったけど今はやってないこと

海外のペンパルを作る

冒頭で紹介したブログにもあった、「海外の友達とチャット」みたいなのはちょろっとやってみたんだけどあんまり続かなかった。 確かに日本人とやりとりしたがる外国人すごいたくさんいるんだけど、時差あるから全然レス返ってこないとか、iPhoneで英文打つのつらすぎるとか、向こうは日本語教わるつもりでくるからやりづらいとか、いろいろ要因があってやらなくなってしまった。

英語でメモを取る

コードを書きながらちょっとした設計を整理しておきたいときとか、走り書きでメモを残すようなときに英語で書くようにしてみた。 中学の時にかっこつけて筆記体の練習しまくってたおかげで、メモを取ること自体そんなに難しくなかった。 狙いとしては、脳内で考えたことを素早く英文で表現することで、結構頭も使うしよい取り組みだったと思う。 正しい英語っていうよりは、より早く言いたいことを表現することを目指してたので、今読み返すと文法が崩壊しすぎている。 頭を使うのであんまり続かなかった。

Macの言語設定を英語にする

これも普段から英語に触れることを目的にやった。 ほぼ困ることは無いんだけど、メニューの項目とかたまに難しいのがいっぱい並んでる時があって、そのたびに単語調べて〜とかやってたのが時間の無駄だった。 頭も仕事をするつもりでいるので、英語学習モードになってない感じがして全然身にならないなと思って半日でやめた。

所感

中学の頃から英語の成績はよかったけど、こと英会話に関してはまったく練習したことが無かったので、最初は脳の負荷が異常に高い感じがしたけど、2週間くらい無理してやってみると意外となんとかなる気がしてくる。

「英語やんなきゃなー」みたいなのはずっと前から漠然と思っていたけど、実際に始めてみると過去の自分はやんなきゃなーとか危機感抱いてるつもりみたいな状態で満足してたんだなあと感じる。明確にやりたいと思ってるならやるだろうと。

とりあえず、

  • DMM英会話無料体験枠をさっさとやる
  • 聞く
  • 書く

やればいいと思います。

Apple Watchにはカバーつけたほうがいい

## Apple Watchめっちゃぶつける

 
これは普段もともと腕時計をつける習慣がなかったのもあると思うけど。
 
狭いところ通りながら壁にこすりつけたり、自販機のおつり取り出しながら強打したりします。いまでもします。
 
購入直後にぶつけまくって、さすがにやばいなと思ってSpigenのラギッドアーマーというGショックみたいになるケースを買いました。
 
現在4ヶ月目に入りましたが、ケースはこんな感じです。
 
f:id:hiragram:20160108132035j:image
 
白いケースが所々黒く汚れてるのわかりますか。
ぶつけまくって角が削れてます。
ボディが裸だったらけっこう傷入ってるのではないか。
 
バンドがスポーツモデルのグリーンで、チープな見た目にこれまたださめなラギッドアーマーの見た目はけっこう気に入ってます。
画面を下にして置いてもガラスが面に当たらないので安心。
 
高価モデルのサファイアガラスなら全然傷つかないのかもしれないけど、安価モデルにはカバー必須ですわ。
 

 

 

 

 

 

Swiftのイニシャライザややこしかったのでまとめた

  • 既定イニシャライザ(default initializer)
    • 引数なし。
    • イニシャライザが1つも定義されておらず、すべてのプロパティの初期値が設定されている時に利用可能になる。
    • ベースクラスの既定イニシャライザは指定イニシャライザとして機能する。
  • 指定イニシャライザ(designated initializer)
    • そのイニシャライザを使うだけでインスタンスの初期化が全て完了できるようなイニシャライザ。
    • サブクラスにおいては、直接のスーパークラスの指定イニシャライザのみ使える。
    • どのサブクラスも、指定イニシャライザを必ず1つ備えている必要がある。
  • 簡易イニシャライザ(convenience initializer)
    • 他のイニシャライザを呼び出して初期化を行うイニシャライザ。
    • 同じクラスの他のイニシャライザを呼び出して利用するが、直接あるいは間接的に指定イニシャライザを呼び出していなければならない。
    • convenienceキーワードがつく

あるクラスの簡易イニシャライザを呼ぶと、スーパークラスのイニシャライザを順番に呼んでいき、ベースクラスの指定イニシャライザが実行された後に自分のクラスのプロパティに値を入れられるようになる。

指定イニシャライザは、スーパークラスのイニシャライザを叩く前に、そのクラスで追加された変数、定数の初期化を済ませていなければならない。

サブクラスのイニシャライザは、スーパークラスのイニシャライザを呼ぶ前に、スーパークラスのプロパティにアクセス出来ない。

イニシャライザは、ベースクラスの変数、定数の初期化が終わるまでインスタンスメソッドやプロパティにアクセスしたり、selfを値として扱ってはいけない。そういう時はタイプメソッドにしましょう。

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にゃんにいろいろ教えてもらえたらなと思ってます。

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

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

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

これ強烈すぎん?

超カッコええやんな

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

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

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

よろしゅうな〜