投稿

ラベル(sed)が付いた投稿を表示しています

メールサーバの移行

イメージ
 自前のメールサーバを停止 これまで、自ドメインのメールサーバはVPS上に構築していた。 ・Ubuntu Server ・Postfix ・Dovecot ・spamAssassinと、BlackListの利用 Spam対策を行ってきたし、サーバ上でメールをトリガーにして各種プログラムを動かしたりしてきた。 メールサーバのメンテナンスは結構面倒くさくて、  ・Disk容量のチェック  ・不正アクセスのチェック  ・各種セキュリティパッチの適用 など、手間がかかる。 そこで、外部のサーバを利用することに…。 結構安くて使い勝手の良さそうなのが、「さくらのメールボックス」 3年契約で、3070円とな…。  メールアドレスは自分のだけなので、20GBまで利用可能!  (Gmailより大きいねぇ) ということで、早速契約。 アカウント設定を行って、既存のDNSを書き換える。WHOISも書き換えて完了。 SMTPとIMAPが利用できればOK。 ちょうど、GoogleがSPF設定していないと受信しないし、DKIMおよびDMARCに対応していないメールを弾くようになったので、対応しているのを確認。 さくらサーバ自体は、これまでお客さんのサーバとして何件も利用しているので、利用方法も難しくはない。  Webメールにも対応しているので、いざという場合にもありがたい。 ということで、各メールソフトの設定を変更。  PC(常時使用する3台)とタブレット、スマートフォンと台数は多いがそれ程手間はかからない。 問題は、旧サーバで送受信したメールの履歴だけれど、これはThunderbrdを使ってローカルに保存することで回避。  本当は、サーバtoサーバでMailboxに残そうとも考えたんだけど、古いメールはそれ程必要ないし、ローカルにバックアップしてあれば凌げるので、良しとする。 移行時にDNSの反映で若干時間がかかったものの、問題なく送受信できるのを確認して、作業完了。  これでメンテナンスの手間が減るので、安いもんです。

ソースコードのチェック

プログラマに求められることは何か… 毎年、非常勤として言語や環境設定、アルゴリズムなどを少し教えている。 ここ数年気になっていることがある。  自分のコードを書かない、書けない人の割合が増えているような気がしている。 確かに、Google先生に聞けば、いくらでもサンプルコードは入手できるし、解説も読める。以前に比べ格段に、ソースコードや開発に関わる情報を入手しやすくなっているとは思う。  そして、自分が作成しようとするプログラムで行き詰まって、検索したサンプルコードを参考に動くようにする。  これは、問題ないと思っている。  人のコードを読む→理解する→自分のプログラムで使えるように修正する(または利用する)→動かす→デバッグする…。  プログラマなら多分、普通の行動でしょう。  ところが、最近、Webに紹介されているコードをそのまま利用して、動く・動かないだけを確認する学生を目にするようになった。 課題を課す→同じ内容の問題と解答を探す→そのまま持ってきて提出する 他人のプログラムを入手→改行やコメントを付け加える→提出する これは、自分の考え・思考をコードに落としたことになるのか? 練習にもなっていないし、何も理解度が上がっていない…。 実力・経験値は一切向上していない…。 対策することに 他人のプログラムを、提出されて「はいOK」という訳にはいかない。 将来ソフトウェア関係の仕事をするのであれば、なおさらそんなことは許されない。  これまでは、各ファイルのmd5sumを取って、同一かどうか(不正しているかどうか)の判定を最初に行っていた。  ところが、最近は、コメントを書き加えるとか、無駄に改行やスペースを入れるという、Cheatまがいの手法を使うケースが目立ってきた。  仕方なく、コメントを無視し、スペースや改行を無視した上で、同一かどうかを判定することにした。 md5.sh 手軽に処理するためにシェルスクリプトで作成してみた。 md5.shで保存して、実行権限を付加してパスの通ったところに置けばOK。 findと併用するのを前提にしている。 #!/bin/bash # 元ファイルから改行・スペースを除去したハッシュ値を出力する # 結果は カレントディレクトリの$re

sed:改行含む文字列への置換

少し苦戦した… すでにコンテンツのあるサイトのドメイン移転とサーバ変更、管理の委託を依頼されて作業を行う。 ドメイン移管 サーバの変更 コンテンツの設置 メールアカウントの設定 以上は、問題なく完了。 さて、あとはコンテンツの修正。 アクセス解析に Google Analytics を利用するのだけれど、これまでの業者さんは未設置。 そこで、各ページに仕込む必要があるけれど、いちいち修正するのはさすがに面倒。 なにせ30ページ程のhtmlが2つもある。 こんな時は、sedの登場ですな。 まずは、jsフォルダを作成。 以下のような内容のg_ana.jsを作成。まぁ、ここまでは、Google Analyticsの吐き出すコードをほんの少し変更するだけでOK   ( function (i,s,o,g,r,a,m){i[ 'GoogleAnalyticsObject' ]=r;i[r]=i[r]|| function (){   (i[r].q=i[r].q||[]). push (arguments)},i[r].l= 1 * new Date ();a=s. createElement (o),   m=s. getElementsByTagName (o)[ 0 ];a.async= 1 ;a.src=g;m.parentNode. insertBefore (a,m)   })(window,document, 'script' , '//www.google-analytics.com/analytics.js' , 'ga' );   ga ( 'create' , 'UA-xxxxxxxxx' , 'auto' );    ga ( 'send' , 'pageview' ); でもって、こいつを読み込むように各htmlに書き込む。 とりあえず、</head>の前に設置すれば良いので、 <script type="text/javascript" src="

sedが便利すぎる

久々にsedの活躍の場 大量のWebを扱う話は継続しております。 よくよく、調べてみると恐ろしげな記述があちこちに… 表があって、その中に金額の一覧が作られているんだけど、ソースコードを見ると <td>¥500-</td> とか書かれているわけですよ。 でもって、これをレンダリングすれば、[ \500- ] となるわけです。 ちなみに、[ ] が表だと思ってください。 これが、1ページに40ヶ所程度。×60ページ。 やる気が失せますわ…。 そこで、sedの出番となるわけです。 何がしないといけないのかというと、 「¥」→「&yen;」に置き換えれば良いだけの話。 これならワンライナーでOKっぽい。 sed -i -e 's/\\/\&yen;/g' www/*/*.html 結局、これだけですね。 ファイル全体で置換して、結果をファイルに上書き保存。 でもって、フォルダが60個ほど分けて保存されているので、その中のhtmlファイルを指定してやればOK。 実際に実行してやると、ほんの1秒足らずで終了してくれます。 こんなの手作業でやる気にならないもんね〜。 テストする時間を入れても、10分もかかっていないので、良い選択をしたなとw こういった処理はスクリプト書くより、sedやawkの方が早いですゎ。 でも、エディタやらGUIベースのツール使ってたりすると、何時間もかけちゃったりするんだろうな、普通は。

グループを別のグループに追加

Linux上での話ですが… 友人より、相談のメールが。 すでにLinux上でユーザを幾つかのグループに分けて管理している。 今回整理統合したのでしょうか、GroupA、GroupBをGroupCに突っ込みたいけど、良い方法は?という質問がありました。 Linuxの場合、プライマリーグループがあってdefaultだとユーザ名と同じグループが作られ、運用しています。 それとは別に、ユーザは他のグループに所属するケースもあるわけで、複数のグループに所属することが可能になっています。 で、その操作を簡単にできるのではないか?ということでした。 結論から言うと、その手のコマンドは存在していないので、標準コマンドで作業を完結することはできないわけです。 じゃぁ、無理なのか?というと、そんなことはなく、ちょっとスクリプトを書けば可能です。 解決方法1 メールの中身を読んだのが、日付が変わる頃だったので、寝ぼけながらも何とか処理できました。 ユーザのグループは、/etc/groupに格納されていて、以下のような構成になっています。 test:x:1003: test1:x:1004:test2,test3 test2:x:1005: test3:x:1006: test4:x:1007:test5 test5:x:1008: あくまでもサンプルですが、test1グループにユーザtest2,test3がいます。さらにグループtest4にはtest5がいます。 このtest1,test4をグループtestに入れることにします。 最終的には、test=(test2,test3,test5)となればOKと。 ※本当は、test1にはユーザtest1、test4にはユーザtest4も入っているんだけど、今回は処理しない前提で行きます。一人くらいなら、手作業で変更できるので…。 考え方 まずは、test1のグループのメンバーを引っ張りだします。 これはgrepを利用すればOK。 $ grep test1 /etc/group すると test1:x:1004:test2,test3 という行を得ることができます。欲しいのはtest2,test3の部分なので、切り出します。