Tweetbot で既読位置を同期する

Tweetbot では、デバイス間で既読位置の同期が可能です。

設定方法

※執筆時点の各Tweetbotのバージョン

  • Tweetbot for Mac: 2.2
  • Tweetbot for iOS: 4.1

Mac

Tweetbot for Mac では Preferences (⌘+,) から Account -> Services -> Sync で設定します。

f:id:chrolis:20151119123329p:plain

同期方法には iCloud と Tweet Marker があり、それぞれ同期される内容に若干の差異があるようです。(かなり古い情報なので今は違うかもしれない)

なお、Visual Sync Marker を有効にすると、同期されている位置にこんな感じのマークがつきます

f:id:chrolis:20151119123343p:plain

iOS

Tweetbot for iOS では アカウント管理画面 -> 設定 -> アカウント設定 から設定します。 (選択する同期方法は各デバイス間で一致させる必要があります。)

f:id:chrolis:20151119123449p:plain

また、複数のアカウントを同期したい場合は、各アカウントごとに同期設定が必要です。

どうなるの?

例えばMac版で Timeline の 2015/11/19 12:00:00 まで既読になっている状態でiOS版を起動すると、起動直後に同じ位置まで自動的にジャンプします。超便利!!

(Tweetbot を使い出してもう3年ほどですが、今まで知らなかった…)

補足: iCloud 同期

iCloud 同期にする場合、あらかじめ同期対象の各デバイスで以下の設定が必要です。

  1. iCloud Drive を有効化
  2. iCloud Drive 上への Tweetbot による保存を許可

Amazon S3 は BitTorrent プロトコルに対応している

CloudFormation のテンプレートを書いている時に S3 に設定可能な属性ってどんなのあったっけなと思って awscli で aws s3api help を眺めていたんですが

f:id:chrolis:20151118164643p:plain

ふむふむ

f:id:chrolis:20151118163017p:plain

むっ

f:id:chrolis:20151118163029p:plain

ん?

f:id:chrolis:20151118163530p:plain

!?!?!?

えっ S3 って torrent 対応してるの!!!??

ドキュメント読んだ

要点をまとめてみる:

  • 追加料金なし(通常の利用方法と同じ課金)
    • BitTorrent 配信への課金方法

      BitTorrent プロトコルによるデータ転送は、クライアント/サーバー方式による配信の場合と同一のレートで課金されます。正確には、ダウンロードを行う BitTorrent クライアントがAmazon S3 「シーダー」にオブジェクトの「一部」をリクエストした場合、REST または SOAP プロトコルを使って匿名リクエストがその「一部」に対して行われたのと同じように課金されます。

  • オンデマンド生成なので初回は時間がかかる
  • 容量が5 GB 未満のオブジェクトについてのみ取得可能

こういうのすごいわくわくするので機会があったら使ってみたいですね

API Gateway + Lambda で固定のパラメータを付加して HTTP Proxy する

API Gateway による HTTP Proxy は作例がたくさんある (というかコンソールぽちぽちするだけで作れる) のだけど、endpoint 側に Query String を渡す際に、client から渡ってきていないパラメータを追加しようとすると素直にはいかなかったのでメモ。

やりたかったこと

  1. 下図の (a) で zipcode=hoge が渡ってくる
  2. (b) で zipcode=hoge を zn=hoge にした上で、
  3. 更に ver=0 というパラメータを追加したい

            | --(a)-> |         | --(b)-> |
     Client |         |   API   |         | GET
            |         | Gateway |         | http://exmaple.com/api/
            | <------ |         | <------ |
    

どうすればいいのか

Lambda で HTTP Proxy 的な処理を書いて GET させるとよい。


詳細は以下のとおりです。 なお、記事にするにあたり 郵便番号検索API を利用させて頂きました。

Integration type: HTTP Proxy だとダメ

Integration type: HTTP Proxy にすると、client から渡ってきた Query String を endpoint に渡す 際、key は変更できるものの、value を変えたり、特定の key を静的に(=固定で)指定といったことはできないようです。

よって、"更にパラメータを追加" するには他の手段をとる必要がありそうです。

Lambda を使う

やや面倒ではあるものの、API Gateway に用意されている HTTP proxy ではなく、Lambda を経由して GET させてみました。

以下は Lambda のコードです。

var request = require('request');
exports.handler = function(event, context) {
    // endpoint 側に渡すパラメータ
    // event には Mapping Template に記述した内容が渡ってくる
    var params = { zn:event.zipcode, ver:'0' }; 

    // コンテンツをパラメータ付きで get
    request.get({url:"http://zip.cgis.biz/xml/zip.php", qs: params}, function(err, res, body) {
      if (!err && res.statusCode == 200) {
        context.done(null, body);
      } else {
        console.log('error: '+ res.statusCode);
      }
    });
};

request モジュールを要求するため、AWSへは node_modules を含む zip ファイルとしてアップロードします。

npm install request
zip -r zipcode.zip index.js node_modules

API Gateway の設定

(APIやResourcesの作成などの基本的な設定は省略します。)

Method Execution には以下の2つの設定を行います。

  1. Method Request の URL Query String Parameters に受け取るパラメータを追加
    • zipcode f:id:chrolis:20151117180401p:plain
  2. Integration Request に Mapping Templates を設定
    • Content-Type: application/json
    • { "zipcode": $input.params("zipcode") }
      ( ちなみにシングルクオートだと上手くいかなかった )
      f:id:chrolis:20151117180410p:plain

上記の例に従った場合、Method Test の結果がこんな感じになれば成功しています。

f:id:chrolis:20151117180429p:plain

Charlotte オリジナルサウンドトラックの Bravely You にはクリッピングがない

(Twitterはあとから遡るの大変なので参照だけ貼っておく)

afconvertの記事 で触れていますが、Charlotte OSTに収録されている Bravely You にはクリッピングが皆無です。(参考リンク: Kazukitiブログ!: CharlotteのOP/EDのBravely You/焼け落ちない翼の音割れが酷すぎる…)

というわけで綺麗な Bravely You が聴きたかったらサントラ買えばいいんじゃないかな!

TVアニメ「Charlotte」 Original Soundtrack

TVアニメ「Charlotte」 Original Soundtrack

Last Login message が出なくなったのをやや暴力的に解決した

OSXのターミナル(iTerm2やTerminal.app)を利用していると、
初回ログインでない限りは新規ウィンドウ/タブを開くと

Last login: Tue Nov 10 22:24:14 on console

みたいなメッセージが出るんですが…

今日のある時点から、なんだかターミナルに違和感を感じるなと思ったら、このメッセージが出力されなくなっていました。

対処

  • /var/log/asl/*.asl を削除してOSを再起動したところ出力されるようになった。
    • sudo rm /var/log/asl/*.asl

補足

  • Last Login 情報は /var/log/asl/*.asl を読んでいるらしいという情報を得て /var/log/asl/ を確認してみると、25MB程ある .asl ファイルが10個ほど溜まっていた
  • ファイル名からして恐らくローテートされたものではあるものの、それにしても短時間でローテートされているのでなんだかおかしそう
  • 後先考えずとりあえず消してみたところ直った

…という、やや暴力的な解決方法でした。

最初は .asl ファイルが壊れているのかなとも思ったものの、そもそも読む方法が分からず。
もし詳しい方が居たら教えて頂けるとうれしいです。

afconvert が便利な話

Charlotte のサントラを買った!!

先日 Charlotte のサントラを購入しました。

せっかくなのでBravely You の音割れの件も確認しておこうと、左記記事でも利用されているAudacityを導入してみたのですが、iTunes配信版と比較する場合、m4a なので直接は読めません→読めました。

コマンドラインで変換できないものか調べていると、なんと OSX には afconvert とやらが最初から入っているではありませんか。

afconvert すごい

さて、afconvert を使って m4a から aiff に変換するわけですが、対応フォーマットを見る限り、OSX上での音声ファイル形式の変換はこれさえあれば足りそうな印象。

(*'-') < afconvert -hf 2>&1 | grep =
    '3gpp' = 3GP Audio (.3gp)
    '3gp2' = 3GPP-2 Audio (.3g2)
    'adts' = AAC ADTS (.aac, .adts)
    'ac-3' = AC3 (.ac3)
    'AIFC' = AIFC (.aifc, .aiff, .aif)
    'AIFF' = AIFF (.aiff, .aif)
    'amrf' = AMR (.amr)
    'm4af' = Apple MPEG-4 Audio (.m4a, .m4r)
    'm4bf' = Apple MPEG-4 AudioBooks (.m4b)
    'caff' = CAF (.caf)
    'ec-3' = EC3 (.ec3)
    'MPG1' = MPEG Layer 1 (.mp1, .mpeg, .mpa)
    'MPG2' = MPEG Layer 2 (.mp2, .mpeg, .mpa)
    'MPG3' = MPEG Layer 3 (.mp3, .mpeg, .mpa)
    'mp4f' = MPEG-4 Audio (.mp4)
    'NeXT' = NeXT/Sun (.snd, .au)
    'Sd2f' = Sound Designer II (.sd2)
    'WAVE' = WAVE (.wav)

実際に変換してみる

afconvert による変換には output format (-f) と data format (-d) の指定が必要になります。
入力ファイルのビット深度は afinfo で確認できます。

(*'-') < afinfo '01 Bravely You.m4a' | grep depth
source bit depth: I16

上記がわかればあとはこんな感じで変換

(*'-') < afconvert -f AIFF -d BEI16 '01 Bravely You.m4a' '01 Bravely You.aiff'

で、音割れはどうだったの

ちなみに比較結果はこんな感じでした。

  • 追記: m4a そのままでも読めました