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(' ')

2016年2月28日日曜日

楽天APIでJANコードからBOOKOFF価格を取得したい

はじめに

前回、楽天APIでBOOKOFFの価格を取得する方法を試してみました。前回の方法は、

「キーワードとshopCodeから商品リストを取得する」

というものでした。さらにAmazonの値段と比較したいとなると、タイトルをキーワードに与えて検索するだけではAmazonの商品と違うものがヒットする可能性があります。それでJANコードも指定してBOOKOFF価格を取得できないか試してみました。環境やAPIは前回と同じです。

以下、ゲームソフトの場合を試しています。

開発・実行環境

MacBook Pro
OSX El Capitan (10.11.3)
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]

使用したAPI

楽天商品検索API (version:2014-02-22)

BOOKOFF取り扱い商品のJANコード

APIリファレンスを見てもJANコードを指定するようなパラメータは見当たりません。適当にゲームソフトを検索してみるとJANコードは下の画像のように表示されているので情報はあるようです。


そこで、
RakutenWebService::Ichiba::Item.search
の結果を見てみました。itemCaptionの項目が商品説明文なのですが、その中に含まれていました。例えば上のソフトの検索結果のitemCaptionは次のようになっています。

「ニンテンドーDS販売会社/発売会社:スクウェア・エニックス発売年月日:2010/03/04JAN:4988601006392機種:ニンテンドーDS国民的RPG「ドラゴンクエスト」シリーズ9作品目。物語の舞台は「天使界」。世界樹に女神の果実が実るとき、神の国への道が開かれる!それは天使界に伝わる言い伝え。しかし、ある日、恐ろしい事件が発生して・・・!?壮大な世界を冒険するという本来の魅力に加え、キャラクターカスタマイズや転職でき、多彩なキャラクター作りが楽しめます。さらにワイヤレス通信でのマルチプレイ、さまざまなサブストーリーを体験できる「クエスト」など新要素満載の充実した内容となっています。」

思いっきり説明文中にJANと含まれていますね。というわけで、JANコードからBOOKOFF価格を強引に取得する方法として、

  1. タイトルをキーワードにして検索し、商品リストを取得
  2. 商品リストを片っ端から調べ、itemCaption中にJANコードが含まれていたら該当商品とみなし価格を取得
を試したコードが下のもの。前回のコードに、
if caption.include? (jan_code)
の行が追加されています。


require 'rakuten_web_service'require 'uri' # 楽天のサンプルに追加
RakutenWebService.configuration do |c|
  c.application_id = 'YOUR_APPLICATION_ID' # 取得したアプリケーションIDで置き換える  
  c.affiliate_id = 'YOUR_AFFILIATE_ID' # この行はなくても大丈夫そう。
end
jan_code = '4988601006392'items = RakutenWebService::Ichiba::Item.search(:keyword => 'ドラゴンクエストIX', :shopCode => 'bookoffonline')
items.each do |item|
  if item['availability'] == 1 #在庫があるか    
    caption = item['itemCaption']
    if caption.include? (jan_code) # 説明文にjan_codeが含まれているか      
      p item.price.to_i
    end  
  end
end

おわりに

普通にJANコードをキーに検索できても良さそうですし、もしかしたら方法があるのかもしれません。見つかったらまた更新します。

2016年2月27日土曜日

Rubyで楽天APIを試す

はじめに

Ruby初心者ですが、個人的プロジェクトで勉強がてら使っています。そのプロジェクトで楽天のAPIを使ってBOOKOFFの価格を調べるという必要が出てきたので、ちょっとやってみました。

開発・実行環境

MacBook Pro
OSX El Capitan (10.11.3)

ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]

使用したAPI

キーワードと楽天ショップを指定して商品リストを取得するAPI。
楽天商品検索API (version:2014-02-22)

準備

  1. 楽天でアプリケーションIDを取得こちらから。
  2. Rubyのgemが用意されているので、gem install rakuten_web_service

サンプルコード

上記楽天のサイトにRubyのサンプルが載っています。下のコードはサンプルを少しだけいじったものです。楽天のサンプルそのままだと私の環境ではエラーが出たので、
require 'uri'
を追加したところ動作しました。
Item.searchで楽天ショップのshopCodeというのを与えるのですが、BOOK OFFの場合、urlが下記のようになっています。
http://www.rakuten.ne.jp/gold/bookoffonline/
最後の"bookoffonline"の部分がshopCodeのようです。
入れてみたらそれっぽく動きました。

require 'rakuten_web_service'
require 'uri' # 楽天のサンプルに追加

RakutenWebService.configuration do |c|
  c.application_id = 'YOUR_APPLICATION_ID' # 取得したアプリケーションIDで置き換える
  c.affiliate_id = 'YOUR_AFFILIATE_ID' # この行はなくても大丈夫そう。
end

items = RakutenWebService::Ichiba::Item.search(:keyword => 'ゼノブレイド', :shopCode => 'bookoffonline') 
items.each do |item|
  if item['availability'] == 1 #在庫があるか
    #取得したデータを適当に出力
    puts "#{item['itemName']}, #{item.price} yen, #{item['shopName']}, #{item['genreId']}, #{item['itemCode']}" 
    puts "#{item['itemCaption']}"
    puts "#{item['itemUrl']}"
  end
end

おわりに

できればJANコードから検索できるといいのですが、このAPIでは対応していないようです。keywordにJANコードを入れるとBOOKOFF指定では何も結果が得られませんでした。店舗指定なしだと、商品名にJANコードが入っていればヒットします。

2016年2月26日金曜日

ロジクール MMOゲーミングマウス G600をプログラミング用に使う(2)

はじめに

前回開封したロジクールG600を仕事用PCにつないで設定してみました。
左がG600、右が今まで使っていたAnkerのエルゴノミクスマウス。サイズはG600の方がやや小さく感じます。

Logicool ゲームソフトウェア 8.78

G600の設定用にWebからソフトウェアをダウンロードします。インストールは特に設定項目もなく、次々とクリックするだけです。終了後再起動を求められます。インストールされた設定用アプリの名前はゲームソフトウェア。仕事中に起動するのを一瞬躊躇してしまうネーミングですね。。以下、画面はバージョン8.78のものです。

起動後の画面はこんな感じ。さすがゲーム用(?)。シンプルで使いやすそう。


まず前回気になったボタンのライトの点滅を止められるのか。設定はすぐ見つかりました。
「ライトの効果」をOFFにすれば常時点灯になります。
色も変えられます。色を真っ黒にすればライトの点灯をOFFにするのと同じことかな?


親指で押す12個のボタンもやはりカスタマイズできます。デフォルトではテンキーに合わせてあるようです。MMOゲームはやったことないですが、テンキーを結構使うんでしょうね。3パターン登録できるようです。ゲームに合わせて切り替えられるんでしょうが、仕事用にもアプリに合わせて切り替えたら便利かもしれませんね。まだそこまでは試していません。


プログラミング用にカスタマイズ

メインで使用している開発環境Microsoft Visual Studioに合わせて少しカスタマイズしてみました。Visual Studio自体、既にキーボードに合わせてカスタマイズしてあるので、そのキーボードショートカットを登録しています。ビルド・コンパイル・デバッグ実行・ステップオーバー・ステップイン・ステップアウト・ブレークポイントを割り当ててみました。


デバッグ中はマウスオーバーで変数の中身を見たりするのでマウスとキーボードを行き来していましたが、このマウスなら右手だけで大抵のデバッグ中の操作ができそうです。

Visual Studioのショートカットには"Alt+K, C"のようにキーをシーケンシャルに押すものもあるので、マウスに登録できるか試してみましたが、無理そうでした。"Alt+K"までしか入りません。Visual Studio側でキー割り当てを変える必要がありますね。

まとめ

ロジクールG600のいいところ

  • カスタマイズ可能な多数のキー。
  • 設定ソフトも使いやすい。
  • 設定内容はマウス内メモリーにも保存できるらしい。別のPCに接続しても設定をやり直さなくてもいいらしい。
  • 個人的にはちょうどいいサイズ。どのボタンにも指が届く。

ロジクールG600のいまいちなところ

特徴的なマウスなので慣れが必要な部分はあります。
  • 右クリックボタンのさらに右側にもボタンがあるので間違えやすい
  • 親指ボタンを素早く押せるようになるのかちょっと不安