Category Archives: 未分類

Rental Orbit Space サービス終了と今後について

昨日報告させていただきました通り、Rental Orbit Space につきましては、ひとまず2024/11/30を持ちましてサービスを終了する運びとなりました。今までありがとうございました。

今まで殆どお話しすることのなかった運営方針と発生していた課題と葛藤、今後についてお話しできればと考えています。

活動開始時期の状況と運営方針

Rental Orbit Space は、2008年12月、当時高校生だった私が趣味と勉強目的で立ち上げたサーバを、自身と同じ学生の勉強場所として、創作活動で生まれた作品の公開場所として、なるべく好条件(機能・容量)で貸し出すというのを目標として始めました。

というのも、当時は企業が提供する無料サービスでサイトを公開しようとすると静的なファイル(HTMLやCSS、画像など)しか設置できなかったり、容量が非常に少なかったりと中々に選択肢が限られ、お金や決済手段の限られる学生がコンテンツを公開したり学習を開始するにはハードルが高かったという背景があります。

当時、企業ではなく個人運営のレンタルサーバーを利用するには、利用者が何の目的で何のコンテンツを公開するのかについて作文を書いて運営者に送り、運営者に厳選されたユーザにのみアカウントを提供するという「審査」と呼ばれる過程を踏むスタイルが殆どでした。また利用目的に「学習目的での利用」はあまり歓迎されず「許可しない」と明記しているケースも珍しくはなかったかと思います。ですが私自身としましては学びや作品の公開を望む人がいれば可能な限り利用してもらいたいと考えており、一貫して「審査」と呼ばれる過程を重視しないスタイルをとっていました(利用目的が「ああああ(以下略)」というような、極端に不真面目な内容については利用を許可しないこともありました)

発生していた課題と葛藤

簡潔に述べますと、想像以上に嵩む費用と不足するマンパワー、進歩し変化していく技術、そして自身と環境の変化になります。

Rental Orbit Space は設置されたサイトの下部に広告を設置することで、運用費(電気代や通信費)を確保するスタイルで運営してきました。当然運営するにあたり突然機材が故障することもあります。しかし、恥ずかしながら収益がそれらを上回ることは殆どなく常に赤字でした。これにつきましては企業であれば大問題ですが、私の目的は趣味と勉強用であっため些末な問題だと言えるでしょう。

一方で運営保守と機能追加に伴うマンパワー不足は明らかに問題があったと言わざるを得ませんでした。誰でも無料で登録できるサービスであるため、悪意のあるユーザが紛れ込むこともあります。中にはCGI Proxy(PHP Proxy)やWebShellなどを始めとする攻撃を目的としたツールを設置を試みるユーザもいました。このようなツールは悪用の仕方によっては警察・裁判沙汰になりかねません。また、未成年の閲覧にふさわしくないコンテンツが掲載されていたり掲示板にスパムボットが群がっている状況では広告代理店より広告の配信が停止されることもあるため独自に対策を行う必要がありました。

ITというのは歳月が経過しますと求められる技術は移り変わり、企業が提供するホスティングサービスも低価格化と多機能化が進みます。その中でもWeb開発の技術とインフラ関係の変化は激動といっても良いでしょう。当初はLAMP(Linux, Apache, MySQL, Perl/PHP)が求められていましたが、VPS(Virtual Private Server)が一般的となりアプリケーションサーバとNginxなどによるリバースプロキシの構成が当たり前になりました。さらに昨今ではKubernetesのようなコンテナ化技術の普及している状況です。しかし共有レンタルサーバーとなると状況は特殊になり、例えばNginxであっても.htaccessの需要を考慮しますとApacheから置き換えるのは難しいものがあります(ApacheとNginxを併用する方法はありますがそれではNginxの速度を活かせません)。アップデートもユーザーが設置した様々なものに影響が出ないよう可能な限り配慮して実施する必要があります。またVPSやコンテナ技術を利用したサービスとしてユーザに提供するとなるとグローバルIPやサーバの台数が今までと比べ物にならないほど必要となり、とても現実的ではありません。このように運営を開始した頃のサービスから中々変化を出せないのは自身も成長していないようで大変なもどかしさがありました。そして、これらの模索は運営保守における時間的・精神的リソースを多大に奪うことに繋がりました。

次に、仮想基盤(ハイパーバイザー)の移行に関する問題があります。現在利用している仮想基盤は無償提供が終了したため、移行を余儀なくされています。この移行ではサービスを稼働させたまま現在のサーバ(実機)を流用することは不可能であり、新たなサーバーの購入が必要であり刷新するとなると数十万円規模の費用と仮想マシンの変換など、多くの作業と時間を伴うことが予想されます。

今後について

今回の Rental Orbit Space としましてのサービス終了は私自身の仕事とプライベートと運営管理のバランスが取れないことが最大の理由であります。終了までのスケジュールはメールにてご案内させていただきました通りですが、私の個人用サーバを管理するのと近いスタイルでの運営であれば負担は少ないかと思います(アップデートなどで互換性などが多少損なわれる可能性があるため、それを考慮し広告などの表示は行わないつもりです)。しかしながら需要が未知数なため、現在の利用者の中でそれでも良いと思われる方や、移行先の選定に困っている方がいらっしゃいましたらメールにて連絡ください。

Rental Orbit Space を運営しました15年という時間は実に私の今日までの人生における半分に迫る時間であり、様々な学びや経験とチャンスをもたらしてもらいました。重ね重ねになりますが、ありがとうございました。

今時で高速なWordPressを楽に構築する(CentOS7 + HTTP/2 + Let’s Encrypt + HSTS + PHP7)

速度的に欲を言えばNginxの方が良さそう?なのですが
利便性(やっぱりhtaccessは使いたい)を考えてApacheにしています。

下手にソースコードをビルドするとその後に脆弱性が見つかったなどでアップデートするのが面倒になったりするのですが、既にそんなことせずとも何とかなりそうだったのでメモしておきます。

リポジトリ(epel + IUS)を追加

$ sudo yum -y install epel-release
$ sudo rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm 

Apache2.4(HTTP/2対応)のインストール

$ sudo yum -y install httpd24u httpd24u-devel httpd24u-mod_ssl

設定方法は Webサーバー構築(Apache) (CentOSで自宅サーバー構築様) を参照

マルチプロセッシングモジュール (MPM)の確認

ApacheでHTTP/2を実現するためにはMPMがEVENTになっている必要がある。
以下の設定ファイルを開きMPMがEVENTになっているのを確認する。

$ sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

HTTP/2用の設定ファイルを作成

設定ファイルを新規追加する。

パラメータ

  • h2(TLS接続)
  • h2c(非暗号接続)
  • H2Direct(HTTP/2でのダイレクト接続の許容の可否)
$ sudo vi /etc/httpd/conf.d/http2.conf
<IfModule http2_module>
    Protocols h2 h2c http/1.1
    H2Direct on
</IfModule>

MariaDBのインストール

$ sudo yum -y install mariadb-server

設定方法は データベースサーバー構築(MariaDB) (CentOSで自宅サーバー構築様) を参照

PHP7.1のインストール(PHP-FPM)

$ sudo yum -y install php71u-mysqlnd php71u-fpm-httpd \
  php71u-cli php71u-mcrypt php71u-gd php71u-xml \
  php71u-mbstring php71u-json php71u-devel php71u-pdo \
  php71u-process

PHP-FPMの設定

実行ユーザ、グループを適切なものに変更します。

実行ユーザをユーザ毎に変えたい(suPHPの様な事をしたい)場合は、その度に設定ファイルを追加してPHP-FPMを再起動してやる必要がありそうです(未確認)。

$ sudo vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = apache
group = apache
$ sudo systemctl start php-fpm.service
$ sudo systemctl enable php-fpm.service

Apache24への設定反映

基本はデフォルトで特に問題ないはずです。

$ sudo cat /etc/httpd/conf.d/php-fpm.conf
# This configuration requires httpd 2.4 with support for UDS (Unix domain
# sockets).  This was added upstream in version 2.4.10, and was also backported
# to 2.4.6 in EL7.

# The following lines prevent .user.ini files from being viewed by Web clients.
<Files ".user.ini">
    Require all denied
</Files>

# Allow php to handle Multiviews.
AddType text/html .php

# Add index.php to the list of files that will be served as directory indexes.
DirectoryIndex index.php

# Enable http authorization headers.
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
    #SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

Let’s Encryptで証明証を発行するためのコマンドをインストール

$ sudo yum -y install certbot python-certbot-apache

証明書発行時に利用する公開ディレクトリの作成と設定

Let’s Encryptがドメイン保有者からの発行依頼であることを確認するためにアクセスしにくるファイルを設置する公開ディレクトリを、サーバ内で共通の場所を使用するようにする(バラバラでも良いが、何かと面倒なので共通化)。

$ sudo mkdir -p /var/www/letsencrypt/.well-known
$ sudo vi /etc/httpd/conf.d/letsencrypt.conf
Alias /.well-known /var/www/letsencrypt/.well-known

証明書の発行と自動更新

証明書を発行する
途中、色々聞かれるが特に難しい事は無い

$ sudo certbot certonly --webroot -w /var/www/letsencrypt/ -d example.net -d www.example.net

証明書を自動で更新するためにcronに以下のように設定を追加する

$ sudo vi /etc/cron.d/certbot
0 5 * * * root certbot renew --quiet

WordPressのインストール
インストール方法は ブログサイト構築(WordPress) (CentOSで自宅サーバー構築様) を参照

※ php-mysqlインストールとApacheの設定は不要

WordPressを公開するVirtual Hostの設定
HTTPで接続してきた場合はHTTPSになるようにリダイレクトします。

HSTSを指定しているので、ブラウザが覚えて常にHTTPSで接続するようになります。

$ sudo vi /etc/httpd/conf.d/virtualhost-01.www.conf
<VirtualHost *:80>
    ServerName example.net
    ServerAlias www.example.net

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.net/chain.pem

    ServerName example.net
    ServerAlias www.example.net
    DocumentRoot "/var/www/html"

    Header set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

Apache24を再起動します。

$ sudo systemctl restart httpd.service

参考サイト

Raspberry Pi 3 Raspbian Jessie で Waveshare 3.5インチ タッチ液晶を動かす

Raspberry Pi3のついでにWaveshare 3.5インチ タッチパネル付き液晶を購入したのですが動作させるのに結構苦戦したので手順を残すためにメモしておきます。

このタッチパネル付き液晶モデル(3.2インチ版も含む)の使用方法を紹介しているサイトの多くは
メーカー?が提供しているISOを使ったりLCD-show.tar.gzを使っていたりしますがPi3では起動しなくなるようです・・・

Raspbian JessieのインストールはNOOBSを使いました。
インストール後はLANへの接続と日本語フォントの追加とSSHが有効であるかの確認を行っています。

SPIの有効化とBOOT時のGUIの無効化(CUI+自動ログイン)に変更します。

$ raspi-config

必要なパッケージ群をインストール。

$ sudo apt-get install xinput evtest libts-bin
$ sudo apt-get install fbi

タッチパネル付き液晶への出力設定

何も設定していない場合はfb0しか無いはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0

FBTFT関連のカーネルモジュールをロードさせます。
以前は自力で導入する必要があったようですが、現在は標準で含まれているようです。

$ sudo modprobe flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
$ sudo modprobe fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

カーネルモジュールをロードするとデバイスファイルが増えるはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0
crw-rw---- 1 root video 29, 1  4月  2 12:41 /dev/fb1

後から追加されたfb1がタッチパネル付き液晶なので試しに画像を表示してみます。

$ wget https://kernel.org/theme/images/logos/tux.png
$ sudo fbi -d /dev/fb1 -T 1 -a tux.png

image3

起動時に自動でモジュールを読み込むように指定します。

$ sudo vi /etc/modules-load.d/waveshare.conf
spi-bcm2835
flexfb
fbtft_device

$ sudo vi /etc/modprobe.d/waveshare.conf
options flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
options fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

起動時からフォントを指定してfb1に出力させるように行末へ以下を追記します。
何だろうと少し調べてみましたが、このfbcon=map:1の役割はcon2fbmapコマンドと同じようですね。

$ sudo vi /boot/cmdline.txt
fbcon=map:1 fbcon=font:ProFont6x11 # 行末に追記します

image1

デスクトップをfb1に出力させながら起動するとタッチパネル付き液晶に表示されるはずです。

$ sudo FRAMEBUFFER=/dev/fb1 startx

image2

デスクトップの出力先をfb1に変更すると再起動後もタッチパネル付き液晶に表示されるようになるのですが
この方法だと、画面が小さすぎて色々と辛いのとHDMIが表示されなくなるので変更しない方法を探しました。

$ sudo vi /usr/share/X11/xorg.conf.d/99-fbturbo.conf
# This is a minimal sample config file, which can be copied to
# /etc/X11/xorg.conf in order to make the Xorg server pick up
# and load xf86-video-fbturbo driver installed in the system.
#
# When troubleshooting, check /var/log/Xorg.0.log for the debugging
# output and error messages.
#
# Run "man fbturbo" to get additional information about the extra
# configuration options for tuning the driver.

Section "Device"
        Identifier      "Allwinner A10/A13 FBDEV"
        Driver          "fbturbo"
        Option          "fbdev" "/dev/fb0" # <- fb0からfb1に変更する方法もあるけど今回はそのまま

        Option          "SwapbuffersWait" "true"
EndSection

色々と調べてみたんですが
フレームバッファをコピーするfbcpコマンドをインストールすることにより
fb0(HDMI)をfb1(タッチパネル付き液晶)に映せる事が分かったので利用することにしました。

これにより、HDMIに接続して起動しても画面が真っ暗って事もなく
ウインドウ幅が小さすぎて操作が困難という問題を解消できます。

$ sudo apt-get install cmake
$ git clone https://github.com/tasanakorn/rpi-fbcp
$ cd rpi-fbcp/
$ mkdir build
$ cd build/
$ cmake ..
$ make
$ sudo install fbcp /usr/local/bin/fbcp

起動時に実行させる方法で少し悩んだのですが
とりあえず安直にrc.localへ追記しておきます・・・

$ sudo vi /etc/rc.local
su -l pi -c fbcp &

最初で設定したのと逆にraspi-configでデスクトップに自動でログインするように設定を直すと
起動が完了するとタッチパネル付き液晶にデスクトップが映るようなります。

image2(1)

タッチパネルの有効化

このままだとタッチパネルが使えないので設定します。

マウスとキーボードをRaspberry Piに接続している場合は以下のようになっているはずです。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1

以前はads7846_deviceだったらしいですがads7846に変わったようなので以下のように追記します。

$ sudo vi /boot/config.txt
# 末尾に追加
dtoverlay=ads7846,cs=1,penirq=17,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=1,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900

キャリブレーションの設定を行うついでに、画面長押しで右クリックになるように追記しておきます。

$ sudo vi /usr/share/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
    Identifier "calibration"
    MatchProduct "ADS7846 Touchscreen"
    Option "Calibration" "3873 272 236 3868"
    Option "SwapAxes"    "1"
    # Enable press and hold for right-clicking
    Option "EmulateThirdButton" "1"
    Option "EmulateThirdButtonTimeout" "750"
    Option "EmulateThirdButtonMoveThreshold" "30"
EndSection

ちなみに、waveshare35a-overlay.dtbというデバイスツリーを設置する方法も紹介されていたりいますが
特に設置せずとも動いているようなので私の環境では設置しておりません。

再起動するとタッチパネルを認識してデバイスファイルが増えており、タッチ操作が可能になっていると思います。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1
crw-rw---- 1 root input 13, 66  4月  2 14:13 /dev/input/event2

image1(2)

その他、スクリーンキーボードのインストール等ありますが、そこら辺は割愛します。。。。

以下、参考サイト
raspberry pi LCDシールド(3.5) [RPiLCD035TP] [3.5inch RPi LCD (A)] 導入 waveshare – Qiita
3.5inch RPi LCD (A) – Waveshare Wiki
Home · notro/fbtft Wiki · GitHub
Raspberry Pi2 3.5inchタッチスクリーンディスプレイの設定 | 猫から星まで
Waveshare3.2インチLCDのセットアップ
Raspberry Piの小さな液晶のPiTFTを仮想画面スクロールで広く使いたかったけど挫折 | matoken’s meme
Raspberry Pi 2にディスプレイをつないでみた! | TONGARISM.COM
千石の4inchタッチディスプレイをRaspberryPi 2 につなぐ – yuki-sato.com
I am getting "FATAL: Module ads7846_device not found." · Issue #260 · notro/fbtft · GitHub
Adafruit customer service forums • View topic – [SOLVED ! ] 3.5" PiTFT resistive Touchscreen – Right-click a

ESXi5.1 APC Smart UPS 連携 メモ

前回のアップデートESXi5.1を623860から914609へアップデートするにより、”vmware-autohalt.sh”を使用しなくてもゲストOSを自動でシャットダウンできるようになったため連携の仕方が若干変わった。

USP連携についてはあまり触れているところは少ないため大まかながらメモしておく。

無料版ESXi5.1のホスト方ではUSP連携に対応していないためゲストを利用してUPSと連携する。
※ 方法は色々あるようで”VMware vSphere Management Assistant”と呼ばれる物を導入する方法もあるようだが今回はゲストにCentOS5を使用して実現する。

使用するゲストにシリアルポートを認識させる。
WS000043

ゲストにApcupsdをインストールする。
インストールの方法は色々と紹介されているので他サイトを参照。

シリアルポートのディバイスファイルの設定が正しいか確認する。
# cat /etc/apcupsd/apcupsd.conf | grep “DEVICE”

# You must also specify a DEVICE, sometimes referred to as a port.
# For USB UPSes, please leave the DEVICE directive blank. For
# UPSTYPE   DEVICE           Description
# usb       <BLANK>          Most new UPSes are USB. A blank DEVICE
DEVICE /dev/ttyS0

Apcupsdを起動する。
# service apcupsd start

ゲスト側でUPSが認識されているか確認するために下記のコマンドを実行する。
# apcaccess

APC      : 001,051,1246
DATE     : 2013-05-28 13:06:07 +0900
HOSTNAME : UPS-SERVER
VERSION  : 3.14.10 (13 September 2011) redhat
UPSNAME  : UPS_IDEN
CABLE    : Custom Cable Smart
DRIVER   : APC Smart UPS (any)
UPSMODE  : Stand Alone
STARTTIME: 2013-05-28 12:33:37 +0900
MODEL    : SMART-UPS 1000
STATUS   : ONLINE
LINEV    : 101.4 Volts
LOADPCT  :  15.6 Percent Load Capacity
BCHARGE  : 100.0 Percent
TIMELEFT :  93.0 Minutes
MBATTCHG : 30 Percent
MINTIMEL : 10 Minutes
MAXTIME  : 1200 Seconds
MAXLINEV : 102.0 Volts
MINLINEV : 099.4 Volts
OUTPUTV  : 101.4 Volts
SENSE    : High
DWAKE    : 000 Seconds
DSHUTD   : 180 Seconds
DLOWBATT : 02 Minutes
LOTRANS  : 090.0 Volts
HITRANS  : 110.0 Volts
RETPCT   : 000.0 Percent
ITEMP    : 40.0 C Internal
ALARMDEL : 5 seconds
BATTV    : 28.3 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Line voltage notch or spike
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STESTI   : 336
STATFLAG : 0x07000008 Status Flag
DIPSW    : 0x00 Dip Switch
REG1     : 0x00 Register 1
REG2     : 0x00 Register 2
REG3     : 0x00 Register 3
MANDATE  : 02/04/99
SERIALNO : WS9906012897
BATTDATE : 02/04/99
NOMOUTV  : 100 Volts
NOMBATTV :  24.0 Volts
EXTBATTS : 0
FIRMWARE : 60.12S.A
END APC  : 2013-05-28 13:06:46 +0900

ESi5.1ホストマシンでシェルの使用とSSHでの接続を有効にする。
WS000044

※これらを有効にするとサマリで警告が表示されるが特に問題は無いので気にしない。

SSHを鍵を使い、パスワードなしでログインできるようにする。
SSHの鍵作成については過去記事ESXi5 SSH 公開鍵暗号化方式 作製を参照。

ゲストに秘密鍵を下記のパスになるようにコピーする。
/root/.ssh/esxi_id_rsa.pub

ESXi5.1ホストマシンに鍵を使ったSSHでパスワードなしでログインできることを確認する。
# ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス>

ゲストでESXi5.1ホストマシンをシャットダウンするシェルスクリプトを作成する。
# vi /usr/local/bin/esxi_shutdown.sh

#!/bin/sh
ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス> "/bin/halt"

実行権を与える。
# chmod 700 /usr/local/bin/esxi_shutdown.sh

実際に実行してESXi5.1ホストマシンがゲストからシャットダウンできるか確認する。
# /usr/local/bin/esxi_shutdown.sh

Apcupsdがシャットダウン時に実行するコマンドを書き換える
# vi /etc/apcupsd/apccontrol

#SHUTDOWN=/sbin/shutdown
SHUTDOWN=/root/bin/esxi_shutdown.sh

Apcupsdを再起動する。
# service apcupsd restart

最後にUPSの電源を引きぬいてESXi5.1ホストマシンが自動でシャットダウンされるか確認する。

参考サイト
ESXi 4.1 から ESXi 5.0 へアップグレード | SS-NET サポート
VMware ESXi 5.0 + vMA 5.0で電源管理 (3) – apcupsdの導入 « RootLinks Co., Ltd.
自宅サーバ構築じぶんめも SSH設定編 | ken39rajima

ArduinoでRELET(FeliCa電子マネー残高照会機)モドキを作ろう

作ろうと考えるようになったいきさつ

以前、家電量販店を歩いてるとSuicaやEdyなどの電子マネーの残高を確認できる電子マネービュアー「リレット」EV10 | KING JIMが販売されており思わず『買いたい』と思いましたが、値札を見たらお値段が・・・・。度々家電量販店に行くも今度買おうと自分に言い聞かせてたらいつの間にか生産中止になってしまたようで・・・・・。仕方ないから自分で自由に機能を拡張できるFeliCa電子マネー残高照会機を作ろうと思い立ちました。

初代残高照会機(Arduino UNO + PaSoRi)

実は、以前にも同様の目的でFeliCaの残高照会機を作った事があったのですが、想像よしていたものより大きく据え置きにするしかなかったため今回これよりも遥かに小さい物を作成しようと考えました。

道具の準備

・ハンダ線
・ハンダ吸い取り線
・フラックス
・熱収縮チューブ
・ハンダこて
・こて台
・こて拭き
・精密ピンセット
・カッターナイフ

電子工作をする上でとくに特別な物はないですが、結構細かい部品をハンダ付けするため精密ピンセットとフラックスがあるといいかもしれません。

部品の準備

・FeliCa リーダー・ライター RC-S620S
・FeliCa RC-S620S ピッチ変換基板のセット(フラットケーブル付き)
・Arduino Pro mini 5V
・SB0802GN
・AS1322A/V2
・Polymer Lithium Ion Battery – 110mAh
・JST-PHオスコネクター
・タクトスイッチ
・1μF積層セラミックチップコンデンサ 2個
・1μF積層セラミックコンデンサ 1個
・10kΩチップ抵抗 2個
・ビニール線

・FT232RL搭載小型USB-シリアルアダプタ 5V
・LiPo Charger Basic – Micro-USB

 今回手軽に持ち運べるよう小型化するために、Arduino Pro miniを選択しましたが、通常8Mhzな3.3V版では115200bpsの転送レートに対応していないためRC-S620/Sと通信することが出来ないので5V版を準備してください。
 なお、同じく軽量化小型化のためにLCD液晶にStrawberryLinux製のミニI2C液晶モジュールを使用しました。このパーツを使用すると一部チップ部品のハンダ付けが必要となりますが、I2C通信を利用する事により使用するピンを劇的に減らすことが可能になります。

ハードウェアの作成

Arduinoにシリアル通信用の足をハンダ付けし、裏面にプルアップ抵抗用にチップ抵抗(10kΩ)を2個ハンダ付けします。

StrawberryLinux製のミニI2C液晶モジュールはコンデンサを3個ハンダ付けしなければならないので、表面にチップコンデンサ(1μF)を2個、裏にコンデンサ(1μF)を1個ハンダ付けします。

StrawberryLinux製の昇圧型DC-DCコンバータモジュールは5V引き出す場合ハンダジャンパーが必要になるのでハンダでショートさせます。

最後にこのような配線になるように各種パーツをハンダ付けしていきます。バッテリーは使い切ると外して充電器に接続し充電します。
※ 当初、CR2032で動かす予定でしたが大電流放電が苦手なようでうまく動きませんでした。
※ RC-S620/Sは配線を間違うと一瞬で壊れます。私は試作の時にうっかり2台も壊してしまいまいした・・・・
※ 今回何となく不安でRAWに昇圧モジュールのOUTを繋いでいますが電圧を5Vに調整しているのでVCCに繋いでも一応動いたりします。

これでハードは完成です。

ライブラリの準備

Arduino向けRC-S620/S制御ライブラリ
I2C液晶ライブラリ – Okiraku Programming

それぞれのライブラリをダウンロードしlibrariesフォルダーに入れ、RC-S620/S制御ライブラリ“RCS620S.cpp”を開き#include “WProgram.h”を#include “Arduino.h”に書き換えて上書き保存します。I2C液晶ライブラリも“LCD_I2C.h”の中身を下記から次のように通り書き換えます。
※ 実は、“LCD_I2C.h”の書き換えは#include “Arduino.h”じゃなくて#include <wiring_private.h>でもよかったり?

書き換え前

#ifndef LCD_I2C_h
#define LCD_I2C_h
extern "C" {
#include <math.h>
#include <wiring.h>
}
#include <Wire.h>

書き換え後

#ifndef LCD_I2C_h
#define LCD_I2C_h
#include <math.h>
#include "Arduino.h"
#include <Wire.h>

ソフトウエアの作成

アトリエのどか様の公開されているスケッチを参考に実際にSuica、PASMO、Edy、nanaco、waonなどのFeliCa電子マネーの残高を表示させるように記述しました。

※ Arduino Pro miniではRC-S620/Sを接続しているとスケッチをArduinoに書き込めないという問題が発生しました。スケッチを書き込む場合は一度ArduinoとRC-S620/Sを繋ぐフレキケーブルを外しておく必要があります。

#include <Wire.h>
#include <LCD_I2C.h>
#include <RCS620S.h>

// Circuit
// RESET    - 1 RST
// Analog 5 - 2 SCL (internally pulled up)
// Analog 4 - 3 SDA (internally pulled up)
// GND      - 4 VSS
// 5V       - 5 VDD

// RCS620S
#define COMMAND_TIMEOUT               400
#define POLLING_INTERVAL              500
#define RCS620S_MAX_CARD_RESPONSE_LEN 30

// FeliCa Service/System Code
#define CYBERNE_SYSTEM_CODE           0x0003
#define COMMON_SYSTEM_CODE            0xFE00
#define PASSNET_SERVICE_CODE          0x090F
#define EDY_SERVICE_CODE              0x170F
#define NANACO_SERVICE_CODE           0x564F
#define WAON_SERVICE_CODE             0x680B

RCS620S rcs620s;

void setup(){
  LCD.begin(5);
  Serial.begin(115200);
}

void loop(){
  uint32_t balance;
  uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN];
  
  rcs620s.timeout = COMMAND_TIMEOUT;
  
  // サイバネ領域
  if(rcs620s.polling(CYBERNE_SYSTEM_CODE)){
    // Suica PASMO
    if(requestService(PASSNET_SERVICE_CODE)){
      if(readEncryption(PASSNET_SERVICE_CODE, 0, buf)){
        // Little Endianで入っているPASSNETの残高を取り出す
        balance = buf[23];                  // 11 byte目
        balance = (balance << 8) + buf[22]; // 10 byte目
        // 残高表示
        printBalanceLCD("PASSNET", &balance);
      }
    }
  }
  
  // 共通領域
  else if(rcs620s.polling(COMMON_SYSTEM_CODE)){
    // Edy
    if(requestService(EDY_SERVICE_CODE)){
      if(readEncryption(EDY_SERVICE_CODE, 0, buf)){
        // Big Endianで入っているEdyの残高を取り出す
        balance = buf[26];                  // 14 byte目
        balance = (balance << 8) + buf[27]; // 15 byte目
        // 残高表示
        printBalanceLCD("Edy", &balance);
      }
    }
    
    // nanaco
    if(requestService(NANACO_SERVICE_CODE)){
      if(readEncryption(NANACO_SERVICE_CODE, 0, buf)){
        // Big Endianで入っているNanacoの残高を取り出す
        balance = buf[17];                  // 5 byte目
        balance = (balance << 8) + buf[18]; // 6 byte目
        balance = (balance << 8) + buf[19]; // 7 byte目
        balance = (balance << 8) + buf[20]; // 8 byte目
        // 残高表示
        printBalanceLCD("nanaco", &balance);
      }
    }
    
    // waon
    if(requestService(WAON_SERVICE_CODE)){
      if(readEncryption(WAON_SERVICE_CODE, 1, buf)){
        // Big Endianで入っているWaonの残高を取り出す
        balance = buf[17];                  // 21 byte目
        balance = (balance << 8) + buf[18]; // 22 byte目
        balance = (balance << 8) + buf[19]; // 23 byte目
        balance = balance & 0x7FFFE0;       // 残高18bit分のみ論理積で取り出す
        balance = balance >> 5;             // 5bit分ビットシフト
        // 残高表示
        printBalanceLCD("waon", &balance);
      }
    }
  }
  
  // デフォルト表示
  else{
    LCD.clear();
    LCD.move(0);
    LCD.print("Touch");
    LCD.move(0x44);
    LCD.print("Card");
  }
  
  rcs620s.rfOff();
  delay(POLLING_INTERVAL);
}

// request service
int requestService(uint16_t serviceCode){
  int ret;
  uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN];
  uint8_t responseLen = 0;
  
  buf[0] = 0x02;
  memcpy(buf + 1, rcs620s.idm, 8);
  buf[9] = 0x01;
  buf[10] = (uint8_t)((serviceCode >> 0) & 0xff);
  buf[11] = (uint8_t)((serviceCode >> 8) & 0xff);

  ret = rcs620s.cardCommand(buf, 12, buf, &responseLen);
  
  if(!ret || (responseLen != 12) || (buf[0] != 0x03) ||
      (memcmp(buf + 1, rcs620s.idm, 8) != 0) || ((buf[10] == 0xff) && (buf[11] == 0xff))) {
    return 0;
  }

  return 1;
}

int readEncryption(uint16_t serviceCode, uint8_t blockNumber, uint8_t *buf){
  int ret;
  uint8_t responseLen = 0;
  
  buf[0] = 0x06;
  memcpy(buf + 1, rcs620s.idm, 8);
  buf[9] = 0x01; // サービス数
  buf[10] = (uint8_t)((serviceCode >> 0) & 0xff);
  buf[11] = (uint8_t)((serviceCode >> 8) & 0xff);
  buf[12] = 0x01; // ブロック数
  buf[13] = 0x80;
  buf[14] = blockNumber;

  ret = rcs620s.cardCommand(buf, 15, buf, &responseLen);

  if (!ret || (responseLen != 28) || (buf[0] != 0x07) ||
      (memcmp(buf + 1, rcs620s.idm, 8) != 0)) {
    return 0;
  }

  return 1;
}

void printBalanceLCD(char *card_name, uint32_t *balance){
  char result[8];
  sprintf(result, "%u", *balance);
  LCD.clear();
  LCD.move(0);
  LCD.print(card_name);
  LCD.move(0x40);
  LCD.print(0xE6);
  LCD.print(0x20);
  LCD.print(result);
  return;
}

作成過程

Arduino Pro miniとチップ抵抗のハンダ付けが終わった写真

ミニI2C液晶モジュールとチップコンデンサのハンダ付けが終わった写真

ミニI2C液晶モジュールとコンデンサのハンダ付けが終わった写真

全ての組立終わり、スケッチの書き込みの準備中の写真

作成例

作成したハードにスケッチを書き込み、調度よさそうな大きさのケースに格納してみました。



機能拡張のヒント

地方の各種交通機関のFeliCaカードに対応させても良いかもしれません。
残高と一緒に経由駅を表示させたり購入履歴を表示できるようにしても良いかもしれません。
おさいふケータイなどの三者間通信に対応しても面白いかもしれません。

各種パーツの図の配布

今回Arduino Pro miniやミニI2C液晶モジュールなどの図を作成しましたのでpng形式で提供させて頂きます。
FeliCa残高照会機 パーツ一覧

参考

かお(・v・)もじ SF Checker – アトリエのどか
第四章 低電圧I2C液晶ディスプレイ
felicalib プロジェクト Wiki
ICカードのフォーマット解析
I2C液晶ライブラリ – Okiraku Programming

RT58iでVPN接続し外部からWOLを行う

RT58iはデフォルトではLAN外からのMagic Packetを通さないためWOLできない。
調べていたら下記のサイトにて設定が紹介されていたので参考にさせていただいた。

WOL(Wake On Lan)のMagic Packetをルーター越えさせる方法。

下記のコマンドを実行することでMagic Packetを通過できるようになる。
ip lan1 wol relay broadcast

VPNは下記の記事を参考にしてください。
今更ながらRT58iでVPN設定を行なってみた

IDC-BB延長フラットケーブルの自作

マザーボード上のCOMポートをブラケット上にRS-232で提供できるようにするケーブルが裏配線したところ微妙に足りない事が判明したため困っていたところ、下記のサイトで延長ケーブルの自作を行っているサイトがあったのでそれを参考に延長ケーブルの作製を行った。

インテルマザーシリアル延長

すでにIDC-BBは二本手元にあったので一本をぶった切って延長ケーブルに使う事にした。

使用したソケットはF3BD10PD254RMCと呼ばれるヒロセ電機の製品で、秋葉原のマルツパーツ館にて取り扱いがある。

圧着機が手元に無かったため、LANケーブル用の圧着機の柄に挟み圧着した。

完成

接続時の様子

仕様・組み立てマニュアル
中継タイプリボンケーブル用コネクタ(HIF3B中継タイプ)

今更ながらRT58iでVPN設定を行なってみた

まずは普通に下記の通りに簡単設定画面のリンクをクリックして設定する。
「詳細設定と情報」> 「VPN接続の設定」> 「PPTPを使用したパスワード認証のリモートアクセスVPNサーバ(Anonymous)」
※ 基本的には適当に設定して問題ないが”PPTP暗号鍵生成の認証方式”は”MS-CHAP v2で認証する”としておくこと。

ただこのままではなぜかVPNに繋げられないので次のような処理を行う。

次は、下記の簡単設定画面のリンクをクリックしてコマンドを実行する。
「詳細設定と情報」> 「コマンドの実行」

実行するコマンド
pp select anonymous
ppp ipcp msext on
nat descriptor masquerade static 1 1 192.168.100.1 tcp 1723
nat descriptor masquerade static 1 2 192.168.100.1 gre

上二行は名前解決に関するコマンド
下二行はNATの設定に関するコマンド

パラメータは各自自分の環境に合わせてください。
そんな感じで多分接続出来るようになると思います。

参考
iPhone4→RT58i VPN(PPTP)接続のコツ
リモートアクセス(PPTP)で社外から社内LANにアクセスしたい

WordPress広告自動挿入

今までAdmanというプラグインを利用していましたが、最近下記のようなエラーが出ているのを発見したので調べました。

Warning: stripcslashes() expects parameter 1 to be string, array given in /var/www/html/wp-content/plugins/adman/adman.php on line 143

Admanの他に新しくNew Admanというプラグインを同じ開発者が公開していたのでインストールしてみたところエラーも出ず正常に動いているようです。

対ボット+外国人用 平仮名+和製漢字CAPTCHA Perl用ライブラリ

―――――――――――――――――――――――――――――――――――――
【ソフト名】かんたん日本語画像認証(アルファベットも可)
【著作権者】ORBIT
【制作日】2011年07月05日
【種 別】Perlモジュール
【連絡先】https://www.orsx.net/blog/
【配布元】https://www.orsx.net/blog/
【圧縮形式】zip
【動作環境】Perl5とImage::Magick、sazanami-gothicをインストールしたLinux
Windows系OSでは動作しない事が確認されております。
【開発環境】
CentOS5.6 perl, v5.8.8
―――――――――――――――――――――――――――――――――――――
≪著作権および免責事項≫

 本ソフトはフリーソフトです。自由にご使用ください。なお,著作権は作者
であるORBITが保有しています。

 このソフトウェアを使用したことによって生じたすべての障害・損害・不具
合等に関しては、私と私の関係者および私の所属するいかなる団体・組織とも、
一切の責任を負いません。各自の責任においてご使用ください。

・はじめに
 新しいフォームを作った時の副産物の公開です。わずか数行で画像認証機能
を実装することが可能です。
 海外のスパム・人間、共に日本特有の和製漢字・平仮名は入力できないこと
に着目し今回の日本語画像認証を作成しました。

・ファイル構成
readme.txt 当取説ファイル
JCaptcha.pm 本ソフト
background.jpg 画像認証用の下地となる画像ファイル
tmp/imgs/ 作成済みの画像ファイルを保存するディレクトリ

sazanami-gothic.ttf
↑さざなみゴシック(フォント) ライセンスの関係上同封しておりません。

・導入方法
efont プロジェクト日本語トップページ – SourceForge.JP
http://sourceforge.jp/projects/efont/
よりさざなみフォントをダウンロードし、sazanami-gothic.ttfのみ取り出し
ファイル構成のようにJCaptcha.pmと同じディレクトリに格納する。

 画像認証機能を追加したい対象のプログラムと同じディレクトリに上記、
ファイル構成を設置する。

・利用方法
下記の使用例を参考にプログラムに組み込んでください。

簡単な使用例

#!/usr/bin/perl

# 当モジュールを呼び出し
use JCaptcha;

# オブジェクトの生成
my $obj = JCaptcha->new(
		Key    => RX, # 鍵を指定
		Lang   => JP, # 言語を指定(JP/ENG)
		Length => 5   # 文字の長さを指定
	);

# 認証画像作成用メソッドを呼び出す
my $tmp1 = $obj->makeimgcode(); # 認証用画像を作成し、その画像までのパスを受ける
print "$tmp1\n"; # 認証画像までのパスを受け取る

#==============================================#
# 画像を表示し、入力を行う処理を書いてください #
#==============================================#

# 認証
# 入力された文字列で認証を行い、正しければ"1"間違っていれば"0"を受ける
#(受け渡す文字列はフラグ無しUTF-8とする)
my $tmp2 = $obj->enimgcode('入力を受けた文字列');
print "$tmp2\n"; # if文などで認証の成功失敗を判別する

・履歴

2011年09月05日 Ver 1.0.0 公開

作成された画像認証用画像の一例

ライセンス形態:GPL
Download:JCaptcha