kopug memo

名古屋で働くとあるWebエンジニアの覚書。

Amazon Drive を CentOS6 から FUSE mountして使う

最近 Google フォト から Amazon プライムフォトに切り替えたところでしたが、Unlimitedストレージ(容量無制限)にプランを変更したので、そちらを活用するために、自宅のNAS(CentOS6)のバックアップ用途として使うことにしたので、その備忘録を載せます。

f:id:kopug:20170513175449p:plain https://www.amazon.co.jp/clouddrive/home

プライムフォトは写真データであれば、Amazonプライム加入者であれば容量無制限(RAWデータ含む)で使うことができるので重宝していました。 Unlimitedストレージは年間\13,800円で利用でき、他クラウドストレージと比べても格安になります。 (米国Amazonだと$59.99/年なので、費用重視する場合はそちらも検討してみてください)

それでは実際に設定をしていきます。

必要なパッケージのインストール

$ sudo yum install epel-release
$ sudo yum install python34 python34-setuptools git fuse fuse-python
$ sudo easy_install-3.4 pip

acd_cli のインストール

$ sudo pip3 install --upgrade git+https://github.com/yadayada/acd_cli.git

acd_cli の設定

$ sudo su -
# acd_cli -v init
17-05-13 20:17:52.829 [INFO] [acd_cli] - Plugin leaf classes: TestPlugin
17-05-13 20:17:52.829 [INFO] [acd_cli] - TestPlugin attached.
17-05-13 20:17:52.829 [INFO] [acd_cli] - Settings path is "/root/.config/acd_cli".
17-05-13 20:17:52.829 [INFO] [acd_cli] - Cache path is "/root/.cache/acd_cli".
17-05-13 20:17:52.836 [INFO] [acdcli.api.client] - Initializing ACD with path "/root/.cache/acd_cli".
For the one-time authentication a browser (tab) will be opened at https://tensile-runway-92512.appspot.com/.
Please accept the request and save the plaintext response data into a file called "oauth_data" in the directory "/root/.cache/acd_cli".
Press a key to open a browser.

上記の指示通りのURLにアクセスをして、oauthの情報ファイル(中身はJSON)をダウンロードし、指定のフォルダ(ここでは/root/.cache/acd_cli/oauth_data)に保存します。 保存が完了したら enterキーを押して先に進んでチェックを完了させておしまいです。

自動マウントできるように

マウント先のフォルダを適当に作ります。

# mkdir /mnt/amazon

スクリプトの作成

# vim /usr/local/bin/acdmount
#! /bin/sh

acd_cli mount -ao $1
# chmod 755 /usr/local/bin/acdmount

/etc/fstabに以下を追加

acdmount  /mnt/amazon  fuse  _netdev  0 0

これでネットワーク接続がある場合に、自動でマウントされます。 今回は初回なので手動でマウントをします。

# mount /mnt/amazon

定期的にsyncを実行させる

これで利用できる状態になっていますが、他のデバイス等から Amazon Drive が更新されている場合に、データ同期がされないので以下のコマンドを定期的に実行する必要があります。

# acd_cli sync

NASのバックアップが主目的なので、1時間に1回 cronで実行するようにしておきます。

vim /etc/cron.hourly/acd_sync
#! /bin/sh

acd_cli sync
# chmod 755 /etc/cron.hourly/acd_sync

最後に

これで一通りの準備は終わったので、あとは自分の用途に合わせて使うことができます。 今回使ったNASは mac の Time Machineとしても利用していたり、TV録画先としても利用しているので、バックアップ環境としては安心できますね。

その「エンジニア採用」が不幸を生む

開発の現場にいることよりも採用の現場にいることのほうが多くなってきている中で、自戒の念を込めてこの書籍を手に取ってみました。

本書のターゲット

  • 企業経営者
  • 採用人事
  • 転職を考えているエンジニアなど

本書の目次

  • 第1章 経営課題をエンジニア採用で解決しようとする落とし穴
  • 第2章 エンジニアの募集要項が書けない人事
  • 第3章 不幸になる原因はエンジニアサイドにもある
  • 第4章「どんなエンジニアが必要なのか?」「そもそも、エンジニアは必要なのか?」を判断する
  • 第5章 よいエンジニアをみつけ、採用する方法
  • 第6章 エンジニアを惹きつけ、働いてもらえる仕組みを作る

個人的なまとめ

エンジニアの採用に関する経営課題の話しから、エンジニアのキャリアパス、評価制度、組織の作り方と続いていきます。
エンジニアが足りないという声はどの企業でも上がってきますが、「優秀なエンジニア」はどんな企業でも活躍できるのか?というとそうではなく、
エンジニアにも多種多様なタイプが居る中で、本当に必要なエンジニアはどういうエンジニアなのかを見極めないと、結果両者にとって不幸を招きます。
本書の前半は経営者/人事のキーワードが多く、後半はCTOというキーワードが非常に多く出てきます。
事業を推進していく上での課題を、どういう技術/採用戦略が必要なのかを見極め、それを実現する組織を作り、その組織を向上/維持するために、
エンジニアの文化、開発手法、評価制度、教育システムを作り、それを真摯に語り採用活動を実施する必要がある事が分かります。

つまり自分がしないといけない事がここにたくさん書かれているわけですね。はい。

ここから先は、確かになーと思った内容をひとつだけピックアップします。

第4章にある、エンジニアを2つのタイプ x 4つのグループに分けて考える図が面白い。

f:id:kopug:20170218225918p:plain

タイプA の “自由な開発環境"とは主に自社サービスの開発/運営をしている人が当てはまります。新規製品・サービスの開発の経験があり、失敗することを成長の糧と考える。
タイプB の "ガバナンス優先の開発環境"とは、与えられた目標の下、持っている技術と経験で着実に開発をおこなう(失敗は許されない)

将来マネージャになった場合に、上記のタイプAとBではマネージメントスタイルも変わってくるため、2タイプ x 4グループの8セグメントで考えて、 今どのタイプのエンジニアが必要なのかを考えていくと、そこに絞った採用戦略も考えられそうですね。

IDCFクラウドでCentOS7を使ってみる

f:id:kopug:20170110190710p:plain

はじめに

  • 今までぬるりと避けてきたCentoOS7を触ってみる
  • IDCFクラウドを今回利用しております www.idcf.jp
  • IDCFクラウド特有の話しはここでは扱いません
    • Webベースのコンパネも非常に分かりやすいので、見れば感覚的に使えます

主にやること

  • anyenvを使って PHP/Rubyのバージョンを切り替えれるようにする
  • Webサーバはnginxを利用
  • FWはIDCFクラウド側で用意されているものを利用する

基本設定

etckeeperのインストール

# yum -y install epel-release
# yum -y install etckeeper

# etckeeper init
# etckeeper commit -m 'first commit'

作業用アカウントの作成

# adduser kopug
# passwd kopug
# usermod -G wheel kopug

# visudo -f /etc/sudoers.d/wheel
%wheel ALL=(ALL) NOPASSWD: ALL
Defaults:%wheel !requiretty
Defaults:%wheel env_keep += SSH_AUTH_SOCK

sshdの設定変更

ここからは 作業用ユーザで実施

rootでのログインを禁止

$ sudo sh -c 'echo "PermitRootLogin no" >> /etc/ssh/sshd_config'

空のパスワードでのログイン禁止

$ sudo sh -c 'echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config'

鍵認証必須

$ sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

設定反映

$ sudo systemctl reload sshd.service

root宛のメールを受け取れるようにする

$ sudo sudo sed -i '/^root:/d' /etc/aliases
$ sudo sh -c "echo 'root: user@example.com' >> /etc/aliases"
$ sudo newaliases

設定内容をコミット

$ sudo etckeeper commit

anyenv のインストール

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l
$ anyenv install rbenv
# anyenv install phpenv

各種pluginのインストール

$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ anyenv update
$ mkdir -p $(anyenv root)/plugins
$ git clone git://github.com/aereal/anyenv-exec.git $(anyenv root)/plugins/anyenv-exe
$ anyenv exec --version
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
$ anyenv git gc

phpのインストール

buildするのに必要なパッケージをインストール

$ sudo yum install -y --enablerepo=epel \
bzip2 gcc mariadb-devel libxml2-devel \
re2c libcurl-devel libjpeg-devel libpng-devel \
readline-devel libtidy-devel libxslt-devel bison-devel \
autoconf automake

インストール可能なバージョン

$ phpenv install -l

Available versions:
  5.2.17
  5.3.2
  5.3.3
  5.3.6
  5.3.8
  5.3.9
  :   :   :
  7.0.12
  7.0.13
  7.0.14
  7.0snapshot
  7.1.0
  7.1snapshot
  master

ここでは 最新の7.1.0 をインストールする

$ phpenv install 7.1.0

ruby のインストール

$ rbenv install -l

Available versions:
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
  : : :
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev
  : : :
$ rbenv install 2.4.0

$ rbenv global 2.4.0

$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

スマホアプリを開発する上で便利な認証基盤とデータ同期サービス

こんにちは。kopugです。
riot.jsにちょっと飽きてきたではなく、気分転換にswift3で遊んでいた時に使った外部サービスをまとめてみます。

Amazon Cognito

f:id:kopug:20170109015248p:plain

https://aws.amazon.com/jp/cognito/

主な機能

  • ユーザ認証機能
    • OAuth / SAML ID / 独自IDに対応
    • さらに User Pools 機能を使えば、アカウント管理基盤(ログイン、サインアップ等)をマネージドとして提供してくれます
  • Sync(同期)機能
    • ユーザーデータのデバイス間の同期
    • オフライン対応 (オンラインになると同期開始してくれる)

参考サイト

qiita.com qiita.com

Google Firebase

firebase.google.com

主な機能

  • リアルタイムデータベース
  • ユーザ認証機能
  • ホスティング機能
  • メッセージング機能
  • アナリティクス機能
  • 公開前のテストラボ
  • etc...

数多くあるので、これひとつ入れるだけで結構作り込まなくて済みます。

参考サイト

qiita.com entershare.jp

Riot.js に 触れてみる #0

f:id:kopug:20170104161938p:plain

フロントエンド系のライブラリ/フレームワークはいくつもありますね。

  • AngularJS
  • React.js
  • Riot.js
  • vue.js
  • Backbone.js
  • Ember.js
  • Knockout.js

用途によって必要なライブラリは変えていくべきですが、今回は Riot.js について触れてみようと思います。

riotjs.com

Riot.js は... HTML・JS・CSSを、普通に理解していて 「説明書を読まない人」向け
と、以下の利用に書かれているだけのこともあり、非常に直感的に分かりやすい書き方をします。

Riot.js in WPD-Week // Speaker Deck

Riot.js の特徴

カスタムタグ

いわゆるコンポーネント指向と言われているもので、独自のタグを作ることができます。
以下はtodoタグを作っている例です。

<todo>
  <!-- layout -->
  <h3>{ opts.title }</h3>

  <ul>
    <li each={ item, i in items }>{ item }</li>
  </ul>

  <form onsubmit={ add }>
    <input ref="input">
    <button>Add #{ items.length + 1 }</button>
  </form>

  <!-- style -->
  <style>
    h3 {
      font-size: 14px;
    }
  </style>

  <!-- logic -->
  <script>
    this.items = []

    add(e) {
      e.preventDefault()
      var input = this.refs.input
      this.items.push(input.value)
      input.value = ''
    }
  </script>
</todo>

カスタムタグは、関連するHTML/CSS/JavaScriptを統合して、再利用可能なコンポーネントを形成します。

人間に読みやすい

カスタムタグにしていくと、HTMLのみで複雑なビューを作成できます。大元のHTMLは以下のようになります。

<body>

  <h1>Acme community</h1>

  <forum-header/>

  <div class="content">
    <forum-threads/>
    <forum-sidebar/>
  </div>

  <forum-footer/>

  <script>riot.mount('*', { api: forum_api })</script>
</body>

このようにカスタムタグを入れ子で配置したりすることもできます。

小さなサイズ

  • polymer.html - 45.69KB (gzip)
  • react.min.js - 45.05KB (gzip)
  • riot.min.js - 9.81KB(gzip)

小さいので、ソースコード自体を読むのもそんなに苦ではないですし、余計な機能が一切省かれているのも個人的には好き。

etc

ここに書いてあることは全て、riot.js のサイトに書かれていることですので、もっと詳しく知りたい方は見てみてください。

xargs で 並列処理

意外と忘れていたので備忘録がてらメモ

(例)

$ yes | head -10000 | xargs -L 30 -P 2 ruby -e 'sleep(1); p ARGV.size;'

-L : 引数の数が30件に達したら, コマンドを実行する
-P : 同時実行数を2に指定

上記のコマンドを実行をすると, 引数の数を標準出力に出しているので確認する事ができる

$ yes | head -10000 | xargs -L 30 -P 2 ruby -e 'sleep(1); p ARGV.size;'
30
30
30
:  :  :

psコマンド等で確認をすると 2プロセス動いているのが確認できる

仕事をする上での楽しさの定義

はじめに

2017年になりました. 今年の抱負は「積極的に明文化すること」にします.

それを思ったキッカケは, 年末の大掃除をする時に今の会社に入社する時に作った職務経歴書のWordファイルを見つけた時のこと. 2007年の更新だったので, 今年でちょうど10年になります.
そこの経歴書をみて思い出したのですが, 1番最初の職務は1997年に学生時代に請負ではじめたWebのシステム開発でした.
そう考えると今年で20年なんですよね...驚きというかある意味怖いというか.
今までの自分の学びとこれからの学びを少しでも残していこう. そんな一年の始まりにしたいですね.

仕事をする上での楽しさ

f:id:kopug:20170102013301p:plain

突然ですが, 仕事を楽しめている人って世の中にどれくらいいるんでしょうね.
人間の一生を考えると働いている時間は非常に長いです.
プライベートと仕事を区別して…という話を聞くことは稀にありますが, 自分はプライベートも仕事もごっちゃ混ぜで考えています.
自分は1人しかいなくて, 人生も1度しかなく時間軸もひとつなので, 分けて感がることが出来ないというのが本音です.

自分の人生を満足させたい, 充実させたいと考えると仕事は切っても切り離せない問題になるので, であれば楽しみたい.
今までを振り返って楽しさ/充実感を感じている時の共通項目を書いてみます.

目標が明確になっていること

f:id:kopug:20170102013326p:plain

もう少し言うと, 目標を達成する上で自身が何をするのかが明確になっている時です.
チームが目指している目標と自身の目標, それを達成するためのアクションが明確になっていると人は動きやすくなります.

ただ動き続けるためには, それだけでは不足していて, 今どの位置にいるのか, 今のアクションは正しいのか? このまま進んでいって良いのか?と不安になってしまいます.
その不安を解消するためにも目標の見える化と成果(数字)の見える化は必須になります.
成果が見える事で今どの位置にいるのかを知ることができ, 目標が見えることで立ち返る事ができます.

これが無いと闇雲に動くことしか出来ず, 人は不安になります.

目標の見える化と管理をする上で便利そうだなーと感じるツールがこれ.

会社やチームの目標から個人の目標に落とし込んで, 各目標の進捗管理ができるツール.
これは使ってみて確かめてみる.

チームが一丸となって, 目標達成に向かっていること

f:id:kopug:20170102013349p:plain

自分1人で出来ることは限られており, 大きな目標を達成するには周りの皆の協力が必要不可欠になります.
自分がフリーランスを辞めた理由がまさにこれでした.
自分が背中を預けられる仲間と切磋琢磨して, 目標に向かって行動している時に人は充実感を得ます.

自分の成長が実感できていること

f:id:kopug:20170102013415p:plain

最高のチームの一員でいるためには, 自身も成長しなくてはいけません. 結果それがチームの成長, 目標達成に向けて必要になるからです.
エンジニアであれば, 自分の書いた過去のコードを見ると成長を感じる事は多いかと思います. ;-)
自分の成長を感じる瞬間はいくつかありますが, 重要なミッションを任されてそれが達成出来た時は感じやすいですよね.

どれだけ良い目標があり, 良いチームに入ることができても, 自身が成長して周りから必要とされなければ, それは楽しくないどころが辛いと感じると思います.
ただ, 何か行動を起こしていれば必ず成長している事はあるはずなので, 今いる場所で何をすれば自分が1番成長できるのかを考えることが重要です.

まとめ

今回はテーマを仕事の楽しさにしましたが, この手の話を考える時に自分はいつも絶対嫌な状態を最初に考えます.
自分がどうしたい. どうあるべきか. それを考える上で間逆な状態を想像してから, そうならないためにはどうすればいいのか.
または, それを単純にひっくり返すだけで自分のしたいことが見えてきたりもします.

そんな事を考えながら, 今日は真田丸のBGMを聴きながら書いています.

NHK大河ドラマ 真田丸 オリジナル・サウンドトラック THE BEST

NHK大河ドラマ 真田丸 オリジナル・サウンドトラック THE BEST

  • 三浦文彰、下野竜也指揮 NHK交響楽団、他
  • サウンドトラック
  • ¥2200