という話

技術ブログにしたい

#hiyokonitsuduke タグでTwitter転職出来た

前回こういうブログを書きました。
ichiy.hatenablog.com

結論

結論から言うと転職できました🙏
ご覧頂いた方、お声かけて頂いた方、ありがとうございました。

#hiyokonitsuduke タグの元であるひよこ大佐や、ブログで転職のこと書こうと思ったからあげさんには足を向けて寝れませんね。

ちなみに札幌の企業ではなく、東京の企業でリモートで働かせて貰ってます。
札幌の企業さんとも最終面接まで行ったんですが、同時に進行してた東京の企業のほうがいろいろ良かったのでそっちにしました。
札幌で面接した後だと、「やっぱ東京の経済圏すげぇな!」って思いましたね。

参考までに

ブログで転職のことかいたので、一応結果もブログでちゃんと書いておこうと思います。
ちなみに非常にしょぼいです。

来てほしいと言われた件数

TwitterのDM:5件
ブログ経由:3件

面接を受けないかと言われた件数

TwitterのDM:3件
ブログ経由:4件

合計15の企業さんからご連絡をいただきました。大変ありがたいことです。
オフラインでもいろんな方に企業を紹介してもらったりして、人の温かさを感じました(*´ω`*)
転職サービスにも複数登録してて、多分最終的に4,50社くらいの企業さんとメッセージのやり取りをしたと思います。
多くの人とのやり取りって日常的にすることがないので非常に大変でしたが、悔いのない転職が出来たなと現時点では思っています。

ちなみにブログ経由ってのは複数経路があって、ブログを見て僕の個人サイトからメールってパターンもあれば、
転職サイトにブログURLを乗せていたので、たまたま読んでくれた採用担当の方が転職サイトからブログ読んで気になったという連絡をくれたパターンもありました。
やっぱりアウトプットって大事ですね。

おわり

転職ブログ書くきっかけになった、からあげさんの記事は9月中頃までって書いてあったのでそろそろ何かしら結果が見れるのかなと楽しみにしてます。

8月末引っ越し、9月頭入社、7日に地震があって、
8月下旬から9月上旬は人生の中でも非常に濃厚な時間でした。

Route53+DNS-01のLet'sEncryptを自動更新する

ググると日本語の記事も結構出てくるんですが、どれも私の環境ではうまく動かなかったので自分なりにやりました。

前提

  • CentOS7
  • certbotcertbot-external-authインストール済み
  • awsコマンドがインストール済み
  • aws configure 済みで、Route53の権限を持ってる

certbot-external-authは下記でインストール

https://github.com/EnigmaBridge/certbot-external-auth
上のURLを参考に

pip install certbot
pip install certbot-external-auth

でインストールできる。

コード

renew.sh

#!/bin/sh

certbot certonly \
  -d sub1.example.com \
  -d sub2.example.com \
  --email test@example.com \
  --agree-tos \
  --preferred-challenges dns \
  --keep-until-expiring \
  --text \
  --configurator certbot-external-auth:out \
  --certbot-external-auth:out-public-ip-logging-ok \
  --certbot-external-auth:out-handler /path/to/hook.sh

# apacheなら
systemctl restart httpd

# nginxなら
# systemctl restart nginx


hook.sh

#!/bin/sh

set -e
cmd="$1"
shift

case "$cmd" in
    perform)
        HOSTED_ZONE_ID="/hostedzone/YOUR_HOSTED_ZONE_ID"
        FILENAME=`date "+%Y%m%d%H%M%S"`.json
        DIR=/path/to/json_dir/

        # 環境変数チェック
        if [ -z "$domain" ] || [ -z "$validation" ]; then
                echo "Undefined environment variable"
                exit 1
        fi

        # 設定用jsonファイルを書き出し
        cat <<EOT > $DIR$FILENAME
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "_acme-challenge.$domain",
        "Type": "TXT",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "\"$validation\""
          }
        ]
      }
    }
  ]
}
EOT

        # jsonファイルをアップロードしてTXTレコードを追加
        aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch file://$DIR$FILENAME

        # DNS反映待ち
        sleep 60
        ;;
    *)
        ;;
esac

使い方

renew.shをcronに登録して毎月1回実行すれば更新されるはず。

説明

certbot-external-authってやつがDNS-01のチャレンジを行うときに色々なタイミングでフックしてくれます。
そのフックを利用してチャレンジ前にTXTレコードを書き換えて認証してもらうって流れです。

どのタイミングでフックされるかや、どういう環境変数を渡してくれるかは下記を参考にしてください。
github.com

hook.shの方はどのフックタイミングかを見極めてperformのときにTXTレコードを書き換えます。
hosted_zone_idはRoute53にアクセスしてHosted zonesを見ればわかります。
f:id:ichiy:20180730145427p:plain

awsコマンドでRoute53の変更を行うにはjsonを使うので、設定用jsonを書き出します。
書き出したjsonawsコマンドでアップロードします。
チェレンジ前にDNSの設定が反映されてる必要があるのでTTLの60秒待ちます。

その後はcertbotが勝手にやってくれます。
最後にWebサーバーを再起動すれば新しい証明書になります。

注意点

本番でやる想定なので「--keep-until-expiring」というオプションをつけてます。
これは証明書の更新が必要ない場合は発行しないというオプションです。

証明書の有効期限にかかわらず発行させる場合は「--force-renewal」というオプションをつけます。
このオプションをつけて実行する場合Let's Encryptのレート制限に引っかからないように注意しましょう。
Rate Limits - Let's Encrypt - Free SSL/TLS Certificates

札幌のWeb系企業で働きたいんですが

2018/09/13追記
転職決まりました。メッセージくれた方ありがとうございました。
追記終わり

f:id:ichiy:20180724114245p:plain

札幌ってWeb系企業存在してる???ってレベルで少なくてびびりました。


転職活動開始直後の私
「エンジニア足りてないし札幌でもすぐ見つかるっしょ( ´ω`)」

現在の私
「札幌Web系企業少なすぎワロタ・・・」

GreenでWeb系企業を検索すると
・札幌のWeb系求人は東京の約36分の1!
・給与相場は約100万低い!

完全に転職活動前のリサーチ不足が原因なわけですがここまでとは・・・。

転職活動開始直後は年俸600万で探してたんですが、札幌で600万なんて最高年収でも満たないところが7割くらいでした。
なので今は450万で探してますがそれでも未だに買い手がつかない状況です。
東京では600万でも結構オファー頂けたのですが・・・。

Green以外も使って見ましたが、正直札幌だとGreen以外は使い物にならなかったです。
エージェントも登録しましたが何も見ずにオファー送ってくるとか本当に酷かったです・・・(これは別途記事にしたい)


ということで、からあげさんに見習ってブログでもちゃんと転職活動しようと思います。
とは言ってもからあげさんほどのスキルも知名度もないので無意味かもですが。

経歴要約

新卒でIT派遣戦士として残業100時間超えで手取り19万で頑張ってましたが2年ちょいでズタボロになって退社。
フリーターとしてフラフラした後、20代後半フリーターという事実に焦り再度プログラムの勉強を再開。
IT派遣戦士のときにはやりたくても出来なかったWeb系の会社に拾ってもらい、戦闘力を上げ、今はリーダーなどもさせてもらえる立場になりました。

ichiy.hatenablog.com
私の記事では唯一ホッテントリに乗ったこの記事書いたときから、大分成長いたしました。


スキル

クラウド

AWS

・EC2
RDB(Aurora)
・Route53
・SES
・S3
・CloudFront
・CloudWatch
・ElastiCache

GCP

・Compute Engine
・BigQuery

OS

Mac
Windows
Linux(CentOS)

言語

PHP
JavaScript
・Shell
Python
・Go

フレームワーク

・Laravel
FuelPHP
Symfony
・Vue.js
jQuery

ミドルウェア

Apache
・Nginx
MySQL / MariaDB
・Redis

監視

・Mackerel
・Fluentd + ElasticSearch + Kibana
・Prometheus

ツール

Github
・Docker
・Backlog
・Slack
FFmpeg
Mecab
・Word2Vec / Doc2Vec
・fastText
・Ansible
・GoogleActionScript

出来ること

開発

開発はアジャイルスクラムで進めてました。

クラウド

AWSやさくらクラウドでの構成や運用体制の設計など
・サービスの規模に合わせた構成。小さいときは費用のかからないのもから、中規模程度の構成まで可能
・ログの蓄積、集計、ビジュアライズなど
・データアナリスト的なこともしていました

サーバーサイド

・技術選定から設計・開発・保守全て
・LaravelやFuelPHPでのサーバーサイド開発
・DB設計
・アプリ向けAPIの作成
・管理画面作成
CMS作成
・外部API連携(Google, AWS, Facebook, Instagram, Pinterest, 楽天, Yahoo)
RSS書き出し
ミドルウェアのチューニング
・キャッシュを使用した高速化

フロントエンド

jQueryやVue.jsでのフロントエンド開発
・SPAの作成
CSSアニメーション
HTML5コーディング

リーダー / マネジメント

・10名以下の少数チームのリーダー、マネジメント経験

エンジニア採用

・職務経歴からレジュメまでしっかり目を通し、実力の判断、社内の雰囲気に合うか見極めての採用
(当たり前のようですが、色んなとこに面接に行ってみてこれが出来てる企業は3割もありませんでした)

SEO

・AMPの導入
・GoogleAnalyticsの導入
・GoogleTagManagerの導入
・SearchConsoleの導入
・常時HTTPS対応
・構造化データ対応
・リッチカード対応
・ページの表示高速化

GAS

・会社用メールフォームとGASを連携
・GoogleAnalyticsと連携し毎日のページごとのPV,セッション,離脱率などを表示
・GoogleSearchConsoleと連携し毎日の流入キーワードを表示

アドネットワーク導入

DFP対応
・レコメンドエンジン広告対応
・ヘッダービディング対応
・Ads.txt

ソーシャル

Facebook Instant Articlesの導入
Facebookアプリ/ ページの作成
Twitterカード対応
Pinterest自動投稿

社内SE

Windowsの共有機能をやめ、NAS導入
・遅かったネットのボトルネックを探し出して改善
Mac/Windowsのセットアップ、初期化
・パッケージをやめてOffice365導入
・セキュリティ研修
・PC基本操作研修

機械学習ディープラーニング

・テキストの類似度算出
・記事のカテゴリー分け、タグの自動付与、簡易レコメンドシステムなどの作成


私の強み

大して強くは無いんですが、0からメディアを立ち上げて、国内Top500には余裕で入るくらいのトラフィック(similarweb調べ)になるまでを経験してるので、そのフェーズで起こる問題は大体対処出来ることでしょうか。
後は2年半くらい一人エンジニアだったので、社内SE的なことも結構出来ることです。
広告代理店業もやってる会社なのでアドネットワークの知識もあります。


希望条件

勤務地

札幌で働きたい!

働き始める時期

結構時間ないんですが9月から働けるところを探しております

年齢

30代前半です。加齢臭はまだ出てません大丈夫です

希望年収


からあげメソッドで計算すると

・データアナリスト 2000万
・AI/人工知能/機械学習 4000万円

6000万くらいの価値があることになります。
1社様限定価格、91%割引の450万円以上でいかがでしょうか?

連絡先

TwitterのDMでお願いいたします
twitter.com

まとめ

東京って本当に仕事に溢れてるんだなって実感しました。
逆に東京以外の地域は福岡とか以外Web系の仕事ほぼ皆無ってこと。

札幌かもしくはフルリモート(月2,3回出社可能)でOKな会社さんいらっしゃいましたら是非お願いいたします🙏

法律の刑罰を比較出来るサービスを作った

compalex.site

きっかけはなんかの過労死ニュースで見た、企業への罰金が50万だったという記事。
もちろん損害賠償があるんだけど法律的には罰金50万で済むということに衝撃を受けた。

それと同時期に漫画村とかで著作権違反のことが話題になってたときに調べたら、こちらは10年以下の懲役または1000万円以下の罰金だそうな。

つまり間違って人が死んじゃうより違法アップロードとかしたほうがめちゃくちゃ罪が重いということ。
どういう経緯があってこういう法律になったのかはわからないけど、直感的にはおかしくないか?これを比較出来るサービスを作ったら面白くないか?
ということで作りました。



技術的な話

特に面白い・新しい技術は使ってないです。

イーガブっていう政府がやってるサイトから法律をダウンロード出来ます。
XML形式なんでパースしてDBに突っ込みました。結構XMLの中身のツリーがバラバラで苦労しました。

環境は、さくらのVPS1台にPHPとVue.jsで作って、前段にCloudFlare噛ましてるだけです。
CSSもベタで書いてます。
驚くほど枯れた技術しか使ってないですが、自分一人で早く、かつお金をかけずに作ろうと思うとこんな感じ。

UIは自分なりに頑張ったつもりだけどデザインの基礎を知らんのでわからんです。

ヘッドレスChrome+Selenium+Pythonでファイルダウンロード

業務に必要なレポートを毎日ダウンロードして加工して別レポート作成する、
みたいな作業を自動化して欲しいとのことでSeleniumでサクッと作ろうと思ったんですが、ヘッドレスChromeだとデフォルトではファイルダウンロードができなくて半日費やしました。

その時の解決方法のメモ。

環境

CentOS7.2
Python2.7.5 (小学生に笑われるやつ)
Selenium
Google Chrome 66.0.3359.117

現象

vaaaaaanquish.hatenablog.com
上記の記事を参考にさせてもらって普通にページの取得とかはできたんですが、ダウンロードボタンを押しても何も起こりませんでした。
正確に言うと、処理の時間としてはダウンロードしてるのとほぼ同じ時間かかっているものの実際のファイルはどこにも無い、かつエラーも出てないという現象でした。

CentOSで使ってたソースをMacに持ってきてヘッドレスじゃないChrome+Seleniumだと普通にダウンロード出来たのでヘッドレスChrome特有の問題かなと当たりをつけました

結論 & 解決

調べてみるとヘッドレスChromeではセキュリティのためデフォルトでファイルのダウンロードが出来ないようになってるみたいでした
stackoverflow.com

上記のstackoverflowに載ってる解決方法とほぼ同じなんですが以下の様にすることでファイルをダウンロード出来ました。
以下の例はヘッドレスChromeChromeをダウンロードしてます。

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--headless')
chromeOptions.add_argument('--window-size=1280,1024')

driver = webdriver.Chrome(chrome_options=chromeOptions)

# ヘッドレスChromeでファイルダウンロードするにはここが必要だった
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
driver.execute("send_command", {
    'cmd': 'Page.setDownloadBehavior',
    'params': {
        'behavior': 'allow',
        'downloadPath': './' # ダウンロード先
     }
})

# ヘッドレスChromeでChromeをダウンロードしてみる
driver.get('https://www.google.co.jp/chrome/index.html')
sleep(3)

# Chromeをダウンロードボタンをクリック
driver.find_element_by_css_selector('#marquee > a').click()
sleep(1)

# 同意してインストールボタンをクリック
driver.find_element_by_css_selector('#eula-accept').click()
sleep(15)

driver.close()


ヘッドレスChromeでファイルダウンロードできた!
ちなみにChrome62から追加されたっぽい?機能なのでそれ未満はダメかもです