The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

MacBook Proの電源アダプタ

MBPを会社と家で使っている場合に、ただでさえMBPが重いのに電源アダプタまで持ち帰りたくないですよね。 ですが、純正の電源アダプタ(85W)を買うと8000円もするわけです・・ そこで色々探してよさげだったのがAnker PowerPort Speed PD 60です。 出力は60W…

SwiftUIのViewで条件によってViewを出し分ける方法

potatotips #64でLTした内容です。 SwiftUIのViewで条件によってViewをだしわけたいことがたまにあるかと思います。 SwiftUIでこのように条件によってViewを出し分けるようなコードを書いてみます。 var body: some View { if imageName.isEmpty { return Te…

アプリのDark ModeをOFFにする

既存のアプリでいきなりダークモードに対応するのは大変です。 しかしXcode11でビルドするとデフォルトでダークモードが適用されてしまいます。 もちろんダークモードをOFFにすることは可能となっています。 アプリ全体でダークモードをOFFにする方法 Info.p…

Nimbleでtupleの比較

Nimbleでtupleをequal()で比較してもコンパイルに通りません。 let tuple = (1, 2) expect(tuple).to(equal((1, 2))) 原因 これはtupleがEquatableではないからです 対策 これはどうしようもないので以下のようにequalを使わずに回避するしかなさそうです ex…

ERROR ITMS-90784

2019/6/28ころから急にAppStoreConnectにipaをアップロードするときに以下のエラーがでるようになった ERROR ITMS-90784: "Missing bundle name. The Info.plist key CFBundleName is missing or has an empty value in the bundle with bundle identifier '…

flutter doctorのエラーの解決方法 Verify that all connected devices have been paired with this computer in Xcode

このようなエラーがでてbrew xxxをしても解決しない場合 [!] iOS toolchain - develop for iOS devices (Xcode 10.2.1) ✗ Verify that all connected devices have been paired with this computer in Xcode. If all devices have been paired, libimobilede…

@propertyDelegateと@propertyWrapperの違い

2019/06/25 現在の情報 Swift EvolutionのProperty Wrappersを見ると@propertyWrapper ですが、 AppleのドキュメントのStateを見ると @propertyDelegateになっています。 state 原因 仕様策定段階で名前が変わった 詳細 ここに書いてあるように最初はpropert…

6.5インチ用のスクリーンショットの必須化

2019年3月27日からは6.5インチ用のスクリーンショットも必須になったようで、AppStoreConnectで申請時に設定しないと審査に出すときにエラーになるようになっていました。 iOS 12.2 SDKを含むXcode 10.2にアップデートして、Appをビルドしてください。2019年…

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)はなぜnanosecondではなくsecondになるか

あんまり気にしてる人はいないかもしれないですが、普段何も考えずに DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) を使っているとdeadline: DispatchTime はsecond単位っぽく感じるかもしれないですが、nanosecondです。 DispatchTime DispatchT…

2018振り返り

2018年の振り返りです。 仕事 5月からコネヒトに出向することとなり、またiOSエンジニアのカムバックしママリのiOSアプリを開発しています アウトプット 今年は去年よりは少し子育てに余裕ができたのでアウトプットを少しすることができました。 gitのhookを…

gitでHEADの代わりに@を使う

いままで@派をあまり見かけたことがないので、もしかして認知度が低いのかな・・と思い今更感がすごいことを書いておきます。 ドキュメントに書いてあるように HEADって打たなくても@(アットマーク)で代用できます。 @ alone is a shortcut for HEAD. Git …

SwiftのDictionaryのsubscriptとupdateValueの違い

SwiftでDictionaryの値を追加、変更するのに2通りのやりかたがあります。 ひとつはsubscript、dict["key"] = "value" もうひとつはupdateValue、dict.updateValue("value", forKey: "key") です。 どちらを使ってもDictionaryの値を変更できますが、微妙に…

Xcode10で地味にInterfaceBuilderで変わっているところ

UIの追加 Xcode9までは右下に出ていたのが、Xcode10だと右上の方にあるボタン(○の中に□のボタン)を押すと出てくるようになりました。 Xcode9 Xcode10 Image Literal Xcode9だと画像名を入力すると補完されていましたが、Xcode10だとやり方が変わりました X…

git2.19以降のbranchのsort

gitの2.19がリリースされました Highlights from Git 2.19 | The GitHub Blog 個人的な目玉機能はbranchのsortが楽になったという点です。 git branch --sort=-authordate とすると更新日順にbranchが表示されます。 更に git config --global branch.sort -…

Horizontal StackViewで左寄せにする

横方向のStackViewを普通に使うと余白は詰められて横幅いっぱい使うようになってしまいますが、たまに左寄せにしたい(右に余白を開けたい)場合があります。 そんなときはこのように空のViewを一番うしろに突っ込んでやることで解決できます。 let spacerVi…

RxSwiftのVariableとBehaviorRelayとBehaviorSubjectの違い

動機 RxSwiftのVariableがdeprecatedになったということで、その代わりとしてBehaviorRelayに置き換えようと思ったときに、BehaviorRelayに単純に置き換えてよいのか?BehaviorSubjectもあるけどこっちはどうなんだっけ?という視点で調べてみました。 結論 …

linuxでSwiftのObjCBool.boolValueを呼ぶとerror

不具合 SwiftでObjCBoolのboolValueをこのように呼び出すと var isDir: ObjCBool = false let isExist = fm.fileExists(atPath: directory, isDirectory: &isDir) XCTAssertTrue(isDir.boolValue) osxだと大丈夫だけどlinux環境だとerrorになる・・ error: v…

electron-vueのproductionビルドで気をつけるところ

electron-vueでアプリを作ってみて、npm run devで開発環境で動かしたときは動いたけど、npm run buildで本番向けにビルドしたときは動かないみたいなことがちょいちょいあったので、それの対応方法です。 ファイルが見つからない productionビルドの場合はw…

Electronに見えないwebviewを埋め込んで処理させる

すでにWeb版が存在してるけどショボいのでネイティブアプリでいい感じにしたいときがあったりすることもあります。 これを、Electronで作ったネイティブアプリの画面上に見えないwebviewを置くことで実現します。 方法 見えないwebviewの埋め込み Electronア…

MacでIEとEdgeのテスト環境をつくる

MSからVirtualBoxのイメージが配布されているのでそれを使います。 1. VMのダウンロード ここからVirtualBox用のVMをダウンロード 2. VMの起動 1でダウンロードしたzipを回答すると MSEdge-Win10というフォルダ内にMSEdge-WIn10-disk001.vmdkとMSEdge-Win10.…

Prettierで.vueをフォーマット

Prettierのv1.10でVueのsingle file componentをformatできるようになりました。 それまではeslintででたエラーを人手でポチポチ直してたのでこの辺りが自動化できるのは最高です。 やることはすでにprettier導入済みであれば*.vueを対象のファイルにいれる…

ReactでESCキーを押したときにモーダルを閉じる

このようにdivにonKeyDownをつけた場合、キーを押してもonKeyDownは呼ばれません。 <div onKeyDown={this.onKeyDown} > tabIndexをつけて要素にフォーカスを持つことができるようにすれば解決します。 <div onKeyDown={this.onKeyDown} tabIndex="0" ></div></div>

SwiftTweets 2018 Winterの資料のまとめ

SwiftTweets 2018 Winterの資料のまとめです。 https://swift-tweets.github.io/2018-winter 発表 どうやってSwiftのOSSをメンテナンスしていくか https://twitter.com/ikesyo/status/954687472369201155 Swift Foundationにコントリビュートする https://tw…

2017振り返り

2017年の振り返りです。 仕事 これまで長らくiOSをやっていましたが、4月からフロントエンド担当になりYADOKARIというメディアを開発してます。 React.jsとかVue.jsを使ったりしてますが、ES6時代だとそんなにJavaScriptについての学習コストがかからないの…

Vue.js Tokyo v-meetup #6 資料まとめ

v-meetup #6の資料のまとめ イベントページ Vue.js Tokyo v-meetup #6 - connpass 資料 speakerdeck.com docs.google.com github.com docs.google.com speakerdeck.com

potatotips #44 iOS資料まとめ

Togetter togetter.com 資料 speakerdeck.com speakerdeck.com speakerdeck.com speakerdeck.com WkWebViewのキャッシュについて調べた from firewood www.slideshare.net speakerdeck.com speakerdeck.com speakerdeck.com

Jestで環境変数を設定する

JestでテストするときにwebpackのDefinePluginなどで環境変数をセットしている場合、テスト時にもセットしたいときがあります。 package.jsonのjestのところにglobalsを追加することで設定できます。 Configuring Jest · Jest EXAMPLE package.json "jest": …

ルートVueインスタンスのプロパティ

こんな感じにroot Vue instanceのpropsを使って初期値とかを与えたい場合があったりします。 html <div id='root' props='initial-value'> javascript const vm = new Vue({ el: '#root', props: ['initialValue'], data: { value: '', }, beforeMount: function() { this.value = this.initialVal</div>…

slackのbotでmentionが飛ばせなくなった対応

9/11からslackのusername指定が使えなくなりました。 A lingering farewell to the username | Slack これにより、botなどでユーザーにメンション飛ばしていた場合にusernameを使っているとmetionが飛ばなくなります。 対応方法 <@username>を<@userID>に変…

Markdown Night 2017 Summer 資料まとめ

Markdown Night 2017 Summerの発表資料のまとめです。 イベントページ connpass.com ハッシュタグ twitter.com 資料 なぜMarkdownは拡張されるのか Markdownはなぜ拡張され続けるのか | bitjourney Kibela esa Markdownの思想とデザイン esa-pages.io Markdo…