雑記

こんにちは。

 

1年以上書いていませんでしたが、文字でアウトプットしてみたくなったので思いのままに書いてみます。

2023年はそれなりに激動でした。

私生活

引越し

元々は都内に住んでいましたが、1月に地元の千葉に引っ越しました。

都心に住むのに疲れ、地元以外の郊外にはすでに何ヶ所か住んだことがあり、さらに特に住みたい場所も無かったので戻る選択をしました。

 

たまたま実家から徒歩で行ける場所に条件の合う物件があったので、内見したその日に契約しました。

やはり実家が近いと生活におけるメリットがたくさんあります。

  • ご飯を作る気力がない時は実家に行けば何か出してくれる
  • 遠出したい時や大きい(物理的に)買い物をする時に実家の車を使える
  • 家族の様子が分かる
  • 誕生日などのイベント事で呼ばれたときにすぐ行ける

 

なんと言っても精神的な安心感がありますね。

自分に何かあった時だけでなく、家族に何かあった時にすぐ駆けつけられるので目に見えない不安からある程度解放されます。

 

直近で言うと年始早々コロナになりまして、そこまで重症化しなかったものの、すぐに食糧を届けてくれました。

※2022年の12月にもコロナになっていて、ほぼ2年連続でした😞

 

また、地元の友達と遊べるというメリットもありますが、そういえばまだ1回も遊びに行っていませんでした。

twitterでは繋がっていますが、いつでも会えるとなると逆に面倒になってしまってます。よくないですね。

 

生活

概ね満足しています。

まず家のスペックが上がったのでストレスが減りました。

before after
1K 1LDK
25平米 42平米
1階 2階
東向き 南向き
駅徒歩10分 駅徒歩5分

 

まず広くなりましたね。広さは正義です。

圧迫感があるとストレスですから

 

1階は最悪でした。陽が入りにくいし近所の目は気になるし、場所によっては虫が出たりします。

2階になってしかも南向きになったので、部屋が暖かいです。

 

駅徒歩はそこまで苦では無かったのですが、近いに越したことはないですよね。

その他

  • ピアスを開けました。ちょっとだけ外に行くのが楽しくなりました。
  • 親知らずを3本抜きました。ずっと放置していたんですが、歯磨きの効率が悪いので抜いたろうと思って抜きました。そんなに辛くなかったです。

仕事

本業

今の会社に来てから2年経ちましたが、相変わらず仕事内容はそこまで楽しくないです。

事業内容とかサービスにはあまり面白さを感じないので、技術面で面白さを見出してなんとかやってます。

 

2023年で1つ挑戦だったのは、社内専用のnpm packageを作った事ですね。

ライブラリを開発する思考は今までなかったのですが、弊社のプロダクト群は細かくマイクロサービス化されているため、共通する機能をそれぞれに実装してしまうと色々問題も起きやすいことから実装に至りました。

 

nodeのversionとか、buildの事とか普段あまり考えない領域の知識がついて良い経験になりました。

成果物としてもかなり全体最適なものを作れた自信があり、目標設定では「これを作り切ったら等級上下られると思う」と言われたので、8月と9月に身を削って作り切りました。

 

そしていざ評価面談になると、「使われるまで評価できない」とのこと。なんやねん。

そうだとしてもどれだけ頑張ってたかは見てるやんか

 

別件で対応したノーコードツールでの成果物で人件費1/3にしたんですけど、そちらの方が評価されました。エンジニアっぽいことで評価してや。

上司

という感じで評価周りで上司への不信感が高まりましたが、10月から部署が統合されて上司が変わりました。

今の上司は、先の上司と比べて普段の仕事ぶりをとてもよく見ているし、評価に反映してくれます。

サポートも(大丈夫かと心配になるほど)手厚いし、次は良い評価になることを期待しています。

同僚

部署が統合されたので同僚も少し変わりました。

前よりも専門性が高いメンバーが多く、刺激を受けています。

上司も含めてほとんどプロパー社員なので、会社による洗脳の影響で思考が偏ってて反吐が出ることもありますが、概ね満足しています。

副業

10月から副業を始めました。社員数15人くらいのスタートアップでバックエンドエンジニアとして働いています。

今は一生終わらなさそうなデータ移行の仕事を粛々とやっています。

業務委託なので面倒な責任がなく、コードを書くこと以外は何もやらなくていいので気が楽です。

 

また、時給的にも本業より高いため、本業より副業の比率を高くしています。

具体的には週休3日制を導入しました。

固定で金曜日が休みになるのですが、そこを副業の時間に充てることで手取りの給料が純増しました。

(そして今更奨学金を払い終えました。)

英語

本業の方で英語のオンラインスクールに無料で通わせてくれるとのことで、希望者かつ適任者の10名程度がエンジニア全体から選ばれました。

事業に興味がない&別のスキルを付けるいい機会だと思ったので希望したら通りました。

なお、大学受験をまともにしていないので英語力が高校2年くらいで止まっていて辛いので、最近は合間の時間に英語の勉強をしています。

ペラペラになるのはおそらく無理ですが、ちょっとした会話がすんなりできるようになれたらなと思います。

最近ハマっているもの

  • 韓国ドラマをコツコツ観ています。最近は「トッケビ」と「恋はゴールドメダル」を観ました。ナムジュヒョクが好きです。
  • LIGHT HOUSEをこの2週間くらいでちまちま観ていました。星野源とオードリー若林の対談です。結構刺さる内容が多かったです。「物事は二項対立で説明できることはほとんどなくて、大抵はグラデーションなんだ」という話で幾分か気持ちが楽になりました。
  • 日向坂46に2019年頃からハマっていますが、今年も引き続きライブなどに行く予定があります。生写真集めはいつからかやらなくなってしまった。。
  • スプラトゥーンは半年くらいやってなかったんですが、年明けに少しやった事で週1くらいで復活しています。

最近欲しいもの

  • マウス
  •  キーボード
    • 家では青軸のキーボードを使っているのですが、副業を外でやる機会が生まれ始めたので、打鍵音の小さいキーボードが欲しいです。
  • windows PC
    • steamのゲーム(今はパルワールド)をやってみたい。

 

以上

SymfonyでAPI Platform使ってみたが、うまくいかなかった話

こんにちは。

本業の方が結構退屈なので、最近はプラベートで開発をしています。

 

とある案件があってAPIサーバーを作ることになり、前職で利用していたSymfonyで作ろうかなーと作業していました。

 

swagger UI的なものでAPI仕様も表現したくて、公式が推奨しているAPI Platformを触ってみました。

symfony.com

 

これすごいですね。

ソースコード上にendpointやrequest parameter, reposnseを定義して、それをそのままAPI PlatformのUIで表現できる。

f:id:kenshlro:20220416232458p:plain

 

I/Oの定義が可視化されているだけでなく、実行もできちゃいます。

f:id:kenshlro:20220416232522p:plain

[Try it out]を押すと実行状態になります。

 

f:id:kenshlro:20220416232602p:plain

 

本業の方でtypescriptのフレームワークloopbackを使って全く同じようなこと直近でやっていて、他でもこういうのやりたいなーと思ってたらsymfonyでできちゃいました。

 

このページも/apiにアクセスするだけで見れてしまうので、直感的で良いですね。

 

公式の感じだと、tableに対応するEntityがそのままAPIのEntityとして使われる想定みたいでした。

tableと紐付けないAPIのEntityを作って実現していくのも一応できそうでしたが、あまりドキュメントが充実していないくてベストプラクティスに辿り着けませんでした。

 

この辺とか、かゆいところに手が届かない。

api-platform.com

 

symfonycasts.com

 

1階層?のEntityありきで、input, outputのDTOを作るところまでは行けたんですが、

ネストされたinput(post requestのパラメータが深いjson構造になってるとか)だと受け切れなくて諦めました。

 

今までだとControllerでrequestを受け取って、それをFormTypeにバインドするってことができたと思うんですが..

 

具体的には、LINEのメッセージをwebhookで受け付けるAPIを作りたかったんですが、うまくやる方法を見つけられませんでした。

https://developers.line.biz/ja/reference/messaging-api/#message-event

 

なので、普通にControllerで受けるやり方にすることにしました。

そのうちいいやり方が見つかったら置き換えていくのもそんなに難しくないと思うので、誰かがうまくやってくれる日を待ってます。

 

なんかこれを見るとAPIのリクエストはそのままだとバインドできないのか..?

また色々試してみます。

qiita.com

PHPのMVCフレームワークを作った

お久しぶりです。

今回はプライベートでPHPMVCフレームワークを作る機会があったので、記録ついでに書いていきます。

 

とりあえずMVCだけあれば良かったので、routing, Response, Requestあたりは作ってません。

 

public/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

 

Apacheの設定ファイルですね。

ここでは、パスと一致するファイルが存在しない場合、アクセスをindex.phpに集約するということが書かれてます。

 

少し雑ですが、要件としては問題ないのでこれで。

 

public/index.php

<?php
define('ROOT_PATH', str_replace('public', '', $_SERVER["DOCUMENT_ROOT"]));

require_once(ROOT_PATH.'Controllers/ContactController.php');
use Controllers\ContactController; // pathを取得 $path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); if ($path === '/contact/index') { $controller = new ContactController(); $controller->index(); } if ($path === '/contact/confirm') { $controller = new ContactController(); $controller->confirm(); } if ($path === '/contact/complete') { $controller = new ContactController(); $controller->complete(); }

超絶手作業ですが、routingは今回スコープ外なのでこれで。

 

例えば、http://localhost:8888/contact/index

でアクセスされたらContactControllerのindexメソッドが呼ばれます。

 

ちなみに今回は問い合わせフォームを作ってます。

 

ContactController#index

class ContactController
{
    public function index()
    {
        ViewBase::render('/Contact/index.php');
    }

~~~

本当はrequireとかuseを上の方に書いてますが、省略。

indexメソッドにアクセスが来たら対象のviewファイルをrenderするようにしています。

 

renderの中身は後述しますが、ViewBaseというrender用のクラスを作ってます。

名前適当につけたんですが、一般的なフレームワークはなんて名前付けてるんでしょう。

symfonyはここから先追えなかったのでわかりませんでした。

symfony/AbstractController.php at 6.1 · symfony/symfony · GitHub

 

ViewBase

class ViewBase
{
    public static function render($fileName, $params = [])
    {
        $filePath = ROOT_PATH.'/Views/'.$fileName;
        extract($params);

        ob_start();
        ob_implicit_flush(0);
        require $filePath;

        $content = ob_get_clean();

        echo $content;
exit;
    }
}

Viewsディレクトリにあるファイルを出力してます。

埋め込む変数も渡してextractで作っています。

 

この辺書いていて思い出したんですが、renderの元を辿るとechoだったなと。

我々はechoから始まったんだった。というのを思い出させられました。

 

普段フレームワーク使ってると意識しないですよね。

 

ContactController#confirm

class ContactController
{
  public function confirm()
    {
       // POSTのみ受け付ける
        if (!$_POST) {
            header('Location: /contact/index');
            exit;
        }

        $contactValidator = (new ContactValidator($_POST));
        if ($contactValidator->isValid()) {
            ViewBase::render(
                '/Contact/confirm.php',
                [
                    'name'  => $_POST['name'],
                    'kana'  => $_POST['kana'],
                    'tel'   => $_POST['tel'],
                    'email' => $_POST['email'],
                    'body'  => $_POST['body'],
                ]
          );
        }

        ViewBase::render(
            '/Contact/index.php',
            [
                'name'   => $_POST['name'],
                'kana'   => $_POST['kana'],
                'tel'    => $_POST['tel'],
                'email'  => $_POST['email'],
                'body'   => $_POST['body'],
                'errors' => $contactValidator->getErrors(),
            ]
      );
   }

confirmです。

validatorを挟んで、問題あれば入力値保持したままindexへ。

問題なければconfirm画面を表示

validatorはただのクラスなので特に載せません。

 

ContactController#complete

class ContactController
{
  public function complete()
    {
       // POSTのみ受け付ける
        if (!$_POST) {
            header('Location: /contact/index');
            exit;
        }

        if (!$_POST['name'] 

            && !$_POST['kana']
            && !$_POST['tel']
            && !$_POST['email']
            && !$_POST['body'])
        {
            header('Location: /contact/index');
            exit;
        }

$contactValidator = (new ContactValidator($_POST));
        if ($contactValidator->isValid()) {
            try {
              $pdo = (new Database())->getPdo();

              $sql  = 'INSERT INTO contacts (name, kana, tel, email, body) VALUE (:name, :kana, :tel, :email, :body)';

              $stmt = $pdo->prepare($sql);

              $stmt->bindValue(':name', $_POST['name'], \PDO::PARAM_STR);
                $stmt->bindValue(':kana', $_POST['kana'], \PDO::PARAM_STR);
                $stmt->bindValue(':tel', $_POST['tel'], \PDO::PARAM_STR);
                $stmt->bindValue(':email', $_POST['email'], \PDO::PARAM_STR);
                $stmt->bindValue(':body', $_POST['body'], \PDO::PARAM_STR);

                $stmt->execute();

                // 表示
                ViewBase::render('/Contact/complete.php');
            } catch (\PDOException $e) {
                error_log($e->getMessage());
                var_dump($e->getMessage()); //エラー画面へ遷移させるとかする
exit;
            }
        }
        // indexへ戻す
        ViewBase::render(
            '/Contact/index.php',
            [
                'name'  => $_POST['name'],
                'kana'  => $_POST['kana'],
                'tel'   => $_POST['tel'],
                'email' => $_POST['email'],
                'body'  => $_POST['body'],
                'errors' => $contactValidator->getErrors(),
            ]
        );
    }

DBに接続して保存してます。

Repositoryは作ってないのでsqlとか直書きです。

 

Models/Database

class Database
{    
    private $pdo;

    public function __construct()
    {
        $dsn      = 'mysql:host=127.0.0.1;port=3306;dbname=casteria;charset=utf8';
        $user     = 'root';
        $password = 'root';
        $opt      = [
            // エラーを取得するため
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            // sqlインジェクションを回避するため
            \PDO::ATTR_EMULATE_PREPARES => false,
        ];

        $this->pdo = new \PDO($dsn, $user, $password, $opt);

    }

    public function getPdo()

    {
        return $this->pdo;
    }
}

DB接続です。

 

簡単ですがここまで作ってみての感想ですが、あらゆる場所で「あのケースも考慮しなきゃダメでは..?」みたいに常に不安になりながら実装してました。

なのでフレームワークには大感謝ですね。PRしてみようかなという気持ちになります。

 

また、実務に直接関わることはなさそうですが、忘れていた部分も多かったのでやってみてよかったです。

最近競技プログラミングをちょっとだけやっているのですが、そのスキルがこの辺で使えそうだな、と思いました。

pythonのオブジェクト周り基礎知識 メモ

前回の記事に引き続き、友人がpythonを勉強しているので、ついでに自分もちょっとだけやってます。

 

普段はPHPを使っているので違いを楽しみながらやっています。

 

今日はオブジェクト周りの基礎を勉強したので、メモ程度に残していこうと思います。

 

こちらのサイトを先生にして進めました。

www.python.jp

 

オブジェクトとは

整数、実数などのデータや、関数のようなプログラムをまとめてオブジェクトと呼ぶ。
プログラマが名前をつけられるもの。(if, while等は含まない)

 

リストオブジェクト(配列)

決まった順番で並べられた情報を表現したもの

// 作成
fruit_list = ['apple', 'banana', 'water melon']
print(fruit_list) // ['apple', 'banana', 'water melon']

// 参照
fruit_list = ['apple', 'banana', 'water melon']
print(fruit_list[0]) // apple
print(fruit_list[1]) // banana

// 挿入
fruit_list = ['apple', 'banana', 'water melon']
fruit_list.insert(1, 'grape')

print(fruit_list) // ['apple', 'grape', 'banana', 'water melon']

// 置換
fruit_list = ['apple', 'banana', 'water melon']
fruit_list[0] = 'orange'

print(fruit_list) // ['orange', 'banana', 'water melon']

// 削除
fruit_list = ['apple', 'banana', 'water melon']
del fruit_list[1]
print(fruit_list) // ['apple', 'water melon']

// 長さ
fruit_list = ['apple', 'banana', 'water melon']
print(len(fruit_list)) // 3

// 繰り返し処理
fruit_list = ['apple', 'banana', 'water melon']

for fruit in fruit_list
    print(fruit)

 

辞書オブジェクト(連想配列

// 作成
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(fruit_dict) // {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}

// 参照
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(fruit_dict['apple']) // りんご

// 追加
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
fruit_dict['orange'] = 'みかん'
print(fruit_dict) // {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ', 'orange': 'みかん'}

// 置換
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
fruit_dict['apple'] = '林檎'
print(fruit_dict) // {'apple': '林檎', 'banana': 'バナナ', 'water melon': 'スイカ'}

// 削除
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
del fruit_dict['apple']
print(fruit_dict) // {'banana': 'バナナ', 'water melon': 'スイカ'}

// 長さ
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(len(fruit_dict)) // 3

// 存在確認
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}

print('apple' in fruit_dict) // true
print('orange' in fruit_dict) // false

 

タプル

ある対象を構成する要素の組み合わせを表現
※辞書オブジェクトはイコールの組み合わせと理解。

 

人形町という地点を構成する要素 = 緯度, 経度

ningyocho = (35.686321, 139.782211)

 

人間の体型表現を構成する要素 = バスト、ウエスト、ヒップ

person = (82, 50, 78)

 

タプル操作

// 参照
print(person[0]) // 82

// 比較 要素数同じ
最初の要素から順番に比較し、差が出た時点で判定
person1 = (82, 50, 78)
person2 = (78, 45, 70)

print(person1 > person2) // true

// 比較 要素数違う
できるところまで比較し、そこまで同じなら要素数が少ない方が小さいと判定される

person1 = (82, 50, 78)
person2 = (82, 50)

print(person1 > person2) // true

// 追加・削除・変更
できない。上書きのみ可能

color = (0, 0, 0)
print(color) // (0, 0, 0)

color = (255, 0, 0) // 上書き
print(print) // (255, 0, 0)

 

タプルとリストの違い

どちらでも実現できることは変わらない。
ある対象を構成する要素を表現する場合にタプルを使う。
単純な集合を表現するならリスト

使い分けるメリット

・タプルを使うことで処理効率が良くなる(らしい)
・タプルを使っているということは、何かを構成するための要素であることをコードから示せる

 

コレクション

リスト、辞書オブジェクト、タプルのような複数のオブジェクトを集約することを目的としたオブジェクトのこと。

コレクション
└ リスト
└ 辞書オブジェクト
└ タプル
└ 文字列
└ …

シーケンス

インデックスを指定して参照できるオブジェクトのこと
シーケンス
└ リスト
└ 辞書オブジェクト
└ タプル
└ 文字列

辞書オブジェクトはkeyを使って参照するので、シーケンスではない。
シーケンスは不等号による比較ができるが、シーケンスではないコレクション(辞書オブジェクト)は比較できない。おそらく順番の概念がないから。

コレクションのアンパック

各要素を変数に一括で入れる

// リスト
fruit_list = ['apple', 'banana', 'water melon']
fruit1, fruit2, fruit3 = fruit_list
print(fruit1) // 'apple'
print(fruit2) // 'banana'
print(fruit3) // 'water melon'
// タプル person = (82, 50, 78) bust, west, hip = person // 省略
// 文字列 word = 'hey' word1, word2, word3 = word
// 省略
// 辞書オブジェクトは? 順番の概念がないからできないかも

 

イカ割りゲーム

サイトの一番最後に演習問題がありました。

イカ割りゲームを自分で作ってみようと言うものでした。

要件を適当にしか把握してなかったのでアウトプットは若干違いましたが、一応1から書き切ることはできました。

github.com

 

元々の要件は東西南北に1マス移動できるボタンを設定して、だんだん近づけていってスイカを割るという要件だったみたいです。

 

自分が作ったのは移動距離もランダムにして3回まで挑戦できるようなゲームです。

じゃんけんみたいな感じです。

 

イカ割り失敗パターン

root@efb2d6a99458:/var/www/html# python water_melon_break_game.py
イカの位置は左から0マス目, 上から2マス目です。
プレイヤーの位置は左から1マス目, 上から2マス目です。
イカ割りを始めるにはそのままエンターキーを押してください。あと3回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (1, -2)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと2回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (1, -1)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと1回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (-1, -2)
運がなかったみたいだね..

 

イカ割り成功パターン

root@efb2d6a99458:/var/www/html# python water_melon_break_game.py
イカの位置は左から0マス目, 上から1マス目です。
プレイヤーの位置は左から2マス目, 上から2マス目です。
イカ割りを始めるにはそのままエンターキーを押してください。あと3回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, -2)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと2回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, 0)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと1回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, -1)
イカが割れました!おめでとう!

 

とりあえずタプルの使い方とか基本的なpythonの書き方は分かってきたのでよしとします。

docker-compose, python, mysqlの環境を作ってみた

こんばんは

 

友人がpythonを使って何か開発をしたいが、開発環境の整え方がわからないということだったので、復習がてら作りました。

 

github.com

 

最初はcloud9でやろうと思ってたんですが、AWSに買収されてからシステムが変わったっぽくて使いづらくなっていてやめました。

 

ggるとpythonフレームワークをぶち込んだ環境の作成記事はたくさん見つかりますが、シンプルにpythonだけ使いたい場合に対応した記事がなかったので作りました。

 

mysqlコンテナとpythonコンテナを立ち上げるように設定ファイルを書いています。

 

立ち上げ手順

$ cd 任意の場所

$ git clone

$ cp .env_tmp .env

後述するtwitterAPIを使いたければ、

.envファイルにCONSUMER_KEY, SECRET, ACCESS_TOKEN, SECRETを入れる(取得の仕方はtwitter developerに書いてあります。)

 

その後ビルドして立ち上げ

$ docker-compose build

$ docker-compose up -d

 

pythonコンテナに入る

$ docker-compose exec python3 bash 

$ python test.py

 

test.pyでは適当なスクリプトを書いてます。

twitterAPIを簡単に使えるtweepyというライブラリを使って特定のハッシュタグが付いたツイートを取得し、出力しています。

 

何かの役に立てば幸いです。

28歳webエンジニアが転職ドラフトを使った体験談

※こちらの記事は転職ドラフト体験談投稿キャンペーン(https://job-draft.jp/articles/251)に参加しています

 

こんばんは。

久しぶりに書きます。

 

最近転職先が決まりました。

プログラマとかエンジニア界隈って領域が広かったり、属している業界や会社によって持っているスキルとか状況が違うので、自分に近い状況の人がどのように転職活動しているのかググってもあまり見つけられないと思います。(見つかりませんでした)

よくプチバズりしているのは意識高い人達だったりするのであんまり参考にならないんですよね。

なので、普通に転職活動している(したい)人の参考になればと思います。

 

人物概要

  • webエンジニア歴は5年半で、2社目
  • 今はプロジェクトの開発リーダーとか、エンジニアリングマネジャーをやっている
  • 現年収は500万円台後半
  • バックエンド、フロントエンド書ける(PHP, vueとか)
  • アプリのAPI開発できる
  • インフラはちょっとしかわからない

転職概要

  • 現職でプレイングマネジャーをやっているが、業務量過多により成果を出しづらい状態になってきた。リソース的に余裕のある会社に行って自分のやりたいように仕事をしたい。そして年収を600万円台に乗せたいと思って活動をはじめました。
  • 今年の4月頃にGreen経由で1社面談するも、現職よりも小さい会社だったので、そのうち今と同じような状況になりそうだと思い辞退。
  • 同時期に転職ドラフトに登録。4ヶ月間参加して合計17件の指名。
  • 2ヶ月目でもらった指名の中に面白そうな会社があり、応募して内定。年収は約60万円アップ。

転職ドラフトに登録したきっかけ

最初は単純に、自分の市場価値が知りたかったからです。

転職ドラフトでの指名額で自分の市場価値を知れれば、今の会社の額が妥当なのかも分かるはずです。

なので、最初は希望年収の欄は空欄にしていました。

面接の準備でやったこと

カジュアル面談は会社の人が会社説明してくれたり、簡単な質問を受ける場なので大した準備は不要ですが、面接となると評価される立場になるので準備が必要です。

 

正解はないものですが、人がどうやっているのか知りたいですよね。

私はこれまで2回転職しているので、自己流ですがご紹介します。

①自己分析をする

一番大事なのはこれだと思います。

自己分析をして自分が何をしたいのか、そして何をしたくないのかを言葉に出来るようにしておく必要があります。

むしろこれだけできていれば面接ある程度乗り切れます。

自分の場合は、ざっくり「楽しんで仕事できる会社」に行きたいと考えていました。

 

仕事している時間って人生の中で大きな割合を占めるので、出来るだけ楽しんでやりたいですよね。

では、自分にとって楽しいとはどういうことなのか深掘りしていきました。

 

自分にとって楽しいとは

└ 担当サービスに興味を持てる

 └ 自分が使っている, 身近なサービス

  └ 自分ごととして開発内容について考慮できる

 └ 世の中にある程度浸透している

  └ 開発した機能やサービスが世の中に影響を与えやすい

└ 技術者として自己研鑽できる環境がある

 └ 内部のエンジニアが技術研鑽に意欲的

  └ 勉強会等が定期的に実施されている

  └ 外部発信の文化がある

  └ コードレビューのレベルが高い

 └ 複数のプロダクトを保有している(マイクロサービス化されていると尚良)

  └ 未経験技術を試す場がある

  └ 身につけた技術を発揮する場が多いと知識が汎用的なものになる

└ 描いているキャリアプランを実現できる

 └ 自分がなりたいと思っているキャリアを実現している既存社員がいる

  └ 30歳までは開発者

  └ 徐々にエンジニアリングマネジャーに 

 

という感じでできるだけ深く掘ります。

いつも仮想の面接官からの質問を想定しながら深掘りしてます。

 

深掘りをしたら、それをスラスラと答えられるようになるまで復唱しています。

 

②受ける会社と、競合の会社について調べる

深掘りをするとどういう会社が自分に合っているのか探しやすくなります。

めでたく興味を惹かれる会社を見つけたら、会社HPにアクセスしてざっと全てのページを眺めたり、サービスを触ります。

仕事終わりにやったりしているので、大体これに数日かかったりします。

 

どんな事業をしている会社か、この会社が大事にしていることは何なのか、ということが一言で言えるくらいには読むようにしてます。

 

その後、比較のために競合の会社についても同じことをします。

似たようなことが書いてあったり、全然違う事業にも挑戦していたり、何かしら発見はあると思います。

 

そして、最終的に以下のような内容に結論が出せるようになるまで読み込みます(使い込みます)。

  • 受けようとしている会社の経営理念、コーポレートメッセージは競合よりも分かりやすく、共感できたか。
  • └ 入社した場合に恥じずに他者に言えるような内容か。
  • └ 自分の言葉に落とし込んで説明できそうか。
  • └ 今後、会社・事業としてどうなっていきたいのか示されていたか。
  • 配属先以外の事業に異動になってもモチベーションを維持できそうか。
  • 社員インタビュー等に書いてある組織・技術的な課題について共に取り組みたいと思えたか。
  • 担当になる(予定の)サービスについて、改善したいor追加したい機能について何か浮かんだか。また、それを実装するとなった場合にワクワクするか。

③書類の準備

履歴書・職務経歴書を準備すると思いますが、ここでも最大限アピールしておいた方が良いです。

面接官は会う前に質問内容を考えます。その時に使える情報はこういった書類のみになりますので、アピールできるものはなるべく書きます。

 

コツとしては、事実だけ書くのではなく、その時工夫した点も一緒に書くと良いと思います。どうせ面接で聞かれますので、予め書いておくと良いと思います。

 

書いた書類は他者に一度チェックしてもらいましょう。

私も完璧だと思って作成した書類を彼女に見せたらボロクソ指摘を食らいましたので、絶対にやっておいた方がいいです。

面接で心掛けていること

最後に、面接時に心掛けていることです。

念入りに準備していれば意外と緊張しないものです。

 

  • 正直に回答する

嘘をつかない方がいいのは当たり前ですが、誇張してしまうことは多少なりともあると思います。

入ってから周りの期待と違うことで困るのは自分ですし、続けて質問された時に困るようなら誇張しないのが吉です。

あと、ある程度場数を踏んだ面接官であれば大体見抜けます。

 

  • 意欲的に回答する

就職活動は恋愛と一緒だとよく言われますが、その通りだと思っていて、

付き合いたいと思っていなさそうな声や態度で「付き合ってください」と言ってもNoですよね。

面接でも、言葉の端々にも気を遣いながら「入社したい」という意欲が伝わるようなコミュニケーションを取ると合格率は格段に高くなると思います。

面接で感じたこと

一番印象深かったのが、転職ドラフト内で登録したレジュメを端から端まで読んでもらえていた点でした。

普段自分が採用活動する時って斜め読みしますし、読んだ内容はほとんど忘れてしまいます。

でも今回は、自分が時間をかけて書いたレジュメの細かい部分まで読んだ上での質問をしてもらえたので、印象が良かったです。

なので、これから参加される方はそういうつもりで書いた方が良いと思います。

 

以上です。

最後疲れてきてまとまり悪くなりました。

気が向いたらまた更新しようと思います。

ジムに通い始めました

こんばんは。

 

最近ジムに通い始めました。

人生初です。

 

コロナの影響で運動不足なのと、お腹周りがたるんできてしまっているのでどうにかせねばと思いまして

 

よくある器具を使ったジムトレーニングではなく、プールに行っています。

 

効率が良いらしいので。

 

最初はクロールだけでずっと泳いでいたのですが、すぐバテて500mくらいしか泳げませんでした。

でも2回目から平泳ぎをするようにしたら500mは軽く泳げるようになりました。

 

行くたびに距離を増やすというノルマを自分に課していて、今のところ達成しています。

 

6/25 500m
6/27 550m
6/29 600m
7/1 200m + 筋トレ
7/5 650m
7/6 700m

 

タイムも測ってみたんですが、クロールが25m18秒、平泳ぎが25m38秒でした。

クロールは水泳未経験者にしては速い方らしいです。

15秒が壁らしい。

 

平泳ぎは遅いみたいです。自分でもわかります。

正しい泳ぎ方が分からず我流だったので動画みたんですが、うまくモノにできていません..w

 

腕と脚を同時に動かしたら水の抵抗が大きくなって遅くなるらしいんですが、ズラすなんてそんな器用なことできない..。

 

それに脚を動かした後って、なぜか上半身が沈んじゃって息継ぎがうまく出来ないんですよね。それで鼻に水入って苦しくなる(笑)

 

もうちょっと動画見て練習します。

 

こんな感じでタイム測ったり、距離メモしていくと続くかもですね。

 

あと、パーソナルトレーニングも2ヶ月だけ申し込みました。

新規会員限定で全8回を4400円で受けられるとの事だったので。

 

1回500円ですよ。

50分しかやらないので本当に少しですが、器具の使い方や正しいトレーニングの仕方を学べるので全然安いと思います。

それに運が良ければ可愛いお姉さんに教えてもらえます。(初回はお姉さんだった。)

 

8月中にはたるんだお腹が引っ込んでいるといいなあ〜と夢見ています。

 

それではこの辺で