長野エンジニアライフ

東京から長野に移住しました。

長野でWebエンジニアになる方法

都内のSIerから長野のWebエンジニアへIターン転職しました。Wantedlyにも↓類似記事あげていますが、改めて個人ブログでも記事にしてみました。 www.wantedly.com

今回の記事では、自己紹介を踏まえながら長野Webエンジニアになるまでの経緯を書きました。

最初に、、

自己紹介

- 1994.7.15 東京都江戸川区生まれ
- 2017.3.31 都内の大学 卒業
- 2017.4.1 ~ 2019.3.31 都内でSIerエンジニア
- 2019.4.1 ~ 長野Webエンジニア ←イマココ

色々なご縁があり長野でWeb系エンジニアに転職することができました。SIerからWeb/リモートワーク/地方移住を考える人は多くいると思います。

今回は 、以下の3点についてまとめてみました。

  • Web系転職にむけてやったこと
  • 長野移住にむけてやったこと
  • 地方エンジニアはオワコンか

まずは、、

Web系転職にむけてやったこと

1. twitterで駆け出しエンジニアをフォローしてみた
2. ポートフォリオ作成
3. Wantedly/Greenに登録してWeb系企業を見た
4. Web系企業と面談(採用面接とは無関係)

1. twitterで駆け出しエンジニアをフォローしてみた

一番転職するにあたってモチベ維持になったかもしれません。twitter界隈の、駆け出しエンジニアの勢いの力を借りて行動力を上げていました。

2. ポートフォリオ作成

SIer時代に自分が長期的に趣味で作っていました(その趣味が転職に至ったのかもしれません)。メルカリで欲しい商品が1円でも安くなったら通知してくれるツーチンという名称のアプリを自作していました。また、レンタルサーバを借りてWordPressを触ったりもしていました。

3. Wantedly/Greenに登録してWeb系企業を見た

色んな会社を見ました。事業をもっている会社や、技術支援にフォーカスを当てている会社など色々ありました。個人的には、トレンドの技術のキャッチアップしている社員に与えられる裁量権が大きいに注目して企業探しをしていました。

4. Web系企業と面談

上記の転職支援サイトで見つけて本当に興味を持った会社に連絡しました。採用面接ではなく、面談という形で企業説明をしてくれる企業が多いので、遠慮せずに連絡してお願いすると良いです。実際に私が、面談した会社は2社だけ(東京の会社、長野の会社)でしたが。ここで面談した内の1社が、私が勤めている今の職場です。

地道にSIerからWeb系へと転職活動を行なっていきました。

ただ、地方移住を将来に描いているエンジニアでしたので、この後に続くて移住活動もしていました。

長野移住にむけてやったこと

1. 長野在住エンジニアをフォローしてみた
2. 実際に長野に行った
3. 長野移住説明会等に参加した
4. 物件をスピーディに決めた(一番大変だった)

1. 長野在住エンジニアをフォローしてみた

上記の駆け出しエンジニアをフォローすると似た理由ですが、移住のモチベ維持のためにフォローしていました。他にも長野関係なく、地方で活躍されているエンジニアのエンジニアライフのわかる呟きを見たりもしていました。

2. 実際に長野に行った

回数は4,5回ほど行きました。地方は車社会のイメージが強いですが、県庁のあるような市街地であれば電車も普通にありますし、思ったほど田舎感は無く感じられます。(移住後は、車はあった方が快適ですが、笑)

3. 長野移住説明会等に参加した

具体的に行ってしまうと銀座NAGANOという、銀座にあるシェアスペースで開催される移住交流説明会などに参加しました。長野県で活発な産業・行政についても知ることができるので、より住むイメージがしやすくなります。 www.ginza-nagano.jp

4. 物件をスピーディに決めた

転職先の内定後に速攻で内見予約して1日で決めました。移動中や移動時間にスーモとかでいいなと思う物件は目星つけておくとスピーディに決めれます。都会よりも、安い/広い部屋に住めます。(広すぎて困るくらい広い間取りの物件もあります、、笑)

最後に、都会から離れると技術についていけなくなりそうって不安になる人もいると思います。 私も今の会社を知る前の転職活動時期はそう思っていました。

だけど、そんなことはありません。一番、今回の記事で伝えたい内容かもしれません。

地方エンジニアはオワコンか?

ぜひ、下のtweetのスライドを最後まで見てください。タイトルだけだと不安になりますが、最後まで見終えるとナルホドと思いました。

私の所属している株式会社日本システム技研(略称・JSL)は長野に拠点を置く会社です。

長野でWebエンジニアになる前の私が、都会から離れると技術力が落ちるだろうと不安にならなくなったのは、JSLが既に長野でも、東京でもエンジニア界隈を盛り上げていたからです。

PyCon JP/DjangoCongress JPでは、JSL社員が毎年スピーカとして登壇しています。この姿をみて、技術のキャッチアップをしていく事に場所なんて関係ない事に気づかされました。今年(2019年)のPyConではゴールドスポンサーとしてもJSLは参加しました。 www.wantedly.com

最後に、、、

2019年に長野県は、信州ITバレー構想を策定しました。
また、 2019年のDjangoCongress JPの開催地は長野県です。

長野から日本を、そして世界を盛り上げるエンジニアになりませんか? www.wantedly.com

他に聞きたい事があれば、気軽にコメント・twitterで絡んでください。笑

FOSSASIA Summit 2020 Singaporeで発表しました!

FOSSASIA

先日、自転車盗難LINEBotについて、FOSSASIA Summit 2020 Singaporeで発表しました。振り返りのため記事にしました。 summit.fossasia.org

FOSS ASIAについて

FOSS:Free Open Source Softwareの略で、開発者とベンダーやユーザの繋がりを生むのを目的とするイベント。 スピーチ、ワークショップや、ポスティングなどの展示があり、OSSであることに重きを置いており、テーマ(Hard Ware/AI/Cloud/...etc)は多岐に渡る。

コロナ影響によるオンライン参加

CFPが受理されてスピーカーとして現地シンガポールで登壇する予定でした。

しかし、フライト数日前にコロナウィルスの影響により渡航者の隔離要請が発令され、シンガポールに到着できてもホテル待機になってしまうため、現地参加することはできませんでした。

ただ、運営の方達が参加できなくなったスピーカの、タイムスケジュールを確保してくれており、オンラインで発表することができました。当日の会場では、YouTubeで各スピーカのプレゼン動画がタイムスケジュールごとに同時再生されました。質疑応答についてはリアルチャットで実施されました。

実際のプレゼン内容

www.youtube.com

スライド内容

speakerdeck.com

振り返り

人生初の英語のCFP・プレゼンから、自分の英語力の無さを改めて痛感しました。(資料作成より、メールのやりとりが一番しんどかった。旅程作成してくれ→それを送付してくれなど)

ただ、英語で発信すれば自分の作品を世界中にアピールできる事を改めて感じたイベントでした。今後は、技術ネタを勉強しつつ、英語も勉強していこうと思います。

自転車盗難推測LINEBotについての解説記事はこちら

kawakeee.hatenablog.com

kawakeee.hatenablog.com

kawakeee.hatenablog.com

【Pythonで解くLeetCode】 1. Two Sum

問題

leetcode.com Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

与えられたコード

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        

解答コード

  • 全探索
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        result = []
        for i in range(len(nums)):
            for j in range(i,len(nums)):
                if nums[i] + nums[j] == target:
                    result = [i, j]
                    break;
        return result;

【解説】
入力された配列numsの大きさをnとすると

  • 時間計算量:O(n2)
  • 空間計算量:O(1)

学習メモ

C++のusing namespace std;について

おまじないとして、書いているusing namespace std;について簡単に調べてみました。

今の私の理解

using namespace std;を書けば、std:cin << ~~とかのstd:を省略できるようになる。

事前知識

using namespace std;について調べるにあたって知っておいた方が良いことを調べておく。

using namespace std;についてわかったことは随時、この記事にまとめていく。

C++のiostreamについて

おまじないとして、書いている#includeについて簡単に調べてみました。

iostreamライブラリ:C++ の標準入出力ライブラリ

  • cin:標準入力
  • cout:標準出力

iostremライブラリで、わかったことはこの記事にまとめていく。

VSCodeでC++の環境構築

準備

VSCodeにて、追加する拡張機能

  • C/C++
    f:id:kawakeee:20200317140152p:plain

  • code runner
    f:id:kawakeee:20200317140255p:plain

  • main.cppファイルの作成

#include <iostream>

int main()
{
    std::cout << "Hello! World!" << std::endl;
    return 0;
}

実行

「Hello! World!」が表示されることを確認◎◎ f:id:kawakeee:20200317140432p:plain

Firebaseプロジェクトの作成からfunctionのデプロイまで

コンソールから新規プロジェクトを作成

https://console.firebase.google.com/u/0/

ローカルで開発環境の構築

作業フォルダ配下で 以下のコマンドを実行。今回はfunctionを作成するので、

firebase init f:id:kawakeee:20200220111907p:plain

◯ Functions: Configure and deploy Cloud Functions ←を選択する

新規作成したプロジェクト名が表示されるので、選択する。(今回はchicken-voiceを新規作成した。) f:id:kawakeee:20200220112247p:plain javascriptを選択 f:id:kawakeee:20200220112429p:plain 残りはなんとなくYESを選択 f:id:kawakeee:20200220112602p:plain

以上で、作業フォルダ配下に、以下のファイル・ディレクトリが作成される。

  • firebase.json
  • functions

Hello,worldしてみる

functions/index.jsにてコードを記述してHello,worldを返すfunctionを作成する

const functions = require('firebase-functions');

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
exports.helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

デプロイしてみる

以下のコマンドを実行

firebase deploy f:id:kawakeee:20200220113602p:plain

Function URL (helloWorld): https://us-central1-chicken-voice.cloudfunctions.net/helloWorld

のURLにアクセスしてHello from Firebase!と表示されればデプロイが正常に完了している。

以上。

Account Activity APIの特定のイベントだけ受信するwebhookの設定

やりたいこと

Account Activity APIの特定のイベントだけ受信するwebhookの設定

現状、すべてのアクティビティ(リプライやRT、ファボなど)に対してwebhook側が受信してしまうので、リプライ(tweet_create_events)があった場合のみ受信を行えるようにしたい。

方法

イベントを受信した際に呼ばれるwebhook関数に対して、特定の条件下にのみ実行されるようにデコレータを自作し実装する。

以下、特定の条件

  • 受信したイベントのアクティベィティがtweet_create_eventsである かつ
  • 受信したイベントは自分のアカウントのアクティビティでない

対応前

@csrf_exempt
def webhook(request):
    """webhook"""
    body = request.body.decode('utf-8')
    json_body = json.loads(body)
    ....
    ....

実装

tweet_replyは自作したデコレータ。これをwebhook関数にかけてあげれば完成。

def tweet_reply(func):
    def checker(request):
        body = request.body.decode('utf-8')
        json_body = json.loads(body)
        isTweetCreateEvents = ('tweet_create_events' in json_body)
        if isTweetCreateEvents:
            user_id_str = json_body['tweet_create_events'][0]['user']['id_str']
            isMyUserId = (user_id_str == my_user_id)
            if not isMyUserId:
                # func(≒ webhook関数)を実行
                func(request)
    return checker
    ....
    ....

@csrf_exempt
@tweet_reply
def webhook(request):
    """webhook"""
    body = request.body.decode('utf-8')
    json_body = json.loads(body)
    ....
    ....

ただ、RTを拾ってしまうので、もう少し条件とtweetオブジェクトの調査が必要そう。