アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


iOS マルチディスプレイ Swift 4

iOSでマルチディスプレイする際のコードをswiftで書き直してみたメモ。

 // 複数 window 対応

    private func checkForExistingScreenAndInitializeIfPresent() {
        if UIScreen.screens.count > 1 {
            // 外付けディスプレイを表す画面オブジェクトを取得する。
            let secondScreen = UIScreen.screens[1]
            print("secondScreen.preferredMode : ", secondScreen.preferredMode)

            // 画面の大きさを取得して、正しい大きさのウインドウを生成できるようにする。
            let screenBounds = secondScreen.bounds
            let screenBounds = CGRect(x: 0, y: 0, width: 2400, height: 1500)

            secondWindow = UIWindow(frame: screenBounds)
            secondWindow?.screen = secondScreen

            // 当初の表示内容を設定する
            if let vc = R.storyboard.settings().instantiateInitialViewController() {
                secondWindow?.rootViewController = vc
            }

            secondWindow?.isHidden = false
        }
    }

    private func setUpScreenConnectionNotificationHandlers() {
        NotificationCenter.default.addObserver(self, selector: #selector(handleScreenDidConnectNotification(notification:)), name: NSNotification.Name.UIScreenDidDisconnect, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(handleScreenDidDisconnectNotification(notification:)), name: NSNotification.Name.UIScreenDidDisconnect, object: nil)
    }

    @objc private func handleScreenDidConnectNotification(notification: Notification) {
        guard let newScreen: UIScreen = notification.object as? UIScreen else {
            print("setUpScreenConnectionNotificationHandlers 失敗")
            return
        }
        let screenBounds = newScreen.bounds
        if secondWindow == nil {
            secondWindow = UIWindow(frame: screenBounds)
            secondWindow?.screen = newScreen
            // ウインドウの初期UIを設定する。
        }
    }

    @objc private func handleScreenDidDisconnectNotification(notification: Notification) {
        if self.secondWindow != nil {
            // ウインドウを非表示にしてから削除する。
            self.secondWindow.hidden = true
            self.secondWindow = nil;
        }
    }

iOS アプリ作る時に自分が見積ミスりがちな項目

最初の見積段階で忘れてて、無料稼働してしまうということがありました。
忘れないように自分用メモ。

開発期間中にXcode / iOS /Swift のバージョンが上がった際の対応

Xcodeのバージョン上げたらビルド通らなくなる事がよくあった。
理由としてはSwift のバージョンが変わったというのが多かった。
ただ、最近はだいぶ減った。

Xcodeの最新がリリースされてすぐだと、
使ってるライブラリがまだ最新に対応してないというのがちょいちょいあるので注意が必要。

対応バージョンの確認

最新バージョン -1くらいが相場かと。(iOS 11なら、10まで)
スピード重視だったり、ものによっては最新のみでもいいかと。

申請サポート

クライアントが「よく分からない」ってことも多いし、
以外と面倒なことも多い。
なし崩し的に無料でやらずにちゃんと計上しとくのが吉。

申請通らなかった時の対応

1発で通るということはまぁ珍しい。
以下のような時は注意が必要。

  • ユーザーが投稿できる機能がある
  • App内課金がある

デバッグ

実機で確認しなきゃいけない機能がある、さらに、iOS複数バージョン対応、
とかだと結構時間かかる。
開発しながらデバッグして〜と思っててもなかなかそうもいかない。
こちらも今後はしっかり見積に計上しとこ。

ActiveRecordの中間テーブルにupdated_atカラムは要らない場合が多い

ActiveRecordマイグレーションファイルは、
自動で t.timestamps が追加され、created_at と updated_atカラムが追加されます。
中間テーブル自体がモデル同士の関連情報以外を持つ場合は別ですが、
モデル同士の関連情報 (user -- follow -- user とか) の場合は、
レコードがあるかないかの状態しかなく、更新というものが存在しないので、
updated_atは必要ありません。
そういった場合は、

t.timestamp :created_at

と記述することで、タイムスタンプをcreated_atのみとすることができます。
注意点は、タイムスタンプカラムが1つだけの時は、t.timestamp と単数形にすること。

という自分用メモ。

参考コード
class CreateFollow < ActiveRecord::Migration
  def change
    create_table :follows do |t|
      t.timestamp :created_at, null: false
    end
  end
end

フリーランスプログラマ3年間の年収実績を公開してみる

近頃社会でフリーランスという働き方が注目されてきてるのを感じます。
プログラマーというのは中でもフリーランスになりやすい職種だと思います。
自分にはフリーになる前に
「実際フリーになったらいくらくらい稼げるのだろう?ちゃんと生活できるのか?」
という疑問があったので、同じような境遇の方のために直近3年間の売上、収入実績を書いてみたいと思います。

ちなみに自分のスペックはこんな感じです。
- プログラマ8年目くらいの30歳。
- iOSアプリ開発 / Rails でWebアプリ開発がメイン
- Webアプリのフロントエンドもやる。ReactとかVueとか
- React Nativeとかもやる - Unityもやる - デザインもやる
- 受託開発がメイン - 常駐案件もやる
- 人日単価5万円〜 - 仕事は100%知り合いから。営業はしない

3年前

売上 700万 利益 600万くらい

この年は7ヶ月間しか働いてないので、7ヶ月分の実績です。
家で仕事してるので家賃を一部経費に計上してて、あと交際費とかを差し引いたのが利益。

2年前

売上 900万円 利益 750万円くらい

支払家賃に加えてMac買ったり設備投資したり出張あったりで経費が150万くらい。

今年

売上 1150万円 利益 950万円くらい

直前のサラリーマン時代の年収は300~400万円くらいだったので、
数字としては悪くない積み上げ方ができているのではと思います。

納税額は所得税 + 住民税で、毎年80~120万くらいでしょうか。
国民健康保険料は50~70万円くらいだったかと思います。
節税としては、小規模企業共済やってます。

先日聞いたyatteiki.fmというpodcastで、「フリーランスの自分がどれくらい稼いでるか言いづらい」
っていう話を聞いて、なるほど確かにこの話は需要あるかも、と思ったこともあり公開してみました。

参考になるかわかりませんが、この記事が誰かの力になれることを願っています。

Connection to http://localhost:8081/debugger-proxy?role=client timed out. Are you running node proxy? If you are running on the device, check if you have the right IP address in `RCTWebSocketExecutor.m

React Nativeで実機確認しようとしたら出たエラー。
Stop Remote Debugすれば治ります。
実機では、開発メニューは、実機をシェイク(物理的に振る)すると、出てきます。