spice picks

エンジニアをしているspiceが色々書きます

ノマド生活、海外移住、フリーランス挑戦、ポッドキャスト・・・盛りだくさんの2023年でした

ノマド生活はすぐ飽きる

6月に部屋を解約して、 マレーシア、東京、ベトナム、タイでノマドワーカーに挑戦してみました。

  • マレーシア(クアラルンプール): 6/11 ~ 7/22
  • 東京(八王子など): 7/23 ~ 9/24
  • ベトナム(ハノイ): 9/24 ~ 10/8
  • タイ(チェンマイ): 10/8 ~ 10/23
  • マレーシア(クアラルンプール):10/23 ~ 11/12

タイのナイトマーケット

ベトナムのなんでも無い路地裏

マレーシアで泊まった建物から見える夜景。フードデリバリーのGrabバイクが沢山とまっていた

よかったところ

  • 色んな文化を体験できる
  • 英語を使う練習になる

よくないところ

  • 異文化体験は数週間で飽きる
  • 移動するたび生活に必要な情報を調べなければいけないので疲れる
  • 思ったより安くない(もうアジアは日本と比べても「めちゃくちゃ安い!」って感じじゃなさそう)
  • 赤道に近いとずっと暑い
  • 定住しないので友達もできず、何かしらのコミュニティと深く関わることはない
  • 東京のマンスリーマンションは都心から離れた場所の1Kで15万円/1ヶ月くらいの家賃。クソ高い。

振り返ると、ノマド生活はもうやりたくないかな、という感じw

結局、そこにちょっと住むくらいでは交友関係は広がらないし、現地の文化を深く知ることもできないんだろうなと感じました。

どうしたって観光用の文化に触れるだけで終わるので、あっっさい異文化体験で終わってしまうんですよね・・・。

SNSでたまに見かける「旅をしながら暮らしている系インフルエンサー」はこのようなあっっっさい異文化体験をなるべく修飾してキラキラ投稿してるだけなんだろうなと思います。

(個人の見解です)

また、定住して自分の部屋を持っていないと「お気に入りのものに囲まれて暮らす」ができず、所有物を減らす必要がありました。

好きなものを発見しても手に入れることができないストレスが積み重なると、だんだん人生に魅力を感じなくなる気がします。

(個人の感想です)

海外移住したぞ〜

来たばっかりなんだけど、12月後半からバンクーバーに移住しました。

これからはまず現地のカレッジ(大学というより専門学校に近い)に通ってセキュリティ系の勉強をする予定です。

これは現地で働くビザが欲しくて通っているだけで、セキュリティ系の職種に転職したいわけではありません。

とはいえ多少興味はあるので、英語の勉強も兼ねて楽しくやっていきたいと思っています。

学校が終わったらフルタイムでフルスタックエンジニアを目指して本格的な転職活動を始めます。

ひとまず、永住権を獲得するのを目標に色々頑張るぞ!

フリーランス挑戦

フリーランスになりたいわけじゃなかったのですが、なってしまいましたw

6月に会社を辞めようと思ったタイミングでカナダ渡航を決めていたので、正社員での転職は諦めてフリーランスでしばらく生きることにしました。

元々副業していた会社にほぼフルタイムでお世話になる形で年末まで稼働しました。

半年ほどフリーランスをしましたが、個人的には社員として働くのが向いているなと感じています。

会社のカルチャー作りやdevOpsを含めた全体の改善にコミットしながら良いプロダクトを作るのが好きっぽいです。

カナダで正社員として就職できるのは1年弱かかるかな・・・。と思っているので、しばらくは耐え凌ぐターンですかねえ。

ポッドキャスト頑張るぞ

前このブログでも書いたのですが、知り合いとやっているポッドキャスト「ITトリオの日常」がそこそこ順調です。

rabspice.hatenablog.com

週1更新を休まずに続けられていることや、音声の質が上がっていることを実感しているのが自信になっていますし、 緩やかではありますが数字は着実に伸びているので、たしかな手応えを感じています。

最近は一段とエンジニアやWeb系のポッドキャストが増えてきており、特に企業が主催する番組も増えています。

そんな中でも魅力的な番組として勝ち上がるつもりです!🔥

ITトリオ、やっていくぞ〜😎

肝臓D判定

3月くらいの健康診断で、肝臓D判定を食らってしまいました。

27歳で、お酒も月に数回飲む程度なのにドウシテ・・・。

詳細な検査を別の病院でしてもらったところ、原因はお菓子の食べ過ぎでした。

自分はグミやチューイングキャンディが好きで、目の前にあれば休憩を挟まず数袋食べ切る食生活をしておりました。

ハイチュウ1本30分ぐらいのペースで食べるのが普通だったのですが、それをお医者さんに話すとドン引きされ、お菓子を控えるようアドバイスをもらいました。

27歳でそんな状況になるとは思わず、さすがに危機感を感じました。

その後は徐々にお菓子の量を減らしていき、お菓子を食べず1日過ごしても苦しくなくなりました。

結果的に4kgくらい痩せて、ちょっとお酒に強くなった気がします。

健康健康健康健康!!!

Expo CLIとEAS Buildを使う時の環境変数の設定

Expo CLIでローカルの開発、EAS Buildでアプリのビルドを作成、という具合でアプリの開発をしているのですが、 環境変数の扱い方に戸惑い時間を溶かしました。

迷ったところと最終的な設定方法をご紹介します。

なお、Expo v49以降を前提とします。

Environment variables and secrets in EAS Build - Expo Documentation

Expo CLI使用時の環境変数

ドキュメントはこちら Environment variables in Expo - Expo Documentation

Expo v49からは.env*ファイルが自動で使われます。

アプリ内で参照するためには、各変数がEXPO_PUBLIC_から始まる必要があります。

EXPO_PUBLIC_API_URL=https://staging.example.com
--> アプリ内で参照可能🙆‍♂️

SOME_KEY=foobar
--> アプリ内で参照不可🙅‍♂️

環境ごとに使用するファイルを変えたい場合は、standard .env files に従ってファイルを作成し、expo実行時のNODE_ENVを変更すればOKです。

NODE_ENV=production expo start
---> .env.production.local や.env.production が使われる

NODE_ENV=development expo start
---> .env.development.local や.env.development が使われる

EAS build時の環境変数

ドキュメントはこちら Environment variables and secrets in EAS Build - Expo Documentation

Because your EAS Build job runs on a remote server, these .env files might not be available.

とある通り、expo実行時に使える.envファイルは使用できない!😡

ということで、EAS buildでの環境変数の設定はeas.jsonに記述します。

dev,prod向けで環境変数を変えたい場合は、eas.jsonのビルドの種類ごとに設定する必要があります。

{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "env": {
        "EXPO_PUBLIC_AD_ID": "ad_id_dev",
        "EXPO_PUBLIC_API_URL": "https://staging.example.com",
        "APP_VARIANT": "development"
      }
    },
    "production": {
      "autoIncrement": true,
      "env": {
        "EXPO_PUBLIC_AD_ID": "ad_id",
        "EXPO_PUBLIC_API_URL": "https://example.com",
        "APP_VARIANT": "production"
      }
    }
  }
}

また、eas.json内で定義した環境変数はExpoの設定ファイル(app.config.js/ts)で参照ができます。

設定ファイル内ではEXPO_PUBLIC_から始まらない環境変数も使えるので、設定ファイルだけで使いたい環境変数EXPO_PUBLIC_をつけない名前にするのがわかりやすくて良さそうです。

自分はeas.jsonで設定したAPP_VARIANTapp.config.ts内で参照してアプリ名などを出し分けることにしました。

import { ExpoConfig, ConfigContext } from 'expo/config';

const IS_PROD = process.env.APP_VARIANT === 'production';

export default ({ config }: ConfigContext): Partial<ExpoConfig> => {
  return {
    ...config,
    name: IS_PROD ? 'アプリ名' : '[dev]Listen',
    ios: {
      ...config.ios,
      googleServicesFile: IS_PROD ? './GoogleService-Info.plist' : './GoogleService-Info-Dev.plist',
      bundleIdentifier: IS_PROD ? 'com.spicex.Listen' : 'com.spicex.Listen.dev',
    },
    android: {
      ...config.android,
      googleServicesFile: IS_PROD ? './google-services.json' : './google-services-dev.json',
      package: IS_PROD ? 'com.spicex.Listen' : 'com.spicex.Listen.dev',
    },
  };
};

はまったポイント

環境変数を設定するためにExpo用の設定とEAS Build用の設定がそれぞれ必要で、 同じ値を.env.*系ファイルとeas.jsonの2箇所に書かなければならないのが盲点でした。

さらに開発開始当初はプロジェクトのレポジトリに.envがあり、EAS Buildのローカルビルドではそこで設定した環境変数を参照できてしまったため、production向けビルドを行ってもdev環境に向いてしまう問題がおこり時間を溶かしました。

最終的には、

といった具合で同じ値を2箇所に書いて無事に開発を進めています。

同じ値を複数箇所に書くのはちょっと違和感あるんですが、まあ大きな問題は起こらない・・・はず。


この記事は React Native Advent Calendar 2023 10日目の記事でした!

qiita.com

React NativeのTextInputで使える13個のコールバックをちゃんと見てみる

reactnative.dev

公式ドキュメントを見ると、TextInputは13種類のコールバック関数を渡せるらしい。

  • onBlur
  • onChange
  • onChangeText
  • onContentSizeChange
  • onEndEditing
  • onPressIn
  • onPressOut
  • onFocus
  • onKeyPress
  • onLayout
  • onScroll
  • onSelectionChange
  • onSubmitEditing

TextInput、たまに触る時にちょろちょろ公式ドキュメントを読んでいるだけで、これらのコールバックの細かい違いを把握していない・・・。

ちゃんと理解した方がいいよね、ということでそれぞれの挙動を実際に動かしながら確認してみました。

(本当はreact native自体の実装も読んだ方が良かったのですが、この記事をアドベントカレンダー予約日前日に書き始めてしまったので叶わぬ夢となりました。すみません。)

実際に動かしたサンプルコードは以下の通りで、観察したいもの以外のpropsを適宜コメントアウトしております。

import { TextInput, View } from "react-native";
 
 export default function App() {
   const onBlur = (e) => {
     console.log("onBlur");
     // console.log(e);
   };
   const onChange = (e) => {
     console.log("onChange");
     // console.log(e);
   };
   const onChangeText = (e) => {
     console.log("onChangeText");
     // console.log(e);
   };
   const onContentSizeChange = (e) => {
     console.log("onContentSizeChange");
     // console.log(e);
   };
   const onEndEditing = (e) => {
     console.log("onEndEditing");
     // console.log(e);
   };
   const onPressIn = (e) => {
     console.log("onPressIn");
     // console.log(e);
   };
   const onPressOut = (e) => {
     console.log("onPressOut");
     // console.log(e);
   };
   const onFocus = (e) => {
     console.log("onFocus");
     // console.log(e);
   };
   const onKeyPress = (e) => {
     console.log("onKeyPress");
     // console.log(e);
   };
   const onLayout = (e) => {
     console.log("onLayout");
     // console.log(e);
   };
   const onScroll = (e) => {
     console.log("onScroll");
     // console.log(e);
   };
   const onSelectionChange = (e) => {
     console.log("onSelectionChange");
     // console.log(e);
   };
   const onSubmitEditing = (e) => {
     console.log("onSubmitEditing");
     // console.log(e);
   };
 
   return (
     <View
       style={{
         flex: 1,
         backgroundColor: "#fff",
         alignItems: "center",
         justifyContent: "center",
       }}
     >
       <TextInput
         style={{
           width: 200,
           maxHeight: 200,
           borderColor: "gray",
           borderWidth: 1,
         }}
         onBlur={onBlur}
         onChange={onChange}
         onChangeText={onChangeText}
         onContentSizeChange={onContentSizeChange}
         onEndEditing={onEndEditing}
         onPressIn={onPressIn}
         onPressOut={onPressOut}
         onFocus={onFocus}
         onKeyPress={onKeyPress}
         onLayout={onLayout}
         onScroll={onScroll}
         onSelectionChange={onSelectionChange}
         onSubmitEditing={onSubmitEditing}
         // value="Hello World"
         // editable={false}
         // multiline
       />
     </View>
   );
 }

また、reactはv18.2.0、react-nativeはv0.72.6を使用しています。

onPressIn, onPressOut, onFocus

  • onPressIn: ({nativeEvent: PressEvent}) => void = TextInputの内部がタップされたとき
  • onPressOut: ({nativeEvent: PressEvent}) => void = onPressInの後、タップされている指がはなれた時
  • onFocus:({nativeEvent: LayoutEvent}) => void = TextInputにフォーカスが当たった時

ということで、よく使うし名前を見れば直感的に理解ができます。

また、これらの呼ばれる順番ですが、基本的にはonPressIn,onFocus,onPressOutの順番で呼ばれるようです。

簡単ですね。

って思ったんですけど、どうやらonPressOutは指を離さなくても、画面に触れたままTextInputの外に指を動かせば発火するようでした。

また、そのまま指を再度TextInputの中にいれるとonPressInも発火するようです。

そして、TextInputの外で指が離れた場合、TextInputへフォーカスは当たらず、onFocusは発火しないみたいでした。

タップして離す/タップして離さず動かす

知らなかった。

また、条件の詳細がわかっていないのですが、Androidで前述した操作を行いonPressIn,onPressOutを繰り返し発生させてから指を離すと、 「TextInputにフォーカスは当たっていないがテキスト貼り付けができる」状態になることがあるみたいです。

フォーカスが当たっていないのに貼り付けメニューが出ている時のスクショ。Pixel 7/ Android 13 で再現

困るシチュエーションは少なそうですが、バグっぽい挙動なのでReact NativeにPR送るチャンスなのかもしれません。

今度issueやコード見てみようかな。

onChange,onChangeText,onKeyPress

  • onChange:({nativeEvent: {eventCount, target, text}}) => void = TextInputの中身のテキストが変わった時に呼ばれる
  • onChangeText:(text: string) => void = TextInputの中身のテキストが変わった時に呼ばれる。引数には変更後のテキストだけが渡される
  • onKeyPress: ({nativeEvent: {key: keyValue} }) => void = キーボードが押された時に呼ばれる。

名前から想像がつきますね。

大体のケースで、中身の変更を捕捉したい時はonChangeTextで事足りるように思います。

onChangeを使うと、コンポーネントがマウントされてから何回テキストが変更されたかの情報がeventCountから取得できるので、 テキストの変更履歴を一定間隔で保存しておく、のような仕様で実装したい時には使えるかもしれません。

onKeyPressは、キーボードが押下された時に発火するようです。

文字だけでなく、EnterBackspaceが押された時にも発火するので、エンターキーが押された時に特定の処理を差し込みたい! という時に便利かもしれないですね。

ちなみに、キーボードの種類(日本語/英語/記号/絵文字)を切り替えるボタンを押した時には発火しないように作られています。ありがたいですね。

しかしこのonKeyPress、キーボード上に表示される予測変換を選択した時にも発火するようです。

iOS(少なくともiOS17)については予測変換の単語選択の全てでonKeyPressが発火し、単語の直後に空白スペースが入る時も発火するようです。

Androidの場合は、入力中の文字に対する予測変換の選択時とその直後の空白スペースの自動入力時には発火しましたが、その後出てくる予測変換の選択では発火しませんでした。

予測変換を選択した時にonKeyPressが2度発火する様子

これは認識しておいた方がよさそう。

また、この挙動があるので「エンターキーやバックスペースキーを実際に押した時」と「予測変換からEnterやBackspaceを選択した時」の区別をつけられなさそうです🤔

エンターキーを押した時と予測変換の「Enter」を選択した時のkeyValueが'Enter'なので区別がつかない

これまで何度か、このonKeyPressで以下のような分岐を書いていたのですが

if (keyValue === 'Enter') {
  // do something
}

意図しない発火を捕捉できていなさそうだ・・・。

これって解決方法あるんですかね?🤔

もしご存じの方がいたら教えてください!

また、日本語のローマ字入力などをする場合は、キーボードがアルファベットを他の言語へ自動で変換する時にもonKeyPressは呼ばれるようなので注意が必要そうでした。

日本語ローマ字入力でonKeyPressが発火する様子

onBlur ,onEndEditing,onSubmitEditing

  • onBlur: function = TextInputからフォーカスが外れた時に呼ばれる
  • onEndEditing: function = TextInputのテキスト入力が終わった時に呼ばれる
  • onSubmitEditing: ({nativeEvent: {text, eventCount, target}}) => void = submitボタンが押された時に呼ばれる

ドキュメントを読む限り、入力が終わった時のテキストを取得したい場合はonEndEditingonSubmitEditingを使うのがよいらしいです。

oBlurでもその時のテキストを引数から取得できたのですが、推奨されていませんでした。

onSubmitEditingは、「submitボタンを押してフォーカスが外れる時」には発火し、「他の要素をタップしてフォーカスが外れる時」は発火しないようでした。

「submitボタンを押してフォーカスが外れる時」の発火順

  1. onSubmitEditing
  2. onEndEditing
  3. onBlur

「他の要素をタップしてフォーカスが外れる時」の発火順

  1. onEndEditing
  2. onBlur

これら2つの動作を区別して処理を分けたい場合は、onSubmitEdigingが呼ばれた時にコンポーネントのstateを操作し、onEndEditingでそのstateを参照することで実現できそうです。

const [isSubmitFlow,setIsSubmitFlow] = useState(false);
  const onSubmitEditing = (e) => {
    setIsSubmitFlow(true);
    // do something
  };
  const onEndEditing = (e) => {
    if(!isSubmitFlow){
      // do something
      return;
    }
    // do other things
  };
  const onBlur = (e) => {
    // do something
    setIsSubmitFlow(false);
  };

onLayout, onScroll, onContentSizeChange, onSelectionChange

  • onLayout: ({nativeEvent: LayoutEvent}) => void = 要素がマウントされた時と、レイアウトに変更があった時に呼ばれます
  • onScroll: {nativeEvent: {contentOffset: {x, y} }}) => void = TextInputの中身がスクロールされた時に呼ばれます
  • onContentSizeChange: ({nativeEvent: {contentSize: {width, height} }}) => void = TextInputの中身の大きさに変更があった時に呼ばれます
  • onSelectionChange: ({nativeEvent: {selection: {start, end} }}) => void = 選択中のテキスト範囲に変更があった時に呼ばれます。

ここら辺は名前の通りの挙動かなと思います。

が、onSelectionChangeについてはテキスト選択中の時のみ発火するのではなく、 カーソルの位置が変わった時にも発火するので注意が必要です。

startとendが同じ値の時は単純なカーソル位置、startとendが違う場合は選択中の範囲を示します。

そして、ローマ字入力で母音を入力する時にはonSelectionChangeが2回発火するようでした。

ローマ字日本語入力では母音の入力でonSelectionChangeが2回発火する様子

おわりに

実際に動かしてみると、細かい挙動で認識していないものがあったので勉強になりました。

それぞれの挙動は時間が経てば忘れてしまいそうですが、

「ちょっと注意しなければいけない挙動があるぞ」

という認識を持てたので、今後TextInputを使って多少複雑な処理を書く時に気を付けることができそうです。

また、今までTextInputを使う時はコンポーネントのstateとTextInputvalueonChangeTextでリアルタイムに同期させる処理を深く考えずに書いていたのですが

const [value, setValue] = useState("Hello World");
  const onChangeText = (text) => {
    setValue(text);
  }
  return <TextInput value={value} onChangeText={onChangeText} />;

リアルタイムで中身を参照する必要がないのなら、onEndEditingで入力が終わった時だけ同期するのでもいいのか?と思ったりしました。

  const [value, setValue] = useState("");
  const onEndEditing = (e) => {
    setValue(e.nativeEvent.text);
  }
  return <TextInput onEndEditing={onEndEditing} defaultValue="Hello World"/>;

また時間がある時に考えてみようと思います。


この記事は

React Native Advent Calendar 2023 3日目の記事でした!

「アップロード中のスクリーンショットがあります。」 というエラーがiOSアプリの審査で消えなくて困った件とその解決策

必須のスクリーンショットを全てアップロードしたつもりなのに、以下のエラーが消えなかった。

アップロード中のスクリーンショットがあります。というエラー

結論

iPad Pro(第6世代)12.9インチディスプレイ」のスクリーンショットをアップロードして、

iPad Pro(第2世代)12.9インチディスプレイ」のスクリーンショットをアップロードしていないとこのエラーメッセージが出る。

iPad Pro(第2世代)12.9インチディスプレイ」にもスクリーンショットを設定するとエラーは消えた。

(正しいエラーメッセージだしてくれ・・・)

ポッドキャストを始めて1年、わりと順調で嬉しい

趣味でポッドキャストを始めて1年で、フォロワー300人を超えてマネタイズもできるようになりました。

良い節目だし自慢したいので、これまでの実績をまとめます。

ついでに、休まず週に1回配信を続けられた収録/編集方法も紹介します。

どんなポッドキャストやってるんだ

「ITトリオの日常」というポッドキャストを配信しています。

エンジニア3人が集まって雑談ミーティングする、というコンセプトで毎週月曜日に最新エピソード更新中です。

Spotify

open.spotify.com

Apple Podcast

podcasts.apple.com

エピソードについて

「雑談ミーティング」がコンセプトなので、 何となくエンジニアが共感できそうな話題をゆるめに扱うことが多いです。

たまに技術関係ないエピソードがあったり、おたより返信回があります。

これまで特に人気だったエピソードは以下の通り。

話している3人について

ITトリオの日常のホストは

  • おぐらくん(僕
  • なべちゃん
  • ちーず

の3人です。 それぞれ大学時代からの知り合いです。

おぐらくんとなべちゃんは大学の研究室が同じ、おぐらくんとちーずは大学時バイトが同じ、ちーずとなべちゃんは新卒同期
3人の絶妙な相関関係

エンジニア系ポッドキャストは沢山あるのですが、男女3人で話しているものは珍しいかも?🤔

差別化要因の1つかもしれません。

実績

たくさんのリスナー

1年たった現在、各種プラットフォーム(Spootify,Apple Podcast, Google Podcast)を合計すると、300人以上もチャンネル購読者がいます。

いつも聴いてくださっているみなさま、ありがとうございます!

2023年10月8日のSpotifyのアナリティクス。(配信プラットフォームを今年になって変えたので、再生開始数/ストリーミング数は正しく出てない)

リスナーの男女比は大体7:3で、 年齢的には20-30代の方々が多いようです。

Spotifyの年齢分布

また、Apple Podcastのテクノロジーカテゴリでは20位~100位をうろちょろしていることが多いですね。

Podcastランキングのスクショ

(最新のランキングはこちら)

続けていればリスナー増えるかな、と思っていたのですが、1年で300人超えるとは思っていませんでした。(すごい

今もコンスタントに増加中なので、1年後には1000人を超えたいな・・・という野望を抱いています。(小声

より多くの方に楽しんでもらえるよう、引き続き頑張ります!🔥

マネタイズ

2023年9月からはPitPaさんのネットワークに参加したので、広告がついてマネタイズが始まりました。

PitPaさんがいなかったらマネタイズも始まってないので、感謝しかないですね・・・。

エンジニアにリーチしたい会社のみなさま、広告掲載お待ちしています!!

prtimes.jp

収録や編集の話

収録ツール

これまでの放送はすべてzencasterというツールでオンライン収録をしています。

zencastr.com

それぞれのローカル音源を個別に録音してくれるのがzencasterの良いところです。

ネットを通して録音すると、音声はどうしても品質が落ちますし、たまに途切れることもあります。

しかしzencasterが用意してくれたローカルの音源を使えばそんな事件をなかったことにできて非常に便利です。

(似たような収録ツールとしてRiverside.fmもあり、こちらを使うポッドキャストの方が多そうです。僕は使ったことないのでよく知らないですが、こちらもよさそう。)

収録頻度とか編集とか

ITトリオの日常は毎週月曜日に更新していますが、 収録は3人の予定が合う日を見つけて3回分くらいまとめて録っています。

お正月以外は休まず配信を続けられているのですが、まとめどり方式にしたのが大きいと感じています。

3回分くらいストックがあれば、何かしらのトラブルがあっても余裕があるので融通が効いてなんとかなります。

毎週収録でやっていたら、きっとお休みだらけだったでしょう・・・。

編集についてはLogic Proを使っていて、

  • 各音声の音量調整
  • 無音部分の削除
  • オープニング、ジングル、エンディングの挿入

などを行なっています。

Logic Proのスクショ

最初の方は1エピソードを編集するのに4~5時間くらいかかっていましたが、 今では1時間~2時間くらいで編集できるようになりました。

やろうと思えばもっと質を高めることもできそうですが、趣味で週1配信を続けるために無理ない程度の編集を心がけています。

1年続けて良かったこと

毎週配信を1年も続けると結構な自信になる

1年たつと放送の数も50を超えるのですが、これがなかなか精神安定剤になってありがたいです。

時々「毎週アウトプットしている人間なんてそんなにいない!それができているITトリオ凄いぞ!」と自己肯定感あがるTimeが訪れますし、

ちょっと落ち込んだ時はこの事実を思い出すだけでメンタル回復ができます。

毎週1回何かしらのアウトプットするのはそんなに簡単なことではないと思うのですが、自分はポッドキャストなら無理なく続けられるようでした。

ありがたいです。

自分が何を考えているかの解像度が高くなる

ポッドキャストを始める前は自分の中で完結していた感情や思考が沢山あったのですが、それを人に向けて話すことが多くなりました。

その過程で自分の気持ちを言語化して整理することで、自分自身が何を感じているのか/考えているのかについて、解像度が高くなっている気がします。

また、そうして解像度が高くなることで、職場で自分の考えを分かりやすく伝えることができて役に立ったことも何回かありました。

おわりに

1年続けてみると結構楽しくて、良いことも多かったです。

趣味が無くて困っている人は、ポッドキャストを始めてみるのもいいんじゃないでしょうか?😎

これからも「ITトリオの日常」は毎週月曜日に更新します!

ぜひ番組のフォローよろしくお願いします!

open.spotify.com

podcasts.apple.com

あと、一緒に続けてくれたちーず、なべちゃんに感謝!

アウトプットできねえのはアウトプットしてねえからだよ!

2023年にやりたいことを考える上で思考を整理してみた。

情報の有効期限

知識や情報には有効期限(使える情報である期間)があり、 時事性が高いものは有効期限が短い。

(e.g. 株価とか、ある技術の最新動向とか。)

逆に長く役に立つものは時事性が低い&学習コストが高い。

(e.g. 例えば、哲学とか、コンピューターサイエンスとか。)

このような知識は大体学問のように体系だっているから、それが出来上がるまでの時間もかなりかかっている。 熟成された知識、というイメージ。

有効期限が短いと価値が無い?そんなことはない

有効期限が短い知識は価値が低いと思いこんでいたけど、じつは知識の種類が違って役に立つ場面が違うだけで、それぞれに異なる価値がありそう。

自分は「有効期限が短い=価値が無い」という考えを知らぬ間に持っていたせいで、これまで「長く役に立つものだけをインプットしよう」という気持ちを持っていた。

このせいで、インプットの種類が偏りがちで、学ぶまでの腰もかなり重くなっていたぽい。

定期的インプット

有効期限の短い情報=時事性の高いインプットは、リアルタイムに仕入れないと価値が低くなってしまう。

なので、いちいち価値の判断を行ってからインプットしていると、その判断の間に価値が無くなってしまう。

これを解決するには、とりあえず定期的にインプットすることを自動化しちゃうのがよさそう。

インプットした情報の価値判断はインプット後に行って、不要な情報はインプット後に忘れる、という構図。

これまでこのようなインプットを行ってなかったので、2023年定期的インプットを1つの目標にしたい。

以下、自分が定期的にインプットしたいものを羅列してみる。

経済・株について

不動産について

  • 理由: 2022年には不動産投資についての基礎的な知識を身につけたが、株と同じでリアルタイムの不動産物件について色々調べていないと、実際に購入するための相場などの目利きができなさそうだと感じている

技術的なもの

  • 理由: エンジニアとしてやっとくべきだだが、最近あんまりインプットできてなかったのでやっていくぞの気持ち
    • GitHub Trend、Zenn、Qiita を毎週眺めるか

アウトプットの有効期限もある?

情報の有効期限には多分、単なる時事性だけではなく、「自分が価値を感じる」有効期限もありそう。

一瞬役にたったと思っても、一週間くらいでその感動は薄れる的な感じで、自分の中で情報が昇華されて「当たり前」になると、価値を感じなくなる気がする。

この時、あくまで「価値」が「常識」に昇華したわけで、価値が無くなったわけではない。

この構図を考えると、アウトプットについても定期的なものにしないと、価値を感じる有効期限が来てアウトプットできなくなってしまう。

「発信できるものがあればアウトプットしよう」だと、中身を考えるうちに有効期限が切れてしまう。

つまり、「アウトプットできるものがない」の理由は、アウトプットしていないから!

中身を迷う前にひとまず出してしまえ!!

こんなことを考慮すると、インプット同様、アウトプットについても定期的に行えるような仕組みや習慣を作り、それに合わせて中身を埋めていくのが良さそう。

このような思考整理ができたから、2023年はインプット/アウトプットを頑張りたい所存。(一年ぶりn回目🔥)

2022年の振り返り箇条書き

結構良かった年だと感じている

  • 仕事
    • 視座が上がった(主観)
      • 組織全体の問題について思いを馳せることが多くなった
      • 視座を上げようとして努力していた訳ではなく、働く中で感じる課題について考えを深める中で、個人、チーム、部署、組織、といった順番で自然と課題の範囲が大きくなっていった
    • 技術的に新しく学べたことが多かった
    • 働くモチベーションが少し低下
      • まあ今年に始まったことではないが、リモートワークが続く弊害みたいなところがある
      • 自分のモチベーションの出どころが、半分事業、半分同僚とのコミュニケーションみたいな感じで、リモートだと後者がなくなってしまい、全盛期のモチベーションに遠く及ばないと感じる場面が多い。
  • 趣味、生活

    • ジャルジャル
      • Youtubeのコントに3回ほど出演ができた。非常に嬉しい。
      • ネタサロン会員が応募できるもので、3回ほど出れた!とても良い思い出。来年は5回くらい出たいな。
    • 映画
      • 多分、30本くらいの映画を映画館で見たかな?
      • 今年は特に、「スパイダーマン ノーウェイホーム」、「ハケンアニメ!」、「すずめの涙」が心に残っている
      • 自分は映画館で映画を見ることがとても好きで、家で映画を見るのはそれほど惹かれないことにも気づいた。
        • 映画館で見ると、何より集中ができる
        • 自分は集中が散漫しがちなので、映画館にいるだけで映画を見る体験の質が爆上げになるので、映画館が好き
    • 読書
      • 今年は全然本を読んでいなくて、30冊くらいしか読んでない気がする
      • 高校生くらいからビジネス本などを読んでいたので、最近そういう本を読むの飽きてきた感じがある。
      • 2023年はこれまで読んでなかったジャンルに挑戦するのもありかもしれない。
    • アニメ、漫画
      • 今年はたくさん見ていた気がする。
        • ヒロアカと呪術廻戦が熱い一年、毎週楽しませてもらった
        • ワンピースを1から最新話まで読んだ
        • ジャンプ+やLINE漫画にも大変お世話になった
      • アニメはそんなに見てないかな?
    • ゲーム
      • マリオカートの熱が2022年前半で冷めた。
        • お気に入りのYoutuberの大会にランクインして目標達成したので、それで一区切りという感じ
        • とはいえ新コースが出たらちょくちょくやっているくらいには好き。
      • その他にやったゲーム
    • 音声配信を始めた
    • 個人開発のサイトをリニューアル
      • デザイン一新してリリースができた。本当はコンテンツを色々増やしたいけど開発ができていない
      • 一応Google Adsenseを設置して、一ヶ月に数百円くらい稼いでくれてる
      • リニューアルしてから放置ぎみだけど、時間あるときにちゃんとやりたい・・・
    • 引っ越した
      • 元の部屋に1年10ヶ月ほど住んで引っ越した
      • 大体2年に1回引っ越しているのだが、こんなに引っ越しが多くなると思ってなかったw
      • 人生で初めて同棲を始めたので、色々と経験することが多い2023年になりそう
    • 英検準一級
      • 思い立ってGWに申し込み、一ヶ月ほどちゃんと勉強をして無事合格しました
    • ブログバズった
  • まとめ

    • 全体的に、新しく始めれたことが多く、満足な一年でした
    • しかし仕事のモチベーションの低下と、読書量の低下、ブログ記事の少なさを2023年には改善したい