Google App ScriptでGoogle Spreadsheetの検索→置換を配列に定義したルール分繰り返す

function main() {
    var sheet = SpreadsheetApp.getActiveSheet();
    
    var replaceRules = [
      ['対象語', '置換後'],
      ['hoge', 'fuga'],
      ['bar', 'baz']
    ];
  
    for ( var i = 0; i < replaceRules.length; i++ ) {
      replaceInSheet(sheet, replaceRules[i][0], replaceRules[i][1]);
    }
}

function replaceInSheet(sheet, to_replace, replace_with) {
  var values = sheet.getDataRange().getValues();

  for ( var row in values ) {
    var replaced_values = values[row].map(function(original_value) {
      return original_value.toString().replace(to_replace, replace_with);
    });
    values[row] = replaced_values;
  }

  sheet.getDataRange().setValues(values);
}

TwitterKit (iOS) をCarthage経由で使おうとしたらセッションが毎回破棄されてつらい

題名どおりで、本当にCarthageのせいかどうか調べてないけど、元がオブCのままだったりするのもあるしセッションが関係しててデバッグがしんどい。

しぶとくググっていたら Twitter Kit iOS purges all sessions every time the app is launched - Twitter Kit SDK - Twitter Developers ここらへんにそれっぽい人を発見したので今CocoaPodsを入れようとしてるけどSpecs.gitが重すぎてむかついている。ログインしたのにセッションが保存されてねえぞな方は確認されたし。

メールって何て言ったら良いかわかんない時あるよね、特に同人活動

同人の人たち(特に学生さんとか)ってメールの文言で参考にするものがないと思うので
自分がよくメールの時に使ってる文言をちらり。

一応Web系とかデジモノ系会社に勤めてまして、マーケティングの人たちがメールしているのが
メーリングリストで回ってくるので、そこで使える単語をちょくちょく盗んでおります。

メールの文体なんてどうでもいいと日本語にうるさい方はブラウザバックしてくれ

初めてメールする時

初めてご連絡させていただきます。 私は初音ミク等を用いた楽曲を制作しているkeiseiと申します。

いきなりメールする時

突然のご連絡で失礼いたします。

お世話になってる人からメールが来た時 or 送る時

「大変お世話になっております。」「いつも大変お世話になっております。」

話し始め

「掲題の件」というタームが使いやすい

ほとんど「掲題の件承知いたしました」「掲題の件確認させて頂きました」で始めてる気がする

嬉しい時

仲良くなってきたらそのまま嬉しいですでいいけど
最初の頃は感無量ですとか大変感激いたしておりますとかにしておくと
ジェントルマンなアトモスフィアを出せると思う
マジカルミライ2017の公募に受かったときはこんな感じで送りました
(今は何度かお会いしているので嬉しいです!って普通に返しちゃう)

「お声掛け頂き嬉しいです。」「お誘い頂き嬉しいです。」
「ぜひともご協力させて頂きたく存じます。」「ご尽力させて頂ければと存じます。」

耳寄りなお言葉を頂いた時

「ご助言ありがとうございます」

申し訳ないことする時

ブシツケというターム

「ただ〜〜〜するのが困難でして、不躾なご対応となり申し訳ないのですが、○○○とさせて頂きたく存じます。」

確認する時

いかがでしょうか

OKな時

ご確認させていただき、問題ございませんので引き続きご進行のほどよろしくお願いいたします。とか

「ご提示頂いた日取りおよび条件にてご承諾させて頂きたく存じます。」
↑日時、ギャラなどの条件を確認してることをちゃんと言う

進めてほしい時

「何卒よろしくお願いします。」でいいんだけど、「ご進行お願いいたします。」ってタームが好き

後でする時

「追って」

「追ってご請求書の方お送りいたしますので、ご確認の上ご査収の程何卒よろしくお願いいたします。」

すぐにやる時

「程なく〜〜〜いたします」

言葉としてはかなり軽いからあまり使わないかな

連続で送ってしまった、送ってしまう時

サミダレというタームが便利

「五月雨で恐縮ですが」「五月雨で申し訳ありません。〜〜〜」「五月雨にて失礼いたします」

返事がほしい時

「お忙しいこととは存じますがお返事頂けましたら幸いです。」

めちゃくちゃ返事が早く帰ってきた時

「迅速なお返事、誠にありがとうございます。」

とりま反応だけしたい時

そんなにメールに内容がない時に使う

「取り急ぎご挨拶まで。  何卒よろしくお願いいたします。」

「取り急ぎお返事まで。」

相手の会社さんにブチアゲてほしい時

「今後とも貴社の益々のご発展を心より祈念しております。」とかなんじゃねえの

Swift2年目の初心者でもRxSwiftでポーリングが書きたい!

欲張りな子ね。

クラスの中に以下を記載しておく。

import RxSwift
import RxCocoa // もしかしたら必要ないかも?

private var polling: Disposable?
private let hoge = Variable<Hoge?>(nil)

そしてこんな感じ。
APIのリクエストの仕方とかはよしなにしてください。

let interval = Observable<Int>.interval(10, scheduler: MainScheduler.instance)
self.polling = interval.subscribe(onNext: { [weak self] _ in
    guard let `self` = self else { return }
    HogeRepository().fetchHoge().subscribe(onNext: { [weak self] result in
        guard case .success(let hoge) = result else { return }
        self?.hoge.value = hoge
    })
    .disposed(by: self.disposeBag)
})

ポーリングは書きたくない

Interface BuilderでUIView.layer.cornerRadiusを調整できるようにする

qiita.com

今までは ↑ ここのコードを参考にやっていたけれど、drawメソッドをオーバーライドするのが非常にしんどいなぁと思っていたら別の場所で良いの見つけたのでメモ

@IBInspectable var cornerRadius: CGFloat {
    set{ layer.cornerRadius = newValue.cgColor }
    get{ return layer.cornerRadius }
}

以上。クソ楽!代入してしまえばいいんだよね。
メインスレッドで動けば大丈夫だと思う(パッと見大丈夫に見える)。

最近イケてると思ったiOSアプリ開発のパターン

UIApplication.shared.delegate as! AppDelegate やめる

static var shared: AppDelegate? {
    return UIApplication.shared.delegate as? AppDelegate
}

コードでAutoLayoutの制約をつける簡易メソッド

func bindFrameToSelf(subview: UIView) {
    // この中で縦横のAutoLayout制約を宣言
}

bindFrameToSelf(subview: hogeView)

アプリで表示する文字列を列挙子にまとめる

struct Strings {
    enum Home: String {
        case title = "ホーム"
        case welcome = "ようこそ"
    }
}

ってやって、ViewControllerで

self.title = Strings.Home.title.rawValue
welcomeLabel.text = Strings.Home.welcome.rawValue

とかやると文字列を気にしなくて良いので気持ちが楽

このそれぞれにさらにStringLocalizableみたいなプロトコルに対応させるようにすれば言語対応ができる

アラートを表示するメソッドをAppDelegateに書く

いままで

let ac = UIAlertController(title: "アラート", message: "アラートです", preferredStyle: .alert)
ac.addAction(.......省略......)
self.present(ac, animated: true)

みたいなやつを色んなところに書いてしまってた。これをやるメソッドをAppDelegateに書いてしまうと気持ちが楽。

func showAlert(withTitle 
    title: String = "アラートタイトルの初期値",
    message: String = "アラート内容の初期値",
    buttonTitle: String = "ボタンタイトルの初期値",
    handler: (() -> ())? = nil) {
    
    DispatchQueue.main.async {
        // ① 一番前のViewControllerなりWindowを得る
        // ② アラートや自前UIViewを作る
        // ③ VCやWindowにaddSubviewしたりpresentしたりする
    }
}

読み込みウィンドウをAppDelegateで保持しておく

private var progressWindow: HogeProgressWindow?

private func setupProgressWindow() {
    // prepare view
}

このウィンドウを、APIClientのコネクション数に応じて表示/非表示させれば良さそう

RealmのマイグレーションIDを日付にする

Realmのスキーマバージョンを日付にすると管理が楽になる?(かも?)

APIClientの結果を必ずRealmにぶち込む

ローカルにぶっこんどいておくと便利なエンティティとかはやっておく

APIClientが通信しているとき必ずprogressを回す

Alamofireとかがデータリクエストをするところの最初でインジケータを回してしまえばいい。VCとかで考える必要がなくなる
post, put, deleteリクエストのときは画面暗くして一時的に操作不能にするとかそういうのもここで突っ込んでしまうと気持ちが楽

viewにまつわる操作をしたかったらAppDelegateにapiCountみたいな変数を生やしておいて、APIClientからそこをインクリメントしたりデクリメントするメソッドにアクセスして(apiCount自体はprivateで宣言しておいた方が良い気がする)、AppDelegate側でそれを監視してビューの出し分けをすれば良い

アセットファイルを画面ごとに分ける

.xcassetsファイルは何個も作れるらしい
親でResourceフォルダみたいなのを作って、そこに画面.xcassetsとかで作ってあげるとよさそう

リリースビルドでは出ないprintメソッド

class Debug {
    class func print(_ items: Any..., separator: String = " ", terminator: String = "\n", function: String = #function) {
   #if DEBUG
        Swift.print(Args(args: items, separator: separator), separator: ......)
   #endif
    }
}

あとはそもそも Swift.debugPrint とか Swift.dump とかあるみたいなのでそれも適宜調べてみて

Fastlaneに引数を渡す

Advanced - fastlane docs

fastlane [lane] key:value key2:value2

fastlane deploy submit:false build_number:24

こんな感じでいけるっぽい

lane :deploy do |options|
  # ...
  if options[:submit]
    # Only when submit is true
  end
  # ...
  increment_build_number(build_number: options[:build_number])
  # ...
end

こんな感じでnilチェックしてあげればよさそう