2016年3月26日土曜日

[Ruby] AmazonのASINからJANコードを取得したい

以前クラウドワークスの募集中の仕事をなんとなく眺めていた時に、
ASINからJANコードを取得するツール作成
の依頼があったと記憶しています。
クラウドワークスは手頃な練習課題を探すのにいいですね。
Rubyで試しにやってみました。

準備


gem install amazon-ecs

この記事執筆時点ではamazon-ecs-2.4.0を使用しています。

コード


ASINから商品情報を取得するAPIはItemLookupです。
gemを使えばとても簡単。
Amazon内ではJANコードのことはEANと呼ばれているようです。
Ecs.item_lookupの第一引数がASINです。


# -*- coding: utf-8 -*-
require 'amazon/ecs'

Amazon::Ecs.options = {
    :associate_tag => 'YOUR_ASSOCIATE_TAG',
    :AWS_access_key_id => 'YOUR_ACCESS_KEY_ID',
    :AWS_secret_key => 'YOUR_SECRET_KEY',
}


res = Amazon::Ecs.item_lookup(
    'B015J4FFRE', :response_group => 'ItemAttributes', :country => 'jp'
)

res.items.each do |item|
  puts item.get('ItemAttributes/Title')
  puts item.get('ASIN')
  puts item.get('ItemAttributes/EAN')
end

実行結果


たまたま目に付いた
を例に実行してみました。
グッドモーニングアメリカ【初回限定盤】
B015J4FFRE
4988001781868
実際のAmazonのページはこちら。
確かに情報が得られているのがわかります。


おわりに


クラウドワークス見てるとExcel VBAでツール作る仕事がよく目に付きます。
今回のネタもユーザー的にはExcelで動くのが便利なんでしょうね。
Rubyコードで納品なんかされようものなら、WindowsだったらRubyのインストールから必要になりますしね。
というわけで、今度VBA化してみようかな。

2016年3月16日水曜日

freeglutをCMakeでビルドする

はじめに


OpenGLでちょっとした実験をするには相変わらず便利なGLUT。
GLUTはマルチプラットフォームでOpenGL描画のためのウィンドウ表示とマウス・キーボード・コンテクストメニューを作成できるライブラリです。
そして、本家は更新止まっているので、オープンソースで代替品がつくられています。
それが、freeglut
久しぶりに使ってみようと思ったら最新版はビルドにCMakeが要るようになったんですね。
以前はVisual Studioのプロジェクトが含まれていたような気がします。
そこで、cmakeを使ってfreeglutをビルドしてみました。
一応ビルドずみのものもこちらから入手できるようです。
(後日freeglutの中を少しいじりたいので今回はソースからビルド)

環境




ビルド

CMakeのGUIバージョン(cmake-gui)を起動します。

「Where is the source code:」欄にfreeglutを解凍したフォルダ(CMakeLists.txtが含まれるフォルダ)を指定します。

ビルドの出力先フォルダを適当に作成し(ここではC:\freeglut-3.0.0\build)、「Were to build the binaries:」欄に指定します。

左下のほうにあるConfigureボタンをクリックします。

使いたいVisual Studioのバージョンを指定して「Finish」ボタンをクリックします。

コンフィグレーションが行われ、しばらくするとビルドオプションが表示されます。
「Advanced」チェックボックスをチェックするとさらに細かいオプションが表示されます。
ここでは何も変更せずにさきほどの「Configure」の右隣の「Generate」をクリックします。

最初に指定したbuildフォルダの下にVisual Studioのソリューションやプロジェクトファイルが作成されます。
Visual Studioを起動し、freeglut.slnを読み込んでビルドします。


とりあえずDebug版をビルドしました。下のようにビルドできているのがわかります。

実行

freeglutのサンプルもビルドされていますので、その中の1つ、Fractalsというプロジェクトを実行してみました。
fractals.datがないとかエラーが出ていますがパスの問題でしょうか。
とりあえずWindowが表示され何かしらOpenGLで描画できているようです。





2016年3月14日月曜日

RapberryPiで学ぶ電子工作メモ - MCP3204について

去年末くらいから「RapberryPiで学ぶ電子工作」
http://www.amazon.co.jp/dp/B00UKG5KRW/
を少しずつ実践しています。
必要なパーツの通販コード等も載っていてとても便利です。

ただし、掲載されているパーツで入手できないものがあったのでメモしておきます。

p.133
6章・AD変換によるアナログ値の利用
12ビットADコンバータ MCP3208-CI/P
「ピンの配置を読み替えれば、MCP3204-BI/Pでも演習可」

このMCP-3208が通販ですぐに見つからず、MCP3204を購入しました。
この場合ピンの配置をを自分で調べる必要があります。

そこで見つけたのが下記のサイト。
https://developer.mbed.org/cookbook/SPI-communication-with-external-ADC-MCP3

MCP-3208とMCP-3204のピン配置図が並んでいてとてもわかりやすいです。
ありがとうございます。

2016年3月10日木曜日

7-Zipをコマンドラインで使って圧縮ファイル作成

7-Zipで圧縮ファイル作成


Windowsはエクスプローラで右クリックからzip作成ならできるのに、コマンドライン(コマンドプロンプト)で使うコマンドはなさそうですね。バッチファイルでzip作成したいとき困ります。

そこでどうすればいいか探してみました。
7-Zipが使えそうです。

7zipのコマンドラインバージョンをこちらからダウンロード
https://sevenzip.osdn.jp/download.html

適当にPathを通すか、絶対パスで起動します。

単純にフォルダをzipに固めたいだけならこんな感じ。

7za.exe a output.zip inputFolder

出力ファイルの拡張子を7zに変えれば7-Zip形式で出力されます。
出力が2GB超えると普通のzipでは対応できないらしいので、その可能性がある場合はこちら。

7za.exe a output.7z inputFolder

複数のフォルダをまとめたい


ここまでは少し調べればすぐ見つかると思いますが、複数のフォルダを1つのフォルダにまとめてからzipを作成したいケースがあって少々悩みました。

普通にコピーして1つのフォルダにまとめてから上記の方法で圧縮すればいいのですが、後処理の都合でまとめたフォルダを元に戻したい状況です。

たとえば下記のような構成の2つのフォルダがあったとします。

  • folder1/subfolder1
  • folder1/subfolder2
  • folder2/subfolder3
  • folder2/subfolder4

これらをまとめて、zip内にサブフォルダをフラットに含めたいのです。
  • subfolder1
  • subfolder2
  • subfolder3
  • subfolder4
それでどうしたかというと、7zaのaオプションは既存のzipファイルに追加もできるようなので、
  1. cd folder1
  2. 7za a ..\output.zip *
  3. cd ..\folder2
  4. 7za a ..\output.zip *
これでとりあえずoutput.zipにフラットにサブフォルダが含まれるようになりました。

2016年3月8日火曜日

ドラッカーさんに教わったIT技術者が変わる50の習慣

「ドラッカーさんに教わったIT技術者が変わる50の習慣」


去年買って最近ようやくパラパラと読みました。内容的にはドラッカー本をIT技術者向けに書いたものです。記憶に残ってるのは2点。

  1. 生産性をひたすら上げろ
  2. 強みを活かせ


生産性をひたすら上げろ


毎日0.3%効率をあげれば一年で2倍になるとか(数字は記憶違いあるかもしれませんが、とにかく毎日効率化を心がけようという感じ)。

この本では具体例として著者は新入社員の頃毎日タイピング練習をしてタイピング速度を上げていたと書かれていました。

個人的にはタイピングがプログラミングに占める割合は少ないので、手っ取り早いのはツールの使いこなしかなと思います。ツールで生産性上げる意味ではEffective Programmerという本がそれに特化していたはず。今度読み返してみよう。


強みを活かせ


人より優れているところを伸ばしていこうという感じ。

プログラマーとして日々精進するのはいいとしても、本業以外に何か勉強しようとすると飽きっぽくて長続きしないですね。本業が一番の強みと言えるように集中するのがいいんでしょうかね。

2016年3月5日土曜日

Mesa 3D Graphiccs Library (OpenGLのオープンソース実装)を試す

はじめに


OpenGLアプリをリモートデスクトップで動かすとまともに動かなかったりします。
以前調べたときはリモートデスクトップで起動するとOpenGLがWindows標準のソフトウェアレンダラーを使用してしまうとの書き込みがありました。つまりOpenGLのバージョンが1.1相当になってしまうようです。

仮想環境でも一般的にOpenGLのサポートは弱いですよね。1年前くらいにParallelsでWindows使ってましたが、OpenGL 2.0くらいでした。

普通にクライアントPCで起動する際にもGPUドライバの不具合があって表示に不具合がでることがあります。

そのような時、遅くても確実に動くソフトウェアレンダラーを使用したいことがあります。Windows標準のソフトウェアレンダラ?はOpenGL 1.1でさすがに機能少なすぎるので、

Mesa 3D Graphics Library

を試してみることにしました。

Mesaとは


OpenGLのオープンンソース実装です。昔はLinux用のグラフィックスアクセラレータのドライバとかなかったのでLinuxでよく使われていた気がします。Windowsでは上記の必要がないとなかなか使わないかもしれません。

ビルドはなかなかハードル高いのでこちらからダウンロードしました。
https://sourceforge.net/projects/msys2/files/REPOS/MINGW/x86_64/
mingw-w64-x86_64-mesa-11.0.5-1-any.pkg.tar.xz


Mesaの実行


ダウンロードしたファイルを展開するとopengl32.dllがありますので、アプリケーションと同じフォルダに置くだけです。

glGetStringで情報を取ってみるとこんな感じでした。

GL_VENDOR : VMware, Inc.
GL_RENDERER : Gallium 0.4 on llvmpipe (LLVM 3.7, 256 bits)
GL_VERSION : 3.0 Mesa 11.0.5 (git-27c6440)

GL_SHADING_LANGUAGE_VERSION : 1.30 

手元のOpenGLプログラムはOpenGL 3.3くらいの機能を使っていたので、いろいろ動かない箇所がありました。ジオメトリシェーダどうしよう。。

Mesaの実行速度


とりあえず実行速度だけ試しました。比較対象は下記の環境。
GL_VENDOR : NVIDIA Corporation
GL_RENDERER : NVS 4200M/PCIe/SSE2
GL_VERSION : 4.5.0 NVIDIA 354.13

GL_SHADING_LANGUAGE_VERSION : 4.50 NVIDIA 

CPUは型番記録し忘れましたが、core i7の3000番台で2コアのやつです。

10万triangles程度のデータを表示してみると、
Mesa : 約13fps
Nvidia : 約130fps

Mesa思ったより速いですね。緊急用には十分か。


2016年3月1日火曜日

楽天APIではまったポイント

はじめに


前回まで楽天APIを使ったことを書きましたが、その中ではまったポイントをメモしておきます。

1秒間に1アクセス


実際の運用では1日に1万以上のキーワードについてAPIで検索しています。
当初は問題なかったのですが、数日後には途中で止まることが多くなってきました。
そういえば利用制限のこと気にせずリクエスト発行しまくっていたなぁと思い調べてみると、、


1秒間に1アクセスだったんですね。。

今、APIのリファレンスを見返してみるとアクセス制限ならそれっぽいエラーが返ってくるようですが、止まってしまっていた時はそんなエラーではなかった記憶があります。
単にネットワークが不安定だったのかもしれません。。

とはいえ利用制限は守るべきですので、1アクセスごとに適当に1秒待つようにして運用しています。それ以来途中で止まることがなくなったようです。

キーワードは2文字以上


keyword parameter is not valid

「keyword が正しい値でなかった時。(半角1文字のみ指定など)」

このエラーも出ました。

例えばキーワードを「ドラゴンクエスト 4」としても出ると思います。「4」が半角でその前にスペースが入っているから「4」が1単語とみなされエラーになるようです。

実運用時には大量のゲームソフトのタイトルでそれぞれ検索をかけています。中にはタイトルに変なスペースが入っていたりしてエラー条件に引っかかることがよくあります。

とりあえず下記のようなコードで1文字単語を取り除いて検索をかけることにしてエラーを回避しました。

    keywords = keyword.split(' ').select {|item| item.length > 1}
    keyword = keywords.join(' ')