koogawa blog

iOS、Android、foursquareに関する話題

【StackOverflow活動日記】Create Tag Synonyms 権限が付与されました

コツコツ続けております。(StackOverflow活動とは

本日、reputation が 2,500 を突破しました🎉

同時に「Create Tag Synonyms」権限を付与して頂きました。

Create Tag Synonyms 権限とは

タグの別名を作成できる権限です。

例えば iOS に関する質問をする際、ほとんどのユーザーは ios というタグを付けると思います。しかし、人によっては ios-sdkapple-ios といったタグを付けることもあります。これだと、iOS関連の質問を見つけるのが難しくなってしまいますね。そこで、Stack Overflow にはタグに別名(Synonym)を付ける機能が用意されています。

例えば、ios には ios-sdk, apple-ios, iphone-os という Synonym が登録されています。

Synonym を使用して質問するとどうなるか?

Synonym を使用すると、Master(本当の名前)に自動的に変更されます。例えば、ios-sdk というタグを使おうとした場合、タグは自動的に ios に変換されます。この時、ユーザーには変更があった旨は通知されません。

また、Synonym から Master への自動変更回数はカウントされています。これらは /tags/synonyms から確認できます。それぞれの Synonym がどれだけ役に立っているか評価できるわけですね。

いやー Stack Overflow ってホントに良く出来てますねー

まず、失敗することを確認してから先に進む

これが正しい、とかを言いたいわけではなく、自分はいつもこうやっているよー、というのをメモに残しておきます。

ケース1

例えば、Aというアプリを動かすにはBとCのライブラリが必要、というケースがあったとします。 こういった場合、自分はまず、BとCのライブラリを敢えてインストールせずにAを動かそうとします。 そこでエラーが出ればBをインストールして試し、ダメならCもインストールします。

理由

素直にBとCをインストールしてから始めればいいものを、何故こんな面倒なことをするのか、理由を考えてみました。

1. エラーが起きた場合どうなるか把握できる

最初から成功してしまうと、エラーになった場合の挙動などを知らずに先に進むことになります。最初に敢えて失敗しておくことで、後々エラーが起こった場合、素早く対処することができます。

2. BとCがなくても動いてしまう場合がある

ドキュメントには「BとCが必要」と書いてあっても、試しに実行してみたら何の問題もなく動いてしまうケースがあります。その場合「何故動いたのか」を調べていくことになるので、結果的に知識を深めることができます。

ありきたりの言葉ですが、疑うことは大事ですね。

ケース2

iOSアプリ開発を例に挙げます。URLSession を使ってHTTP通信するケースを考えます。

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
      if let data = data, let response = response {
        print(response)
      } else {
        print(error ?? "Error")
      }
    }

    task.resume()

この場合もまずは次のことを試します。

  1. urlnil を入れてみる
  2. url に実在しないデタラメのURLを入れてみる
  3. task.resume() を実行しない

理由

1. データがおかしくなった場合の挙動を知っておけるので、後々エラーになったときに役に立つ

これもケース1とほとんど同じですね。最初に失敗しておくことで、

  • アプリがクラッシュした → お、nil が混入しとるな
  • レスポンスが返ってこない → そもそもリクエストしてる?

といった対応ができるようになります。

2. いきなり成功すると不安になるから

「一発でビルドが通った」

これほど不安なことはありません。 この気持、わかってくれる方もいらっしゃるのでは??

まとめ

ここに書いた内容が、他の皆さんもやっている「当たり前」の進め方なのかはわかりません。だからこそメモに残してみました。 俺も同じだよ!などあれば教えてください。

【StackOverflow活動日記】MapKit: MKAnnotation の Callout がうまく表示されない問題

割と続いております。StackOverflow活動日記です。

さて、今日回答したのはこちらの質問。

stackoverflow.com

私が得意とする MapKit 関連の質問です。

この分野で多いのが、

  • 地図上にピンが表示されない
  • ピンをタップしたときに表示されるバルーンが思い通りにならない
  • ピンがドラッグできない
  • 地図上に線が引けない

等の質問です。そして、そのほとんどが delegate プロパティのセット忘れや、delegate メソッドの実装漏れによるものです。

今回も「ピンは表示されるけど、ピンをタップしたときに表示されるバルーンにCallout(ボタンみたいなの)が表示されないよ」といった内容でした。

f:id:koogawa:20170831233019p:plain
▲この右側のボタンが表示されないようです

コメント欄のやり取りを見ると、どうやら delegate プロパティにはちゃんと self がセットされている様子です。その後、Stackoverflow のチャットルームに移動したようですが、解決には至らなかったもようです。*1

となると、次に疑うのは delegate メソッド(viewForAnnotation)の実装漏れです。質問文に載せられたソースコードをじっくり見てみると、どうやらちゃんと実装されている様子・・・いや、よく見てみると

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!

になっていました。このメソッドは Swift 3 で

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?

に変わっています。そのため、このメソッドが呼ばれず、Callout の設定も実行されずにいたようです。

その旨を回答したところ、無事問題が解決されたようです👍

***

Accept + vote up により、reputation が +25 されました。

2,500 まであと少し!がんばります💪

*1:Stackoverflowにはディスカッションのためのチャットルームが用意されている。20 reputation以上のユーザなら誰でも入室することができる

2017/8/22 から Foursquare API の Rate Limits ルールが変わったよ

TL;DR

  • 2017/8/22 までに開発者アカウントを認証しない場合、1日に呼び出せるAPIの回数が 1,000 回に制限される
  • 開発者アカウントを認証すればこの回数が 100,000 回に増える
  • ログイン不要の userless requests は対象外(呼び出せる回数に変更なし)

認証は https://ja.foursquare.com/developers/verify から行える。(クレジットカードが必要。課金されることはないとのことだが自己責任で)

はじめに

今年の6月に foursquare asia を名乗るアカウントから「Foursquareの開発者のアカウントを認証してください」というメールが届きました。

f:id:koogawa:20170824001835p:plain

・ ・ ・

なんだか日本語があやしい🤔

さらに、クレジットカードの登録も必要になるとのことなので、しばらく様子を見ることにしました。

アプリが機能しなくなる

8/23 の夜、Foursquare API を利用している私のアプリが動いていないことに気付きます。

「あのメールは本物だったのか…!」

慌てて API のレスポンスを調べてみると

HTTP/1.1 429 Too Many Requests
X-Cache-Hits:
0
Tracer-Time:
2
Content-Length:
134
X-RateLimit-Limit:
0
X-RateLimit-Remaining:
0

が返ってきていました。どうやら、1日1,000リクエストの制限に達してしまったようです。

ちなみに、1,000リクエストというのは、ユーザ一1人あたりのリミットではなく、アプリ全体のリミットです。例えば100人ユーザーがいるアプリの場合、ひとり1日10回しかAPIを呼び出せない計算になります。(これはキツイ)

あらためて公式ドキュメントを見てみると、

On August 22, 2017, if you have not verified your account, all of your existing apps will be subject to a call quota of 1,000 calls per day. You will still be able to verify your account at any time to receive 100,000 calls per day for one primary app.

の行がいつの間にか追記されていました。昨日ぐらいからこのルールが適用されたようですね。(CHANGELOGには無かったぞ!)

ちなみに、ログイン不要で使える userless requests は対象外のようです。つまり、

https://api.foursquare.com/v2/venues/search?ll=40.7,-74&
client_id=CLIENT_ID&client_secret=CLIENT_SECRET&v=YYYYMMDD

のように、oauth_token を使わずに API を利用しているアプリは何の影響もありません。

開発者アカウントを認証してみる

取り急ぎ、クレジットカードを登録して開発者アカウントを認証してみました。

Rate Limits を読む限り、次のリセット時刻(midnight UTC と書かれている)が来るまで制限は解除されないようなので、ひたすら待ちたいと思います。

アプリ利用者の皆様にはご迷惑をお掛けいたしますが、復旧まで今しばらくお待ちいただけますようお願いいたします。

2017.8.24 9:00:制限が解除されました!

【StackOverflow活動日記】ブログのサイドメニューにバナーを貼ってみた

自分のウェブサイトに Stack Overflow のプロフィールバナーを貼れることを知ったので、やり方をメモしておきます。

  1. Stack Overflow を開く
  2. ヘッダーの右にある自分のアイコンをクリック
  3. 画面上部にある「Edit Profile & Settings」をクリック
  4. 左メニューにある「Flair」をクリック
  5. 画面の下の方にある「How do I use it?」の HTML をコピーして自分のウェブサイトにペースト

これだけです!

テーマも4種類ほど用意されているようですね。

f:id:koogawa:20170818141123p:plain

「Hotdog」は見た目も強烈で目立ちそうですが、使い所が難しそうです🌶

【StackOverflow活動日記】WKWebView reload() がページをリフレッシュしてくれない件

完全に思いつきだけど、Stackoverflow活動 のログをなるべく残していきたいと思う。

Stackoverflow で何か回答してみたいけど、どんな風に回答したらよいかわからない人の参考になれば幸いである。

今回解決した質問はこちら。

stackoverflow.com

the first time load web page fail at offline. then I connect network call reload() to refresh current page, but it is not work, the WKNavigationDelegate can't get any callback.

初回ロード時にオフラインで失敗した場合、再びオンラインになった際に reload() を呼んでもページをリフレッシュしてくれないよ!という内容。

実際にコードを書いて試したところ、確かに reload() 呼んでもウンともスンとも言わない。

調べてみると、WKWebViewurl プロパティ(現在表示しているページのURLがセットされる)には初回ロード時に失敗すると nil がセットされることがわかった。

reload() メソッドはこのURLを再読み込みしようとするため、何度実行してもリフレッシュされなかったわけだ。この仕様は今まで知らなかったので勉強になった。

というわけで、ページをリフレッシュする際は url プロパティをチェックするといいよ、といった内容をサンプルコード付きで回答した。

後日、私の回答が承認され、reputation は 2350 になった。

f:id:koogawa:20170818135040p:plain

この調子で 2500 目指すぞ💪

StackOverflow、昨年リリースした Documentation の投稿受付を終了

去年リリースされた StackOverflow の Documentation というサービスを覚えているでしょうか?

www.publickey1.jp

上記の紹介記事も300以上ブックマークされていることから、日本でも一部では注目されていたのではないでしょうか。

その Documentation ですが、静かにその役目を終えようとしています。

meta.stackoverflow.com

文中では

We still think Stack Overflow Documentation is a good idea.

「我々は今もなお Documentation は良いアイデアだと思っている」という考えは強調しつつも

By May, it was clear we weren't on the right path. New users weren't coming to Documentation. So we went back to the drawing board and started another round of user interviews focused on Transact SQL. We brought on a user experience researcher to help us interview technical writers. The results were encouraging in the sense that we know a lot more about what makes for great documentation and how we might support that effort.

以前から新しいユーザー集めに苦戦していたことは認めており、それを解決するために色々と試行錯誤を重ねていたようです。

But it was also clear fixing Documentation would require a significantly larger team.

しかし、すべてを解決するためには莫大なリソースが必要になることもよくわかっていたようです。

今後

投稿されたコンテンツの扱いについては、今後ユーザーと議論しながら決めていくようです。最低限、テキストのアーカイブは提供されるとのことです。

Documentation によって獲得した reputation やバッジの取扱についても詳しく書かれているので、気になる方は読んでみると良いでしょう。