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

プログラミングとかAndroid

Datadog のメモリ監視に関するダッシュボード設定

「君のアカウント、試用版だから有料版にアップグレードするか無料版にダウングレードするかしないと消すね」
Datadog から警告が来たので、もし設定しなおす場合の参考用に。

1. メモリを used, buffers, cached, free の分け方で見る場合

free コマンドで言うところの used, buffers, cached, free で分けて見る場合です。

グラフはこんな感じ。

f:id:nekonenene:20171128003424p:plain

それの設定はこうする。

f:id:nekonenene:20171128004118p:plain

JSONだとこういう設定になっている。

{
  "viz": "timeseries",
  "requests": [
    {
      "q": "avg:system.mem.free{*} by {host}, avg:system.mem.cached{*} by {host}, avg:system.mem.buffered{*} by {host}, avg:system.mem.used{*} by {host} - avg:system.mem.cached{*} by {host} - avg:system.mem.buffered{*} by {host}",
      "aggregator": "avg",
      "conditional_formats": [],
      "type": "area",
      "style": {
        "palette": "dog_classic"
      }
    }
  ],
  "autoscale": true,
  "status": "done"
}

used には buffered と cached が含まれていて、 used + free = total になります。
ですので、下から

  • (used - buffered - cached)
  • buffered
  • cached
  • free

と領域を持つようなグラフになっています。
(used - buffered - cached) が使用メモリ容量とほぼイコールです。

2. メモリを available, not available で分ける場合

(used - buffered - cached) は使用メモリ容量とほぼイコールと上で書きましたが、厳密には異なります。
以下の記事が詳しいです。

Datadog では available は system.mem.usable が当たりますのでそれを使います。

こういうグラフになります。

f:id:nekonenene:20171128010845p:plain

それの設定はこう。

f:id:nekonenene:20171128010955p:plain

JSONでの記述はこうなっています。

{
  "viz": "timeseries",
  "requests": [
    {
      "q": "avg:system.mem.usable{*} by {host}, avg:system.mem.total{*} by {host} - avg:system.mem.usable{*} by {host}",
      "aggregator": "avg",
      "conditional_formats": [],
      "type": "area"
    }
  ],
  "autoscale": true,
  "status": "done"
}

グラフの下部分がメモリ使用量だとわかりやすいので、下から

  • (total - usable)
  • usable

と領域を持つグラフにしています。

基本的にはこちらのグラフだけあれば充分ですが、 1. で紹介したグラフも並べておくと、なんとなく充実感を持てると思います。

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接続できなくなったら悲しいな……(でもありそうだな)