<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="text">ぢみへんプログラミング日誌</title>
  <subtitle type="html"></subtitle>
  <link rel="self" type="application/atom+xml" href="http://jimiprg.blog.shinobi.jp/atom"/>
  <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/"/>
  <updated>2012-09-15T21:19:01+09:00</updated>
  <author><name>ぢみへん</name></author>
  <generator uri="//www.ninja.co.jp/blog/" version="0.9">忍者ブログ</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/27</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/linux/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E8%B6%85%E5%85%A5%E9%96%80%E3%83%A1%E3%83%A2-3-%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E5%86%8D%E3%81%B3" />
    <published>2014-06-05T21:36:01+09:00</published> 
    <updated>2014-06-05T21:36:01+09:00</updated> 
    <category term="linux" label="linux" />
    <title>サーバー構築超入門メモ(3)：ファイアウォール再び</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[既にパケットフィルタで最低限セキュリティを保ってSSHだけは可能な状態でセットアップはしていたが、このままでは色々と問題がある。HTTP, HTTPSを遮断したままだし、他にも遮断したために、インターネットにアクセスする必要のある種々のコマンドが利用不能のはずである。<br />
勿論そのままではアプリケーション開発どころではないので、必要になりそうなコマンドが使えるよう、ここではyumを例に、順を追ってファイアウォールを調整してみよう。<br />
<br />
<kbd>yum list</kbd>と入力するとインストール済みのソフトウェアパッケージが一覧表示されるのだが、今の状況では最初にこういう出力が出てくる。<br />
<pre>[root@ap]# yum list<br />
Loaded plugins: fastestmirror, security<br />
Loading mirror speeds from cached hostfile<br />
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&amp;arch=x86_64 error was<br />
14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.fedoraproject.org'"<br />
* base: ftp.iij.ad.jp<br />
* epel: epel.mirror.net.in<br />
* extras: ftp.iij.ad.jp<br />
* updates: ftp.iij.ad.jp<br />
http://ftp.iij.ad.jp/pub/linux/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'ftp.iij.ad.jp'"<br />
Trying other mirror.<br />
...<br />
...<br />
(以下延々とエラーが続く)</pre><br />
『Couldn't resolve host 'ftp.iij.ad.jp』、つまりリモートホストの参照ができないと言われているわけだ。これを裏付けるためにパケットフィルタのログを見てみる。（最初の時点からログが出るように仕込んであったのだ。どういう具合に設定したのかは<a href="http://jimiprg.blog.shinobi.jp/linux/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E8%B6%85%E5%85%A5%E9%96%80%E3%83%A1%E3%83%A2" title="" target="_blank">このシリーズの1回目</a>を参照のこと）<br />
<pre>Jun  5 20:09:11 &lt;ホスト名&gt; kernel: [output rejected]IN= OUT=eth0 SRC=xxx.xxx.xxx.xxx DST=zzz.zzz.zzz.zzz LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=58532 DF PROTO=UDP SPT=59673 DPT=53 LEN=53</pre><br />
/var/log/messagesの内容が上記だが、リモートホストへのUDPプロトコル53番ポートへの送信が遮断されている。UDPで53番ポートを使うのはＤＮＳサービスであるから、なるほどホストの名前解決ができないのも納得だ。さっそくこの制限を外してみる。<br />
<pre>[root@ap]# vi /etc/sysconfig/iptables<br />
# Generated by iptables-save v1.4.7 on Thu Jun  5 20:39:55 2014<br />
*filter<br />
:INPUT DROP [2:64]<br />
:FORWARD DROP [0:0]<br />
:OUTPUT DROP [0:0]<br />
-A INPUT -p icmp -j ACCEPT<br />
-A INPUT -i lo -j ACCEPT<br />
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
-A INPUT -p tcp -m tcp --dport 1234 -m state --state NEW -j ACCEPT<br />
-A INPUT -j LOG --log-prefix "[input rejected]"<br />
-A FORWARD -p icmp -j ACCEPT<br />
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
-A OUTPUT -p icmp -j ACCEPT<br />
-A OUTPUT -o lo -j ACCEPT<br />
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
# 下の１行を追加！<br />
-A OUTPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT<br />
-A OUTPUT -j LOG --log-prefix "[output rejected]"<br />
COMMIT</pre><br />
設定追加後に再度<kbd>yum --list</kbd>とやってみると、今度は次のようなエラーが出た。<br />
<pre>[root@ap]# service iptables restart<br />
[root@ap]# yum list<br />
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&amp;arch=x86_64&amp;repo=os error was<br />
12: Timeout on http://mirrorlist.centos.org/?release=6&amp;arch=x86_64&amp;repo=os: (28, 'connect() timed out!')</pre><br />
エラーを見て察しがつく人もいると思うが、今度はhttpプロトコルが遮断されているためにcentos.orgと通信が通信ができてない。ログを見ても分かる。<br />
<pre>Jun  5 20:42:53 &lt;ホスト名&gt; kernel: [output rejected]IN= OUT=eth0 SRC=&lt;送信元MACアドレス&gt; DST=2a02:2498:0001:003d:5054:00ff:fed3:e91a LEN=80 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=TCP SPT=44504 DPT=80 WINDOW=14400 RES=0x00 SYN URGP=0</pre><br />
やはりTCPプロトコル80番ポートへの送信が遮断されている。<br />
これも以下の行をiptablesファイルを編集し、OUTPUTルールの最後から2行目に挿入する。<br />
<code>-A OUTPUT -m tcp -p tcp --dport 80 -m state --state NEW -j ACCEPT</code><br />
最後の行はそこよりも上の行のルールで引っかからなかったパケットを遮断する際のログ出力を指示しているので、必ずOUTPUTルールの最後にないといけない。これはINPUTやFORWARDでも同じことだ。<br />
<br />
再びiptablesサービスを再起動してyumを実行する。<br />
<pre>[root@ap]# yum list<br />
Loaded plugins: fastestmirror, security<br />
Loading mirror speeds from cached hostfile<br />
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&amp;arch=x86_64 error was<br />
12: Timeout on https://mirrors.fedoraproject.org/metalink?repo=epel-6&amp;arch=x86_64: (28, 'connect() timed out!')<br />
* base: ftp.tsukuba.wide.ad.jp<br />
* epel: ftp.jaist.ac.jp<br />
* extras: www.ftp.ne.jp<br />
* updates: www.ftp.ne.jp</pre><br />
『Could not get metalink https://mirrors.fedoraproject.org』とエラーが出ているところを見ると、今度はhttpsプロトコルが遮断されているのが原因だろうと察しがつく。<br />
<pre>Jun  5 21:01:25 &lt;ホスト名&gt; kernel: [output rejected]IN= OUT=eth0 SRC=&lt;MACアドレス&gt; DST=2001:4178:0002:1269:0000:0000:0000:fed2 LEN=80 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=TCP SPT=43004 DPT=443 WINDOW=14400 RES=0x00 SYN URGP=0</pre><br />
ログには上記のエラーが数行あった。TCPでポート番号443はHTTPSだから、やはり見立ては合っている。そこでこれまでと同じやり方でHTTPSも許可してやろう。果たして今度はどうかと思いつつ<kbd>yum --list</kbd>を実行した。<br />
すると今度こそ、エラー表示なくyum が実行されたのだった。<br />
<br />
というわけで、、、<br />
ここまでにdns, http, https のファイアウォールを調整した。これで当面は問題ないはずだ。仮に問題が出てもまた今回のようにログを確認し、パケットが遮断されていればその内容を分析して必要なら通信を許可していけばよい。許可していいのか怪しいものに関しては識者に聞くなどして再度検討する。問題ないことがはっきりするまでは念のため当面はそのままにしておくのが良いだろう。<br />
ここから先は過去にエントリしてきた記事の内容を頼りにruby, rails 等をインストールできるようになっているはず。超入門メモとしては十分な内容になったかな？少なくとも自分の備忘録としてはそれに近いと思うけど、読者の皆さんにも多少なりとも役立てば幸いです。]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/26</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/linux/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E8%B6%85%E5%85%A5%E9%96%80%E3%83%A1%E3%83%A2-2-%EF%BC%9Assh%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AE%E8%A8%AD%E5%AE%9A" />
    <published>2014-06-04T22:08:12+09:00</published> 
    <updated>2014-06-04T22:08:12+09:00</updated> 
    <category term="linux" label="linux" />
    <title>サーバー構築超入門メモ(2)：SSH公開鍵認証の設定</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h2>SSH(Open SSH)公開鍵認証を使えるようにする</h2>前回はSSHデーモンの設定で、とりあえずパスワード認証を使えるようにしておいたが、本当は公開鍵認証に切り替えないといけない。<br />
公開鍵認証というのは&hellip;&hellip;あまり理屈は良く分かってないのだが（汗）どうやら秘密鍵と公開鍵の２つで認証する方式であるということは間違いない。（苦笑）<br />
その2つの鍵を作るツールはいくつかあるので、慣れてる人はそれをそのまま使えばいいだろうし、そうでなければ本などを読んでそれに従えば大体間違いないと思っていいだろう。<br />
<br />
ここでは筆者が今まで使った２つの方法を紹介する。<br />
<br />
<strong>①ssh-keygen</strong><br />
LinuxOSを使っていて、sshdとsshの二つがインストールされていればこのコマンドも入っている（多分）。鍵を作る暗号アルゴリズムにはDSAとRSAというのがあるが、ここではDSAを使った例を紹介する。まずSSHを使ってログインさせたいユーザーででOSにログイン（この例では「hoge」というアカウントを使用）した後、自分のホームディレクトリで必要なコマンドを入力していく。<br />
<pre>[hoge@ap] $ pwd<br />
/home/hoge<br />
[hoge@ap] $ ssh-keygen -t dsa<br />
Generating public/private dsa key pair.<br />
Enter file in which to save the key (/home/hoge/.ssh/id_dsa):  [ここはエンターキーを押すだけ]<br />
<br />
Enter passphrase (empty for no passphrase):  [パスフレーズを入力]<br />
Enter same passphrase again: [同じパスフレーズを入力]<br />
<br />
(この後公開鍵と暗号鍵を生成した結果が表示される)<br />
<br />
[hoge@ap] $ ls -aF<br />
./  ../  .bash_history  .bash_logout  .bash_profile  .bashrc  .ssh/<br />
[hoge@ap] $ ls -aF .ssh<br />
./  ../  id_dsa  id_dsa.pub<br />
[hoge@ap] $ cd .ssh<br />
[hoge@ap] $ cat id_dsa.pub &gt;&gt; authorized_keys<br />
[hoge@ap] $ chmod 600 authorized_keys<br />
[hoge@ap] $ cd ..<br />
[hoge@ap] $ chmod 700 /home/biotopos/.ssh</pre><br />
ssh-keygenコマンドを使うことで.sshというディレクトリに id_dsa と id_dsa.pub という2つのファイルが生成される。これらはそれぞれ順に秘密鍵と公開鍵ファイルという扱いになる。<br />
このうち公開鍵であるid_dsa.pubファイルを名前を「authorized_keys」に変えてコピーすると、OpenSSHがこのファイルを公開鍵として利用するようになる。<br />
<br />
その後、各種SFTPツールを使って秘密鍵ファイル(id_dsa)をローカルホストにコピーしたら、それをteraterm等のコンソールツールに公開鍵認証時の秘密鍵として指定すればよい。<br />
<br />
<strong>②puttygen</strong><br />
SFTPツールは各種あるが、いくつかのツールではputtyというコンソール端末ツールが使う形式の秘密鍵ファイルでないと受け付けないことがある。（例：WinSCP)<br />
このため必要であればputtygen.exe をインターネットからダウンロードしてくる必要がある。<br />
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html<br />
<br />
ツール自体の使い方は簡単で、ローカルホストで最初から秘密鍵と公開鍵の両方を作成したければ「generate」というボタンを押し、その後「Save plivate key」と「Save public key」のボタンをそれぞれ押して、ファイルに保存すればいい。<br />
既にリモートホスト側（つまりサーバー側）で鍵自体は作成済みで、秘密鍵をローカルにダウンロード済みであれば「Load」ボタンを押してファイルを指定すれば、パスフレーズの入力を済ませたあとにputtyで使う形に変換してくれる（本当は名前だけ変えて中身は同じなんじゃ？　未確認だけど）。その後「Save private key」ボタンを押して、putty.ppk というファイルを作れば、以後それを秘密鍵ファイルとして使えるようになる。<br />
<br />
<h4>パスワード認証を不可にする</h4><div>前回sshdの設定で、パスワード認証を可能にしていたが、公開鍵認証ができるようになった後ではこの設定はただの脆弱性に過ぎない。このためパスワード認証は不可にする。sshd_configファイルを変更して保存したら、sshdを再起動すればよい。</div><pre>[root@ap] vi /etc/ssh/sshd_config<br />
....<br />
....<br />
PasswordAuthentication yes   &larr;これをyes に変える<br />
...</pre><br />
<br />
これ以後はrubyなりrailsなりをインストールしていけばよいのでサーバ構築の話はここでおしまい、としたいところだが、ファイアウォール（パケットフィルタ）の設定はまだhttpとhttpsの送信を許可していないのでyumやrubygemが動かない等、再度ファイアウォールの関係で問題が起きることが予想される。ということで、その辺は次回に。<br />
<br />
<span style="color: #444444; font-family: Arial, Helvetica, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 13px; line-height: 23.54400062561035px; background-color: #fcfcfb;">参考文献・URL：</span><br style="color: #444444; font-family: Arial, Helvetica, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 13px; line-height: 23.54400062561035px; background-color: #fcfcfb;" /><span style="color: #444444; font-family: Arial, Helvetica, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 13px; line-height: 23.54400062561035px; background-color: #fcfcfb;">CentOS6で作るネットワークサーバ構築ガイド　秀和システム刊</span><br style="color: #444444; font-family: Arial, Helvetica, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 13px; line-height: 23.54400062561035px; background-color: #fcfcfb;" /><span style="color: #444444; font-family: Arial, Helvetica, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 13px; line-height: 23.54400062561035px; background-color: #fcfcfb;">Linuxサーバーセキュリティ　オライリー刊</span>]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/25</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/linux/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E8%B6%85%E5%85%A5%E9%96%80%E3%83%A1%E3%83%A2" />
    <published>2014-06-04T00:53:15+09:00</published> 
    <updated>2014-06-04T00:53:15+09:00</updated> 
    <category term="linux" label="linux" />
    <title>サーバー構築超入門メモ(1)：ファイアウォールとSSHの用意</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h2>今回はサーバー構築の話です。</h2><div>久々の更新ですが&hellip;&hellip;みなさんいかがお過ごしでしょうか。</div>今回はサーバー構築の話です。<br />
サーバー構築のネタは、Rails開発環境を作るという内容では過去数回やってきました。この2年ほど、いくつかRailsを使ったプロジェクトでWebアプリケーションを作る機会に恵まれた経験から言うと、やはり元々がLAMP型開発と言われていただけあって、ウェブアプリケーション開発者には仮想OSを用いた開発環境だけでなく本番稼働サーバーのことも視野に入れたノウハウが要求される機会が増えたと思います。昔はサーバー屋さんに任せていればよかったことも、ある程度のことは自分でできるか、頼むにしてもこちら側にある程度の知識がないと何をしてほしいのか説明するのも大変な時代になってきました。言い換えるならば、<br />
<strong>「俺は開発者だからサーバーのセットアップなど関係ない」という時代はとっくの昔に終わっています。いや、終わっていた。（笑）<br />
</strong>おそらく10年くらい前からそうなってきてたんでしょうが、個人的に経験しないと分からない性質なので最近になるまで分かりませんでした。例え本番サーバーでWebアプリケーションの環境を構築しなくても、これまでに見てきたようにWindows環境を使う開発者はVMWare等で仮想Linux環境を作らないことには仕事になりません。早急に<strong>Vagrant</strong>や<strong>Pappet/Chef </strong>といったツール習得の必要性を感じずにはおれない、今日この頃であります。なので、今後はサーバー環境の方に重点を置いた構築の備忘録も書いていこうと思います。<br />
もっとも筆者はいわゆるインフラ専門の技術屋さんではありませんので、そこはあくまでも「ちょっと時代に取り残されてる」アプリケーション開発者から見た学習録であることはご了承ください。何か内容に間違いなどありましたら、ご指摘お願いします。<h2>ファイアウォール</h2><div>さて、本題に入りましょう。</div>まず、お断りしておかなくてはいけないのは、筆者はノートPCを1台しか持っておらず、他にサーバーに使えるような機械を持っていないため、もっぱらサーバー環境構築の作業は「<a href="http://vps.sakura.ad.jp/" title="" target="_blank">さくらVPS</a>」を使うことを通じて経験しています。ですので、マシンハードウェアにディスクを設置して電源は何を使って、OSはどうやってインストールするのか&hellip;&hellip;ということはここでは触れません。もっとも、当ブログにて過去にVMWareでゲストOSの構築をやっている話も書いてきているので、多少はそこが参考にできるかもしれません。<br />
<br />
で、さくらVPSですが、「VPS」というのは「仮想プライベートサーバー」の略語らしいですね。へぇ～。仮想化技術はほぼ上っ面の概略程度しか知りませんが、いやはや時代の移り変わりが早いこと。まぁボヤキはそのくらいにして、さくらVPSで仮想サーバーを1台レンタルすると、すぐにさくらから必要な情報の連絡が来てサーバーが使えるようになります。ちなみにOSはCentOS(多分、バージョンは6)を指定。<br />
サーバーを起動した後、最初はさくらVPS専用コンソールからしかアクセスができません。そして、何はともあれこのコンソールから最低限のセキュリティ設定を真っ先にしなければなりません。具体的にはパケットフィルタリング（ファイアウォール）とセキュアシェル(SSH)の設定ですね。<br />
<br />
<strong>基本設定</strong><br />
ファイアウォールは、icmp, ループバック、確立済みの接続とセキュアシェル新規接続以外の送受信を無効にします。<br />
<pre>[root@ap]# iptables -t filter -F                                       <br />
[root@ap]# ip6tables -t filter -F                                      <br />
[root@ap]# iptables -P INPUT DROP                                      <br />
[root@ap]# iptables -P FORWARD DROP                                    <br />
[root@ap]# iptables -P OUTPUT DROP                                     <br />
[root@ap]# ip6tables -P INPUT DROP                                     <br />
[root@ap]# ip6tables -P FORWARD DROP                                   <br />
[root@ap]# ip6tables -P OUTPUT DROP</pre><br />
iptablesとip6tablesはそれぞれIPv4とIPv6に対応したパケットフィルタリングを制御するためのコマンドで、この設定内容をサーバー再起動後も保存したい場合は<br />
<pre>[root@ap]#service iptables save<br />
[root@ap]#service ip6tables save</pre><br />
とやる。<br />
その後、icmpとループバックプロトコル、一旦接続済みとなった通信を許可に変更。<br />
<pre>[root@ap]# iptables -A INPUT -p icmp -j ACCEPT<br />
[root@ap]# iptables -A FORWARD -p icmp -j ACCEPT<br />
[root@ap]# iptables -A OUTPUT -p icmp -j ACCEPT<br />
[root@ap]# ip6tables -A INPUT -p icmp -j ACCEPT<br />
[root@ap]# ip6tables -A FORWARD -p icmp -j ACCEPT<br />
[root@ap]# ip6tables -A OUTPUT -p icmp -j ACCEPT<br />
[root@ap]# iptables -A INPUT -i lo -j ACCEPT<br />
[root@ap]# iptables -A OUTPUT -o lo -j ACCEPT<br />
[root@ap]# ip6tables -A INPUT -i lo -j ACCEPT<br />
[root@ap]# ip6tables -A OUTPUT -o lo -j ACCEPT<br />
[root@www6419up ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j AC<br />
CEPT<br />
[root@ap]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j<br />
ACCEPT<br />
[root@ap]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j A<br />
CCEPT<br />
[root@ap]# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j A<br />
CCEPT<br />
[root@ap]# ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j<br />
ACCEPT<br />
[root@ap]# ip6tables -A OUTPUT -m state --state ESTABLISHED,RELATED -j<br />
ACCEPT</pre><br />
それからSSHの受信ポートを開ける必要があるので、<br />
<pre>[root@ap]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT</pre><br />
とする。ポート番号は標準の22番ではなく1234とする。（この値はSSHの設定と同期がとれていれば、ポート番号の許容する範囲で何を使っても良い）<br />
最後に、フィルタで処理を拒否したパケットのログが取れると通信が上手く行かないときに便利なのでその設定を入れる。<br />
<pre>[root@ap]# iptables -A INPUT -j LOG --log-prefix "[input rejected]"<br />
[root@ap]# iptables -A OUTPUT -j LOG --log-prefix "[output rejected]"<br />
[root@ap]# ip6tables -A INPUT -j LOG --log-prefix "[input rejected]"<br />
[root@ap]# ip6tables -A OUTPUT -j LOG --log-prefix "[output rejected]"<br />
[root@ap]# service iptables save<br />
iptables: Saving firewall rules to /etc/sysconfig/iptables: [  OK  ]<br />
[root@ap]# service ip6tables save<br />
ip6tables: Saving firewall rules to /etc/sysconfig/ip6tables: [  OK  ]</pre><br />
ちなみ<kbd>service iptables save</kbd>(IPv6の方はip6tablesに置き換える)で設定内容を保存すると、/etc/sysconfig/iptables(/etc/sysconfig/ip6tables)の内容はこんな感じになる。<br />
<pre># Generated by iptables-save v1.4.7 on Wed Jun  4 00:05:53 2014                 <br />
*filter<br />
:INPUT DROP [3:96]<br />
:FORWARD DROP [0:0]<br />
:OUTPUT DROP [0:0]<br />
-A INPUT -p icmp -j ACCEPT<br />
-A INPUT -i lo -j ACCEPT<br />
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1234 -j ACCEPT<br />
-A INPUT -j LOG --log-prefix "[input rejected]"<br />
-A FORWARD -p icmp -j ACCEPT<br />
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
-A OUTPUT -p icmp -j ACCEPT<br />
-A OUTPUT -o lo -j ACCEPT<br />
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
-A OUTPUT -j LOG --log-prefix "[output rejected]"<br />
COMMIT<br />
# Completed on Wed Jun  4 00:05:53 2014</pre><br />
ぶっちゃけ、このファイルができたらその後はこれを直接いじって、iptables(ip6tables)を再起動させても良い感じではある。(再起動は service iptables restart)<h2>セキュアシェルの基本設定</h2>つぎにSSHサーバの設定をば。<br />
デフォルトでは22番ポートを受信に使うところを、いかにもクラッカーに狙われそうなので先ほどパケットフィルタリングで接続許可した1234番に変更。ルートユーザーの直接ログインは不許可。それから公開鍵認証の設定を後で行うため、認証方式を一旦ユーザーアカウントパスワード認証に変更しておく。<br />
<pre>[root@ap] #vi /etc/ssh/sshd_config           <br />
(中略)<br />
PasswordAuthentication yes   # &lt;= これを追加<br />
PermitRootLogin no                # &lt;= これを追加<br />
Port  1234                               # &amp;lt:= これを追加</pre><br />
ここでSSHを再起動し、このサーバーに対してteraterm等のコンソールからSSHアクセスをテストすると、とりあえず通常のパスワード認証ではあるがログインできるようになるだろう。<br />
ちなみに、ここには書いていないが、既にルートユーザーログインを遮断しているので、別途アカウントを作っておく必要はある。(コマンドはuseradd, passwdを使う)<br />
<br />
（つづく）<br />
<br />
参考文献・URL：<br />
CentOS6で作るネットワークサーバ構築ガイド　秀和システム刊<br />
Linuxサーバーセキュリティ　オライリー刊]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/24</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby/visenere_cipher%201.0.0%20%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%80%80%E7%AC%91" />
    <published>2013-11-18T00:34:08+09:00</published> 
    <updated>2013-11-18T00:34:08+09:00</updated> 
    <category term="ruby" label="ruby" />
    <title>visenere_cipher 1.0.0 リリース　笑</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<a href="http://jimiprg.blog.shinobi.jp/ruby/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7%E7%94%A8%E3%81%AEgem%E3%82%92%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82" title="" target="_blank">先日お知らせした</a> ヴィジュネル暗号処理用ライブラリ「vigenere_cipher」1.0.0 を本日リリースした。<br />
探し方：<br />
<pre>&gt; gem search ^vigenere<br />
<br />
*** REMOTE GEMS ***<br />
...<br />
...<br />
vigenere_cipher (1.0.0)</pre><br />
インストール方法：<br />
<pre>&gt; gem install vigenere_cipher</pre><br />
もし興味があったら試してみてやってください。<br />
ソースコードは<a href="https://github.com/tmaekawa/vigenere_cipher" title="" target="_blank">こちら</a>]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/23</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby%20on%20rails/centos6.4%20-%20ruby2.0%20-%20rail_23" />
    <published>2013-11-18T00:22:13+09:00</published> 
    <updated>2013-11-18T00:22:13+09:00</updated> 
    <category term="Ruby on Rails" label="Ruby on Rails" />
    <title>CentOS6.4 + ruby2.0 + rails4 インストール備忘録(その弐：turbolink &amp; passenger 編)</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[Rails 4 になって turbolinkなる機能が追加されたらしいのだが、これが結構評判悪くて、外そうという話になった。外せ言われても、どうしたらいいのか分からないんですけど&hellip;&hellip;<br />
というわけで先人にお聞きしました　笑<br />
<a href="http://qiita.com/kazz187/items/12737363d62b9c91993c" title="" target="_blank">Rails 4 で turbolinks をオフにする方法</a><br />
簡単にポイントを挙げると、Railsアプリを生成する段階以降、以下の手順を踏めばいい。<ul><li>Railsアプリを生成する際、bundlerの実行をスキップするオプションをつけてコマンド実行する。<br />
<pre>rails new アプリケーション名  --skip-bundle</pre></li><li>application.html.erb に記載されているHTMLタグの中にある、「"data-turbolinks-track" =&gt; true」という属性設定を削除</li><li>application.js に記載されている「//= require turbolinks」の行を削除</li><li>Gemfileの「gem 'turbolinks'」という記述をコメントアウト後、bundle install実行</li></ul>さらに今までずるずると避けてきたpassenger のインストールと設定作業をすることになった。<br />
作業自体は「Ruby on Rails 3 アプリケーションプログラミング」(山田祥寛著：技術評論社）に書いてある通りに行うことでほとんど悩みなく、結構手早くできた。<br />
が、しかし、<br />
いざそのpassengerを使ってApache経由でアプリを起動(=ブラウザで表示)させようとすると、「could not find a JavaScript runtime. 」というメッセージが表示されて何も動きやがらない。だがどう考えても前回までの作業でnode.js とそれに対応するrubyモジュール「execjs」はインストール済みなのは間違いなく、全く訳が分からない。<br />
エラーの出ている箇所をスタックトレース情報を元にたどると、どうやら execjsの構成ファイルである「runtime.js」の以下の部分で指定されているはずのランタイムがない、と言ってるようなのだ。<br />
<pre>  Node = ExternalRuntime.new(<br />
:name        =&gt; "Node.js (V8)",<br />
:command     =&gt; ["node"],<br />
:runner_path =&gt; ExecJS.root + "/support/node_runner.js",<br />
:encoding    =&gt; 'UTF-8'<br />
)</pre><br />
<br />
なにぃぃぃ？！<br />
それじゃ成す術なしじゃねぇかよ～&hellip;&hellip;と思っていたら、やはりここでも同じことではまった先輩がいらっしゃいました。　笑<br />
<a href="http://forums.freebsd.org/showthread.php?t=35539" title="" target="_blank">HOWTO: RubyOnRails + ExecJS + NodeJS - "Could not find a JavaScript runtime"</a><br />
それによれば上記のコードを以下のように直せば行けるとのこと。<br />
<pre>Node = ExternalRuntime.new(<br />
:name        =&gt; "Node.js (V8)",<br />
:command     =&gt; ["/usr/local/bin/node"],<br />
:runner_path =&gt; ExecJS.root + "/support/node_runner.js",<br />
:encoding    =&gt; 'UTF-8'<br />
)</pre><br />
<br />
:command キーに対応する、ランタイムのパスを"node"から直接node.js がインストールされているパスに置き換えてしまうというわけだ。（注：ここでは/user/local/bin/node となっているが、実行環境によってここは読みかえる必要がある。whichコマンドもしくはwhereis コマンドを使えばそのパスは取得できる。[which node または whereis node])<br />
<br />
実際にやってみるとこれがすこぶる上手く行った。<br />
よかった、よかった&hellip;&hellip;<br />
<hr /><em><strong>番外編</strong>：<span style="text-decoration: underline;">production モードで rails console コマンドや rake db:migrate コマンド等を扱う際の注意。</span></em><br />
Rails はデフォルトでは開発モードである develop 環境で作業をするため、運用時に指定することの多い、production モードで rails コマンドや rake コマンドを実行するには、オプションを付けないといけない。<br />
<a href="http://ionrails.com/2011/05/07/rails-rake-db-migrate-in-production-mode/" title="" target="_blank">Rails and rake db:migrate in Production Mode</a><br />
ポイントになる具体例だけ書いておく。<br />
<pre>rails console production<br />
rails dbconsole production<br />
rails server -e production<br />
rake db:migrate RAILS_ENV=production</pre><br />
<br />
<br />
<hr /><br />
番外編2: <em><span style="text-decoration: underline;">passengerで動かすとasset pipeline</span> が動かない<br />
</em>もしそうなったら、config/environment/production.rb の以下部分を修正する.<br />
<pre># Do not fallback to assets pipeline if a precompiled asset is missed.<br />
#  config.assets.compile = false  #=&gt; 旧<br />
config.assets.compile = true     #=&gt; 新</pre>]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/22</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7%E7%94%A8%E3%81%AEgem%E3%82%92%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82" />
    <published>2013-11-10T17:33:38+09:00</published> 
    <updated>2013-11-10T17:33:38+09:00</updated> 
    <category term="ruby" label="ruby" />
    <title>ヴィジュネル暗号用のgemを公開してみた。</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[ヴィジュネル暗号というのはその名の通り暗号処理方式の一種で、その詳しい歴史については<a href="http://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7" title="" target="_blank">wikipedia</a>を参照してもらうとして、本日その処理をrubyで簡単に行うためのライブラリ(<a href="https://rubygems.org/gems/vigenere_cipher" title="" target="_blank">vigenere_cipher 1.0.0.pre</a>)を公開した。（ソースコードは<a href="https://github.com/tmaekawa/vigenere_cipher" title="" target="_blank">github</a>から入手可能）<br />
<br />
gemを作るのもgithubを使うのも初めてだったので結構大変だった。<br />
そのあたりについては後日、手順等をまとめておこうと考えている。<br />
<br />
現在の暗号技術から言ってヴィジュネル暗号自体は大したものとは言えない。<br />
しかし鍵となるキーワードが十分に長く、暗号方式が秘密であれば、簡易的用途で用いる分には、今でもある程度使える余地はある。<br />
<br />
要望等はgithubの方か、もしくは当ブログにてお願いします。]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/21</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby/rubygem%20%E3%81%8C%E5%8F%8D%E5%BF%9C%E3%81%97%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%89" />
    <published>2013-11-04T14:21:52+09:00</published> 
    <updated>2013-11-04T14:21:52+09:00</updated> 
    <category term="ruby" label="ruby" />
    <title>rubygem が反応しなくなったら</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[仮想マシンを使っていくつもOSをインストールし、Ruby on Rails の環境を作っていると、ときたまrubygemが全く反応しなかったり、反応しても不安定になることがある。筆者が確認できた特徴は以下である。<br />
・gem list --remote が反応しない。(ごくたまに反応することはある)<br />
・gem install が反応しない。<br />
なお gem install については、V オプションを付けて実行すると、現在の通信状況が分かるので便利だ。<br />
例) gem install -V gem名<br />
(--no-ri --no-rdoc オプションを付けるとインストール時間の節約にもなる)<br />
<br />
gem install にVオプションを付けて実行して以下のようなエラーが出たら要注意。<br />
<pre>Unable to resolve dependencies: <br />
sprockets-rails requires sprockets (~&gt; 2.8); <br />
railties requires thor (&lt; 2.0, &gt;= 0.18.1); <br />
actionmailer requires mail (~&gt; 2.5.4); <br />
activerecord requires activemodel (= 4.0.1), arel (~&gt; 4.0.0), activerecord-deprecated_finders (~&gt; 1.0.2); <br />
actionpack requires builder (~&gt; 3.1.0), rack (~&gt; 1.5.2), rack-test (~&gt; 0.6.2), erubis (~&gt; 2.7.0); <br />
activesupport requires thread_safe (~&gt; 0.1)</pre><br />
<pre><br />
ERROR:  Could not find a valid gem 'rails' (&gt;= 0), here is why:<br />
Unable to download data from https://rubygems.org/ - no such name (https://rubygems.org/latest_specs.4.8.gz)</pre><br />
<br />
上記2点のエラーには非常に手こずらされた。<br />
結論から言うと、これらのエラーは大体、次の問題のどれかまたは全てに起因している。<br />
・DNSの問題で「rubygem.org」の名前解決ができない<br />
・SSLの問題でHTTPSアクセスを拒否されてしまっている（ように見える)<br />
・ファイアウォールで443番ポートへの送信を拒否している<br />
<br />
ファイアウォールに関しては確認の上、443番ポートへの外部送信を許可すればよいとして、DNSを原因とする場合は、wget コマンドを使って確認することができる。<br />
<pre>&gt; wget https://rubygems.org/specs.4.8.gz<br />
--2013-11-04 13:18:16--  https://rubygems.org/specs.4.8.gz<br />
rubygems.org をDNSに問いあわせています... 失敗しました: ホスト名に対応するアドレスがありません.<br />
wget: ホストアドレス `rubygems.org' を解決できませんでした。</pre><br />
<br />
この反応が出たら、何らかの理由でDNSが名前解決をできていない可能性を疑うべきだろう。<br />
それに加えて、SSLの問題が絡んでいる可能性もある。それについては<a href="https://github.com/rubygems/rubygems/issues/515" title="" target="_blank">GitHub</a>に掲載されている。<br />
<br />
ではここまでに書いた状況に陥ってしまったらどうすればいいのだろう？<br />
<br />
gemコマンドの入力を通常とは変える、というのがその答えとなる。<br />
<pre>&gt; nslookup rubygems.org<br />
;; Question section mismatch: got rubygems.org/AAAA/IN<br />
Server:         220.152.38.201<br />
Address:        220.152.38.201#53<br />
<br />
Non-authoritative answer:<br />
Name:   rubygems.org<br />
Address: 54.245.255.174<br />
<br />
&gt; gem install -V rails --source http://54.245.255.174</pre><br />
<br />
まずはnslookup(またはdig)コマンドでrubygems.org のIPアドレスを特定する。<br />
次にgem install で --source オプションを指定し、gemのダウンロード元のサーバーを特定するのだが、このときに先のIPアドレスを指定する。またプロトコルはhttps ではなく「http」とする。この対応で正常にgemをインストールできるようになるはずだ。<br />
<br />
リモートサーバー（ダウンロード元サーバー）にあるgem の一覧を見るときもこれと同じ工夫をすれば良い。<br />
<pre>&gt; gem list --remote --source http://54.245.255.174</pre><br />
<br />
<hr /><h4>が、しかし、<br />
<br />
まだこれで終わりではなかった&hellip;&hellip;笑</h4>恐らくこのブログを見ている人の少なくない数がRailsを使っていると思われるが、もしその人の環境で上述したようにrubygem が動かない場合、それは<h4>bundlerも動かない</h4>ことを意味している。<br />
そして筆者もすぐにその穴に落ちてしまったのだった　笑<br />
この場合、良いのか悪いのか別にして筆者の場合は/etc/hosts ファイルに直接 rubygems.org のアドレスを書くことで回避できた（ように見えるが確信はない）。<br />
<pre>vi /etc/hosts<br />
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4<br />
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6<br />
54.245.255.174  rubygems.org</pre>]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/20</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby%20on%20rails/centos6.4%20-%20ruby2.0%20-%20rail" />
    <published>2013-10-23T02:12:25+09:00</published> 
    <updated>2013-10-23T02:12:25+09:00</updated> 
    <category term="Ruby on Rails" label="Ruby on Rails" />
    <title>CentOS6.4 + ruby2.0 + rails4 インストール備忘録</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[今春rubyがバージョン2に、夏に入ってRailsも正式にバージョン4となった。<br />
そしてまた、筆者の担当するプロジェクトでそれらの組み合わせを再度CentOS上に構築しなくてはならなくなったので、備忘録的にメモを残しておく。<br />
<br />
メモといっても、実際には過去Rails3 をインストールしたときの教訓がそのまま使えるのでその分についてリンクのみ提示し割愛させていただく。<br />
<br />
<a href="http://jimiprg.blog.shinobi.jp/ruby/ruby-1.9.3-p392%20%E3%82%92%20centos%206" title="">ruby-1.9.3-p392とrails3.2.13 を CentOS 6.4 にインストールするまで (1)</a><br />
<a href="http://jimiprg.blog.shinobi.jp/ruby/ruby-1.9.3-p392%20%E3%82%92%20centos%206_15" title="">ruby-1.9.3-p392とrails3.2.13 を CentOS 6.4 にインストールするまで (2)</a><br />
<a href="http://jimiprg.blog.shinobi.jp/ruby/ruby-1.9.3-p392%E3%81%A8rails3.2.1" title="">ruby-1.9.3-p392とrails3.2.13 を CentOS 6.4 にインストールするまで (その後)</a><br />
<br />
今回さらに引っかかったのは、rails server とコマンドを打ったところで、以下のエラーが出た点だった。<br />
「/usr/local/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)」<br />
<br />
どうやら execjs というモジュールが使うはずのランタイムとやらがないらしい。<br />
そこで参照しろと指示してあるページ(https://github.com/sstephenson/execjs)に行くと、そのランタイムとはJavascript ランタイムのことであるらしいことが分かる。Rails の機能として、そうしたランタイムを使う機能がデフォルトで追加された&hellip;&hellip;と考えておこう。（前回同じことで引っかかった覚えがないため、いつからそうなっているのか不明）<br />
<br />
いくつかランタイムの候補が挙げられているのだが、筆者はnode.js を選んだ。<br />
http://nodejs.org/<br />
<br />
こちらでソースをダウンロード、ビルドしてから再度 rails server を実行した。<br />
<pre><br />
&gt; cd /tmp<br />
&gt; wget http://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz<br />
&gt; cd node-v0.10.21<br />
&gt; ./configure<br />
&gt; make<br />
&gt; make install<br />
&gt; cd  &lt;railsアプリのルートディレクトリ&gt;<br />
&gt; rails server<br />
=&gt; Booting WEBrick<br />
=&gt; Rails 4.0.0 application starting in development on http://0.0.0.0:3000<br />
=&gt; Run `rails server -h` for more startup options<br />
=&gt; Ctrl-C to shutdown server<br />
[2013-10-23 02:10:36] INFO  WEBrick 1.3.1<br />
[2013-10-23 02:10:36] INFO  ruby 2.0.0 (2013-06-27) [x86_64-linux]<br />
[2013-10-23 02:10:36] INFO  WEBrick::HTTPServer#start: pid=25526 port=3000</pre><br />
どうやらうまくいったっぽい。<br />
<br />
※注：node.js のコンパイルにはgccだけでなく、g++(gcc のC++バージョン)も必要]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/19</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby/enumerator%20%E3%81%8C%E3%81%AA%E3%82%93%E3%81%A7%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B%E3%82%88%E3%81%86%E3%82%84%E3%81%8F%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F-2-" />
    <published>2013-10-16T16:41:25+09:00</published> 
    <updated>2013-10-16T16:41:25+09:00</updated> 
    <category term="ruby" label="ruby" />
    <title>Enumerator がなんで必要なのかようやく分かった(2)</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[以前のエントリ「<a href="http://p.tl/cy0k" title="" target="_blank">Enumerator がなんで必要なのかようやく分かった</a>」でEnumratorクラスの存在意義について書いたが、少し補足をば。<br />
以前の内容では本来enumerableモジュールをincludeしていないクラスでも、その代替となるメソッドを指定し、eachメソッドを持つかのように見せかけるラッパークラスとしてEnumerator の存在意義を紹介した。<br />
irbを使って具体的に示すと以下のようになる。<br />
<pre><br />
irb(main):036:0&gt; class Abc<br />
irb(main):037:1&gt;   def initialize<br />
irb(main):038:2&gt;     @arr = [1,2,3,4,5,6]<br />
irb(main):039:2&gt;   end<br />
irb(main):040:1&gt;<br />
irb(main):041:1*   def my_each<br />
irb(main):042:2&gt;     @arr.each{|n| yield n}<br />
irb(main):043:2&gt;    end<br />
irb(main):044:1&gt; end<br />
=&gt; nil<br />
irb(main):045:0&gt;<br />
irb(main):046:0* abc = Abc.new<br />
=&gt; #<abc:0x2897ca0 arr="[1," 2="" 3="" 4="" 5="" 6=""><br />
irb(main):047:0&gt; enum = Enumerator.new(abc, :my_each)<br />
=&gt; #<enumerator: abc:0x2897ca0="" arr="[1," 2="" 3="" 4="" 5="" 6="">:my_each&gt;<br />
irb(main):048:0&gt; sum = enum.inject(0, :+)<br />
=&gt; 21<br />
</enumerator:></abc:0x2897ca0></pre><br />
<br />
見ての通り、クラスAbcはenumerable をinclude してないが、my_eachメソッドを指定してEnumerator オブジェクトを生成すると、そのEnumeratorオブジェクトを通じてmapやinject等の、enumerableモジュールをinclude しなければ使えないメソッドが使えるようになる。<br />
ここまでが以前のエントリ内容であった。<br />
<br />
しかし現在、Object#to_enum, Object#enum_for というメソッドの存在により（enum_for はto_enum の別名メソッドで機能は同じ)、直接Enumeratorをnewメソッドで呼び出すことは滅多にない、と「プログラミング言語Ruby」(David Flanagan/まつもとゆきひろ著)には記されている。<br />
「プログラミング言語Ruby」の「5.3.4 Enumerator」の章ではこれらのメソッドを引数無しで呼び出すと、呼び出し主体であるオブジェクトのeachメソッドを呼び出すだけのeachメソッドを持ったEnumeratorオブジェクトを返す。つまり a.to_enum と記述すると、Enumerator.new(a, :each) を実行するということだ。Object#to_enum に引数をつけると、Enumerator.new の第二引数の部分に任意のメソッド名を指定できる。その場合、to_enum よりも enum_for を使う方が名前として適しているかもしれないとも記されている。<br />
<br />
実際にやってみるとこういうことだ。<br />
<pre><br />
irb(main):049:0&gt; enum = "1234".enum_for(:each_char)<br />
=&gt; #&lt;Enumerator: "1234":each_char&gt;<br />
irb(main):050:0&gt; enum.map{|c| c.to_i * 2}<br />
=&gt; [2, 4, 6, 8]</pre><br />
<br />
<br />
さらにRuby 1.9からは、引数無で呼び出された場合にEnumeratorオブジェクトを返すイテレータメソッド(あるいはイテレータ的なメソッド)が増えた。特にEnumerableモジュールをミックスインした場合、each, map 等は引数無しだと全てEnumeratorオブジェクトを返す。そうした場合では、to_numもenum_for も記述不要となる場合も多くなった。<br />
<pre><br />
irb(main):051:0&gt; "1234".each_char.select{|c| c.to_i.even?}<br />
=&gt; ["2", "4"]</pre><br />
<br />
これはまぁ、便利っちゃー便利な機能だと思う。]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
  <entry>
    <id>jimiprg.blog.shinobi.jp://entry/18</id>
    <link rel="alternate" type="text/html" href="http://jimiprg.blog.shinobi.jp/ruby%20on%20rails/activerecord%E3%82%92%E5%B0%91%E3%81%97%E6%8B%A1%E5%BC%B5%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%EF%BC%88%E3%81%9D%E3%81%AE%E5%BC%90%EF%BC%89" />
    <published>2013-09-12T13:37:45+09:00</published> 
    <updated>2013-09-12T13:37:45+09:00</updated> 
    <category term="Ruby on Rails" label="Ruby on Rails" />
    <title>ActiveRecordのヴァリデーションを自動化する</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[ActiveRecord(以下ARと略)にはデータの整合性をチェックするためのヴァリデーションメソッドが用意されているんだが、たくさんのARを扱うWEBアプリを作ろうとすると、個々のARにいちいちテーブルのカラム制約に合せたヴァリデーションを記述するのが面倒くさくなってくる。<br />
そもそもARは対応するテーブルのメタ情報は全て持っているので、それを利用してヴァリデーションを自動記述してしまった方がはっきり言って楽だろう。<br />
<br />
――ということで作ってみました。<br />
<pre>module AutoValidates<br />
def self.included(klass)<br />
  klass.class_eval{ <br />
    klass.columns.each do |column|<br />
      next if ["id"].include?(column.name)<br />
      if [:integer].include?(column.type) &amp;&amp; !column.array<br />
        # 数値型確認<br />
        validates column.name.to_sym, <br />
                  numericality: {unless: Proc.new{|k| eval("k.#{column.name}").nil?}, <br />
                  only_integer: true  <br />
      elsif column.null == false<br />
        # NOT NULL<br />
        validates column.name.to_sym, <br />
                  presence: {if: Proc.new{|k| eval("k.#{column.name}").nil?}<br />
      end<br />
    end<br />
  }<br />
end<br />
end</pre><br />
<br />
<br />
これをAR側でincludeすればOK.(のはず)<br />
<br />
]]> 
    </content>
    <author>
            <name>ぢみへん</name>
        </author>
  </entry>
</feed>