レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

株式会社レベルエンターは、昨年2015年7月に設立しており、この7月1日で2期目に入りました。

正直なところ、大きな不安の中で模索する日々でしたが、様々な人のご支援や温情により、なんとか1年やってこれました。
ビジネスが軌道に乗っているとはまだまだ言えません。
しかし僕らにしかできないこと、僕らが世の中に打ち出せることが見えてきました。
ワクワクする期待や希望はとても大きくなってきています。
2期目は、企画段階から世に出していく段階へ進めていきたいと思います。

会社としては、1期分の一通りの出来事を経験したことと、
背伸びして従業員さんを雇い入れられたことが、大きな成果だと感じています。

この1年間は、自分たちの実力を蓄える時間と位置付けていました。
でも2期目は、我々らしさをきちんと打ち出して行こうと思っています。

これからもレベルエンターを宜しくお願い致します。

SIerに勤めるあなたが出世できないとしたらそれは質問力だろう。

タイトルは釣りだけれども、やっぱり質問力は大事。

僕は質問力が100中、0から10ぐらいの新卒さんや学生さんたちに教える仕事をしている。

彼らに伝えたい事は山ほどある。そしてそれは今のうちに身につけているととても大きな武器になる。
質問力は新人だろうが、ベテランだろうが関係なく必要な仕事力であると思うのだ。
なぜなら、新人は先輩に質問するが、ベテランもクライアントに質問するのだ。


質問をするときにきにするべきポイントは以下だ

・「目的」どういうことを実現したいと思っているのか

・「推測」そのために自分は何ができるのではないかと思っている

・「報告」どこまでは調べたのか、そして、どこまでは自分が理解できているかという「理解の表示」も含める
 
・それらをできれば図示を交えること

こういった観点を踏まえて質問することができれば
達成したい目標をいち早く達成することができるかもしれない。

新入社員さんへ伝えたい行動規範48カ条

新入社員さんがええ感じになってきた頃合、お伝えしたい48カ条をまとめておきます。

責任

1.人のせいにせず自分の責任と考えよう
2.中途半端で満足せず成し遂げよう
3.ポジションや責任を与えられたら成長のチャンスと捉えよう
4.他人より先に動こう
5.自ら決定しよう。責任を負おう。責任こそが仕事の本質
6.与えられたチャンスにはとりあえず乗っかろう
7.横並び意識を捨てよう
8.悪くならない可能性よりも良くなる可能性を選択しよう
9.アウトプットの質にこだわろう
10.よりよくしよう、現状維持は悪と考えよう

習慣

11.生活習慣を重視しよう。日々の積み重ねに価値をおこう
12.若い頃は仕事を中心に置こう、それはプライベートを含めた「人生」を充実させるため
13.本を読もう。読む習慣をつけよう
14.「深く狭く」その先に広がりがあるから
15.調べる回数はできるだけ少なく決心しよう。同じことを100回調べるより行動して知ろう
16.記録しよう。記録して測定しよう
17.事実に対して、意見と仮説をもとう
18.見えない属性を見よう。例えば人の情緒が効率に及ぼす影響を考えてみよう

自己研鑽

19.自分の特徴を構築してよう。同世代と比べて特徴をプロデュースしよう
20.自分を分析しよう。強み弱みを問われたときにどう答えるか常備しよう
21.自分の価値を高める努力をしよう。自分を安売りしてはいけない
22.他人を信頼しよう。自分には厳しく懐疑しよう
23.目標をもとう
24.平穏よりも刺激を求めよう。そうすれば変化に強くなるから
25.自らの目で確かめよう。とりあえず作ってみよう
26.自分の記憶を疑おう

行動

27.熟考よりも行動を優先しよう。考えれば考えるほど行動しにくくなるから
28.振り返りをしよう。反省しよう
29.素直にあやまろう
30.未来のチャンスにしがみつこう、今の安全または過去の栄光は捨てよう
31.挑戦と困難を楽しもう
32.トラブル解決に取り組もう。問題の対応は、新しい物の創造と同じく価値がある

コミュニケーション

33.人の話を聞こう。人の話は遮らず最後まで聞こう
34.反論するなら代替案を出そう
35.自分は口下手だと思っていればこそ説明上手になる努力をしよう
36.自分の正義を押し付けるのではなく、相手の正しさも認めよう
37.一度言った事でも間違っていたら覆す勇気を持とう
38.伝える方法を模索しよう
39.上司と信頼関係を築こう。上司の当たり外れは、あなたの責任も半分あると知ろう
40.チームへの貢献を優先しよう
41.人間関係を地道に、農業のように構築しよう。畑を耕し種をまきじっくり待とう。とりあえずの利益より信頼の構築をめざそう
42.意見の不一致を大事にしよう。意見の一致を嫌おう
43.上と比べよう。社外の人や目上の人と付き合おう

仕事

44.無駄に費やす時間を見直そう。時間についての改善は大きな宝であると知ろう
45.仕事が終わってから翌日の仕事のことを考えよう。仕事場についてから昨日取り組んだ問題について思い出すのでは効率がまったく悪いから
46.必要性のない仕事は疑おう。行わなくても良いかもしれない可能性を考えよう
47.優先順位を決めよう。決めてから進もう
48.現在の仕事の進め方に疑問を持とう。既存踏襲は常に遅れをとっていく道だと思おう

新入社員さんや学生さんへ教える技術と方法論

レベルエンターという会社は、プログラミングを学生など若い人たちに教える会社ですが、プログラミングに限らず、あらゆる学習について言える僕の気づきがあります。
それは仕事として取り組んだ経験がなければ、まるで我々が高校でならった「数学」の授業のように、将来なんの役に立つかわからず学んでしまうということです。

僕は10年以上、IT企業向けの派遣講師としてプログラミングを教えてきたのですが、プログラミングを仕事として経験した人と比較して新入社員や学生では、効果を上げる方法論が180度違うということに気づきました。

新入社員は業務経験がありません。それは我々業務経験者が思っている以上に学習効果に影響します。現場で役立つ技術だけを教えても、あんまり身になりません。必要性がわからないのです。

それに対して業務経験者は、現場経験に照らして今教えられていることがどれほど価値があるかを判断できます。だから技術だけ教えた方が効率良く学べます。


我々は、上記の理由で新人さんや学生さんは、グループワークを重視し、かつコミュニケーションを重視して伝えています。また、カリキュラムの進め方的にもコミュニケーションなしには成果があがらないように設計しています。

新入社員や学生は、覚えるべきことが何の役に立つのかピンとこないので、チームに貢献するという目的をもたせて学習成果をあげるようにしているわけです。
チームに貢献することや足を引っ張らないことに目的意識をもたせることで成果が上がっていきます。

そのほかは、そもそも楽しいと感じてもらえるようにカリキュラムを設計します。
これはレベルエンターの社名の由来でもある、エンターテイメントレベルで楽しく学ぶという理念からきています。

docker-phpの環境構築メモ

教育資料作成のためのメモ。丁寧には書かない。
(以下、sudo面倒くさいのでrootでインストール)

PHPから DockerRemoteAPIを叩く、docker-phpというのがある。
https://github.com/docker-php/docker-php

ドキュメント
http://docker-php.readthedocs.org/en/latest/

環境構築のメモ

Virtualbox Centos7minimalで環境を作ってみる。

32bitのepelにはdocker-ioパッケージがないので、複雑化する。
またCentos6系は、Dockerのサポートから外れているので7の64bitでやる。
https://github.com/docker/docker/issues/14365

32bitか64bitかを知る方法

uname -a
i686, i686, i386と表示された場合は、32bitカーネル
X86_64やamd64と表示された場合は、64bitカーネル

centos7、ifconfigがなくてびびる
http://qiita.com/haisaihiroki/items/87fe137f00b5c625f607
http://www.cyberciti.biz/faq/rhel-centos-linux-7-restart-networking-command-line/

ifconfig -> ip addr
service サービス コマンド -> systemctl コマンド サービス 

virtualbox にcentos7.isoをインストール
・ホストオンリーネットワークを作っておくこと
参考:http://www.kakiro-web.com/memo/virtualbox-create-virtual-machine-2.html
・ホストオンリーネットワークは、ipを192.168.99.2で静的に設定
 ローカルPC側を192.168.99.1にしてみた。

selinux を止める

vi /etc/selinux/config

書き換える箇所は以下

SELINUX=permissive

要、再起動

reboot

docker インストール

yum update
yum -y install docker-io

dockerのサービスを起動する

systemctl start docker
systemctl enable docker

dockerイメージをダウンロード

docker pull busybox:latest

実行確認してみる。

docker run -it busybox

busyboxは、基本的なLinuxコマンド群を単一のbusyboxコマンドにまとめたものであり、必要最小限のLinuxシェル環境を提供する場合によく利用されています。

Dockerにおけるデータ専用コンテナ、KVM仮想化環境からの移行 | Think IT(シンクイット)

centos7のイメージも入れてみた。動いてる

docker pull centos:7
docker run -i -t centos:7 /bin/bash

PHPhttpdをインストール。
PHPの関連パッケージで競合があったので--skip-broken

yum -y install httpd
yum -y  install php
yum -y --skip-broken  install php-* 
yum -y  install git

httpd.confでPHPを有効化

vi /etc/httpd/conf/httpd.conf

約45行目「Dynamic Shared Object (DSO) Support」ブロックの中に、モジュールを登録する以下の記述をします。(58行目あたりにしました)

# PHP setting --- start
LoadModule php5_module modules/libphp5.so

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

httpd起動、自動起動

systemctl start httpd.service
systemctl enable httpd.service

composerをインストール(docker-phpインストールのため)

cd ~/
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

プロジェクトを作成、httpdのデフォルトのドキュメントルート/var/www/html配下に作った

cd /var/www/html
mkdir docker-php

composerでdocker-phpをインストール

cd docker-php 
composer require docker-php/docker-php

環境変数でDOCKER_HOSTを設定しておく( remote apiのため)

vi /etc/profile

最終行に追記

DOCKER_HOST=tcp://127.0.0.1:2375

設定した環境変数の読み込み

source /etc/profile

dockerをtcpで待ち受けるように設定

vi /etc/sysconfig/docker

2375ポートでRemotoAPIを待ち受けるようにする。

OPTIONS='--selinux-enabled -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375'

TCP経由でRemoteAPIを利用できるようにする。
デフォルトではfdのみなのでローカルホストからしかdockerコマンドを利用できませんが、TCPソケットを有効にして リモートマシンからもコントロールできるようにします。
ドキュメント上、以前は Port:4243を使用していましたが、メジャーバージョンから Port:2375に変わっています。

http://marmotte.pyrites.jp/blog/2015/01/13/docker-on-centos7/


vi /etc/init/docker.conf
DOCKER_OPTS='-H tcp://127.0.0.1:2375'

Docker再起動

systemctl restart docker

PHPのファイルを作成

cd /var/www/html/docker-php/
vi test.php

中身。(内容はdocker-phpのドキュメント参照)

<?php
require_once("vendor/autoload.php");

use Docker\Docker;
use Docker\DockerClient;
use Docker\API\Model\ContainerConfig;
try{
  $client = new DockerClient([
    'remote_socket' => 'tcp://127.0.0.1:2375',
    'ssl' => false,
  ]);

  $docker = new Docker($client);

  //$containers = $docker->getContainerManager()->findAll();

  $containerManager = $docker->getContainerManager();

  $containerConfig = new ContainerConfig();
  $containerConfig->setImage('busybox:latest');
  $containerConfig->setCmd(['echo', 'I am running a command']);

  $containerCreateResult = $containerManager->create($containerConfig);
  echo var_dump($containerCreateResult);
} catch(Exception $e){
  print($e);
}

だれでもできる低い生産性体験

会社で使うちょっとしたツールをphpで作ってます。

家に帰って、子供が寝静まった頃に酒飲みながらコーディングすると、当たり前だけどなかなかはかどりません。

「これって生産性の高い低いを体験できる方法だよなー」と。


飲んでる時、ハマったのはちょっと階層の深いメソッドで、DBへのクエリの結果の配列から絶対取れるはずのデータが取れないこと。

まず状況を把握するのが大変。
SQL単独で実行してみたらデータ取れてるし、引数も間違っていない。
我ながらしょうもないところで詰まったなとボンヤリ思いながら次の手が億劫でしょうがない。

ajaxコールしている先だからechoやprintしてもうまく全容がわからない。そこをうまく改善して全容を見分ける仕組みをつくることも面倒くさくて手が出せない。飲んでると思いつく気がしない。

エラーログも吐いてるけど、色々他のログも長々と出していて、読み解くのもちょっと一苦労。

もう少し詳細なテストコード書くか、と思い切るまで2時間ほどグルグル手軽なデバッグを試すが成果がでず、結果テストコードを書く気になった。元気ならすぐテストコードに着手するだろうのに。
テストコード書く気になった直後、猛烈な眠気に襲われ諦めて寝た。

そして、朝15分で解決した。

2次元配列の1個目の添字を設定せずに2個目の添字でアクセスしようとしていたというだけの、超単純なミスに2時間はめられたのだった。

そもそも、飲んでコーディングしなければ、処理とデータの状態をイメージしながらかけるのでこう言う単純ミスに引っかかることも避けられたはずだ。


新人の頃のコーディングは、こんな感じだったな。
残業して疲れた頭でやるのもこんな感じで、
本来やらなくていいこと、0秒の作業に工数を2時間も使ったわけだ。


開発者の生産性を考える時、その人に備わった能力パラメータとしての生産性もあるが、体調や環境といった要素に影響される集中力が指数関数的に関わって決まるんですよね。スポーツ選手のスコアに近い気がします。

こうやって体験すると、新人ばかりを100人集めても1人のスーパーエンジニアに勝てないことを改めて感じます。

集中できる環境や体調管理をどのように実践すれば良いのか、経営者として仕組みを考えることに結びつけることで2時間のロスを前向きに考えようと思います。

酒が飲めなければ、とことん疲れた深夜とかにコーディングすれば体験できますね。

[備忘録] postfixを介して、GmailのSMTPを使ってメール送る設定

本日詰まったのでメモ
centos 7 minimam とMac El Captain でpostfixを介してGmailSMTPサーバー経由でメールを送る

AWSのセキュリティーグループでアウトバウンドのport=587を開けておくこと)

まずはpostfix がインストールされていない場合centos7 minimamにインストール

yum install postfix # macでは不要
yum install cyrus-sasl-plain # macでは不要

centosではiptablesでポート25も開けておく

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT # macでは不要

一応確認コマンド

service iptables status # macでは不要

sendmailpostfixが共存している場合、以下のコマンドでpostfixを有効にしておく

alternatives --config mta # macでは不要

postfixではsasl認証を使う、centos7minimamではyumであらかじめインストールしておらずつまった

sudo vi /etc/postfix/sasl_passwd

追記内容

smtp.gmail.com:587 メールアドレス@gmail.com:パスワード

chmod 600 /etc/postfix/sasl_passwd

postfixに読み込ませてDB化するコマンド

sudo postmap /etc/postfix/sasl_passwd

postfix設定ファイルの本丸へ

sudo vi /etc/postfix/main.cf

以下を追記

# Minimum Postfix-specific configurations.
mydomain_fallback = localhost
relayhost=smtp.gmail.com:587

# Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

# Enable Transport Layer Security (TLS), i.e. SSL.
smtp_use_tls=yes
smtp_tls_security_level=encrypt
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
tls_random_source=dev:/dev/urandom

postfix を起動します。

sudo postfix start
#終了コマンドは以下
#sudo postfix stop
#リロードコマンドは以下
#sudo postfix reload

メール送信確認

date | mail -s "test" 送り先メールアドレス

appendix

TSL接続確認

openssl s_client -connect smtp.gmail.com:587

メール送信に関するログはcentでは以下

tail -f /var/log/maillog

おまけ PHPでメール送る設定

vi /etc/php.ini
969行目あたり

sendmail_path = /usr/sbin/sendmail -t -i

参考
http://d.hatena.ne.jp/ayokoyama/20061207/p1