LINEで二段階認証が通らなくなった時の対処

結論から言うと、問い合わせましょうという簡単な話。
だから焦ってアカウント削除しないように!!!
大事なあの子の連絡先は失なわずに済みますから!!

自分のケースでは、修理に出すためにiPhoneをリセットしたのがキッカケです。
修理から戻ってきて、データ復元してLINEアプリを起動すると「本人確認が必要」という画面が表示されました。
はいそうですかと手続きを進めてもエラーで上手く行きません。
LINEへの問い合わせの結果、「一時対処」ということでサポートに対応してもらう事で解決しました。

しかし納得行かないのは、理由の説明も謝罪の言葉も無かった点。
もしかして引き継ぎ設定せずにiPhoneをリセットすると、毎度問い合わせないといけないのか?
メールも定型文貼り付けただけみたいだし、ラーメン屋でインスタントラーメン出された気分です。

続きを読む LINEで二段階認証が通らなくなった時の対処

React Nativeでリリースビルドが起動しない問題の解決法

React Nativeを使ってiOSアプリを開発していて、TestFlightで配信しようとした時に問題にぶち当たった。

起動直後に落ちる

配信されたアプリを起動するとすぐにクラッシュしてしまう。
クラッシュレポートも上がってこないから、何が起こったのか分からない。
まるでProvisioning Profileの有効期限が切れた時のような挙動。
しかし、Code SigningやProvisioning Profileの設定は正しい。
そもそも間違っていればTestFlightで配信できないから。

原因1: ダイナミックなクラス名参照を実装している

続きを読む React Nativeでリリースビルドが起動しない問題の解決法

自分が実際やってみて成長できたなぁと思うこと

アプリを一人で作りたい人向けです(たぶん)。
あくまで個人的にやってよかったと思うことなので、参考まで。

OSSプロジェクトをフォークしてアプリを作り始める

フルスクラッチでアプリやサービスを作ろうとしているなら、自分の好きな技術スタックと共通している(出来るだけ著名な)OSSプロジェクトをフォークして始めるのはオススメです。
OSSのソースコードをなんとなく読むよりずっと学習効率がいいからです。
実用されてある程度くすんだものは、実際的なノウハウがより沢山詰まっています。
これは開発効率というよりは、盗める質と量が多いアプローチかもしれません。

一つやる際の注意点です。
要らないコードが沢山入っている状態から始めることになりますが、それらを削除するのは後にしてください。
実装に困った時の参考にするためです。
充分に身についたと思ったら、一気に削除しましょう。

続きを読む 自分が実際やってみて成長できたなぁと思うこと

デッサン会@原宿

例によってiPad Pro + Apple Pencilで参加。
だいぶ慣れてきた。
ペンの種類を鉛筆からインクにしたらかなり描きやすくなった。

前半は参加者の中から一人ずつモデルを選んで10分間ポーズを取ってもらって描く。
後半はあらかじめ決められていたダンサーの方だった。
実はこちらのMVに出ているハラサオリさん。

今日はこのMVと全く同じ髪型で紅色のワンピースだった。
来月からドイツの方へ行かれるとのこと。
ダンスでドイツに行くって凄いね。想像できない。

彼女を描いていて、ものすごく心が静かになっていくのを感じた。
人前に出慣れているからなのかは分からないけど、大勢の人から見られているのに微塵も心の揺れを彼女から感じない。
終始落ち着いた表情で、まばたきもゆっくり瞼が閉じて開く動作をする。
誰にどう思われるのかなんて意に介さない、そんな姿勢だった。

そんな彼女を見ていて、なぜか勇気づけられた。
不思議なことに、自分はこれでいいのだ、と思えてきた。
今日はとてもいいエネルギーをもらった。

人ってじっとしているだけでもこんな風に影響を与えられるんだな。
陰ながら応援します。

zshからfishに乗り換えた

なんか自分のzshが重い。
ターミナル立ち上げてコマンドが打てるようになるまで1秒ぐらいかかる。
おおかたoh-my-zshあたりが余計なことをしているんだろう。
これは設定を見直す必要がある。
ところで、fish shellというやつが前から気になっていた。
せっかくだし、これに乗り換えてみることにした。
fishの良さは検索すれば山ほど出てくるので割愛する。

自分の環境は以下の通り:

  • OS: macOS Sierra
  • ターミナルエミュレータ: iTerm2
  • 配色: Solarlized Dark

個人的な作業記録なので「ふーん」ぐらいの感じで読んで欲しい。

続きを読む zshからfishに乗り換えた

プログラミングを英語で教える会に参加してみた

こういうことをボヤ〜っと考えていて、知り合いの外国人に聞いたりしていたんだけどなかなか見つかっていなかった。
んで、meetup.comをフラフラと閲覧していたらこんなコミュを発見。

自分のために作られたんじゃないかというぐらいにドンピシャ。
という訳で脊髄反射で参加ボタンを押してさっそく行ってみた。
参加料は無料。

会場はカフェのように綺麗なSHIFTBRAINさんのオフィス。
10人弱が集まった後、ホストの人が英語話者に何が学びたいかをヒヤリングした。
ジャックというイギリス人がiOSを学びたいというので、自分が教えることに。

彼はUXデザイナーで、画面をSketchで描けるようだ。
プログラミング知識はHTMLが少し書ける程度。
なので、まずはXcodeのStoryboardでボタンなどのコントロールをいろいろ配置する所から教えてみた。
次に、ボタンをSwiftでプログラマティックに配置する方法を教えた。
自分も最近はSwiftを全然書いていなくて忘れていたけど、適宜復習しつつ教えた。
最終的にはTable Viewでダイナミックにデータを表示できるところまで行けた。

2時間という短い時間だったけど、ジャックもiOSプログラミングの雰囲気を掴めたようだ。
自分の英語はカタコトだったけど、意外と通じるもんだなぁと思った。
自分のアプリのユーザサポートを外国人相手にやっていた経験がかなり助けになったと思う。

でもヒヤリングが絶望的な事を再認識した。
単語同士の音がつながると全く聞き取れない。
普段から耳を慣らす対策が必要だ。

あとジャックが彼のiPhoneのことを「My friend」と呼んでて面白かった。
“Where is my friend?” みたいな。
最初何のことかさっぱり分からなかった。笑

楽しいmeet upイベントなので定期的に参加したいな!

ES6でクラス名を動的に変更する方法

ES7のdecoratorsでクラスを生成するとクラス名がそのデコレータのものになってしまいます。
例えば:

import React from 'react'

function addAwesomeProperty (Spec, Component = Spec) {
  class AwesomeClass extends React.Component {
    render () {
      return React.createElement(
        Component,
        Object.assign({ awesome: 'yes!' }, this.props)
      )
    }
  }
  return AwesomeClass
}

@addAwesomeProperty
class OriginalClass extends React.Component {
  ...
}

こうすると生成後のクラスの名前は AwesomeClass になってしまいます。これは不便。
だからといってクラス名を以下のように変えようとしても出来ません:

AwesomeClass.name = 'OriginalClass'

なぜなら name プロパティは writable ではないからです:

Object.getOwnPropertyDescriptor(AwesomeClass, 'name')
    { value: 'func',
      writable: false,
      enumerable: false,
      configurable: true }

しかしES6の仕様によると以下の方法で変更できるとの記述を見つけました:

> Object.defineProperty(func, 'name', {value: 'foo', configurable: true});
> func.name
  'foo'

という事は、前述の例を以下のように修正すればクラス名に影響を与えずに済みます:

import React from 'react'

function addAwesomeProperty (Spec, Component = Spec) {
  class AwesomeClass extends React.Component {
    render () {
      return React.createElement(
        Component,
        Object.assign({ awesome: 'yes!' }, this.props)
      )
    }
  }
  // 追加
  Object.defineProperty(AwesomeClass, 'name', { value: Component.name, configurable: true })

  return AwesomeClass
}

まぁ、これが設計として正しいのかは謎です。

蛇足

動的なクラス名を定義する方法として、

const classes = { [ dynamicClassName ]: class { ... } }
classes[dynamicClassName].name  // => dynamicClassName

みたいな方法もあるみたいだけど、自分の環境では常に _class となって上手く行かなかった。
自分のbabelの設定が悪いのかもしれないけど。