ブログ

読んで思い出す。忘れるために書く

OpenWeatherMap API と連携して天気予報を表示する

Ruby on Rails - Rails 天気予報取得 表示|teratail」で、質問者によって書かれた JavaScript との連携方法を調べてみた

リポジトリ

GitHubリポジトリを作った : gouf/open_weather_map_demo - GitHub

書いたコード

(faraday gem で書いた例)

Faraday gem を利用して ぜんぶ Ruby 側にコードを寄せてしまってもよかったけど、既存の JavaScript コードとの連携が今回の目的なのでパス

(といいつつ JavaScript の部分は結構 書き換えてしまった...)

大まかな処理内容

Rails と絡めた書き方にするために

  • <div class="weather" data-weather="Tokyo"/> のようなコードを Controller - View で生成
  • JavaScript 側で class で要素を拾う
  • 要素の data 属性値をもとに、OpenWeather API にリクエストを送信
  • リクエストの応答情報をもとに、天気予報をページ中に表示

という処理の流れを考えた

詳細は 作成したリポジトリ を参照のこと

Links

Q. Rails で可逆暗号を使いたい (Rails 6)

A. ActiveSupport::MessageEncryptor を利用する

暗号化・復号化例

#
# ActiveSupport::MessageEncryptor#new で扱える key の長さが
# 決まっているのでその定義を呼び出して使う
#
# salt の生成
#
# NOTE: このままだと実行時に再生成されて復号化できなくなる
# .env や `rails credentials:edit` に値を保管したい
key_length = ActiveSupport::MessageEncryptor.key_len
salt = SecureRandom.random_bytes(key_length)

key =
  ActiveSupport::KeyGenerator.new('additional my secure secret')
                             .generate_key(salt, key_length)


#
# 暗号化・復号化のための MessageEncryptor インスタンスを生成
#
# 暗号化・復号化の実施
#

# HINT: `cipher:` で投げる有効な値は OpenSSL::Cipher.ciphers で確認できる
# デフォルトでは aes-256-gcm が利用される
crypt = ActiveSupport::MessageEncryptor.new(key, cipher: "aes-256-gcm") 

pp encrypted_data = crypt.encrypt_and_sign('my secret data') 
# => "4/fBPw+VUGTXlwsstHfQycJ4hQHUySes--1vnaE91fQM6GZ655--Nyq/mh6ytaxfvMOLYdcySw=="

pp crypt.decrypt_and_verify(encrypted_data)
# => "my secret data"

Links

Q. バージョンアップで rubocop ( rubocop.yml ) が動かなくなってめんどうくさい

A. mry コマンドをつかう

Vim + Ale で rubocop を自動で走らせていたけど、動かなくなったので その対処

インストールと使い方

# インストール
gem install mry
# つかいかた
mry --help
# =>
# Usage: mry [options] [.rubocop.yml]
#     -t, --target=TARGET_VERSION
#     --from=CURRENT_VERSION

Link

Q. TextField 入力の改行に合わせて高さを自動調整したい

A. 「StackOverflow の回答」を参考に、 UIViewRepresentable, View の実装をする

import SwiftUI
import Combine

final class UserData: BindableObject  {
    let didChange = PassthroughSubject<UserData, Never>()

    var text = "" {
        didSet {
            didChange.send(self)
        }
    }

    init(text: String) {
        self.text = text
    }
}

struct MultilineTextView: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        let view = UITextView()
        view.isScrollEnabled = true
        view.isEditable = true
        view.isUserInteractionEnabled = true
        return view
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
    }
}

struct ContentView : View {
    @State private var selection = 0
    @EnvironmentObject var userData: UserData

    var body: some View {
        TabbedView(selection: $selection){
            MultilineTextView(text: $userData.text)
                .tabItemLabel(Image("first"))
                .tag(0)
            Text("Second View")
                .font(.title)
                .tabItemLabel(Image("second"))
                .tag(1)
        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(UserData(
                text: """
                        Some longer text here
                        that spans a few lines
                        and runs on.
                        """
            ))

    }
}
#endif

Link

Q. Cocoa Pods でインストールしたライブラリを利用しようとすると「No such module」と云われる

A. [project_name] ... .xcproject じゃなくて .xcworkspace を開く

あとは [Product] - [Scheme] - [Manage Schemes] で、Pod 関連のスキームが有効になっているかも確認しておく

f:id:innocent-zero:20200213175817p:plain
Manage Schemes ダイアログで有効になっている Scheme を確認

Links

Bull's Eye アプリを作った (チュートリアル完走)

Your First iOS and SwiftUI App」のコースを修了した

リポジトリ

github.com

シミュレータでの動作イメージ

「指示された数値に どれだけスライダーの値を近づけられるか」で得点を競うゲーム

チュートリアルは動画形式で、Swift での基礎文法とか SwiftUI でのボタン要素のレイアウトなどを教えてくれる

Links