転職を期にこれまでを振り返る

個人開発の休憩がてら書く。

10月一杯で2年と9ヶ月勤めた会社を退職して別の会社に入った。

前職の会社は地方の小さな会社で、WEB的な開発半分SIer的な開発半分な受託開発の会社だった。スーツで出社する必要はなかったけどお客さんと会って打ち合わせすることとかはあったのでそういうときはスーツ着ていた。

入社してすぐアーロンチェア? 的な高い椅子と高級そうな机が届き、それを組み立てるのが初出社日の仕事だった。翌日PCをセットアップした。PCはiMac27インチで、メモリは24GBに拡張してあった。入社したときの自分はプログラミングは完全に未経験者だったので、そんな人間によくiMac買ったなと思うがよく考えたらmacbook買うのもそんなに値段変わんないかもしれない。でもまあとにかく椅子と机は高級だった。

要するにプログラミングを覚えるにはかなりいい環境だったのだろうと思う。低スペックのWindowsPC渡されてたら嫌気が差して今頃ITの仕事つづけていなかったかもしれないし、炎上システム開発案件の噂話でよく聞くように狭い会議室の中パイプ椅子に座らされ隣の人と肘がぶつかるような距離で長机に向かい、前任者が酷使したが故にトラックパッドがツルツルになってしまったThinkPad上のサクラエディタで開発させられたりしてたら過労死していたかもしれない。仕事中に細かくあれこれ指示をされることもなく、自分で自由にググってツールインストールして使ったりしたりしてもよかったので、そういう試行錯誤をするのが一番勉強になった。vimを愛用するようになったのは明らかにこの環境のおかげだった。

案件的にもPHPとかSQLとかSwiftとかAndroidJavaとかいろいろあって勉強になった。地方の会社ってなんでも請け負ってWEBからスマホからやれるものはなんでもやるという感じになると思うのだけど、そのおかげでいろんなものに手を出せたのはよかった。

じゃあなんでそんないい会社を辞めてしまったのかというと、入社して三年目になると自分の成長度合いが目に見えて落ちてきたと感じてきたからだ。

入社してすぐから1年半ぐらいの期間は、とにかく触れるもの全てが新しくて自分がぐんぐんプログラマーとして成長しているのを感じていた。まあ、最初期にプログラミング全くわからない状態でObjective-CでのiOSアプリ開発を課題として与えられたときは全然わからなくて挫折しかかっていたが、その時期をすぎたらプログラミングが楽しくなってきていた。

それに対して丸二年経って三年目に入ってくると、結構似たような仕事が多くなってきたりとか、WEBのバックエンドやコンピューターの低レイヤ、ネットワークなどに対するしっかりした知識なしに雰囲気でコード書いていることに対し漠然とした不安を感じるようになった。会社が小さくて自分と同スキルだったり似たような技術趣味傾向の同僚がいなかったのも不安を強めた原因と思う。

また、インターネット上で活躍しているエンジニアたちのブログなどを読むと自動テストだCIだクラウドだキャッシュだ仮想DOMだRxなんとかだと書いてあるのにそれらをほとんど触ったこともないことに不安を抱くようになった。つまり、そのあたりの部分に成長の余地を感じた。

地方の小さい会社では、そういうモダンな開発手法だとかフレームワークだとかははっきり言って必要ないというか、まあなくても十分仕事できる。案件的にもWordPressとかEC-CUBEをカスタマイズしたりだとか、それらのサイトをWebViewで見られるようにして、あとちょろっと通知が出せるようなアプリさえ作れればなんとかなると思う。

正直言って自分もそういう地元の産業と結びついたWordPress屋さんみたいな仕事をいいなと思う。完全にそっち方向に向いた会社も転職先として候補に入れていて面接もうけた。しかし、結局はモダンな開発を学習できる環境に身を置きたいと思った。

職業人生を会社員として全うするというつもりはあまりないのだが、会社員プログラマーとして仕事をすることは勉強にはなると思う。なぜなら無理やり週5日8時間みっちりと開発に参加せざるを得ないからだ。

地方のホームページ屋さんになったり、地方で東京のSIerから仕事を受ける会社に入ることは、もう少しあとでも遅くないと思う。今は、ある程度の規模の会社で、日本でエンジニアをやるということがどういうことなのか知っておきたかった。そこに自分の成長の谷地がある。もっと簡単にいえば今までと違ったことがやりたくなった。

今のところそこそこ期待通り学習できてる部分もあれば、思ってたのと違ったという部分もあり、まあ半々だ。それらも全部将来の役に立てるため、たまにはこうしてログを吐き出しとくことにする。

どの会社から何を汲み取るかは自分次第。会社主体にならないように心がけている。

findコマンドメモ

findコマンドたまにしか使わないけど、たまに遭遇するとやってることの意味がわからなくて毎回ググるのでよく使いそうなところだけメモ。ほぼmanすればわかることだが。

使い方

パス内のファイルを再帰的に列挙するコマンド。

find <パス> <オプション>

-typeオプション

検索するファイルのタイプを指定する。

例)

カレントディレクトリ以下の普通のファイルを全部列挙する

find . -type f

カレントディレクトリ以下のディレクトリを全部列挙する

find . -type d

ブロックデバイスファイルとかキャラクタデバイスファイルとかってなんだろうと思ったけど、 ここに解説が載っていた。

-maxdepthオプション

検索する階層の深さを指定する

例)

fooディレクトリから2階層下までのディレクトリを列挙する

find foo -type d -maxdepth 2

-nameオプション

検索するファイル名で絞り込みをする

例)

カレントディレクトリ以下のファイルの中で'bar'という文字を含む名前のファイルを列挙する

find . -name '*bar*'

まあでも「〇〇.phpどこあったっけ?」みたいな使い方であればlocate *.php | grep ◯◯ってやったほうが速い。

-execオプション

-execのあとにコマンド名を入力することで、findの結果をそのコマンドに引数として渡すことができる

例)

カレントディレクトリのファイル名出力全部の先頭に「おやつたべたい」を追加する

find ./* -type f -maxdepth 0 -exec echo 'おやつたべたい{}' ';'

-execで渡せるコマンドは複数可で、最後に';'か'+'を渡すことがコマンド終了の合図になってるらしい。{}はfindコマンドの結果。

vimでPHPファイル開いたときにインデントがおかしくなる問題

vimPHP編集すると

setlocal shiftwidth=4

に設定してても実際ファイル編集するときに

set shiftwidth?

すると2になっててここ最近本当にムカついてた。

賢いプラグイン様が色々やってくれているから設定ファイルのキャッシュとかが残ってるのか? と疑ったりしたが、どうも違うらしい。(プラグインディレクトリ全部消してvimそのものをビルドし直したりしたがダメだった)

原因は、PHPファイルだと一度~/.vim/ftplugin/php.vimが読まれたあとに~/.vim/ftplugin/html.vimが読まれてしまうことだった。

先人のためになる記事が既にあったので解決できた。

PHP書くときは素直にPHPStorm買ったほうが良いのだと思う。。。

gitでリモートリポジトリのブランチ一覧だけを出力する

gitでリモートリポジトリのブランチ一覧だけを表示したいときもある。

git branch -r

もしくは

git branch --remotes

で表示できる。

git branch -a

git branch --all

エイリアスで、リモートも含めた全てのブランチ一覧を表示する。

たまに知りたいときに毎度ググっていたのでメモ。

シンボリックリンクの実体のパスを出力する

シンボリックリンクの実体のパスを調べようとしてreadlinkというコマンドがあるらしいのでmanしてみたらstatというコマンド使えるよと書いてあった。

$ stat -f "%N: %HT%SY" /tmp/*

fは出力をフォーマットするの意。 各フォーマット指定子の意味

  • N: ファイル名
  • T: ファイルのタイプ
  • H: Tの前につけるとファイルのタイプを言葉で出力 (つけなければ/とか@とか*とかの出力になる)
  • Y: 実体のパス
  • S: 特殊な文字で、Yの前につけた場合は" -> “を出力してくれる。見やすい

PHPのmkdir

自分用のメモ。

<?php
function makeDir($upload_directory, $newdir) {
    $dir = __DIR__;
    $absolute_path = "{$dir}/{$upload_directory}/{$newdir}";
    if (file_exists($absolute_path)) {
        if (!is_dir($absolute_path)) {
            error_log("file exists already");
            exit("NG");
        }
    } else {
        if (!mkdir("{$upload_directory}/{$newdir}", 0777, true)) {
            error_log("failed to make directory");
            exit("NG");
        } else {
            error_log("created directory");
        }
    }
}

userNotificationCenter:willPresentNotification:withCompletionHandler:が呼ばれないとき

Firebaseに渡すcontent_availableというパラメータがtrueになっていないかを確認する。

Firebase公式ドキュメント

iOS では、このフィールドを使用して APNs ペイロードで content-available を表します。通知やメッセージの送信時にこのフィールドが true に設定されている場合、アクティブでないクライアント アプリのスリープ状態が解除されます。Android では、既定でデータ メッセージによってアプリのスリープ状態が解除されます。Chrome では現在サポートされていません。

上記の記述からして一見フォアグラウンド通知とは関係なさそうだが、実際の挙動を確認してみると、これがtrueの場合はアプリがフォアグラウンドだろうがバックグラウンドだろうが同じメソッドが呼ばれるということのようだ。

で、なぜかデフォルトのwillPresentNotification…ではなく、iOS10ではバックグラウンド通知時に呼ばれるdidReceivedNotificationResponse…がフォアグラウンドでも呼ばれてしまう。willPresentNotification…は呼ばれない。

content_availableをfalseにしたら無事willPresentNotification…が動いた。

ものすごく分かりにくい。これのせいで丸一日くらい悩んだ。

しかもcontent_availableをfalseにしても普通にスリープ中でも通知が表示されるし。。何のためのパラメータなのかわからない。