まとめも

大事だと思ったこと、困ったところのメモ

linux機にログインした際に表示されるメッセージをカスタマイズする

linuxマシンにログインすると、

Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-64-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


Last login: Thu Feb 23 17:32:40 2017 from 198.51.100.100

のようにメッセージが表示されます。

このメッセージをカスタマイズする方法を紹介します。

/etc/update-motd.d というディレクトリにはログイン時に表示されるメッセージを表示するスクリプトが入っています。このディレクトリに入っているスクリプトの数字が若い者から順に実行されます。

自分のほかにログインしているユーザー情報を表示するには /etc/update-motd.dスクリプトを追加します。

表示されて欲しい位置にメッセージが来るようにスクリプト名の先頭数字は調整してください。

以下に他のログインユーザー情報を表示するサンプルを載せておきます。

#! /bin/bash

num=`who | wc -l`
if [ $num -lt 1 ];then
  echo "There is no users logged other than you"
  exit
fi

num=`expr $num + 1`
msg="";
for ((i=1; i<$num; i++)); do
  user=`who -u | sed -n $i'p'`
  msg=$msg`echo $user | awk '{print $1 " "}'`
done

echo $num" peoplelogged in ""[ you "$msg"]"

ただし、システム全体に適用される点には気をつけてください。

任意のディレクトリにtmpfs設定する

tmpfsとは

tmpfs設定すると、データが通常HDDに書き込まれるところをメモリー上に書き込まれるようになります。

なぜ必要か

一般的に記憶装置の書き込み回数には上限があります。特にフラッシュメモリーの上限は数千回と言われています。

機器の寿命を減らすとともに、メモリー上に書き込むため、高速に動作するtmpfsを特定のディレクトリに適用する方法を説明します。 /dev/shm というディレクトリは、最初からtmpfsに設定されているため、どこでも良いという人はここを使うこともできます。

tmpfs設定

まず、 /etc/fstab を編集します。

/home/admin/tmp というディレクトリを、32Mbyteのサイズで設定する場合の例

tmpfs   /home/admin/tmp    tmpfs   defaults,size=32m,noatime,mode=1777  0  0

上記の設定を /etc/fstab に追記します。

次に、再起動します。

最後に、df -h で確認します。

tmpfs            32M     0   32M   0% /home/admin/tmp

先ほどの設定例の場合、上記のような行が見えると成功です。

最後に

tmpfs設定したファイルは、リブートやシャットダウンで中身が消えてなくなることに注意してください。

/etc/rc.local に書かれた内容は起動時に実行されるため、 tmpfs/etc/rc.local をうまく使うと、機器に負担の少ないシステム構築が可能です。 rc.local に書かれたスクリプトは起動時に管理者権限で実行されます。また、編集には管理者権限が必要です。

scpで複数のファイルをまとめて送信する

scpで複数ファイルをまとめてコピーする方法が意外と知られていないようなのでメモします。

scpとは

SCP (Secure Copy Protocol)は、SSHの仕組みを用いてファイルをコピーできるプロトコルです。 使いかたは通常の cp コマンドと同じように使用できます。

scp [ファイルのコピー元] [コピー先]

ローカルホスト内(同じマシン内)でも利用できますが、基本的にはローカルホストとリモートホスト(別のマシン)のファイルやり取りでよく使われます。 ファイル送信や受信する際ファイルのパーミッション関連でエラーメッセージがでることがあります。 その際は一度/tmpに置くとうまくいくと思います。

基本的な使いかた

ファイルを送り込む

scp [ユーザー名]@[ホスト名]:[リモートファイルパス] [ローカルファイルパス]

例)

リモートマシンのユーザー名が remoteusername
リモートマシンのドメイン名が hostname.remote
送信元ファイルが ~locausername/src_file
送信先ファイルが /tmp/dest_file

の場合

scp ~localusername/src_file remoteusername@hostname.remote:/tmp/dest_file

ファイルを取り込む

scp [ローカルファイルパス] [ユーザー名]@[ホスト名]:[リモートファイルパス]

例)

リモートマシンのユーザー名が remoteusername
リモートマシンのドメイン名が hostname.remote
受信元ファイルが /tmp/src_file
受信ファイルが  ~localhostname/dest_file

の場合

scp remoteusername@hostname.remote:/tmp/src_file ~localusername/dest_file

複数のファイルをまとめて送信する

ファイルを送り込む

scp { [ローカルファイルパス] [ローカルファイルパス] ... [ローカルファイルパス] } [ユーザー名]@[ホスト名]:[リモートディレクトリ]

例)

リモートマシンのユーザー名が remoteusername
リモートマシンのドメイン名が hostname.remote
送信元ファイルが /tmp/src_file1と/tmp/src_file2
送信先ディレクトリが ~remotename/dest_dir

の場合

scp /tmp/src_file1 /tmp/src_file2 remoteusername@hostname.remote:/tmp/dest_dir/

IoTに関わって感じたこと

IoTとは

Internet of Things とは、あらゆるものをインターネットにつなげることで面白いことが出来るのはないかという考えで、現在業界のトレンドと言われています。 あらゆるもののデータを集めることでこれまで見えてこなかった情報が得られるのではと期待されています。

実際にIoTに関わって

コンピュータは気温の変化や水に弱い

コンピュータは本来空調の効いた快適な部屋に設置され使われるものです。現代では、スマートフォンのほとんどが防水・防塵に対応している時代となり、この当たり前のことを忘れがちですがコンピュータは精密機器であり、水に近づけることは危険なことなのです。

コンピュータが動くためには電気が必要

コンピュータを動かすためには電気が必要です。最近のスマートフォンは大容量バッテリーを積んでおり3000mAhを超えることも普通のこととなってきています。そのため、1日心配せずに使えるようになりましたが、IoTは厳しい環境に設置されることもあり、その場合は電池で動かすのですが、充電電池のエネループの最も性能が高いモデルで2500mAhです。これらが意味する事は、スマホ1台の電池より少ない電気で半年から1年程度動かすということです。

何事も物理が大切

物理とは、ケーブルやコンピュータそのもののことを指します。トラブルが起こるほとんどが物理障害であるといわれています。 特にIoTでは、機器が屋外に置かれることもあり、機会にとって過酷な環境です。そのため、物理的なトラブルも起こりやすくなります。 通常のコンンピュータは屋内かつ空調の効いた部屋に置かれることが多いので、気温の変化はそれほど大きくありません。一方で、屋外に設置された場合1日の気温差が10℃以上あることも珍しくありません。夏の昼間と冬の夜明け前は、特に過酷な環境と言えると思います。

このような環境で、安定してシステムを動かすことはとても厳しいことであるように感じました。 一方で、このような困難を乗り越えて安定して動くシステムを構築するこの過程こそIoTの醍醐味なのかもしれないとも感じました。

言葉の一人歩き

ビッグデータクラウド、IoTこれらは、キーワードが注目されとりあえずやっておこうみたいな企業が多いように感じています。 目的を持ってやる事が大切だと思うのですが、方法が目的になっていて意味のわからないことになっているように感じています。

私は、この3つの言葉はとても密接な関係がある言葉であると思います。  IoTは、あらゆるものから情報を集めて面白いことをしようという考え方  ビッグデータは、多くの情報から傾向を見つけ出し、その傾向を利用してマーケティングを行ったり、将来の予測を行ったりしようという考え方  クラウドはネットワーク上のコンピュータに情報を置いておいてそこに情報を集めどこからでもアクセスすることができるようにしようという考え方 これらから言えることは、多くの情報を効率良く集め、利用しようということです。 これからは、多くの情報をどのように使うかということが課題となってくるのではないかと考えています。いずれAIがこれらの情報を処理するようになると思っていますが、そのAIプログラムが完成するまでは、人間がすることになるでしょう。

JavaScript [object Object]の中身を確認する

JavaScritptでコードを書いて、動かしてみると自分の意図しない結果だった場合、デバックが必要となります。この際に便利なのが、 console.log です。 console.log("文字列"); で文字列を、 console.log(変数); で変数の中身をブラウザの開発者モードのコンソールに表示することができ、動作がどこまで意図した動作をしていて、どこから意図しない動作になっているのかの切り分けに使うことができます。jsonを扱った際に [object Object] で少し詰まったのでメモします。

[object Object]

jsonというデータ形式JavaScriptで扱った際に、変数(jsondata)にjsonのデータがきちんと入っているのか確認しようと、console.log(jsondata); を書き足し、ブラウザから確認すると、 [object Object] と表示されてしまいます。 これでは、正しくデータが入っているのか入っていないのか確認することができません。

中身を見たい

変数(jsondata)のデータをコンソールに表示する場合

console.log(JSON.stringify(jsondata));

JSON.stringify() を使うことで、jsonデータの中身をコンソールに表示できるようになります。

Let'sEncrypt証明書の自動更新を行う

Let's Encryptは、難しい手続きなく証明書を取得できる素晴らしいサービスですが、証明書の有効期限が90日と短いことが特長です。 今回は、この証明書の更新をcronで自動的に行いたいと思います。

cronとは

指定した時刻に処理を自動的に行ってくれる仕組みのことです。

更新方法

WEBサーバーの停止

apachectl stop WEBサーバーが動いていると、更新することが出来ないので停止させます。

証明書の更新

admin@ubuntu:/home/admin/certbot$ ./letsencrypt-auto renew --force-renew

このコマンドを叩けば強制的に証明書が更新されます。ただし、特定の期間で更新できる上限が設けられているのでテストを行う際は--dry-runオプションをつけると良いと思います。

WEBサーバーの再開

apachectl start 更新が終わったら、サービスを再開させます。

これらを自動化する

シェルスクリプトを用意する

#!/bin/bash
#apacheの停止
apachectl stop

cd /home/admin/certbot

# --dry-runオプションをつければ、証明書は更新されずに動作のみ確認することができる
./letsencrypt-auto renew --force-renew

#apache再開
apachectl start

このスクリプト/root/update.sh として保存します。

cronで定期的に実行する

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

43 4 1 * * root /root/update.sh

/etc/cron.d/update-everymonth として保存します。(パスがあっていれば名前はなんでも良いです。) update-everymonth は毎月1日の04:43に/root/update.shをroot権限で実行するという内容が書かれています。

Let's encrypt で証明書取得

li-one.hatenablog.jp

Windowsマシンがpingに応答するようにする

pingとは

相手のコンピュータにつながっているのか確認するために使用されることが多く、障害が発生時には問題の切り分けを行うために使われます。 echo要求とecho応答からなり、echo要求を送られたコンピュータは通常echo応答を返す。しかし、Windowsの初期設定では、echo要求を受け付けません。

echo要求に応答するようにする

セキュリティが強化されたWindowsファイアウォール設定を開きます。 f:id:li-one:20160728140754p:plain

次に受信の規則をクリックします。 f:id:li-one:20160728141117p:plain

ファイルとプリンタの共有(エコー要求-ICMPv4受信)やファイルとプリンタの共有(エコー要求-ICMPv6受信)を右クリックから有効化します。 プロファイルのプライベートやパブリックというのは、初めてのネットワークにつないだ時に設定するパラメータです。 例では、すべて有効化していますが、必要に応じて有効化するネットワークを設定してください。

f:id:li-one:20160728141506p:plain

次に、先ほど有効化した項目をダブルクリックし、プロパティを開きます。 メニューの中からスコープを選択します。 リモートIPアドレスラジオボタンを任意のIPアドレスに切り替えてください。 これにより、任意の相手からのecho要求を返すようになります。

有効化した項目すべてで切り替え作業が必要になります。

任意の相手からのecho要求に応答したくない場合は、これらのIPアドレスを選択し、適切な設定を行ってください。

f:id:li-one:20160728142554p:plain