酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

s3cmdを使ってローカルファイルをAmazon S3へアップロードする

メモ。あとで説明を書く。

configを指定する

デフォルト設定は、.s3cfgを指定される。 別のアクセスキーなどを使いたい場合には.s3cfgをコピーして、アクセスキーを書き換えりすれば良い。

デフォルト設定以外の場合は、-c /PATH/hoge.s3cfgを指定する。 例えばhoge.s3cfgを使ってバケットの一覧を取得する場合には下記のようにコマンドの前に追加する。

s3cmd -c /Users/ch3cooh/hoge.s3cfg ls

バケットの一覧を取得する

$ s3cmd ls 

2017-01-23 00:42  s3://sub1.example.co
2013-04-09 05:53  s3://sub2.example.co

指定したバケットに格納されているファイルの一覧を取得する

$ s3cmd ls s3://sub1.example.co

                       DIR   s3://sub1.example.co/css/
2017-02-11 16:18      9540   s3://sub1.example.co/index.xml
2017-02-11 16:18      1168   s3://sub1.example.co/sitemap.xml

指定したローカルディレクトリから指定したバケットへファイルをアップロードする

$ s3cmd sync /Users/ch3cooh/DIR_PATH/ s3://sub1.example.co/

upload: '/Users/ch3cooh/DIR_PATH/.DS_Store' -> 's3://sub1.example.co/.DS_Store'  [1 of 28]
 6148 of 6148   100% in    0s    66.94 kB/s  done
Done. Uploaded 504011 bytes in 4.0 seconds, 123.06 kB/s.

同期時にサーバーにないファイルを削除する

s3cmd --delete-removed sync /Users/ch3cooh/DIR_PATH/ s3://sub1.example.co/

さくらVPSで構築したFTPサーバーのパフォーマンスを調べる

FTP経由でアップロードされたxmlをパースして集計する作業をしています。

アップロードされるxmlファイルは、3KB~6KBほどのサイズの小さなファイルです。毎日数千ファイル増えていくのですが、このシステムをさくらVPSとかさくらクラウドに移してみてはどうか?という話題になったので調査しました。

ここで調査しているのは速度的なものだけです。アップロードのテストはCyberduckを使って全36,714ファイル(約301MB)をアップロードします。ダウンロードのテストは普段使っているバッチを使って同じファイル群をダウンロードします。

試してみた結果、以下の通りでした。

VPS512 VPS1G VPS2G
月額 635円 900円 1,580円
初期費用 1,000円 1,500円 2,000円
メモリ 512MB 1GB 2GB
ディスク容量 SSD:20GB SSD:30GB SSD:50GB
CPU 仮想1コア 仮想2コア 仮想3コア
アップロード 約29分 約30分 約28分
ダウンロード 約39分 約40分 約41分

おそらく数回試して平均を取ればより正確な評価ができるでしょうけれど、アップロード・ダウンロード速度に関しては、あまり差がないことがわかれば分かればよいのでこれでよしです。

Amazon Web Services(AWS)のRoute 53でドメインを取得する

かなり前からAmazon Web Services(AWS)のRoute 53経由でドメインを登録できることは知っていたのですが、ここしばらく新しいドメインを取ってなかったので利用することがありませんでした。

先日、kyukoapp.comのドメインを取得するにあたって、Route 53を利用したのでRoute 53でのドメインの取得の仕方をメモしておきたいと思います。

AWSのサービス一覧から「Networking」の中から「Route 53」を選択します。

左側のメニューの「Domains」から[Redistered Domains]をクリックします。

次に、右側に青いボタンが2つ表示されます。[Register Domain]ボタンをクリックします。

取得したいドメイン名を入力して、[Check]ボタンをクリックします。

入力したドメインが取得可能かどうか表示されます。取得可能なようでしたら[Add to cart]ボタンをクリックします。

画面の下部に、同じドメイン名の異なるTLDや、似たようなドメイン名をサジェストしてくれます。今回は.comだけで良いのでそのまま[Continue]ボタンをクリックします。

取得するドメインが決まったら、個人情報を入力していきます。画面下部の[Continue]ボタンをクリックします。

登録内容に誤りがないか確認画面が表示されます。

問題なければ、画面下部の[Complete Purchase]ボタンをクリックして支払いを確定させます。

支払いを確定すると、最初のメニュー画面に戻されます。左側のメニューの[Pending Requests]をクリックします。

kyukoapp.comがドメイン登録の処理中であることがわかります。きちんと見ていなかったので正確にはわからないのですが、1時間後には登録が完了していたと思います。

Route 53で取得したドメインをAzure App Service Web Apps(旧名称 Azure Websites)で運用する場合には、下記の記事も参考にしてくださいね。

blog.ch3cooh.jp

C#とCoreTweetを使ってフォロワーの情報を取得する

本記事ではC#とCoreTweetを使って、自分のフォロワーを取得する方法を紹介します。

Twitterのフォローとフォロワーがたまにわからなくなりますが、自分のフォロワーとは「自分をフォローしている他人」のことです。

CoreTweetのNuGetを使った導入方法とTwitterの開発者サイトでのアプリケーション登録(アクセスキーの取得)に関しては以前紹介した「C#とCoreTweetを使って簡単にTwitterへツイートするbotを作る - 酢ろぐ!」をご覧ください。

自分のフォロワーを取得する

自分のフォロワーの情報を取得するにはREST APIのfollowers/listを利用します。followers/listの詳細な仕様に関しては、本記事の参考セクションでリンクを貼っていますのでご参照ください。

var tokens = CoreTweet.Tokens.Create("{API key}",
    "{API secret}",
    "{Access token}",
    "{Access token secret}");

// cursorを-1に指定して最初のページを取得する
var followers = await tokens.Followers.ListAsync(cursor => -1, count => 200);
foreach (var user in followers)
{
    Console.WriteLine("{0}: {1}", user.ScreenName, 
        user.CreatedAt.DateTime);
    Console.WriteLine("---------");
}

// 次のフォロワーのページをcursorを指定して取得する
var nextCursor = followers.NextCursor;
followers = await tokens.Followers.ListAsync(cursor => nextCursor, count => 200);

下図は上記のサンプルコードを実行した結果です。

f:id:ch3cooh393:20150208143026p:plain

参考

自分のフォロワーを取得するにはREST APIのfollowers/listを利用しました。詳しい仕様やパラメータについては以下のページを参考にしてください。

C#とCoreTweetを使ってAPIの残数(rate limti)を取得する

本記事ではC#とCoreTweetを使って、APIの残数(rate limti)を取得する方法を紹介します。

CoreTweetのNuGetを使った導入方法とTwitterの開発者サイトでのアプリケーション登録(アクセスキーの取得)に関しては以前紹介した「C#とCoreTweetを使って簡単にTwitterへツイートするbotを作る - 酢ろぐ!」をご覧ください。

特定のユーザーのツイートを取得する

APIの残数(rate limti)を取得するにはREST APIのapplication/rate_limit_statusを利用します。application/rate_limit_statusの詳細な仕様に関しては本記事の参考セクションでリンクを貼っていますのでご参照ください。

var screenName = "daruyanagi";

var tokens = CoreTweet.Tokens.Create("{API key}",
    "{API secret}",
    "{Access token}",
    "{Access token secret}");

var rateLimits = await tokens.Application.RateLimitStatusAsync();
foreach (var rateLimit in rateLimits["statuses"])
{
    Console.WriteLine("{0}: {1} {2}",
        rateLimit.Key, rateLimit.Value.Remaining, 
        rateLimit.Value.Limit);
    Console.WriteLine("---------");
}

下図は上記のサンプルコードを実行した結果です。少し分かりにくいかもしれませんが、user_timelineの残数が179になっています。

f:id:ch3cooh393:20150118190749p:plain

参考

APIの残数(rate limti)を取得するにはREST APIのapplication/rate_limit_statusを利用しました。詳しい仕様やパラメータについては以下のページを参考にしてください。

「URLのコメント見るやつ」を作りました

@jz5が「リツイート直後のツイートを表示するやつ」を公開したようです。

本人に@を飛ばすほどではない時にTwitterでRTした後にコメントを書くエアリプみたいなことをすることがあります。Twitterに張り付いている時には構わないのですが、後々から言及されているのを拾い損ねることがあります。

「リツイート直後のツイートを表示するやつ」は、なかなか使いやすくって下図のようにRT後のツイートを拾って表示してくれます。

「○○を表示するやつ」ってフレーズが気に入ったので、僕もさっくりとサービスを作ってみました。「URLのコメント見るやつ」です。

  • (すでにサービスの提供を終了しています)

URLを入力してLoadボタンをクリックすると、そのURLについてのTwitterとはてなブックマークでの言及されているコメントを表示することができます。例えば、先ほどの「リツイート直後のツイートを表示するやつ」に関するコメントをみたい場合は以下のように指定します。

  • (すでにサービスの提供を終了しています)

こんな感じでコメントが表示されます。

思い付きで作ったサービスですが別用途での利用方法を思いついたので、しばらくメンテナンスを続けていく予定です。

C#でHtml Agility Packを使って秀和システムの新刊情報を取得する

Html Agility Packという.NET Framework向けに書かれたHTMLパーサーライブラリがあります。このライブラリはC#から利用することができます。簡単にウェブスクレイピングすることができます。

今日もリスト形式で並んでいるデータを取得してみましょう。過去に「 WindowsPhoneアプリ開発入門」でも題材に使った秀和システムの新刊情報をスクレイピングしてみましょう

f:id:ch3cooh393:20141204104009p:plain

昨日の記事とほとんどやっていることは同じですが、昨日はtableタグ上のデータを取得したのに対して、今日はdlとdtタグのデータになります。

// 新刊情報を取得したいサイトのURL
var urlstring = "http://www.shuwasystem.co.jp/newbook.html";

// 指定したサイトのHTMLをストリームで取得する
var doc = new HtmlAgilityPack.HtmlDocument();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(new Uri(urlstring)))
{
    // HtmlAgilityPack.HtmlDocumentオブジェクトにHTMLを読み込ませる
    doc.Load(stream, Encoding.UTF8);
}

// 最初のsinkanがコンピュータの関連書籍
var priceNode = doc.DocumentNode.Descendants("div")
    .Where(n => n.GetAttributeValue("id", string.Empty) == "sinkan")
    .First();

// 必要な情報を読み取る
var listItems = priceNode.Descendants("dl")
    .Select(n =>
    {
        // 書籍のタイトルを取得する
        var title = n.SelectSingleNode("dt")
            .InnerText.Trim();

        // 書籍のISBNを取得する
        var isbn = n.SelectSingleNode("dd/p/strong")
           .InnerText.Trim();

        return new { Title = title, Isbn = isbn };
    });


// 結果を出力する
listItems.ToList().ForEach(item => 
{
    Debug.WriteLine("{0} ({1})", item.Title, item.Isbn);
});

関連記事

このブログでHtml Agility Packについて取り扱った記事をピックアップしました。