Blog

  • RubyでTwilio使って電話してみた

    池澤あやかさんがTwilio使って電話しているのを見まして(MacPeople)、面白そうだなあと思ったので、私もやってみました。前に「Zabbix Conference Japan 2013」で「Zabbix × Twilio でサーバー監視電話連絡の自動化」という発表を聞いたことがあって、Twilioが気になってはいたんですよね。けけけ、けっして、池澤あやかさんがやってたから真似した訳ではないです。

    そもそもTwilioとは何か?
    公式ページから引用しましょう。

    「Twilio を使えば、標準的なウェブ言語を使用して、簡単に、インテリジェントな音声通話アプリケーションを構築できます。 Twilio は従来のテレコム サービスの世界と IPコミュニケーションの橋渡しをします。」

    自由かつオープンにテレコムサービスを利用できる。素晴らしいです。本来はNGN(Next Generation Network)にこのような役割が期待されていたと思うんですけどね。残念ながら、いまだNGNは自由でもオープンでもないですからねえ。残念なことです。

    利用するにはまず登録が必要です。Twilioのサイトに行く。
    日本だとKDDIのグループ会社であるKDDIウェブコミュニケーションズが事業として運営しているようです。うーん、通信キャリアの色が付くのは微妙だなあ。
    ともあれ、登録。利用登録ボタンから登録するだけです。テストコールもかかってきます。トライアル中は無料。ただ、いつトライアル終わるのかが不明瞭です。使用量が一定量に達したら使えなくなるみたいです。

    Rubyから電話をかける方法は、Twilioのブログに載っていますし、ログイン後の「Api Explorer」というコーナーでサンプルスクリプトを見ることもできます。サンプルは、なんと、Curl/Ruby/PHP/Python/Node.js/Java/C#が用意されています。好きな言語で書けるのはいいですなあ。

    Twilioはマークアップ言語TwiMLを使います。TwiMLでTwilioにしゃべらす内容などを書きます。TwiMLはTwilioが読める場所に無いといけません。つまりインターネット公開する必要があります。私は自分のWebサーバを使いました。持っていない人は、TwiML用のホスティングサービスなどがありますので、そちらを使うといいかも。

    日本語も話せますが、とりあえず英語にしてみました。

    [gist id = “9992780” file = “welcome.xml”]

    このwelcome.xmlをWebサーバに置きます。
    ここでは仮にhttp://hogehoge/welcome.xmlとしておきます。

    続いて、Rubyでコードを書きます。Ruby 2.1.1を使用。
    まずはtwilio-rubyを入れます。

    [shell]# gem install twilio-ruby[/shell]

    サンプルを参考に(というかそのまま)書く。

    [gist id = “9992780” file = “call-twilio.rb”]

    これで準備完了。

    [shell]$ ruby call.rb[/shell]

    と実行すると、電話がかかってきました!
    試用期間中はTwilioの宣伝文言が入りますが、その後、男性の声で「Welcome to Twilio!」と話してくれました。

    TwilioのWebサイトを見てみると、IVRとかも作れちゃうようです。
    これは色々な可能性があるなあ。

  • さくらのVPSにRuby 2.1.1を入れた

    さくらのVPS(CentOS 6.5)にRuby 2.1.1を入れました。
    こちらのサイトを参考にさせていただきました。

    普通にyumでインストールしようとしたのですが、

    [shell toolbar=”true”]
    # yum install ruby
    ================================================================================
    Package Arch Version Repository Size
    ================================================================================
    Installing:
    ruby x86_64 1.8.7.352-13.el6 updates 534 k
    [/shell]

    なー、古い!

    インストール方法をいろいろと調べたところ、Ruby Version Manager(RVM)というものを使うべきだそうな。本家でも紹介されていました。

    事前準備。

    [shell]
    # yum install gcc-c++ patch readline readline-devel zlib zlib-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison gdbm-devel tcl-devel tk-devel libxslt-devel libxml2-devel
    # yum install –enablerepo=epel libyaml-devel
    [/shell]

    RVMのインストール。私しか使わないサーバなので、ユーザ毎に環境を作る必要性はなく、rootでインストールすることにしました。/usr/local配下にインストールされます。

    [shell]
    # curl -L https://get.rvm.io | bash -s stable
    …
    * First you need to add all users that will be using rvm to ‘rvm’ group,
    and logout – login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

    * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.
    [/shell]

    上記のメッセージが出ますが、rootで使うだけだったら、いったんログアウトしてログインすればオッケーみたい。

    [shell]
    # rvm -v
    rvm 1.25.22 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

    # rvm list known
    # MRI Rubies
    [ruby-]1.8.6[-p420]
    [ruby-]1.8.7[-p374]
    [ruby-]1.9.1[-p431]
    [ruby-]1.9.2[-p320]
    [ruby-]1.9.3[-p545]
    [ruby-]2.0.0-p353
    [ruby-]2.0.0[-p451]
    [ruby-]2.1[.1]
    [ruby-]2.1-head
    ruby-head
    [/shell]

    インストール。コンパイルするので時間がかかります。

    [shell]
    # rvm install 2.1.1
    # rvm docs generate-ri
    [/shell]

    無事にインストールできました。

    [shell]
    # ruby -v
    ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

    # irb
    2.1.1 :001 > puts "Hello! World!"
    Hello! World!
    => nil

    [/shell]

    一般ユーザでもRubyを使う場合は、source /etc/profile.d/rvm.shを実行します。

    [shell]
    $ source /etc/profile.d/rvm.sh

    $ ruby -v
    ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

    $ irb
    2.1.1 :001 > puts "Hello! World!"
    Hello! World!
    => nil
    [/shell]

    終わり。

  • さくらVPSでdenyhosts

    logwatchでログ監視してますが、結構いろいろなところからのアクセスがあります。
    denyhostsはログを監視して、不正と思われるIPアドレスを/etc/deny.hostsに追加してくれるソフトです。

    [shell]
    $ sudo yum -y install denyhosts
    …
    Installed:
    denyhosts.noarch 0:2.6-19.el6

    Complete!
    $ sudo service denyhosts start
    Starting denyhosts: [ OK ]
    $ sudo chkconfig denyhosts on
    [/shell]

    これでいいはず。

  • Fedora 20をMacbook Proに入れた

    Fedora 20をMacbook Proに入れました。VMware Fusionを利用。

    Fedora 20

    こちらのサイトを参考に日本語入力できるようにしてみました。

    [shell]# yum install -y ibus-mozc[/shell]

    しかし、日本語入力ON/OFFキーがわからないので、右上のバーのボタンをマウス操作して切りかえしています。

  • さくらのVPSでApacheのVirtualHostを使う

    1台のマシンで複数のサイトを立ち上げたい場合、VirtualHostを使います。公開するドメインと、それ以外とを分けておきたいと思ったので、VirtualHostの設定を行いました。

    まず、/etc/httpd/conf/httpd.confのVirtualHostのサンプル設定を消します(重要)。
    その後、/etc/httpd/conf.d/virtualhost.confに以下を設定しました。
    VirtualHost毎に設定を分けるとか、色々な方法があるみたいです。

    [shell]
    NameVirtualHost *:80

    <VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName hostname1.com:80
    </VirtualHost>

    <VirtualHost *:80>
    DocumentRoot /var/www/html2
    ServerName hostname2.com:80
    </VirtualHost>
    [/shell]

    SSLでもアクセス可能にする場合は、ポート443のNameVirtualHostを作ってあげる必要があります。で、VirtualHost毎に設定してあげると。

    [shell]
    NameVirtualHost *:443

    <VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName hostname1.com:443
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/hogehoge.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/hogehoge.key
    </VirtualHost>

    <VirtualHost *:443>
    DocumentRoot /var/www/html2
    ServerName hostname2.com:80
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/hogehoge2.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/hogehoge2.key
    </VirtualHost>
    [/shell]

  • WordPressの検索エンジンへのインデックス許可

    いかん・・・チェックしたままになってました。

    「設定(Settings)」-「表示設定(Readings)」-「検索エンジンでの表示(Search Engine Visibility)」のチェックを外さないとだめでした。

    やってもうたー。

  • さくらのVPSにアンチウィルスソフトClam AntiVirusを入れる

    メールサーバの運用をしていることから、アンチウィルスソフトを入れなくてはと考えました。インストール方法は、ほぼすべてこちらに書いてある通りでオッケーです。素晴らしい。

    [shell]
    $ sudo yum -y install clamd
    $ sudo vi /etc/cram/cramd.conf
    #User clam
    #TCPSocket 3310
    #メールサーバと連携させるため、TCPはオフにしておきます。

    $ sudo freshclam

    $ sudo service clamd start
    $ sudo chkconfig clamd on

    $ sudo clamscan –infected –remove –recursive
    [/shell]

    参考サイトにある一日一度のスキャン設定も入れておきました。

  • さくらのVPSをメールサーバとして利用する

    さくらのVPSにドメインを割り当てたので、メールサーバの設定をすることにしました。しかし、いろいろとトラブルに見舞われました。

    当たり前のことですが、設定内容をちゃんと理解してからメールサーバ設定をするようにすると、失敗が少なくなると思います。適当にあれこれ設定して、いろいろとミスしてしまいました。反省反省。

    まずはメールの仕組みを把握することが重要です。これについては色々なサイトや本があるので、それを読んでおけばOKですね。中でも、SMTPで利用するSMTP AUTHの理解が重要です。こちらのサイトが非常によくまとまっています。設定については色々なサイトを参考にしましたが、特にこちらやこちらのサイトが参考になりました。

    仕組みを理解したら設計します。
    プライベートなので、頭の中で設計してもいいと思います。どのような構成にするかを考えます。特にセキュリティ。以下の構成にしました。

    ・送信サーバ=Postfixを利用。SMTP AUTHで認証。SASLでSASL独自のパスワードデータベースを利用します。サブミッションポートを使い、通信はTLSで暗号化。
    ・受信サーバ=Dovecotを利用。IMAP。Linuxユーザとパスワードで認証。通信はTLSで暗号化。

    TLSを使うと決めたからには、まずは証明書を作成します。
    make  mail.pemしたら、促されるままにいろいろと設定すればオッケー。

    [shell]
    $ cd /etc/pki/tls/certs
    $ sudo make hogehoge.pem
    [/shell]

    続いてPostfixの設定をします。SASLとTLSを使うと。私はmaster.cfの設定が間違っていて(TLSをONにしていなかった)、かなりハマってしまいました。気をつけましょう。

    [shell]
    $ sudo vi /etc/postfix/master.cf
    submission inet n – n – – smtpd
    -o smtpd_tls_security_level=encrypt
    -o smtpd_sasl_auth_enable=yes
    smtps inet n – n – – smtpd
    -o smtpd_tls_wrappermode=yes
    -o smtpd_sasl_auth_enable=yes
    [/shell]

    main.cfではMaildir方式を用い、メールを10MBに制限します。

    [shell]
    $ sudo vi /etc/postfix/main.cf
    broken_sasl_auth_clients = yes
    disable_vrfy_command = yes
    home_mailbox = Maildir/
    inet_interfaces = all
    message_size_limit = 10485760

    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    mydomain = ほげほげ.com
    myhostname = mail.ほげほげ.com
    myorigin = $mydomain
    smtpd_banner = $myhostname ESMTP unknown
    smtpd_client_restrictions = permit_mynetworks,reject_unknown_client,permit
    smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $mydomain
    smtpd_sasl_security_options = noanonymous
    smtpd_sender_restrictions = reject_unknown_sender_domain

    smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
    smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
    smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
    smtpd_use_tls = yes
    [/shell]

    Dovecotをインストールし、各種設定を行います。

    [shell]
    $ sudo  yum -y install dovecot

    $ sudo vi /etc/dovecot/dovecot.conf
    protocols = imap pop3
    #imapsとかpop3sの設定は不要です。入れると起動時にワーニングが出ます。

    $ sudo vi /etc/dovecot/conf.d/10-auth.conf
    disable_plaintext_auth = no
    auth_mechanisms = plain login

    $ sudo vi /etc/dovecot/conf.d/10-mail.conf
    mail_location = maildir:~/Maildir

    $ sudo vi /etc/dovecot/conf.d/10-master.conf
    #ポート番号を適切に設定(コメントアウトを外す)

    $ sudo vi /etc/dovecot/conf.d/10-ssl.conf
    ssl = yes
    ssl_cert = </etc/pki/tls/certs/hogehoge.pem
    ssl_key = </etc/pki/tls/certs/hogehoge.pem
    [/shell]

    Maildir形式を使うので、スケルトンを作りつつ、既存ユーザ(sampleuser)に対してはMaildirを作ってあげます。

    [shell]
    $ sudo mkdir /etc/skel/Maildir
    $ sudo chmod 700 /etc/skel/Maildir
    $ sudo mkdir /home/sampleuser/Maildir
    $ sudo chmod 700 /home/sampleuser/Maildir
    $ sudo chown sampleuser:sampleuser /home/sampleuser/Maildir
    [/shell]

    SMTP AUTHパスワードの設定。SASL独自のパスワードデータベースsasldbを使うので、「auxprop」を指定します。

    [shell]
    $ sudo vi /etc/sasl2/smtpd.conf
    pwcheck_method: auxprop
    mech_list: cram-md5 digest-md5 plain login
    [/shell]

    パスワード設定。

    [shell]
    $ sudo saslpasswd2 -u ほげほげ.com -c sampleuser
    $ sudo sasldblistusers2
    [/shell]

    sasldbのパーミッションを変更し、postfixグループとします。

    [shell]
    $ sudo chmod 640 /etc/sasldb2
    $ sudo chgrp postfix /etc/sasldb2
    [/shell]

     起動させる。

    [shell]
    $ sudo chkconfig postfix on
    $ sudo chkconfig saslauthd on
    $ sudo chkconfig dovecot on
    $ sudo service postfix start
    $ sudo service saslauthd start
    $ sudo service dovecot start
    [/shell]

    あとはテストです。
    当たり前ですが、メーラを正しく設定しておかないとメール送受信できません。
    SMTP AUTHを使うとか、TLSを使うとか、自分で決めたとおりにメーラに設定して送受信試験を行います。これもいろいろと間違っていて、時間かかってしまいました・・・。
    MacだとAirmailがオススメです。テストボタンもあるし、試験しやすいので。

    やはり、メールのセットアップは大変です。これだけでも大変なのですが、まだまだやることがあります。それはまた今度の機会に。

  • さくらのVPS再起動時にApacheが起動しない問題((98)Address already in use: make_sock: could not bind to address 0.0.0.0:80)

    さくらのVPSを再起動した際に、Apacheが起動しない問題があって悩んでいました。
    起動させようとしてコマンドを打つと、以下のエラーが出て起動しないのです。

    (98)Address already in use: make_sock: could not bind to address [::]:80
    (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

    [shell]
    # service httpd start
    Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
    (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
    no listening sockets available, shutting down
    Unable to open logs   [FAILED]
    [/shell]

    Googleで調べると、こちらのサイトに解決策が載っていました。
    以下のようにします。

    [shell]
    # /usr/sbin/lsof -i | grep http
    httpd 1646 root 4u IPv6 10967 0t0 TCP *:http (LISTEN)
    httpd 1646 root 6u IPv6 10971 0t0 TCP *:https (LISTEN)
    # kill 1646
    # service httpd start
    [/shell]

    それにしても原因は何だろうなあと、調査を続けたところ、こちらのサイトに原因が書いてありました。証明書にパスフレーズを設定しているのが原因らしい。解決策としては、パスフレーズを抜くか、SSLPassPhraseDialogを設定してパスフレーズを渡してやればいいみたい。少し悩んだのですが、SSLPassPhraseDialogを使う場合は、スクリプトファイルにパスフレーズを記載しなければならず、それはそれでセキュリティ的にどうなのかなあと思ったので、さくっとパスフレーズを削除することにしました。

    [shell]
    # cp server.key server.key.backup
    # openssl rsa -in server.key -out new.server.key
    # mv new.server.key server.key
    # service httpd restart
    Stopping httpd: [ OK ]
    Starting httpd: [ OK ]
    [/shell]

    これでさくらのVPSを再起動したときにも、Apacheが自動で起動するようになりました。

  • さくらのVPSにownCloudを設定する(自己署名証明書には気をつけて)

    ownCloudという、プライベートストレージを構築できる素晴らしいソフトがあります。

    インストールも超簡単。
    あえてここに書くまでもありません(Google先生に聞いてください)。

    問題は自己署名証明書です。
    MacにはMac用のクライアントソフトが用意されています。自己署名証明書をMacに読み込ませない状態で、クライアントソフトを起動すると、ownCloudに全くつながりません!エラーが出て終わりです。ハマりました・・・。

    エラーを解決できなかったので、ownCloudの導入をあきらめて、WebDAV環境を作ったのですが、その作業の中でMacに自己署名証明書をインストール(登録)したのでした。もしかして・・・と思って、証明書インストール後にownCloudクライアントを立ち上げて起動したらうまくいった次第であります。

    くれぐれも自己証明書には気をつけましょう。端末にインストール(登録)するのを忘れずに!

    あ、あと、ownCloudを入れる際ですが、ユーザ名とパスワードを入れるだけでOKみたいです。下手にMySQLのユーザとかを入れようとするとうまく行きませんでした。どなたかの参考になればと、書いておきます。