さくらVPS で Ubuntu 10.04 (LTS) から 11.10 にアップグレードするには

さくらのVPSがリニューアルしたので移行するべく新しい VPS を同環境にセットアップしようとしたら意外に嵌まったのでメモ。 まずはカスタムOSインストールで Ubuntu 10.04 を入れておく。 続いて /etc/update-manager/release-upgrades を編集してアップグレードターゲットを LTS(長期サポート版) から normal(通常)に変更する。 # Default behavior for the release upgrader. [DEFAULT] # Default prompting behavior, valid options: # never - Never check for a new release. # normal - Check to see if a new release is available. If more than one new # release is found, the release upgrader will attempt to upgrade to # the release that immediately succeeds the currently-running # release. # lts - Check to see if a new LTS release is available. The upgrader # will attempt to upgrade to the first LTS release available after # the currently-running one. Note that this option should not be # used if the currently-running release is not itself an LTS # release, since in that case the upgrader won’t be able to # determine if a newer release is available. Prompt=normal ...

2012年3月30日 · Toshimitsu Takahashi

Ajax Web ぺージを検索ボットがクロールできるコンテンツを返すようにする

最近は様々な Web サイトで Ajax が当たり前のように使われています。 ページ内のコンテンツをほぼ全てAjaxで別途ロードするようなサイトの場合、検索エンジンのロボットにはすっからかんのページがクロールされてしまいます。 そのために、サーバ側で予めブラウザで画面をロードした後のHTMLを生成して返すのが良いみたいです。 Googleのサイトにも AJAX クロール: ウェブマスターおよびデベロッパー向けガイド - ウェブマスター ツール ヘルプ のようなページがあり、HTML スナップショットをクローラーに提供するように提案されています。 また下記の英語サイトでは具体的な HTML snapshot の実装方法例が出ていて、その中で Java の HtmlUnit というものが紹介されています。 How do I create an HTML snapshot? - Webmasters — Google Developers これを使って実際に今、Nginx とアプリケーションサーバで動かしている Web サイトに、 クローラーのアクセス時だけ Nginx → HtmlUnit の Java Web アプリサーバ → アプリケーションサーバと経由して HTML スナップショットを返すようにしてみました。 HtmlUnit のサイト: http://htmlunit.sourceforge.net/ サーブレットの実装 HtmlStaticServlet クラスは、GET で受け取ったパスをそのまま本来のアプリケーションサーバにリクエストして返すものです。 getAjaxPage メソッド内で FireFox 3.6 で JavaScript オン、CSS オフでアクセスしてロード後2秒間処理させて結果のXHTMLを返しています。 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlStaticServlet extends HttpServlet { private static final String ROOT_URI = "http://localhost:8081"; private static final long serialVersionUID = 172403081095751054L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = ROOT_URI + request.getRequestURI(); System.out.println(url); String htmlContent = getAjaxPage(url); response.setContentType("text/html; charset=UTF-8"); PrintWriter writer = response.getWriter(); if (htmlContent != null) { response.setStatus(HttpServletResponse.SC_OK); writer.print(htmlContent); } else { response.setStatus(HttpServletResponse.SC\_NO\_CONTENT); } } private String getAjaxPage(String url) { WebClient webClient = new WebClient(BrowserVersion.FIREFOX\_3\_6); webClient.setJavaScriptEnabled(true); webClient.setCssEnabled(false); webClient.setScriptPreProcessor(new IgonoredGAScriptPreProcessor()); try { HtmlPage page = webClient.getPage(url); webClient.waitForBackgroundJavaScriptStartingBefore(2000); return page.getDocumentElement().asXml(); } catch (Exception e) { return null; } finally { webClient.closeAllWindows(); } } } Google Analyticsの無視 このままだとスナップショット生成時にGoogle Anlyticsへのアクセスが発生してしまいます。 こちらを無視するように JavaScritpのファイルロード時の処理を前もって処理する ScriptPreProcessor クラスのサブクラスを作っておきます。 ...

2012年3月17日 · Toshimitsu Takahashi

Postfix でバーチャルドメインで受けたメールを指定アドレスに転送するには

そのホストのメインドメインとは別のドメインのメールアドレスにメールが来たら、別のメールアドレスに転送する方法について。 まずメインドメインとは別のドメインを受けるには、virtual_aliases_domains に設定します。さらにそのドメインのメールをどう処理するか virtual_alias_maps に指定したファイルやデータベースでマッピイングします。 メイン設定 /etc/postfix/main.cf virtual_alias_domains = another.com virtual_alias_maps = hash:/etc/postfix/virtual /etc/postfix/virtual マップ設定を編集する。下記は receive@another.com を to@forward.com に転送する設定です。 receive@another.com to@forward.com 設定反映 postmap でマップ設定を反映して、Postfix を再起動します。 # postmap /etc/postfix/virtual # /etc/init.d/postfix restart To: が欠落しないようするには 上記の設定だと転送されたメールの To: undisclosed-recipients:; なります。これだと受け取ったときにどこ宛のメールかわかりません。調べたところバーチャルドメインのみを使った場合、しょうがないようです。 それでは困るので、一旦エイリアスを経由させたところうまくいきました。 /etc/postfix/virtual マップ設定を編集する。下記は receive@another.com を to@forward.com ではなくローカルの viaanother に渡すようにします。 receive@another.com viaanother viaanother に来たものを to@forward.com に転送するようにします。 /etc/aliases viaanother: to@forward.com を追記して # newaliases で反映です。 これで To: には元の宛先が残ったまま転送されるようになりました。当然 エイリアスではなくメールボックス内で .forward 設定することも可能です。

2012年2月5日 · Toshimitsu Takahashi

US SIMフリー版 iPhone 4S を輸入してドコモの Xi 契約でテザリングするまで

まず前提として私は iPhone これまで持ったことがありません(iPhone アプリを出していますが http://itunes.apple.com/jp/artist/tilfin-ltd/id371277701)でした。これまで iPod touch + Pocket WiFiで乗り切っていましたが、ドコモならテザリングできると知り Xi プランで契約すると結構お手頃ということでチャレンジしました。 なお予め断っておくと、US版の SIMフリーを日本で修理できるかは不明です、多分難しいでしょう。ドコモ側も自分たちの出している機種以外の利用は保証外と言われました。ということで、一般の方(非開発者)が特にメインの携帯電話として使うのはかなりリスキーだと思います。 先に、あまりネットでみかけなかった又は不明な事柄で、判明したことを列挙しておきます。 「SIMフリー版でもiPhone 4Sは、SoftBankかauのSIMなどiPhoneキャリアのSIMカードでないと初期アクティベーションできない」というのは嘘です。いきなりドコモのminiUIMでアクティベーションできました。 Xi の ISP(プロバイダ)は Mopera U にした方が良い。家の回線がぷららで、ここで Xi APN も提供していたんですが、認証できませんでした。素直に Mopera にしましょう。(iOSでは認証方式の選択ができないのが原因な気がします。) 知ってる方には当たり前の話だと思いますが、端末をアクティベーションしないと何もできません。SIMフリー版iPhone 4SをiPod touch的に使うことは、何らかのSIMカードでアクティベートしないとダメです。 「メッセージ」アプリでドコモの SMS が使えます。 輸入するまで まず購入したのは Official Apple Store - Buy iPhone 5s, iPhone 5c, iPad Air, iPad mini, MacBook Pro, and more です。ただ直接購入したのではなく、Exclusively for PayPal Customers | HopShopGo という販売代行サイトを利用しました。ここは PayPal で決済してくれるため非常に重宝しています。 AdMob などから米ドル建てで PayPal に報酬を受け取っている場合、現状の超円高ドル安では、なるべき米ドルのまま取引したいわけで、それが可能になります。iPhone 4S 16GB SIM Unlocked の MD237LL/A モデルを買うのに 730 ドルくらい PayPal から払いました。そして DHL で送られてきて、輸入内国消費税や手数料を2000円ほど払いました。 ...

2012年1月5日 · Toshimitsu Takahashi

Apache SSL だったものを Nginx をフロントにおいてリバースプロキシ化したときの設定

さくらの VPS (Ubuntu) で Apache に 80 (http), 443 (https) で Listen させていました。バーチャルホストでいくつかのドメインをこれで処理していましたが、フロントに Nginx を置いて必要な処理だけ Apache にすることにしました。 そこで SSL を Nginx で動かすにあたって、リバースプロキシ下でも Redmine など https 設定で動くように設定したときのメモです。 SSL証明書、秘密鍵の設定 Apache の /etc/apache2/ssl.crt/server.crt と ca-bundle.crt を Nginx の /etc/nginx/ssl/cert.pem に移す $ cd /etc/apache2/ssl.crt # cat server.crt ca-bundle.crt > /etc/nginx/ssl/cert.pem ※CA証明書を別にできないのでサーバ証明書に追記する。 Apache の /etc/apache2/ssl.key/server.key を Nginx の /etc/nginx/ssl/server.key にコピー $ cp /etc/apache2/ssl.key/server.key /etc/nginx/ssl/cert.key Nginx の設定 Apache は 8080 (http) ポートで動かす。Nginx の 443 (https) をそこにリバースプロキシする。 # HTTPS server # server { listen 443; server_name www.example.com; access_log off; ssl on; ssl_certificate ssl/cert.pem; ssl\_certificate\_key ssl/cert.key; ssl\_session\_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl\_prefer\_server_ciphers on; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Proto https; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } proxy_set_header でいくつかのヘッダを Apache に渡すことで https 設定の Redmine などが動くようになる。

2011年12月31日 · Toshimitsu Takahashi

Ubuntu の Redmine を 1.3.0 にアップグレードした

Redmine 1.2.0 から 1.3.0 アップデートするのに色々とハマったのでメモしておく。 Redmine 1.3.x で必要となる Rails などの依存バージョンは以下の通りです。 Ruby 1.8.7 Rails 2.3.14 Rack 1.1.1 参照)Redmineのインストール — Redmine Guide 日本語訳 Ruby と Rails バージョン $ /usr/bin/ruby -v ruby 1.8.7 (2011-06-30 patchlevel 352) \[i686-linux\] $ /usr/bin/rails -v Rails 2.3.14 以上は、Debian Package(apt-get)で入れたもの。 Rubygems をダウンクレード Rubygems のバージョンが 1.8.13 だったが、Rails が対応していないため Rails 2.3.14が対応している 1.5系の 1.5.3 に替える。 $ sudo gem install rubygems-update -v 1.5.3 Fetching: rubygems-update-1.5.3.gem (100%) Successfully installed rubygems-update-1.5.3 1 gem installed Installing ri documentation for rubygems-update-1.5.3... Installing RDoc documentation for rubygems-update-1.5.3... $ sudo gem uninstall rubygems-update Select gem to uninstall: 1\. rubygems-update-1.5.3 2\. rubygems-update-1.8.13 3\. All versions \> 2 Successfully uninstalled rubygems-update-1.8.13 $ sudo update_rubygems RubyGems 1.5.3 installed &#65279;=== 1.5.3 / 2011-02-26 NOTE: RubyGems 1.5.0 and 1.5.1 have a broken <tt>gem update --system</tt>. To upgrade you'll need to use the manual upgrade recipe. Using sudo/su as appropriate: $ gem install rubygems-update $ update_rubygems Bug Fixes: \* Fix for a bug in Syck which causes install failures for gems packaged with Psych. Bug #28965 by Aaron Patterson. \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- RubyGems installed the following executables: /usr/bin/gem1.8 Rack, Rake, RDoc をインストール $ sudo gem install rack -v=1.1.2 $ sudo gem install rake -v=0.8.7 $ sudo gem install rdoc -v=2.4.3 新 Redmine の展開 RubyForge: Redmine: Project Filelist から 1.3.0 の tar.gz をダウンロードして展開。 ...

2011年12月29日 · Toshimitsu Takahashi

AKB48 の Google+ アクティビティデータを MongoDB で MapReduce してみた

MapReduce について実際やってみたことがなかったので、MongoDB で試しそうと思っていました。 そんななか、AKB48 の(18歳以上?の)メンバーが Google+ を開始しました。これで「バルス」以上に定時でかつてない負荷が Google+ にかかり始めたと思われます。ということで、扱うにはもってこいなデータなのでこれを使うことにしました。 Google+ API は今のところデータのGETしかできないようですが、それで充分です。 とりあえずメンバーの Googel+ のID(?)と名前をMongoDB のコレクションに突っ込みます。 それを元に定期的に各メンバーのアクティビティ(活動のエントリ)を取得しては、 JSON をそのままほぼそのまま別のコレクションに突っ込みました。 メンバーの取得とセット AKB48 Now on Google+ のHTMLを適当にパースして突っ込みました。 MongoDB シェルで見ると以下のように入ってます。 $ /proj/arble/mongodb/bin/mongo MongoDB shell version: 2.0.0 connecting to: test \> db.idols.find({}, { "_id":0, "id":1, "name":1 }) { "id" : "108406705498777962659", "name" : "板野友美" } { "id" : "112077362806147944184", "name" : "梅田彩佳" } { "id" : "105229500895781124316", "name" : "大島優子" } { "id" : "108367535733172853340", "name" : "大家志津香" } { "id" : "116324240483798147615", "name" : "大矢真那" } { "id" : "107135851528812577523", "name" : "小木曽汐莉" } { "id" : "111145641865855965824", "name" : "小野晴香" } { "id" : "110230842586402039931", "name" : "河西智美" } { "id" : "109547251260290757268", "name" : "柏木由紀" } { "id" : "108485060451296256117", "name" : "片山陽加" } has more Google+ からデータの取り込み Activities: list - Google+ Platform — Google Developers を使うと、ユーザのアクティビティがリストで取得できます。userId に上記の idを、collection に “public” と指定します。 ...

2011年12月11日 · Toshimitsu Takahashi

Ruby で Windows Azure Storage テーブルを操作するには

Github にある johnnyhalife/waz-storage · GitHub ライブラリを使うと簡単に操作できます。Windows Azure Storage REST API のラッパーになってます。 Rubygems でインストール $ sudo gem install waz-storage Fetching: mime-types-1.17.2.gem (100%) Fetching: rest-client-1.6.7.gem (100%) Fetching: ruby-hmac-0.4.0.gem (100%) Fetching: waz-storage-1.1.1.gem (100%) Successfully installed mime-types-1.17.2 Successfully installed rest-client-1.6.7 Successfully installed ruby-hmac-0.4.0 Successfully installed waz-storage-1.1.1 4 gems installed Installing ri documentation for mime-types-1.17.2... Installing ri documentation for rest-client-1.6.7... Installing ri documentation for ruby-hmac-0.4.0... Installing ri documentation for waz-storage-1.1.1... Installing RDoc documentation for mime-types-1.17.2... Installing RDoc documentation for rest-client-1.6.7... Installing RDoc documentation for ruby-hmac-0.4.0... Installing RDoc documentation for waz-storage-1.1.1... 認証 waz-storage ライブラリの認証方法は Base のクラスメソッド establish_connection! にアカウント名、アクセスキー、SSLを使うかどうかをハッシュで渡します。 ...

2011年12月10日 · Toshimitsu Takahashi

Kindle Fireを取り寄せたのでRoot奪取しないでどこまでできるかレポート

Amazon.com 米国国内でしか買えないらしい Amazon の Kindle Fire ですが、Hop・Shop・Go 使って購入しました。 途中で関税かかってしまいましたが、まあ iPod touch 程度のお値段なんで安いです。 ダンボの中身は非常に簡素 サイズは Galaxy Tab と同じ7インチのようです。今まで Android 端末は WSL JAPAN Xvision(P10AN01) だったので、液晶は見違えるほどよく感じます。ただ、Kindleとして持つと明らかに重いです。ちょっと片手で持って読むというのは長時間は辛い気がします。ただラバーで覆われているため、カバー要らずでフィット感は良好です(DSっぽい)。 Lock画面の画像は毎回変わるがCoolなものばかり。 Kindle Fire は、Androidではあるものの Amazon の独自仕様です。しかし、既にOSのソースコードが公開されているし、多分相当Hackされるはずなので文鎮化することは無いと期待しています。 アクティベートにはAmazon.com のアカウントが必要です。ただ、自分の場合登録先の住所が日本であるため、アプリを専用マーケットからダウンロードしてインストールすることはできません。米国内向けにしか売ってないためこれで通常は問題無いのですが、日本で使うにはほとんど何もできないことになります。 Android 端末は Rootを奪取すればなんでも頑張ればいけますが、とりあえずやらずにどれだけ使えるか確認してみました。 Docs(電子書籍) 電子書籍に関しては、O’relly.com の本が mobi ファイルを入れてみました。epubには対応していません。これはアクティベートすると、xxxxx@kindle.com という受付メールアドレスが与えられるので、ここにアカウントのメールアドレスから送信すると、ダウンロードできます。クラウド経由な手法です。 Music, Videoなど マイクロUSBケーブルを持ってなかったので急いで購入しました。これでPCに繋ぐとパッと見てわかるフォルダ構成なので、Music, Videoなどそれぞれのフォルダにファイルコピーすれば視聴可能です。Webブラウザからダウンロードすることはできないようです。 Apps(アプリケーション) 写真用のGalleryなどのいくつかのアプリは、プレインストールっぽく(初回起動時にダウンロード)なっており、最低限のアプリをインストールできるようにはなっています。ただ、それ以外のものは apk ファイルをブラウザからダウンロードしてインストールするしかありません。そのためにはSettingからソース不明のアプリをインストールできるように設定しておきます。 問題は apk ファイルをどう用意するかですが、自分の場合は既に Android 端末を持っていたので、そこで Root Uninstaller というアプリを使って、Twitterなどのアプリを「Backup」する方法でapkファイルをSD カード経由で取り出しました。Angry Birdsなどこの方法でインストールできました。 iOSアプリとしても有名な Pulse がプレインストールされている。 Kindle Fireには端末自体に Back ボタンや Home ボタンはなく、下からスライドして画面上に出る。 まとめ Root取らずとも、Docs, Music, Video, Apps, Web とほぼ一通りの機能は使えました。 Android をある程度 Hack した経験がないと辛いでしょう。 最後にもう一度、本体にマイクロUSBケーブルは付いていませんが必須です。 ちょっと重いかな。

2011年11月26日 · Toshimitsu Takahashi

Express などで Redis でセッション管理した場合のDBナンバーの指定方法

Node.js + Express な環境でセッション情報を Redis に置くようにしていた。デフォルトのdbに入れていたので別のにしようと思い調べたところ、Redis はナンバリングで DB を指定することがわかった。 Express の Guide には設定方法が載っていなかったが、使用するライブラリ connect-redis の READMEからわかった。 visionmedia/connect-redis · GitHub に書いてあるとおり、RedisStoreのコンストラクタ引数でオプション指定できるので、db としてセットする。 // Configuration app.configure(function(){ … app.use(express.session({ store : new RedisStore({ db: 10 }) })); … }); 上記の例では db number を 10 としている。host, port なども同様に指定できる。 結果的には Express 自体の話ではないけど、そのために調べたので。

2011年11月25日 · Toshimitsu Takahashi