koogawa blog

iOS、Android、foursquareに関する話題

プログラミングでつまづいてきたこと(koogawa編)

satoru-takeuchi.hatenablog.com

こちらの記事がとても良かったので自分も書いてみます。主にiOSプログラミングの内容です。

元記事の id:satoru_takeuchi さんもおっしゃっていますが、初心者に暴言を吐いてくる人、マウント取ってくる人は無視して良いと思います😇

Stack Overflowで最も多く支持されたiOS関連の質問ベスト10(2019年版)

f:id:koogawa:20191207224439j:plain

どうも、koogawa です。

今年は Stack Overflow の reputation がついに 6,000 を超えました🎉

f:id:koogawa:20191207224726p:plain

そんなわけで、とうとうiOS アドベントカレンダーも最終日ですね! 今年も昨年に引き続き「今年Stack Overflowに投稿されたiOSに関する質問」の中で、Vote数(投票数)が多かった質問、つまり デベロッパーから支持の多かった質問 をまとめてみました。

それでは10位から順に見ていきましょう!

※2019年12月16日(日本時間)時点での情報を元に集計しています

第10位:Xcode 10.2 で iOS 10 未満のシミュレーターを動かそうとするとクラッシュする問題(61票)

stackoverflow.com

さて、今年の第10位に輝いたのはこの質問です。Xcode 10.2 で iOS 10 未満のシミュレーターを動かそうとすると、次のエラーを吐いてアプリがクラッシュするという内容です。

dyld: Library not loaded: /usr/lib/libauto.dylib Referenced from: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation Reason: no suitable image found. Did find: /usr/lib/libauto.dylib: mach-o, but not built for iOS simulator

これはコードベースが Swift の場合のみ発生する問題で、Objective-C では発生しないとのことです。

この問題の原因ですが、結論から言うと Xcode のバグだったようです。

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_1_release_notes

ワークアラウンドとして、/usr/lib/swift ディレクトリをシミュレータのランタイムルートに作成することにより、この問題を回避できるよ!と簡潔に説明した回答がベストアンサーに選ばれていました。

私はこの問題には直面しなかったんですが、質問・回答ともに多くの票を集めていることから、世界中の開発者がこのバグの影響を受けたのではないでしょうか。

第9位:Xcode 11.2 で Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 compiler が出る問題(63票)

stackoverflow.com

Xcode 11.0 でコンパイルされたフレームワーク (今回の例では RxSwift)があり、これは Xcode 11.1 でも問題なくインポートできました。しかし、Xcode 11.2 にアップデートしたところ

Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 compiler

というエラーが出てしまいました。私はこのエラーの対処には慣れており、Xcode 11.2 を使用して RxSwift を再コンパイルすれば解決できることを知っています。しかし、Swift 5.1 の主な機能は「モジュールの安定性」ではなかったのでしょうか?モジュールの安定性が得られたため、フレームワークは新しい Xcode のリリースごとに再コンパイルし続ける必要はないという印象を受けましたが、明らかにそうではありません。このようなことが起こる理由を説明できる人がいればとても嬉しいです。という質問です。

最も多くの票を集めた回答は、

WWDC のビデオ https://developer.apple.com/videos/play/wwdc2019/416/ で説明があるよ!フレームワークのビルド設定で

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

を設定すると、Xcode 11.0(Swift 5.1)を使用してコンパイルしたフレームワークXcode 11.2(Swift 5.1.2)でコンパイルできるようになるよ!

という内容でした。しかし、これでもエラーが発生するというコメントも寄せられ、今現在もベストアンサーには至っていません。

第8位:Xcode 10.1 が iOS 12.2 をサポートしてない問題(66票)

stackoverflow.com

はい、出ました!Xcode x.y が iOS x.y をサポートしてない問題です。数年前からこの企画をやっていますが、この手の質問はホントに毎年出てきます。

今回も DeviceSupport をネットから入手して、

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

にリネームしてコピーすれば解決するよ!という回答がベストアンサーに選ばれていました。(この方法は非公式の解決法なので自己責任で!)

第7位:Xcode 11 の debugger がものすごく遅い問題(68票)

stackoverflow.com

Xcode 11 にアップデートしてから debugger がものすごく遅くなってしまったよ、という内容です。とくにブレークポイントを貼ったときが顕著で、プログラムがブレークポイントに到達すると30秒ぐらい停止してしまうとのことです。

実はこれ、私も感じてました・・!ブレークポイントを貼って、さらに変数の中身を表示しようとするとインジケーターが30秒以上回った状態になるんですよね。

configurations -> Manage schemes -> Edit scheme -> Run -> Diagnostics tab の順に開いて、各チェックボタンを外せば速くなる、という回答がもっとも票を集めていましたが、「解決しない」「そもそも"遅い"ってどういうこと?」というコメントが多数寄せられています。この質問には2019年12月時点でもベストアンサーが選ばれていません。

第6位:iOS13 で UISegmentedControl の色を変える方法が変わってる問題(71票)

stackoverflow.com

iOS 12 までは tintColor で UISegmentedControl の色を変えることができていたけど、iOS 13 から効果がなくなった!という内容です。

たしかに、iOS 12 まではtintColor で色を変えることができました。

f:id:koogawa:20191219220508p:plain

しかし、iOS 13 からは UISegmentedControl の見た目が変化し、色を変えるプロパティとして selectedSegmentTintColor が追加されています。

f:id:koogawa:20191219220525p:plain

このプロパティの使い方や、色を設定する上での注意点について詳しく解説した回答がベストアンサーに選ばれていました。

参考

第5位:iOS 13.2 の WKWebView が謎のエラーを吐き続ける問題(83票)

stackoverflow.com

iOS 13.2 beta をインストールして以来、ずっと次のようなエラーが出続ける問題です。

2019-10-10 12:10:47.867830+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.908698+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.908814+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.934169+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.947668+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.964375+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193556+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193723+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193941+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.194012+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.195679+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.200432+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.207225+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.207298+0200 (...) [Process] kill() returned unexpected error 1 

Storyboard 上の WKWebView を含む ViewController をロードするたびに発生しますが、クラッシュはしないようですね。

実はこの原因は WebKit (またはOS自身)のバグにあるようです。

ちなみに2019年12月現在、このバグはまだ直っていないようです😢

第4位:ダークモードを回避することはできるの?問題(152票)

stackoverflow.com

はい、出ました!ダークモードに関する話題です!

iOS 13 からダークモードが追加されるけど、私は対応する予定はないよ!なんとか回避できない?という質問ですね。このQ&Aを見た方も多いのではないでしょうか!?

Info.plist の UIUserInterfaceStyle に Light を設定すると回避できるよ!という回答がベストアンサーに選ばれていました。しかし、この回答に対するコメントを見ても分かる通り、この回避策だと審査が通らないという声もあります。一番確実なのはダークモードに対応すること、なんでしょうね😅

第3位:Provisioning profile doesn't include 〜 エラーが出ちゃう問題(183票)

stackoverflow.com

第3位はプロビジョニングプロファイルに関する質問でした!

いつものようにアプリを実機ビルドしようとすると、次のエラー出てしまって困っている、という内容ですね。シミュレーターでは起こらないようです。

  1. Automatic signing is unable to resolve an issue with the "LearningSpriteKit" target's entitlements. Automatic signing can't add the application-identifier and keychain-access-groups entitlements to your provisioning profile. Switch to manual signing and resolve the issue by downloading a matching provisioning profile from the developer website. Alternatively, to continue using automatic signing, remove these entitlements from your entitlements file and their associated functionality from your code.
  2. Provisioning profile "iOS Team Provisioning Profile: #####.LearningSpriteKit" doesn't include the application-identifier and keychain-access-groups entitlements.

この原因ですが、結論から言うと一時的なサーバー証明書の問題だったようです。

上記のissueが関連していて、Apple からも 558,000 の証明書が無効になったとアナウンスが出ています。

この問題により、GoDaddy, Google, そして Facebook も影響を受けたようです。

この経緯を簡潔に説明した回答がベストアンサーに選ばれていました。ちなみに、今日現在、この問題は解消されています。

第2位:iOS 13 でモーダルがフルスクリーンにならない問題(286票)

stackoverflow.com

はい、出ました!iOS 13 でのモーダル問題です。

今まで

self.present(vc, animated: true, completion: nil)

のように書けばフルスクリーンでモーダルが表示されたのに、iOS 13 ではセミモーダル(半モーダルと呼ぶ人もいる)になっちゃうよ!どうして?という内容ですね。

「問題」と書いてしまいましたが、これは立派な仕様であり、WWDC 2019 の Platforms State of the Union でもこの新しい Card Presentation について触れられていましたね。

f:id:koogawa:20191223205750p:plain

この経緯とフルスクリーンにする方法について解説した回答がベストアンサーに選ばれていました。

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen // これでフルスクリーンになる
self.present(vc, animated: true, completion: nil)

第1位:Xcode 11.2 にアップデートしたら UITextView でクラッシュする問題(339票)

stackoverflow.com

今年1位に輝いたのはあの UITextView でクラッシュする問題でした!!

Xcode 11.2 にアップデートしてアプリをビルドすると

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named UITextLayoutView because no class named UITextLayoutView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'

というエラーログをとともにアプリごとクラッシュするけどなんで!?という内容です。

この質問には多くの回答、コメントが寄せられ、現在は Highly active question(非常に多くの回答がついたため、これ以上回答が追加されるのが制限されている状態)になっています。

Workarounds について詳しく解説した回答がベストアンサーに選ばれましたが、今現在の最良の解決方法は「Xcode 11.2.1 にアップデートしろ」ということになっています。

総括

ダークモードに関する質問は少なめ

今年発表された iOS 13 の目玉機能の一つとして「ダークモード」がありましたが、それに関する質問は思ったより多くありませんでした。技術的な質問ではなく、ダークモードを回避するにはどうしたらいいの?という質問が第4位にランクインしていたのも興味深いですね。

私が公開しているアプリもダークモードには対応しましたが、特に大きな問題もなくスムーズに進めることができました。このあたりの対応の進めやすさも質問が少なかった要因の一つかもしれませんね。

やはりモーダルの仕様が変わった影響は大きかった?

iOS 13 からモーダルのスタイルがデフォルトでセミモーダルになりましたが、やはりこれに戸惑った開発者も多かったようです。従来のフルスクリーン表示戻す方法についての質問(第2位)は300票近く集めていましたね(昨年の1位より票が多い!)。このQ&Aを参考にした開発者の方も多いのではないでしょうか?

投票数は全体的に増加傾向

投票数は年々減少傾向にあったのですが、今年は久しぶりに増加しました!昨年の1位(Xcode 9.3 から見知らぬ plist ファイルが追加された問題)が123票だったのに対し、今年の1位(UITextView でクラッシュする問題)はなんと300票以上を集めていました。

要因としては、単純に困った人が多かったのと、ダークモードの登場など、インパクトのある変更が今年は多かったからでは?と感じています。

以上、10日間に渡って2019年のランキングをお送りしました!

というわけで、12月1日から始まった iOS アドベントカレンダーも本日で終了です。エントリーされた皆様、お疲れ様でした!

来年もまた需要があればやるかも!?*1

*1:毎年読んでくれている方がいたらぜひコメントください!需要が知りたいです!

宮崎に友達が遊びに来てくれたら連れていきたい場所ベスト5

f:id:koogawa:20191201011858p:plain

宮崎IT関連勉強会 Advent Calendar 2019 の5日が空いていたので埋めてみます (技術と関係ない内容ですみません🙏)

なお、ベスト5、と書きましたが順位に意味はありません。思いついた順です。

では、さっそくいってみましょう!

第5位. 冷や汁が売ってる自動販売

宮崎ではなんと冷や汁自動販売機で買えます!美味いです!そしてちょっと高い!

第4位. 電車と空港が同時に見られる公園

運が良いと電車と飛行機の離陸が同時に見られます!

なかなかレアだと思いますが如何でしょうか?

第3位. フェニックスブルーイング

知人がやっているビールのお店です。IPAペール・エールがオススメです。毎週飲んでます🍺

第2位. The Beach Burger House

海を見ながら食べられるのがGood!インスタ映え間違いなしです!ワシはインスタやらないけど。

第1位. 肉麺 もみじ

最後はここ!本当に美味しいです!シメに「追い飯」を入れて食べるのが最高です。

宮崎中心部にあるので時間があるならぜひ行ってみてほしいです(日曜祝日は休みかも)


明日は、shogo0525 さんの登場です!

「宮崎に住むエンジニアさんに20の質問」に回答してみる

宮崎IT関連勉強会 Advent Calendar 2回目の登場です😁

今回は自分が言い出しっぺでもある「宮崎に住むエンジニアさんに20の質問」に回答してみたいと思います。

ぜひ、他の皆さんも回答して Advent Calendar に記事を書いてみてくださいね!

それでは、さっそくいってみましょう!

Q1: 名前orハンドルネームを教えてください(よければ由来も教えてください!)

koogawa と名乗っております。これは一番最初に入社した会社での社員アカウントから取りました。

Q2: 宮崎ご出身ですか?

いいえ、関東出身です。自然の多いところで子育てするという夢を叶えるため、2年前に東京から移住してきました!

Q3: 宮崎の好きなところは?(場所や食べ物などなんでも)

人混みが少ないところ、自然が多いところ、子どもたちが素直なところ、です!

Q4: 宮崎に住んで不便に感じることはありますか?

Apple Store が無いところ!AirPods Pro のような流行りの製品はまず店舗に置いてません。

Q5: 欲しい技術書はいつもどこで買っていますか?

カリーノのツタヤに意外と売ってます!あとは大体Amazon

Q6. プログラミング以外の趣味や特技があれば教えてください

クラフトビールが好きで、今まで500種類以上のビールを飲んできました🍻

あと、最近はできていませんが、子供が生まれる前はアマチュアバンドでドラムを叩いてました。

Q7: よければエンジニア歴を教えてください

2005年デビューなのでそろそろ15年になるんじゃよ👴

Q8: 好きな言語はなんですか?

Swift, Objective-C, Kotlin

Q9: 苦手な言語はありますか?

VBScript はもう触りたくないです。

Q10: 普段はどこで働いていますか?(オフィス、自宅、コワーキングスペース等)

フルリモートということもあり、働く場所はとくに決まっていません。

複数のコワーキングスペースを契約してまして、働く場所はその日に決める感じです。 雨の日は自宅で作業することが多いです。

Q11: 勉強会やセミナーなどには参加してますか?

Webナイト宮崎という勉強会に運営として参加しています。

東京や福岡で開催されるカンファレンスにも毎年遠征しています。

また、最近では Code for MIYAZAKI というプロジェクトに参加し、行政と絡みながら面白いプロダクトを作っています。

Q12: 普段やられている技術関連の情報収集方法があれば教えてください

情報収集は Twitter がメインです!

以前、地方に住むエンジニアがこの先生きのこるにはという発表したのでよろしければ!

Q13: 好きなエディタを教えて下さい

Xcode, VSCode, Android Studio を交互に使い分けています。

Q14: お気に入りのコード管理ツール、プロジェクト管理ツールがあれば教えて下さい(Git, Backlog, Bitbucket など)

仕事・プライベートともに GitHub が中心ですね!

Q15: キーボードや周辺機器にこだわりはありますか?

Apple 純正のワイヤレスキーボード(M9270J/A)を愛しています。アルミではなくプラスチック製のやつですね。今はもうメルカリなどでしか入手できません。

f:id:koogawa:20191202013214p:plain
https://support.apple.com/ja-jp/HT201186#7

Q16: 尊敬しているエンジニアやロールモデルはいますか?

CTO と呼ばれる人たちは基本的にリスペクトしています。

地方に移住したエンジニアのロールモデルはまだ少ないので、自分がロールモデルになっていけたらいいなと思ってます。

Q17: デスクトップの壁紙はどんな壁紙ですか?

Macについてくる、昼夜の時間帯で変化するやつが気に入ってます。

Q18: 「フラグが立つ」「スタックに積む」「ポインタがずれる」など、ついつい日常会話で使ってしまうプログラミング用語があれば教えてくださいな。

あのお店は UI/UX が良くない、とかついつい使ってしまいます。

Q19: よいエンジニアの条件を3つあげてください。

  • 親切なこと
  • 自走できること
  • 技術が好きであること

Q20: あなたにとってプロフェッショナルとは?

「やりたいこと」を「楽しく」やる人。

誰かの受け売りなんですが、自分の子供に「父さんな、お前たちを守るためにやりたくない仕事を仕方なくやってるんだ」なんて言いたくないですよね。


宮崎IT関連勉強会 Advent Calendar 2019、明日は mather314 さんです!

今後はStack Overflowの質問がupvoteされたときのreputationが倍になります!過去の質問にも適用

こんにちは。Stack Overflow 活動中の koogawa です。もうすぐ reputation が 6,000 を超えそうです。

f:id:koogawa:20191114094704p:plain

今朝、Stack Overflow からこんなメールが来ていたので解説します。

※そもそも reputation, upvote って何?という方はこちらのスライドをご覧ください

今後は質問がupvoteされたときも+10される

今までは自分の質問がupvoteされたとき(つまり、他のユーザーから良い質問!と認められたとき)は reputation が +5 されました。これが今後は倍の +10 になります。

f:id:koogawa:20191114095124p:plain

これまでは「良い回答」に価値が置かれていたのが、今後は「良い質問」にも価値が置かれるようになるというわけですね。この流れはなんか Quora に似てるなーと感じました*1

過去に投稿した質問にも適用

この変更は、過去に自分が投稿した質問に対しても遡って適用されるようです。再計算は2019年11月15日までに完了するようなので、自分のプロフィール画面を確認してみることをおすすめします。いきなりreputation が増えてるかも!?

***

今回なぜこのような変更が行われるか、については下記公式ブログに詳しく書かれています。

stackoverflow.blog

*1:Quoraは良い質問をした人に報酬が払われるシステムがあります

iOSDC Japan 2019 前夜祭に参加してきたよ #iosdc

今年もやってまいりました!iOSDC Japan 2019!

iosdc.jp

会場はおなじみ、早稲田大学 西早稲田キャンパスです!去年も来たのであまり迷わずにたどり着けました👍

f:id:koogawa:20190905234906p:plain

さっそく今年のノベルティであるトートバッグを頂きましたが、今話題のダークモードにもちゃんと対応している辺りはさすがだなぁ、と思ってしまいました。

f:id:koogawa:20190905234952p:plain

ビールもデプロイされていたそうですが、残念ながら私が到着したときには売り切れでした😂

聴いたセッション

仕事で遅れて参加したため、今回は所さんの「Advanced Segue (2019年のSegue事情)」のみ聴講しました。

Advanced Segue (2019年のSegue事情) by 所友太 | トーク | iOSDC Japan 2019 #iosdc - fortee.jp

speakerdeck.com

最初に会場アンケートがあり、「ご担当のアプリでStoryboardを使っている人」という質問にはたくさん手が上がりました。しかし、「Segueを使っている人」という質問になると手を上げる人は半分ぐらいに減っていました。

しかし、このセッションを聞いて Segue に対する考え方が変わった方は多かったと思います。以下、内容メモです。

  • Segueの種類
    • Standard Segue(ViewControllerを開く)
    • Embed Segue(ViewControllerの入れ子
    • Unwind Segue(特定のViewControllerまで遡る)
    • Custom Segue(なんでもアリ)
  • Segueを使うPros
    • Storyboardで完結できる部分が増える
    • prepareForSegueなどで一元管理できる
    • Apple Wayから外れない
  • Segueを使うCons
    • ViewControllerのinitializerを自分で呼べない
    • prepareForSegueが複雑になりがち
  • iOS 13 で大幅に進化を遂げた Segue
    • Segue Action の登場
    • 任意のViewControllerのイニシャライザが使えるように!
    • prepareForSegueが複雑になりがちという問題も解消!
    • Segue 良いのでは?
  • より高度な使い方
    • Unwind Segue 便利
      • どこからでも任意のVCに戻れる コードなしでUnwindできちゃう
    • Custom Segue は何でもアリ
      • 画面遷移のかわりにopenURLするなんてこともできちゃう

セッションを聴くまでは1画面:1Storyboard =Segue 使う機会はない、と思いこんでいましたが、

id: f:id:KishikawaKatsumi さんのこのツイートを見て、なるほどなぁ、と。

そんなわけで

明日もいろいろ聴いてきます!

プルリクエストを作る際に画像を Markdown から丁度よいサイズの img タグに変換してくれる Chrome extension「ImgConverter for Github」が超便利

プルリクエストを作る際、スクリーンショットを添付することはよくありますよね。

たとえばアプリのスクリーンショットを普通にアップロードすると自動で Markdown にしてくれるんですが、このままだと画像が大きすぎるんですよね😩

f:id:koogawa:20190814225249g:plain

仕方ないので、画像を予め小さくリサイズしてからアップするか、img タグを使ってサイズを 50% ぐらいにするのですが、これがまためんどくさい😤*1

そこでこんなツイートをしたところ、とても有益な情報をいただきました。

早速使わせて頂きましたが、まさに求めていたものはコレだ!という感じでした。

f:id:koogawa:20190814225916g:plain

img タグなのでサイズも簡単に調整できちゃいます👍

ImgConverter for Github は下記リンクからインストールできます。 chrome.google.com

*1:たまに img タグにしてくれるんですが、条件がわかっていません