ITunes Matchが止まる件

iTunes Matchはじまりましたねー。
全部の音楽データをMacに入れてる時は容量をセーブしたくて、USのアカウントで使ってみたのだけどその時は日本のiTunes Storeで購入したDRMで保護されたデータがマッチもアップロードをされずやめてしまいました。

で、今回日本でサービスが始まったということで特に必要性は感じなかったけど、せっかくなので初日にサインアップして御多分にもれず途中で止まるというトラブルに巻き込まれまくりました。

1、Step1が止まる問題は、「iTunes Matchをアップデート」でだいたい解決します。
これはUSバージョンでも発生するようで、英語でのツイートもちょくちょく見ます。
スクリーンショット 2014-05-05 15.59.44
スクリーンショット 2014-05-05 16.24.51

2、Step2の進行中だけど、ちょくちょく止まる問題は、サインアウト・サインインを繰り返せばだいたい解決します。
これもUSバージョンでも初回は発生しました。2〜3回繰り返した気がします。

3、2をやっても一向に進まない場合、これがかなり困りモノです。2000曲中1995曲くらい完了してあと少しで進まないアレです。
「iCloudの状況」を表示させてどの曲で詰まってるか確認します。

スクリーンショット 2014-05-05 16.28.35

スクリーンショット 2014-05-05 16.06.14

詰まってる曲を一旦iTunesから削除してマッチングを再開させます。これで完了すれば、この曲が原因なのが確定ですね。 その際Step3は光の速さで完了します。処理的には並列で動いてるけど、表示は単一なのでStep2だったということでしょうか。Step3のアップロードのアクションは既に終わってる状態です。

私の場合25曲程がこのどうしょうもないファイルたちでした。
うち12曲はなんとしてもアップロードさせたい思い出アルバムの曲たちです。13曲入りのアルバムの12曲だけがアップロードできない状態でした。
タグを弄ってもAACにしてもWAVにしてもダメなのでやっぱり波形の問題?と思いAudacityという波形編集ソフトでフィルターかけてみたけどダメ。
最終的に一応アップロード可能なファイルができたのだけど、曲の最後7秒ほどを削ったバージョン。3秒ほどではダメ。アップロードに失敗してしまいます。
ただ7秒だと曲が削られてしまうんですよね。残念。さすがにこれは採用できず未だアップロードできないままです。

これがアップルのソフトウェアクオリティというべきか、長年のアップル信者の私もさすがにがっかりです。
以前なら「こういうところもひっくるめてアップルの良さ!」と言ってたになあ。

GhostをHerokuで動かす

noteにせよMediumにせよGhostにせよシングルカラムのブログが流行ってますね。だいぶ前にGhost入れてみてフーンで終わってたので改めてインストールする事にしました。
Herokuはなんだかんだで1年に1回くらい使うけど全然使い方が頭に入らないので今回整理の意味も込めて書いていきます。

これがないと話にならないので、まずはGhostをダウンロードします。
「Ghost」をGoogleで検索すると「Image for Ghost」とか出てきて心臓に悪いですね。

ダウンロードしてきたGhostを解凍・展開します。5/1現在バージョンは0.4.2。
展開したGhostのディレクトリに移動します。

$ cd /path/to/ghost/
$ npm install
$ npm start
$ open http://127.0.0.1:2368/

node.jsが入ってることが前提だけど、これだけどとりあえず動きます。

これをパブリックに公開する為、Herokuにデプロイします。

まずは、デプロイ後に実行されるコマンドを記述したProcfileを作成します。

web: NODE_ENV=production node index.js

いきなりだけど、こけるの承知でHerokuへデプロイする準備にとりかかります。
ProcfileもひっくるめてCommitします。後述のHeroku createする前にcommitしておいた方が後々楽です。

$ git init
$ git add .
$ git commit -m "Initial Commit"

ローカルにHerokuコマンドは入ってるけど鍵とかどうなってるか忘れたので一旦鍵をリセットして新しいのを作成・送信。

$ heroku keys:clear
$ ssh-keygen -t rsa -C "メールアドレス"

.ssh/cofigに下記を追記

IdentityFile ~/.ssh/id_rsa

Herokuへログインします。

$ heroku login

「君のローカルに公開鍵みつかったけどどれを転送する?」
とでるのでさっき生成した公開鍵をHerokuに転送する。

鍵の準備が整ったのでアプリを作成します。
Herokuのサイトからももちろんできるけど、コンソールを開いてるのでコンソールから作ります。
アプリ名はなんでもいいので、

$ heroku create

を実行。

Creating hoge-moge-7151... done, region is us
http://hoge-moge-7151.herokuapp.com/ | git@heroku.com:hoge-moge-7151.git
Git remote heroku added

みたいに一瞬で作成される。
gitのリポジトリを事前につくってたので、Herokuのリモートリポジトリも追加されます。

これで兎にも角にもデプロイする準備ができたのでpushします。

$ git push heroku master
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:hoge-moge-7151.git'

DBがsqliteのままなのでこける
Railsと同じくGhostはsqlite3だけど、Herokuではsqliteが使えないのでPostgresを使います。

まずnpmでpgモジュールがインストールされるようにpackage.jsonを編集。

"dependencies": {
        "pg": "latest”,
        "bcryptjs": "0.7.10",
        "bookshelf": "0.6.1”,

config.jsにPostgresの設定を書きたいところだけど、デフォルトでPostgresが用意されているわけでないので、一旦Herokuのサイトに行きPostgresのアドオンをインストールします。
アドオン一覧のページに行って、Heroku Postgresを追加。プランはFreeのにしておきます。

追加されたPostgresアドオンの詳細ページ(Connection Setting)に接続情報が記載されています。このページを開きながらコンソールに戻りconfig.jsの設定を行います。
編集するのはもちろんProductionの方です。

以下のようになります。

    production: {
        url: 'http://hoge-moge-7151.herokuapp.com',
        mail: {},
        database: {
            client: 'postgres',
            connection: {
              host: process.env.POSTGRES_HOST,
              user: process.env.POSTGRES_USER,
              password: process.env.POSTGRES_PASSWORD,
              database: process.env.POSTGRES_DATABASE,
              port: '5432'
            },
            debug: false
        },
        server: {
            // Host to be passed to node's `net.Server#listen()`
            host: '0.0.0.0',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port: process.env.PORT
        }
    },

DBだけでなくURLやnodeのポートなんかも設定を変更しています。
DBの接続情報はHerokuの環境変数からとることにします。環境変数へ登録するのは先程のConnection Settingの情報ですね。

heroku config:set POSTGRES_HOST=****
heroku config:set POSTGRES_USER=****
heroku config:set POSTGRES_PASSWORD=****
heroku config:set POSTGRES_DATABASE=****

これでPostgresの設定も完了。

これで一応動くけど、認証メールが送れないとGhostの管理画面で怒られ続けられます。
自分にしか飛ばさないので、SMTPをGmailにしておきます。

mail: {
    transport: 'SMTP',
    options: {
        service: 'Gmail',
        auth: {
            user: ‘hoge@gmail.com',
            pass: ‘*******'
        }
    }
},

再度pushします。

$ git push heroku master
 -----> Launching... done, v13
      'http://hoge-moge-7151.herokuapp.com/ deployed to Heroku

To git@heroku.com:hoge-moge-7151.git
   79bed5c..7675064  master -> master
$ open http://hoge-moge-7151.herokuapp.com/

問題なく開けれたら成功ですね。
個人的には、Herokuは開発環境/グローバルでのテストとしてはいいけど、痒いところに手が届かず、なかなか公開サービスには使えないと思ってたけどブログ程度ならいい気がしてきた。
開発環境/グローバルでのテストに特化したPaaSがあったらいいのにな。昔のGeocitiesみたいに広告入るPaaS。需要あると思う。