miyasakura’s diary

日記です。

REALFORCE for Macのmodeを保存する

REALFORCEはデフォルトだとファンクションキーを押したときの動作がMacの特殊機能(明るさ調節とか)になっているので、切り替えキーを押してファンクションキーが動作する状態で使っています。

しかし接続のたびにこの設定をしなきゃ行けなくて面倒すぎるだろと思っていたのですが、先日1歳の子供がキーボードをガンガンやっていたらWin modeになっていて、Mac modeに戻しても接続し直すと毎回Win modeになってしまう状態に。

ファンクションキーなら常に使うわけではないので耐えられたのですが、Win modeになるのは耐えられないなということで、問い合わせてみたら

通常のMacモードの時に、
Fnキーを押しながら、F14キーを押してください。
 
Fnキーを押しながら、F14キーを押すことで
キーボードへ設定の保存がされます。

とのことでした。

これは説明書にも書いてあったのだろうか。。。

ということでWin modeを解除してさらにファンクションキーの切り替えをした状態でFn+F14で無事に接続時にわざわざ切り替えをしなくて良いようになりました。

REALFORCEを使い始めて1年くらい経って初めて知ったという話。

当たり前だからググっても出てこないんだろうな。

とりあえず備忘録にこちらに書いておきます。

子供が生まれました

直接話した人くらいしか報告していなかったのですが、昨年の11月に第一子(男の子)が生まれました。

妻の妊娠期間が完全にコロナの影響を受けた結果、パパママ教室は中止になり病院の付き添いは制限され、気分転換に出かけることもなかなかできず、といろいろ大変でした。

世の中の妊婦さんみんな頑張って欲しいです。

そんな中昨年私はコロナのおかげか仕事がこれまでに無いほど忙しくなってしまい心に余裕が持てなかったのですが、今年は少し落ち着きまして、土日は休んで朝晩も前ほどは働いておらず、労働時間がかなり減っております。

その分はほぼ子供を愛でている時間になりました。

誰もが言うことではありすが、我が子はこんなに可愛いとは。

地方出身者として東京での子育ては全くイメージが湧きませんが、どうにかやっていこうと思います。

CASTER BIZを使ってみた感想 〜フリーランスエンジニア編〜

CASTER BIZというサービスを使い始めてもうすぐ1年経つのですが、便利に使っているので簡単に紹介します。

cast-er.com

CASTER BIZはざっくりいうと、月10万円程でオンラインのアシスタントに最大30時間の作業をお願いできるサービスです。

特徴としては

  • 窓口の人は固定なので仕事を頼みやすい
  • 実際の作業者は裏側にいるチームがやっているので幅広い業務に対応してくれる
  • 他サービスと連携していて、契約書チェックやオフィス清掃なども時間を充当することで利用可能

といったところです。

年間契約で一括払いなら月10万円を切るので、自身の単価次第ではありますが1〜2日程度の作業をやってもらえれば十分にコストメリットが出てきます。

お願いしていること

私がお願いしている業務はざっくりこんな感じです。

経理業務

毎月のレシートを送るとスキャンして会計ソフトで仕訳してくれます。

今まで仕訳業務は税理士さんに10,000円/月でやってもらっていたのですが、それを巻き取ってくれました。

税理士事務所の職員さんが片手間でやるよりも丁寧にやってくれている気がしています。

オンラインの領収書もLast PassでID/Passwordを共有しておけば勝手にログインして取得してくれるのでかなり楽です。

スキャンについては名刺も一緒に送ってと名刺アプリに取り込んでもらうのもお願いしています。

請求書発行

毎月3~5社程度に請求書を発行するので作業報告書などの作成を含めて半日作業になっていました。

毎月の額も変わるので自動化もできずメールの送付先を間違えないようにしたりが結構なストレスだったので、これがなくなることでかなり助かっています。

あとは業務をしている先で担当者がAWSの費用申請を毎月あげるのが嫌だということで請求代行的なのをお願いされたりするんですが、請求の手数料がCASTER BIZの時間分の費用を上回れば気楽に受けられたりと地味な収入アップもやりやすくなります。

リマインド

毎月5日に自分の給料を法人から振り込むとかそういう業務はどうしても忘れてしまうのでリマインドしてもらってます。機械的なリマインドを設定するのも良いのですが、毎回微妙に内容が変わる場合にも対応してもらえるので助かります。

画像編集

いわゆるホームページの作成業務だとPSDファイルをスライスしたり、画像を微妙にいじったりという業務が発生するケースが多いのですが、そう言ったものを自分でやるとどうしてもストレスになるのと時間の使い方的に効率的にはならないので、お願いできるのはかなり大きいです。

普通に会社で事務員的なのを雇っていたとしても専門性を必要とする作業は難しいと思うので、頻度は少ないですが、こういったことをお願いできるのは助かります。

電話代行

電話は基本的に無視したいのですが、たまに仕事関係で重要な電話もあるので、転送して受けてもらっています。よくわからない営業電話を受けなくていいというのはかなり快適になりますね。

契約書チェック(AI-CON)

新規取引先との契約が半年に一回くらいあるので、契約書チェックをするんですが、弁護士に頼むほどでもないのでこのサービスでチェックしてもらっています。

CASTER BIZの3時間くらいを消費することでチェックしてもらえます。

自分で確認するよりも効率的かつしっかりとチェックしてもらえる印象です。

その他細々した業務

  • 簡単な市場調査
  • (クオリティを求められない)資料作り
  • 飲食店の予約
  • 個人的な旅行の宿の候補出し

などなど、単発で発生するタスクをさくっとお願いできます。

余った時間

個人で引きこもって開発していることが多いので、上記のいろいろをやってもらっても大した量にはならず定常業務のみの場合は15時間ほど余ります。

それでも個人的には十分に元が取れている感覚なので良いのですが、時間が余ると毎回どうしますか?と声をかけてもらえます。

お金を払うと繰り越せるのですが繰り越してもやってもらうことがないので、私はCASTER BIZの提携サービスを利用することにしています。

提携サービスには上記のAI-CONの他、家事代行(CASY)やフラワーギフトなどがあり、私はフラワーギフトをよく使わせてもらっています。

CASTER BIZの価格設定的にはおそらく1時間を3000円くらいに見ているので、15時間余ると5万円くらいのサービスが受けられることになります。

ということでフラワーギフトは結構豪華なものを送ることができます。

本来であれば取引先に送るものですが、自分自身だったり実家だったりも良いかと思います。(個人的利用はやりすぎると税務署に怒られるので大きな声では言えませんが。)

まとめ

コロナ禍で自分自身の動きがかなり減っているためお願いする業務も少なくなりコスパは悪くなっているものの、引き続き便利に使えているため私はしばらくこのまま利用しそうです。

エンジニアだと日々のスケジュール調整だったり会食の予約調整といったことは少ないので、秘書的な仕事をしてもらうことはあまりないわけですが、それでも複数社と取引しているような場合は細々とした業務を巻き取ってもらえるので便利に使えるのではないかと思います。

私の場合は毎月の見積書・請求書の発行や経理や電話など自分がやるとストレスフルな業務をアウトソースしつつ、契約書チェックなど単発で発生する雑多な業務も金額内でやってもらえているのでかなり助かっています。

React Native (with Expo)で開発してみた感想メモ

記憶が薄れる前にメモ。一人でガガガっと開発してみた感想です。

  • React Native のよかったところ
    • React、Typescriptで開発できるのは非常に楽
    • Android / iOSの差分や分岐も許容範囲
    • Android / iOSでの開発経験もそれなりに役に立った
  • Expoのよかったところ
    • こういうのあるかな、と思うと大体Expoが提供しているライブラリでカバーされている
    • ExpoでのPush Notificationの実装は一瞬だった
    • 開発中のものをテスターに利用してもらうのが楽だった
    • ビルド〜リリースまでの一連の手順もわかりやすい
      • TestFlightの使い方とか証明書の扱い方などを忘れていてもなんとなくで全てやってくれる
  • React Native のダメだったところ
    • Webの Material-UI に相当するMaterial Designライブラリがなかった
    • 適当に作るとパフォーマンスはあまりよくなさそう
      • 初期なら問題ないが、すぐにパフォーマンスチューニングのフェーズが来そう
    • (expoでしか使っていないのでまだダメ出しするほどよくわかっていない)
  • Expoのダメだったところ
    • 次は早速Bare WorkflowになりそうなのでManaged Workflowは初期の初期くらいしかメリットはないかも
    • expo clientをダウンロードしてもらって使い方を教えたりは結局手間だし、テストユーザーの人にあまり利用してもらえなかった
      • もし良ければ使ってみてください、くらいだとExpoのアプリアイコンを日常的にタップしてもらうのは難しい
    • Over the air updateはきちんと実装しないとアップデートのタイミングをうまく制御できない
      • 素直にストアからのバージョンアップで良いなと思った
  • ExpoとFlutterで悩んでExpoを選択したのは正解だったか
    • Expoは開発からリリースまでのワークフロー全体をカバーしているので、アプリ開発をよくわかってない人がリリースまで漕ぎ着けるのが早い
    • 開発費も開発期間も少ない今回はExpoを選んで正解だった
    • アプリ開発の知識があまりなくてリリースまで時間がない人、開発リソースが極端に少ない場合はExpoを使ったReact Native、それ以外の場合はFlutterのが最終的に幸せになれる気がしている

他にも思いついたら追記するかも。

ExpoでActive StorageにDirect Upload

Reac Native勉強中。

APIサーバーでもRailsは大活躍しておりますが、ExpoでActive Storageを扱うにはちょっとコツが必要でした。

まずはImage Pickerはなんでも良いと思うのですが、複数画像を選択できるnpmが expo-image-picker-multiple くらいだったのでこちらをインストール。

yarn add expo-image-picker-multiple

これを呼び出すわけですが、callbackで画像を扱いやすいサイズに縮小しつつ、その情報をbase64で取得します。

保存されたファイルをfetchして扱うとなぜかバイナリが変更されてしまうので、このbase64を取り回す必要がありました。

ついでにファイルサイズとmd5も取得します。

import { ImageBrowser } from 'expo-image-picker-multiple';
import * as ImageManipulator from 'expo-image-manipulator';
import * as FileSystem from 'expo-file-system';

async function processImageAsync(uri) {
  const file = await ImageManipulator.manipulateAsync(
    uri,
    [{ resize: { width: 1000 } }],
    { compress: 0.8, format: ImageManipulator.SaveFormat.JPEG, base64: true },
  );
  return file;
}

    <ImageBrowser
      max={20}
      loadCount={50}
      onChange={(num, onSubmit) => {
        setNum(num);
        setOnSubmit({
          fn: onSubmit,
        });
      }}
      callback={(callback) => {
        setLoading(true);
        callback
          .then(async (photos) => {
            const cPhotos = [];
            for (const photo of photos) {
              const pPhoto = await processImageAsync(photo.uri);
              const info = await FileSystem.getInfoAsync(pPhoto.uri, {
                md5: true,
                size: true,
              });
              cPhotos.push({
                url: pPhoto.uri,
                filename: photo.filename,
                width: pPhoto.width,
                height: pPhoto.height,
                type: 'image/jpg',
                size: info.size,
                checksum: info.md5,
                base64: pPhoto.base64,
              });
            }
            setValue('imageFiles', cPhotos);
            navigation.goBack();
          })
          .catch((e) => {
            console.log(e);
            setLoading(false);
          });
      }}
    />

この情報を利用してRailsAPIを叩きます。

今回recordを作成するのですがAPIは下記のように実際にrecordを作成するのとActiveStorage用のAPIは2つを利用します。

  blob: async (auth: Auth, file: File): Promise<BlobData> => {
    const client = new ApiClient<BlobData>(auth);
    return await client.create('/rails/active_storage/direct_uploads', {
      blob: {
        filename: file.filename,
        contentType: file.type,
        byteSize: file.size,
        checksum: base64.fromByteArray(hexStringToByte(file.checksum)),
      },
    });
  },
  directUpload: async (file: File, blob: BlobData): Promise<void> => {
    const fileBlob = base64.toByteArray(file.base64);
    const options = {
      headers: {
        'Content-Type': blob.directUpload.headers.ContentType,
        'Content-MD5': blob.directUpload.headers.ContentMD5,
      },
    };
    await axios.put(blob.directUpload.url, fileBlob, options);
  },
  create: async (auth: Auth, form: RecordForm): Promise<Record> => {
    const client = new ApiClient<Record>(auth);
    console.log({ record: form });
    return await client.create('/api/records', { record: form });
  },

これを下記のように

  • 画像ごとにactive storageのblobを作成してその情報でdirectUploadする
  • 画像情報を加えてアップロード

という感じでやればOKです。

            const images = await Promise.all(
             imageFiles.map(async (imageFile) => {
                const blob = await RecordApi.blob(state.auth, imageFile);
                await RecordApi.directUpload(imageFile, blob);
                return blob.signedId;
              }),
            );
              await RecordApi.create(state.auth, {
                ...form,
                images,
              });

だいぶ適当でしたが参考までに。

#アップロード中の途中経過を出すのはいったんパスしました。

Ubuntu18.04にFolding@homeをインストール(CUDA対応)

マシンリソースをコロナウイルスの解析に役立てるという話。

gigazine.net

ちょっと乗り遅れましたが自宅のUbuntuマシンにインストールしました。

うまくいかずに何度かやり直してあとから手順を見返しているので下記手順でうまくいかないところあるかも。

--

まずはグラボ(GeForce GTX 1050 Ti)がCuda対応なのでドライバとcudaのライブラリをインストール。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
sudo apt-key adv --fetch-keys 
sudo apt-get update
sudo apt-get install --no-install-recommends cuda-10-2

上記でnvidiaのドライバも入るはずだが、もしnvidiaのドライバが別途インストール必要であれば

ubuntu-drivers devices # recommendedを確認
sudo ubuntu-drivers autoinstall

でインストールできる。

次にFAHClientをインストール。

wget https://download.foldingathome.org/releases/public/release/fahclient/debian-stable-64bit/v7.5/fahclient_7.5.1_amd64.deb
sudo dpkg -i --force-depends fahclient_7.5.1_amd64.deb

--force-dependsでインストールしてモジュールが足りてないエラーが出たので、とりあえずaptで必要なモジュールをインストール。

sudo apt --fix-broken install

次に設定。

インストール中に設定画面が出るが、XMLのがわかりやすいのでインストール後に手動で/etc/fahclient/config.xmlを編集。user/passkey/teamは必要に応じてで良い。

<config>
  <!-- Client Control -->
  <fold-anon v='false'/>

  <!-- Folding Slot Configuration -->
  <gpu v='true'/>

  <!-- Slot Control: light, medium, or full -->
  <power v='full'/>

  <!-- User Information -->
  <user v='miyasakura'/>
  <passkey v='hogehoge'/>

  <!-- Folding Slots -->
  <slot id='0' type='CPU'/>
  <slot id='1' type='GPU'/>
</config>

一回再起動。(確かCUDAは再起動が必須なのとFAHClientは再起動しないとうまく動かなかった)

sudo reboot

起動後動いているか確認。

sudo systemctl status FAHClient

ログファイルをみて特にエラーが出ていなければOK。

less /var/lib/fahclient/log.txt

その時点でWork UnitがなければNo WUs availableといった表示が出ているが問題ない。

そのうちアサインされて動作が始まる。

ログを見ればGPUが使われているかどうかはわかるが念の為、

nvidia-smi

GPU-Utilを確認する。

自宅リモートワーク環境を整える

リモートワークをやる会社が観測範囲で増えてきているので、ここ数年ほどリモートワーク中心になっている自分がおすすめするものを上げてみます。

それほど工夫してきたわけではないので目新しいものはあまり無いかも。

昇降式デスク

手動は大変なので自動で。自分が買ったときはIKEAのものがコスパが良かったのでそれを買って未だに不満なく使えています。10年保証。いまならもっと安い選択肢もありそう。

www.ikea.com

昇降機能は平均して3週間で利用しなくなるというのをどこかで見た気がします。なので本当に必要かは正直その人次第です。立ったままずっとやるよりは30分ごとに適切に休憩したほうが作業効率も健康にも良いとは思います。

私は立ったままだとあまり集中できいのでほとんどは座った状態で、一日中作業する日で2〜3回程度、一回10分ほど立った状態で作業する程度の使い方です。

机の大きさは部屋次第ですが、幅はともかく奥行きは最低80cmは欲しい。

良い椅子

一日に座る時間×1万円が相場という噂。8時間作業なら8万円。自分はそんなに仕事したくないですしスタンディングも考えて5万円ほどの椅子です。(オカムラのSilphyというやつですが今見たら7万円くらいが相場になってた)

椅子に数万も払えるかよ、という人は専門店に行って10〜20万の価格帯の椅子を色々見ていると10万以下なら安いな、と思えるようになります😇

www.iamworkaholic.jp

安定した通信環境

固定回線はニューロ光がベスト、入れられないならauひかり。NTTの光回線なら最低限v6プラスを使う、が正解な気がします。

無線LANルーターはある程度値段がするものを買っておいたほうが安定しますが、バッファローの15000円のルーターでも使い方次第でよくフリーズするのである程度は諦めるしかなさそうです。

ちゃんと安定させるにはルーター機能と無線アクセスポイントは別デバイスにしたほうが良いというのが今のところの結論。

RescueTimeで時間を計測

PC/mobileのアプリで、立ち上げているアプリの時間を計測してくれるアプリ。適当になりがちな時間の使い方を振り替えることができます。

www.rescuetime.com

ポモドーロ・テクニックなど作業をうまくすすめる方法は色々ありますが、まずは計測、振り返りができる状態にして効果を計測するのが大事かと思います。

毎週送られてくるメールに書かれているProductivityをみるだけでも気づきがあり、フリープランでも十分に活用できます。

チャットの通知はOFF

リモートワーク関係なくかもしれませんが。リモートになればどうしてもチャットは増えるので基本OFFのが集中できます。

私は仕事メールのスマホ通知だけONにしてそれ以外はほぼ通知来ないようにしています。

オンサイトでの会議は避ける

現時点でのリモートワークは感染症の予防を目的なので顔を合わせてのMTGは無いと思いますが、そうでなくなったときのアドバイスとして。

自分はフリーランスなのでミーティングの場所に向かって1時間会議して戻ってきて作業、というのがよくあるのですが、準備・移動の時間や前後の集中が切れる時間というのも含めると一回1時間のミーティングだけで3〜4時間作業ができなくなって半日分のコストになっています。

なので、MTGがある日を集中させて移動や集中が切れる時間を減らすという工夫はしているのですが、基本ミーティングはやらない&やるとしてもリモートで短時間、というのが基本かと思います。

MTGのツールは Zoom か Whereby がおすすめです。

気分で作業場所を変える

自宅環境を整えると意地でも自宅で仕事をしたくなりますが、どうしても集中できないときとかは環境を買えたほうが良いです。

その時は自宅のリビングやコワーキングスペース、カフェあるいは会社などが選択肢になるでしょうか。

コワーキングスペースなどは会社員で会社がお金を払ってくれないのであればそこまでしてやる必要はないと思いますが、パフォーマンス向上のために会社側がお金を出して欲しいところですね。

カフェ等での作業はセキュリティが厳しい会社ではそもそも禁止されているかと思いますが、外作業をやるなら覗き見防止フィルターは最低限つけておきましょう。

おわりに

ぱっと思いついたのがこんなところです。エンジニアとしてだと更に開発マシンやソフトウェア、他にも固定IP、VPNなどのネットワーク周りなど色々ありますが万人にオススメするわけではないので別の機会に。更に思いついたら追記します。