ハトネコエ Web がくしゅうちょう

プログラミングとかAndroid

CygWin 環境に nokogiri , ffi, mysql2 をインストールできるようになるまで

WindowsRails アプリを動かしたくて CygWinbundle install したら nokogiri で止まってしまうので、必要なものをまとめた。

なお、 Windows 10 64bit 環境に CygWin64 をインストール、
apt-cyg mirror には http://cygwin.mirror.constant.com/ を利用した。

apt-cyg

まず、CygWin のデフォルトのインストーラーを使うのは大変なので、
apt-cyg を入れる。

デフォルトのインストーラーで lynx をインストールしておく必要がある。

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

で apt-cyg のインストール完了。

apt-cyg install wget
apt-cyg update

でパッケージ情報を最新に。

ruby , ruby-devel

ruby だけじゃなくて ruby-devel も、nokogiri のインストールには必要なので注意。

apt-cyg install ruby ruby-devel

必要なものを入れる

ここまでで gem install nokogiri をやってみても悲しいことに失敗するので、いろいろ足していく。
makeやCコンパイラーや、各種ライブラリ。

apt-cyg install make gcc-core zlib zlib-devel libiconv libiconv-devel

これらを足すことで nokogiri がインストールできるようになっているはず。

gem install nokogiri

成功だったらバンザイ! ダメだったらすみません……。

nokogiri 単体で使うことはあまりないので、インストールが確認できたらアンインストール。

gem uninstall nokogiri

代わりに今後使うであろう bundler を入れておきましょう。
どうも gem install でグローバルインストールすると ~/bin 以下に実行ファイルが置かれるようなので、 ~/bin にPATHを通します。

gem install bundler
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

その他 : ffi , mysql2

ffi のために

apt-cyg install libffi6 libffi-devel

mysql2 のために

apt-cyg install mysql libmysqlclient-devel

これらをインストールすることによって、 bundle install を正常終了させることができた。

ちょっとしたWindows向けウィルスをPythonで作ろう

プログラマーはたまに「ハッカー」と呼ばれることなんてあります。
ハッカーって言葉のイメージと言えばウィルスです。

そうだ、ウィルスを作ろう!

これが今回のテーマです。

と言っても悪いことしたら捕まってしまうので、
友達にメールでexeファイルを送りつけて「便利アプリだよ!実行してみて!」と嘘ついて実行させると、「うわっ」と思われる程度のものを作ります。
(自己増殖しないので、今回の場合は正しくはコンピューターウィルスでなく マルウェア と呼ぶのが適切ですが、一般的な言葉の認知のもとウィルスと書きます)

参考にしたのはこちらのサイト : How to Make a Simple Computer Virus with Python

Pythonからexeファイルを作るには?

拡張子が .py じゃ誰もクリックしてくれません。 .exe ってなっててほしいですよね。

そのために使うのがこちら PyInstaller です!

exeファイルの実行開始が遅いとかいう悪評も見ましたが、 py2exe や cx_Freeze はうまく扱えなかった(Visual Studioをインストールするのはめんどうだった)ので最終的に PyInstaller にしました。
実際使ってみましたが、今回はファイルサイズが小さいからか、exeの実行開始が遅いとは感じませんでした。

PyInstaller を使ってみよう

Windows PowerShell で作っていきます。

Chocolatey は導入済みだとします。

nekonenene.hatenablog.com

1. Python をインストール

choco install python -y

2. PyInstaller をインストール

pip install PyInstaller

インストールできたら

pyinstaller -v

で、バージョンが表示されることを確認しましょう。

3. カンタンな Python コードの作成

てきとうな名前のフォルダを作って、そこに hello.py という名前のファイルを作って以下のように書いて保存します。

# -*- coding: utf-8 -*-
import time

print("Hello exe")
time.sleep(2)

4. PyInstaller で exeファイルを作成

hello.py を作ったフォルダーに cd コマンドで移動していったのち、
まずは

python hello.py

で、作ったPythonコードが実行可能か試します。
「Hello exe」と表示されたら成功です。

次に PyInstaller で exeファイルにしましょう。
-F のオプションは、exeファイル単体を出力するためのオプションです)

pyinstaller -F hello.py

つらつらと文字が流れたのち「completed successfully.」の文字が最後に見えたら成功です。

フォルダー内に「dist」という名前のフォルダーが作られて、そこに「hello.exe」が出来上がっているはずです。
ダブルクリックで実行しましょう。
「Hello exe」と表示され、2秒経つと自動で終了します。

ファイルを作成するPythonコードを書こう

「Hello exe」と表示するだけでは物足りません。
ウィルスといえばやっぱりファイル操作。

といっても削除や拡張子の変更は本当に迷惑すぎるので、今回は大量のファイル作成ということにしておきましょう。

thousand_dreams.py という名前のファイルを作成し、以下のように書き込みます。

# -*- coding: utf-8 -*-
for num in range(1000):
    f = open("X%06dX" % num, "w")
    f.truncate(1024 * 1024) # 1MB
    f.close

PyInstaller で exeファイルにします。
(今度は -w オプションを加えています。これはexeファイル実行時にコンソールウィンドウを表示させないためのオプションです)

pyinstaller -F -w thousand_dreams.py

dist フォルダに thousand_dreams.exe が作られたと思います。
これをダブルクリックするだけで、1MBのファイルが1000個作られます!
けっこう迷惑です。

ちなみに、もとは1000個でなく1000000個(100万個)のファイルを作成するプログラムだったのですが、
実行したらストレージは切羽詰まってくるし(なにしろ100GBぶん作られるので)
どんどんCPU使用率は上がってくるしで、あわててタスクマネージャーからストップしました。

このように、 数行のプログラムでカンタンに友達を減らすようなアプリが作成できてしまいます!

なんてプログラミングはおそろしいんだ・・・。

プログラミングとウィルスの関係に興味を持ったら、
以前流行ったランサムウェアの学習用の実装なんかもGitHubで読めますので、ウィルスへの理解を深めると良いでしょう。

github.com

コンピューターを守るには、敵を知らなければならないのです。

セキュリティソフトをインストールしない人が世の中にはいますが、ウィルスは簡単に作られ世界にばらまかれます。
しっかりセキュリティソフトをインストールして、最低限の防衛をおこないたいところです。たった1日10円以下です。安いもんです。

私はカスペルスキーとESETを使ってます。
カスペルスキー、セキュリティ性能は高いんだけどファイアーウォールが頑張りすぎててバリバリパソコン使うような人だと引っかかることが多い。
カスペルスキーの方が優秀だけどESETくらいゆるくても充分なんじゃないか、と思ったりもします。
あとは最近海外で評価を得ている BitDefender がちょっと気になってる。

カスペルスキー セキュリティ 2017 3年5台版

カスペルスキー セキュリティ 2017 3年5台版

letsencrypt renew 後に nginx restart が必要

久しぶりにメモ。

自分で管理してるサイトにアクセスしようとしたら
SSH証明書の有効期限切れエラーを見ることに。

で、なんか設定忘れてるのでは、という気がして他の人の renew のやり方見ていたら、(Let's Encrypt で Nginx にSSLを設定する - Qiita
「nginx再起動してるじゃん!」と気付いたので

sudo service nginx restart

そうすると、ちゃんとHTTPS接続ができるようになりました。

nginx restart させなきゃなのね。

そんなわけで、Ansibleを修正しつつ、サーバーの方でも

sudo crontab -e

で root の cron 設定を

0 4 * * * letsencrypt renew --non-interactive --no-self-upgrade

から

0 4 * * * letsencrypt renew --non-interactive --no-self-upgrade && service nginx restart

に変更しました。めでたし。

これでもまた3ヶ月後にSSH接続できなくなったら悲しいな……(でもありそうだな)

エンジニアが辞めない組織について本気出して考えてみた

いつもは技術系の記事ばかりですが、最近ビジネス書を読んで「なるほどなー」と思ったので、
エンジニアが居続けてくれる組織についてあれこれ考えてみます。

読んだ本↓

まだこの本しか人事本は読んでないので、この本の受け売りが多いです。(他の著者のをもう数冊読まなきゃね!)
あとは自分がエンジニアやっていて感じることからの感覚をミックスして。

0. 本の概要

さてさて、この本の概要ですが、一番言いたいところは
『人の成長なくして企業の成長なし』
ここに尽きると思います。
社員教育にお金と時間をかけられていない会社は、そのうち企業成績が頭打ちになるぞ、と。

社内で優秀な人を生み出せなければたしかに将来的にはそうなりますね。
「優秀な人を外から採ればいい」という考え方もありますが、現在社内にいる人との軋轢(あつれき)が生じたり、
この本にも書かれていますが、他社で業績を上げた人が必ずしも自社でパフォーマンスを発揮できるとは限りません。

それは、なにも転職者が経歴を大きく見せたとかいうわけでなく、
その人が優秀に見えるようにサポートした優秀な人が他社にはいたとか、
優秀な人が満足して働ける下地(社風、上司、資金体制)が自社にはないとか様々な理由があります。

この作者さんの会社は営業マンを育ててるので立場は違いますが、
「成長できない会社に居る意味はない」と考えるエンジニアとは利害関係が一致しそうですね。

「優秀になって会社辞めていく人いるじゃん!」というツッコミはありそうですが、
優秀な人を作らないよりはマシです。
教育をせずに優秀な人を1人も生み出さないよりは、
50人優秀な人を作って30人辞めていくことのほうが遥かに会社の未来が輝きます。
教育を受けたことを実感する人は会社に恩義を持ってくれますので、自社に仕事を持ってきてくれることや、社に再び戻ってきてくれる可能性だってあります。

1. 採用と教育

「辞めない組織」と考えると、職場環境の改善を考えてしまいますが、
そもそも採用に失敗している可能性があります。

たとえば、「優秀な人だけをとる」。
会社立ち上げ時に凄腕エンジニアを2〜3名確保する、というのはいいかもしれませんが、
3名前後揃ってきたなら、会社の理念に共感してくれ、未熟だけど素直でやる気にあふれてる人を1人は採るべきです。

まず、優秀な人は簡単に辞めます。
理由は単純で、優秀だからです。
他に働きどころはいくらでもあります。

そしてエンジニア業界は狭いので、
優秀な人が辞めると「あそこはあんまりいい会社じゃないかも」という印象が生まれます。(退職エントリが書かれることもありますし)

ですので、優秀な人だけをとらず、未熟な人を入れます。

そして、優秀な人達には未熟な人を教育してもらいます。
この教育には様々な効果があると私は考えています。

  • 教える側が、知識の再確認ができ成長できる
  • 人的マネジメントスキルのある人(リーダーに向く人)がわかる
  • 母性本能の目覚め

最後アホなこと書きましたが、男女問わずいわゆる母性本能は多かれ少なかれあると思っていて、
人を育てていると、「この子の面倒は最後まで見なくちゃ」という気持ちが芽生える人がいます。
そうすると、優秀な人であれどその職場で働く特別な意味というのが生まれ、長く居着いてくれる原因につながる可能性があります。

この、「職場で働く意味」というのはとても大事で、
本の中ではコミュニケーションを密にすることで『職場が居場所の1つになっている』ことが辞めない環境づくりの1つの策だと書いてありますが、
優秀なエンジニアの居場所は多いです。ネットや他社との付き合いなど、居場所はありますしすぐに作れます。

自社で働く意味を持たせられる組織づくりがあるなら積極的にしていくべきでしょう。

教育する側と教育される側の密な関係がある組織というのは、
フリーランスをするよりも会社で働くほうがいい」と思わせる大きな効果が望めるでしょう。

エンジニア人事としては、教育する側と教育される側のバランスが悪くならないよう、採用に気を付けるのもそうですし、
教育される側だった人が教育する側に回れるタイミングを見つけられるよう、教育する側の人たちのフィードバック、
教育する側に向いている人を知るために教育される側の人たちのフィードバックをとるなど、
各エンジニア間の相互フィードバックを見られるシステムづくりをしておくことも大事になります。

2. 優秀になる人を採る

さて、先ほど「会社の理念に共感してくれ、未熟だけど素直でやる気にあふれてる人」と書きました。

会社の理念に共感してくれる人を選ぶのは、長く居てもらうためです。
社長の考え方と大きくかけ離れている人は、いずれ会社の方針との衝突を起こします。
しかもプログラマーはロジカルに考えられる人が多いので、その人の意見にも筋が通っていたりして困ります。

これがコミュニケーションが密な職場で、かつ、社長と対等に話し合える職場であればいいのですが、
そうでない場合は新入社員の不満はどんどん溜まっていき、「いつか辞めてやる……」とストレスを抱えていきます。
社長は強い意志をもって方針を考えているわけで、それを簡単に曲げるわけもないので、人事としては会社の方針に共感してくれる人を優先的に採用するのが無難でしょう。

イエスマンだけ採用しろ」と書いてるみたいで自分でも書いてて気持ち悪さはあるのですが、
ただ、会社の向いてる方向と違う方向を向いてる人が多くては会社はいっこうに進みませんし、
社長目線としては、会社の方針をしっかり理解してくれているポストがいなければ社長が抱えている業務を安心して任せられません。
そういうわけで、全てにイエスである必要はもちろんありませんが、会社理念には同意してほしいかな、というところです。

次の素直でやる気にあふれる人については、単純ですね。
教えがいがあるからです。

教える側になる人たちは教えることの専門家ではないですから、
モチベーションが保てなくなれば放棄します。
モチベーション維持となるのは、やはり結果が見えることです。

ですので人事は、教えがいのある人を採用してくるのが大切になりますし、
教える側の上の立場の人は、新人の成長を本人だけでなく教える側の人にも伝えてあげてください。
子どもの成長が褒められるのは、親として当然うれしいことです。

そして、素直でやる気にあふれる新人は、速いスピードで教える側へと成長を遂げてくれることでしょう。

3. 不満のキャッチアップ

この本……えっと、間が空いてしまったのでもう一度貼っておきます。この本ですね。

この本でこのような記述があります。

コミュニケーションが足りない職場では、最初は小さかった不満の種が、放置されることによって日に日に増幅していく。
その結果、「どうせ誰も自分を気にかけていないのだから、我慢する必要はない」と辞めてしまう。
十中八九、このパターンです。

> それな <

という気持ちです。

本当にこれです。
別れるカップルと同じです。

不満へのケアが足りていないと、しだいに「不満あつめ」をしだします。
最初は「△△がイヤ」という不満だったのが、
時間が経つと「△△がイヤだし、▽▽もいけてないし、××もダメ」とどんどん嫌なことが目についていきます。

友達に相談したら当然「えー、それならもう辞めちゃいなよ」ということになりますし、
自問自答でも「辞めるしかない」という結論に達するので、辞職の意志が固まります。

辞めることを決意したあとでは、それの理由付けのためにますます「不満あつめ」は加速していきますし、
その状態ではもう上司の「辞めないでよ」という声は厚い壁に阻まれてちっとも届きません。

辞職願を出されてからではもう遅いのです。
大切なのは、常に不満へのケアが出来ることです。
必ずしも改善まで結びつく必要はありません。聞いてあげるだけでも大きく違います。

では、不満を常に言ってもらえるようにするにはどうすればいいかという点については
密なコミュニケーション。これに尽きると思います。

本の中では質も大事だけどそれ以上に量が大事としており、
上司が部下とのコミュニケーションを積極的にとるような仕組みづくりについても触れられています。

本の中では飲みニケーションを仕組み化している点が記述されていますが、
なにもお酒を飲むことに限らず、(飲めない人もいますし)
おいしい料理を食べることや一緒にゲームをすることでも気はゆるみますので、
そういう機会を多く設けることが有効でしょう。

社内の人とのランチ補助制度や、部活制度を設けてる会社がありますが、
こういう狙いだったんだなと気付き感心しました。

『優秀な技術者を追い出してしまう方法』という記事がありましたが、
これらは具体的すぎる内容でどの会社でも等しく起こる問題ではないですから、
会社としてまずおこなうことは、コミュニケーションを密にして上司が部下の不満を常にキャッチアップできる環境づくり、というところでしょう。
その上で、記事にあるような不満が出てくるかもしれませんが。

コミュニケーションの数、そして、気がゆるんでなんでも話せる場(お酒だったりおいしい食事だったりゲームだったりがある場)の用意、
あとは「最近なんか困ってることある?」と聞くようにすれば、自然と不満をキャッチアップできるようになっていくことでしょう。
最初は部下は遠慮するでしょうが、回数を重ねて少しずつ壁がなくなればよいかと思います。

4. おわりに

以上、『辞めない採用、即戦力の育成で儲かる会社になる!』(著:小山昇)を読んで
自分なりにまとめてみた意見でした。

この本とても良くて、1000円ちょっとで買えるのに、

  • 新卒採用・中途採用における人の選び方
  • 新卒へのアピール方法
  • 新卒採用の教育手法
  • 中途採用の注意点、教育手法
  • 社員に長く居てもらうための仕組みづくり

など、網羅的な人事の考え方を実例とともに読みやすい文体で書いてあって良書だなと感じました。

もちろんあくまで一人の考え方をまとめた本なので全てを鵜呑みにするのは良くありませんが、
なかなか説得力のある発言にあふれていました。

エンジニア採用の現場ではよく「優秀な人(=即戦力を指す)に来てもらいたい」なんて声を耳にしますが、
本当にそれでいいの? 新人教育って必要ないの? など考えるところはいくつかあったので、今回の記事で考えをまとめられてよかったです。

話の流れで入れられなかったのですが、私の考える「優秀な人」は情報共有の出来る人です。
どれだけプログラミングが出来る人でも、会社は組織立って動くところですから情報共有をしてくれないと困ります。

勝手に実装進めてたけど、他の人がプルリク見て初めて、急ぎでない用件のほうを実装してたことがわかるとかは困ります。
なにも情報共有されていないと、その人が辞めたあとによくわからないコードの山が残ります。

逆にプログラミングが多少できなかろうと、悩んでいることを共有してくれるのなら周りはアドバイスができます。

どうしたら情報共有の出来る人って採用できるんだろうと考えちゃいますが、
ひとつは伝達力を測ることでそれを望めるのかなと思ったりはします。
たとえば「バナナとはなにか説明してください」のような、ふだん説明しないようなものの説明を、
多すぎないしゃべりで、的確に表現できる人は情報伝達力が高いなと感じます。

いろいろ考えてみましたが、
人事というのはなかなか最適解がなくて、プログラマーよりよっぽど難しい職業のようです。大変面白いですね。