ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたり、LoLをしたり試合を見に行ったりしているエンジニアのブログです。技術的なはなしとか日常的なはなし、カメラやLoLや競馬の話も書きます。右メニューに検索やらカテゴリーやらがあるので、見たい記事だけ見てね!

【Swift4】URLSessionを利用してApiClientを実装してみるその1【URLSessionとstruct, Codable】

もくじ

f:id:yoshiki_utakata:20180708001344j:plain

はじめに

最近再びSwiftを触り始めました。何のアプリを作るにしてもAPIを叩くことは多いかと思いますし、最初にAPIを叩く部分を実装することも多いかと思います。そこで、URLSessionを利用してjsonAPIを叩くAPI Clientを実装してみようと思います。

環境

  • Swift 4

URLSessionの使い方

今回はとりあえず、tokenなどは不要でとにかく叩くだけでいいAPIを叩く。NASA Image APIを使う。

APIを叩くにはURLSessionを使うのが簡単。実装はこう。

let urlOpt = URL(string: "https://images-api.nasa.gov/search?media_type=image")
// URLは固定値なので!できる前提で進めて問題ない
let request = URLRequest(url: urlOpt!)
let task = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in
  // レスポンスに対する処理をここで行う(コールバック関数)
  // task.resume() を実行するとリクエストが行われ、
  // レスポンスが返ってきた時点でここの処理が非同期で行われる
}
// リクエストを実行
task.resume()

data, urlResponse, error の処理

dataにはレスポンスボディ、urlResponseにはレスポンスヘッダ、errorはレスポンスが得られなかったときのエラーが入ってくる。

  • data, urlResponseがnilのときのみerrorに値が入っている。
  • ホストが見つからない、通信エラーなどのそもそもAPIレスポンスが得られなかった場合はdataとurlResponseがnilになり、errorに値が入る。
  • ホストに接続できたが404エラー、500エラーなどの場合はdata, urlResponseが帰り、errorはnilが返ってくる
  • data, urlResponse, error がともにerrorになることはない。

ステータスコードはどうやって取るか

  • statusCodeはurlResponseに入っているが、そのままではstatusCodeは取れない
  • HTTPURLResponse extends URLResponse で、HTTPリクエストのときはHTTPURLResponse型が変えてくるので、キャストしてやる必要がある。
  • キャストしてやる必要がある。
let task = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in
  guard let urlResponse = urlResponse as? HTTPURLResponse else {
    // レスポンスが得られなかった場合
    return;
  }
  print(urlResponse.statusCode)
}

guard文については詳しく説明しないが、Optionalな値のOptionalを外すための構文だ。この場合、urlResponseがHTTPURLResponseにキャストできなかった場合はnilだった場合はguard文のelseの中に入る。

JSONDecoderを使ってJSONのレスポンスをいい感じにstructにマッピング

Codableというのをextendsしたstructを利用すると、Data <-> structの変換がめちゃめちゃ簡単にできる。

NasaAPIのレスポンスはざっくりこんな感じ(一部のレスポンスのみ表示)

{
  "collection": {
    "items":[
      {
        "data":[
          {
            "nasa_id":"nasaid"
          }
        ],
        "href":"http://nasa.gov/item.href"
      }
    ]
  }
}

この構造に対応したstructを定義する。例えばこうである。

public struct NasaImageApiSuccessResponse : Codable {
    let collection: NasaImageApiCollection
}

public struct NasaImageApiCollection : Codable {
    let items: [NasaImageApiItem]
}

public struct NasaImageApiItem : Codable {
    let data: [NasaImageApiItemData]
}

public struct NasaImageApiItemData : Codable {
    let nasaId: String

    /// APIの結果はsnake_caseだがそれをcamelCaseにマッピングする
    private enum CodingKeys: String, CodingKey {
        case nasaId = "nasa_id"
    }
}

じっくり比べてみれば、structが対応しているのがわかるだろう。必ずしも全部の要素をもたせる必要はない。APIのレスポンスのうち利用するものだけをstructでモデリングすればよい。

また、APIのレスポンスはsnake_caseだがコードではcamelCaseを使いたいという場合がある。その際はNasaImageApiItemDataのようにCodingKeysを定義してやれば変換される。

ではこのStructを使って実際に変換してみる。

let task = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in
  // nilチェック
  guard let data = data, let urlResponse = urlResponse as? HTTPURLResponse else {
    // 通信エラーなどの場合
    return;
  }
  do {
    let decoder = JSONDecoder()
    let response = try decoder.decode(NasaImageApiSuccessResponse.self, from: data)
    print(response.collection.items[0].data[0].nasaId)
  } catch {
    // レスポンスのJSONがstructと異なる場合など
    return;
  }
}

きれい簡単でわかりやすい。JSONのパースに失敗したりする場合もあるので、do-try-catch が必要だ。

ここまでのまとめ

Swift4でAPI Clientを実装するにはURLSessionとCodableを利用するときれいに実装できる。

しかしこれだけではAPI Clientクラスは実装できない。API Clientクラスの利用側に使いやすい形でレスポンスを返してやる必要がある。

時間は非同期コールバックと、セマフォにより同期的処理について書く。

Kyasのリアルカードを使ってみる

もくじ

Kyashとは

kyash.co

簡単に説明すると、Suicaのようなチャージして使う電子マネーのようなものなのですが、この電子マネーを友人に送金することで、割り勘だったり建て替えの支払いを行うことができるアプリです。

例えば、コンサートやライブの連番チケットを取る状況を考えます。2人で行くとしても、連番チケットをとるためには、どちらか1人が2枚のチケットを撮ることになりますよね。そしてチケット代や手数料とかを考えたら...一人あたり5432円!この5432円を小銭で用意するのは大変です。そういう時にKyashが使えます。

Kyashにチャージしたお金はもう現金に戻すことはできないのですが、Kyashのアカウントに紐付けられたクレジットカード*1番号で決済すると、Kyashの残高から支払われます。

アルカードとは

Kyashには「リアルカード」と「バーチャルカード」があり、Amazonとかネットショッピングで買い物する場合バーチャルカードで十分なのですが、実店舗で支払う場合はリアルカードを発行する必要があります。まあ僕はリアルカードなくても特に困ってはいないのですが、

  • 今リアルカードを発行すると発行手数料が無料
  • Kyasyのリアルカードまたはバーチャルカードで決済すると2%キャッシュバック

というキャンペーンが行われているので発行してみました。

どうやって手に入れるの?

Kyashのアプリなどから申し込みができます。申し込んだら1ヶ月弱くらいでカードが届きましたが、これは申込み状況にもよるようです。

書留とかではなく普通の郵便で届きます。「大丈夫なの?」って思うかもしれませんが、届いたカード番号をKyashのアプリに入力するまではカードが有効化されませんので平気です。

アルカードをKyashアプリに登録して有効化した場合、今までのバーチャルカードの番号は使えなくなりますので、電気代等のお支払いに使っていた場合は注意してください。

使ってみる

キャッシュバック2%ということでガンガン使ってみましょう。試しに最初は福利厚生倶楽部(なんかクーポンとかを買えたりするとこ)で使おうと思ったのですが、Kyashカードは使えませんでした。どうやら使えない場所もあるみたいですね。バーチャルカードでダメだった場合はリアルカードを発行してもだめなようです。なるほど。

友人はリアルカードを飲食店の支払いなどに使っていましたが、普通につかえていました。カードがぺらっぺらでクレジットカード感がないので、最初はちょっと出しづらいかもしれません。

ネットワークスペシャリストの受験料を支払ってみる

f:id:yoshiki_utakata:20180712104816p:plain

VISAは使えると書いてあります。「受験者本人名義のクレジットカードを使用してください。 」と書いてありますが、ここは大丈夫なんでしょうか...とりあえず払おうとしてみます。

...

払えました。

クレジットカード番号が登録されていると自動チャージになるので、残高が足りない場合はクレカから支払われることになります。

キャッシュバックは、その月の分が翌月末までにキャッシュバックされるとのことなので、今回の文は8月中にキャッシュバックがあるということですね。それまで待ちます。

*1:というよりプリペイドカードに近い?

Botkitを使ってnode.jsでSlackのBotを作る

もくじ

概要・環境

つくります。

$ node -v
v9.5.0

$ npm -v
6.1.0

$ yarn -bv
1.3.2

リポジトリ

github.com

参考

CentOSで動かす

nodejsとかyarnのインストール

https://linuxize.com/post/how-to-install-node-js-on-centos-7/

# なんでもいいからnodejsをインストール
$ yum install nodejs

# npmをインストール
$ yum install npm

# nodeのバージョン管理ソフト「n」をnpmでインストール
$ npm install -g n

# node 10(多分執筆時最新版)インストール
$ n 10
     install : node-v10.6.0
       mkdir : /usr/local/n/versions/node/10.6.0
       fetch : https://nodejs.org/dist/v10.6.0/node-v10.6.0-linux-x64.tar.gz
######################################################################## 100.0%
   installed : v10.6.0

$ node -v
v10.6.0

$ yum install yarn

startupに登録

リポジトリ startup/README.md 参照

【LoL】超初心者がルブランを使ってみた感想 パッチ8.13

もくじ

はじめに

f:id:yoshiki_utakata:20180706232736p:plain

以前リメイクが入ったルブランですが、パッチ8.8だったかでもとの昔のルブランに戻りました。ルブランといえばバーストとブリンクでキルをキルをとっていくアサシンであり、同時に捜査難易度が難しいチャンピオンというイメージがあるかと思います。しかし、ダメージの出し方さえわかれば、最低限使うには問題ないレベルにはなるかと思います。*1

この記事では、僕がルブランを何試合か使って学んだ、ダメージの出し方や得意苦手などについてまとめたいと思います。

ダメージを出していくためのスキル回し

ルブランでダメージを出していくのに大切なのはQのシジルマリスの使い方です。

詳しいスキルの説明なんかはlol wiki *2 あたりを見てほしいのですが、

Q - シジルマリス

指定対象の敵ユニットに魔法DMとマーク(3.5s)を付与する。マークが付いている敵ユニットに再度スキルでDMを与えると、マークを消費して同様の魔法DMを与える。

つまり、シジルマリスを当ててから3.5秒以内に他のスキルでダメージを与えて追加ダメージを発生させ、バーストを出すのがルブランのダメージの出し方です。

Qの直後にRを使うとマークの追加ダメージを発生させつつもう一回マークをつけることができます。

基本コンボ

先程書いたようにルブランはQのシジルマリスの追加ダメージをうまく発生させるようなスキル回しが重要です。

基本的なコンボは、

  1. Wのブリンクで近づいて
  2. Qでマークを与えて
  3. Rで追加ダメージを発生させつつ再びマークを与えて(Rがある場合)
  4. Eのチェインを当ててマークの追加ダメージ

となります。

状況に応じて

  • Wでブリンク→Rでブリンク→Qシジルマリス→Eチェインでマークの追加ダメージ

だったり、Wのダメージが結構大きいので、相手がWの範囲内に入ってきた時は

  • Qシジルマリス→Rでマークの追加ダメージ→Wを当ててWのダメージ+マークの追加ダメージ

なんていうコンボもあります。とにかく、WなりEなりを当ててQのマークをしっかり消費して追加ダメージを与えていくのが大切です。

スキルオーダー

ルブランのスキルオーダーは R > W > Q > E です。

一見Qを上げても良さそうな気はしますが、Wのほうがレベルアップでのダメージのスケールが大きいのと、クールダウンが短縮されるので、Wを上げるほうが有効です。

アイテム

ファーストアイテムはエコーが良いかと思います。単純にダメージが上がるのと、ルブランの弱点であるウェーブクリアが若干補える点などで相性が良いかと思います。

その次の候補は、モレロノミコン、ラバドンデスキャップ、ヴォイドスタッフあたりです。モレロノミコンが人気なのは、おそらく固定値の魔法防御貫通が手に入る点で、ヴォイドスタッフのようなパーセンテージの魔法防御貫通が魔法防御が高いチャンピオンに対して有効な一方で、モレロノミコンのような固定値の魔法防御貫通は魔法防御が低いチャンピオンに有効なためです。アサシンであるルブランはADCのような魔法防御が低いチャンピオンを狙いたいのです。

続いて単純にダメージが上がるデスキャップそしてヴォイドスタッフと進むビルドが多いようです。状況に応じてゾーニャ *3 や、ヴァンシーベール(対面がAPチャンピオンだったりCCがきつかったりする場合)を積むこともあるようです。

ルブランが苦手としている点

ウェーブクリア

ルブランはウェーブクリア向けのスキルが少なく、Wをウェーブクリアに使ってしまうと攻めの主要スキルがなくなってしまうかつマナもかなりきつくなるので、対面がウェーブクリア能力が高いとかなりきついです。特に現在のパッチではウェーブクリア能力が全体的に重要視されていますので、MIDルブランの勝率も低めになっているのかと思います。

ミニオンが多い状況

Wからコンボに入った場合に、最後にEのチェインを当てないとマークの追加ダメージを発生させられませんが、ミニオンが多いとEが当てづらいため、ミニオンが多い状況は少し苦手としているように思います。

対ルブラン

うかつにWの範囲に入らないことが重要

通常ルブランはWで近づいてきてQ→Eでマークの追加ダメージというコンボを狙ってきます。Wの範囲に敵が入っていない場合はWを移動のためだけに打つことになりますが、Wの範囲に入ってしまうと Q→W のお手軽大ダメージコンボが入ってしまいます。QよりWのほうが射程が短いので、Qの範囲に入ったとしてもWの範囲に入らないように注意が必要です。

Eのチェインをうまく避ける

コンボのフィニッシュはEのチェインです。ルブランのスキルの中でEが一番当てづらいため、コンボを食らってしまったらとにかく最後のEを避けることで若干ですがバーストが抑えられます。

*1:めっちゃうまくなるのはまた別の話として...

*2:https://loljp-wiki.tk/wiki/?Champion%2FLeBlanc

*3:ルブランとの相性はそこまで良くないでしょうが、対面がADチャンピオンだった場合に積む感じでしょうか

突然の日本サーバー限定イベント「QUIZ Rivals」が今日から始まる

もくじ

VS2018イベントの真っ最中ですが、日本サーバーでは「QUIZ Rivals」イベントが始まります。

あなたのLoL知識に挑戦!!期間限定イベント! | League of Legends

イベントの内容

イベントページはここ!↓

https://jp.leagueoflegends.com/ja/featured/jp-quiz-rivals-2018

イベントは9日間

イベントは本日7/5から7/13までの9日間です。

f:id:yoshiki_utakata:20180705124744p:plain

クイズに答えるとポイントを獲得

毎朝6時にクイズが出されて、答えるとポイントを獲得(正解2ポイント、不正解1ポイント)します。(動画は見なくてもいいっぽいです)

f:id:yoshiki_utakata:20180705124803p:plain

ポイントを集めてアイテムを獲得

ポイントがたまるとゲーム内でアイテムが獲得できます(ブルーエッセンスとキーのかけら)

f:id:yoshiki_utakata:20180705124513p:plain

ゲーム内アイテムだけじゃなくてリアルアイテムも獲得できる

さらにポイントを貯めるとLJLグッズがあたる抽選に応募できます。

f:id:yoshiki_utakata:20180705124911p:plain

デイリーミッションでスタンプを獲得できる

デイリーミッションとして、クイズに参加してからLoLで1勝するとスタンプを獲得できます。

f:id:yoshiki_utakata:20180705124941p:plain

スタンプ7個でチェストを獲得

スタンプ7個でチェスト獲得できます。つまり、9日間のうち7日間ミッション達成する必要があります。個人的にはちょっと厳しい!!

f:id:yoshiki_utakata:20180705125027p:plain

報酬でキーのかけら3つ、スタンプでチェスト1つなのでちょうどチェスト1つ開けられる計算ですね。がんばりたい!

ポイントの方は1日3問なので、最高6ポイント。9日間なので54ポイント!1日1問ミスなら45ポイント。Tシャツに応募したいならだいたい半分以上正解すればOKってところですね。2択問題なので1/2で正解しますし、そもそも回答するだけでもポイントがもらえるので、とにかく毎日回答することが重要そうです。全問不正解でも3ポイント*9日間 = 27ポイントはもらえます。

クイズは知識問題(最悪ググればわかる)から運ゲーっぽいもの(画像参考)まであります。30ポイントためるだけなら自分の実力だけで攻めても問題なさそうですね。40ポイントためたい人も、知識問題だけ落とさないように答えていけばだいたい大丈夫そうです。