rubyでQRコード生成
ライブラリはたくさんあって何を使えばいいのやら。いくつか試して良さそうなものを。
rqrcode
インストール
rqrcodeとrqrcode_pngは一緒にいれると便利。
$ gem install rqrcode $ gem install rqrcode_png
require 'rubygems' require 'rqrcode' require 'rqrcode_png' qr = RQRCode::QRCode.new('hoge', :size => 4, :level => :h ) png = qr.to_img #png.resize(90,90).save("hoge0.png") png.save("hoge0.png")
barby
インストール
ネーミングセンスいいですよね。QRコードだけでなく一次元コード(バーコード)も色々できたり。
require 'rubygems' require 'barby' require 'barby/barcode/qr_code' require 'barby/outputter/png_outputter' qr = Barby::QrCode.new('hoge', { :size => 4, :level => :h }) File.open('hoge1.png', 'w'){|f| f.write qr.to_png }
やりたかったこと
QRコードで資産データシールを作りたいだけなんですね。
require 'rubygems' require 'fileutils' require 'RMagick' require 'rqrcode' require 'rqrcode_png' text = "hoge" qrimage = text + "-tmp.png" width, height = 100, 100 qr = RQRCode::QRCode.new(text, :size => 4, :level => :h ) png = qr.to_img png.resize(width, height).save(qrimage) height += 20 # margin image = Magick::Image.read(qrimage).first image = image.change_geometry("#{width}x#{height}") do |cols,rows,img| img.resize!(cols, rows) img.background_color = 'white' img.extent(width, height) end draw = Magick::Draw.new draw.annotate(image, 0, 0, width / 2 , 110, "id: #{text}") do self.fill = '#000000' self.align = Magick::LeftAlign self.stroke = 'transparent' self.pointsize = 10 self.text_antialias = true self.kerning = 1 end image.write(text + ".png") FileUtils.rm(qrimage, {:force => true})
やっつけ感が拭いきれませんが、とりあえず目的は達成できました。時間があるときにrqrcodeやRMagickをもっと掘り下げて見たいと思います。
瞳孔が開くほど簡単にredmineを構築できる「Bitnami」 (1)
Redmineって便利だけどインストールが結構面倒じゃないですか。
特にCentOSにインストールする場合だと、rvmでrubyのバージョン指定して、passengerコンパイルして、apacheのconfいじって.....ええと正直きつい。
http://blog.redmine.jp/articles/2_3/installation_centos/
そこで「Bitnami」登場です。
BitNami Redmine Stack provides a one-click install solution for Redmine.
http://bitnami.com/stack/redmine/installer
「Bitnami Redmine」はフルスタックソリューションです。bitnami-redmine-2.3.2-1の場合は以下すべてを含んでいます。デフォルトは/opt以下にインストールします。
- ruby 1.9.3-p448
- redmine 2.3.2
- apache 2.4.4
- passenger 4.0.10
- mod_pagespeed 1.6.29.2
- mysql 5.5.32
- subversion 1.7.4
- php 5.4.18
- phpmyadmin 4.0.3
- git 1.8.3
- perl 5.16.3
本当に超楽です。CentOS6.4 と bitnami-redmine-2.3.2-1 を使ってredmine構築まで行ってみます。
インストール方法
インストーラダウンロード
まずbitnamiのサイトでインストーラをダウンロードします。
インストーラ実行
インストーラを実行。終わり。お疲れ様でした。
$ sudo ./bitnami-redmine-2.3.2-1-linux-x64-installer.run
インストールは簡単すぎるので、少しTIPSを備忘録として残しておきます。
monitでプロセス監視
monitはプロセスを監視するツールです。なぜかmonitはインストールされないので、DAGリポジトリなどからyumでmonitをインストールします。
$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm $ rpm -ivh rpmforge-release-0.5.2-2.el6.rf.i686.rpm $ yum install monit $ ln -s /opt/redmine-2.3.2-1/config/monit/bitnami.conf /etc/monit.d/bitnami.conf $ chkconfig --level 345 monit $ /etc/init.d/monit start
必要に応じて/etc/monit.conf や /opt/redmine-2.3.2-1/config/monit/conf.d/*.conf を修正してください。
logrotateを設定してログの肥大を防ぐ
bitnamiにはlogrotate.confも用意されています。必要に応じてconfを修正してください。
$ ln -s /opt/redmine-2.3.2-1/config/logrotate/bitnami.conf /etc/logrotate.d/bitnami.conf
Bitnami Redmine を自動起動
Bitnami Redmineのサービス起動スクリプトは /opt/${installdir}/ctlscript.sh です。これを/etc/init.d以下にコピーします。
$ cp -p /opt/redmine-2.3.2-1/ctlscript.sh /etc/init.d/bitnami-redmine
chkconfigで自動起動の登録をするため、コピーした/etc/init.d/bitnami-redmineを少しだけ修正します。シェバン(#!/bin/sh)のあと1つ改行を入れたあと、chkconfig: と description: を追加します。この意味は 「man chkconfig」のRUNLEVEL FILESセクションを参照してください。
#!/bin/sh # # chkconfig: 345 80 30 # description: BitNami Redmine Service
chkconfigでサービス登録。
$ chkconfig --add bitnami-redmine
/etc/init.dにコピーしたファイル名が--add で登録する名前になります。
Redmineのサブディレクトリを変更
デフォルトのパスは http://yourhost/redmine になっています。ここでは http://yourhost/redmine => http://yourhost/bts へ変更します。
最初は、Alisasを変更します。
$ cat /opt/redmine-2.3.2-1/apps/redmine/conf/httpd-prefix.conf #Alias /redmine/ "/opt/redmine-2.3.2-1/apps/redmine/htdocs/public/" #Alias /redmine "/opt/redmine-2.3.2-1/apps/redmine/htdocs/public" Alias /bts/ "/opt/redmine-2.3.2-1/apps/redmine/htdocs/public/" Alias /bts "/opt/redmine-2.3.2-1/apps/redmine/htdocs/public" Include "/opt/redmine-2.3.2-1/apps/redmine/conf/httpd-app.conf"
次にRAILS_RELATIVE_URL_ROOT と PassengerPreStart を変更します。
$ cat /opt/redmine-2.3.2-1/apps/redmine/conf/httpd-app.conf <Directory "/opt/redmine-2.3.2-1/apps/redmine/htdocs/public"> PassengerEnabled on Options -MultiViews AllowOverride All <IfVersion < 2.3 > Order allow,deny Allow from all </IfVersion> <IfVersion >= 2.3> Require all granted </IfVersion> #SetEnv RAILS_RELATIVE_URL_ROOT "/redmine" SetEnv RAILS_RELATIVE_URL_ROOT "/bts" PassengerAppRoot "/opt/redmine-2.3.2-1/apps/redmine/htdocs" </Directory> #PassengerPreStart http://127.0.0.1:80/redmine PassengerPreStart http://127.0.0.1:80/bts
apacheを再起動
$ /etc/init.d/bitnami-redmine restart apache
このようなエラーが表示される場合はmonitがインストールしていない可能性があります。
which: no monit in (/opt/redmine-2.3.2-1/perl/bin:/opt/redmine-2.3.2-1/git/bin:/opt/redmine-2.3.2-1/sqlite/bin:/opt/redmine-2.3.2-1/ruby/bin:/opt/redmine-2.3.2-1/subversion/bin:/opt/redmine-2.3.2-1/php/bin:/opt/redmine-2.3.2-1/mysql/bin:/opt/redmine-2.3.2-1/apache2/bin:/opt/redmine-2.3.2-1/common/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
monitを動かす必要がなくてもエラーを抑止するのでインストールしておいた方が良いです。
自作PCケース BitFenix PRODIGY Black にしました
新PC買いました。自称、中学生の気持ちがわかる男なのでケースは中学生仕様。AMD派の私としてはRichland A10あたりにしたかったのですが、わけあって Haswellに妥協。
スペック比較
旧PC | 新PC | |
---|---|---|
CPU | AMD Phenom X4 9550 | Intel Core i5 4430 |
GPU/OnBoard | ATI Radeon HD 4200 | Intel HD Graphics 4600 |
MainBoard | Micro-Star INTERNATIONAL 78GTM-E45 | ASRock H87M-ITX |
ベンチマーク - エクスペリエンスインデックス
せっかくなので旧PCと新PCをベンチマーク。まずはWindows7のエクスペリエンスインデックス。あれ?思ったより性能差がみえない...
- Core i5 4430
ベンチマーク - GeekBench3
エクスペリエンスインデックスは数値がざっくりすぎるので、ここは新しいバージョンのGeekBench3で。
- Core i5 4430
Win32OLEでインストール済みソフトウェア一覧を取得してみたよ
リーマンは時折無駄としか思えない人力作業を強制させられるときがあります。インベントリを人力で調べるなんて拷問ですよ。
ささっとvbsを書いて終わりのつもりだったのですが妙に遅い...半端ではない遅さ。
hostname = "remote_host" set locator = CreateObject("WbemScripting.SWbemLocator") Set wmi = locator.ConnectServer(hostname, "ROOT\cimv2", "user", "password") Set items = wmi.ExecQuery("Select * from Win32_Product",,48) For Each item in items Wscript.Echo "Caption: " & item.Caption Wscript.Echo "Version: " & item.Version Next
どうやら win32_productクラスがよくないようです。「win32_product slow」とググるとワンサカ出てきます。MSI経由で情報を取得するため、超がつくほど遅いようです。
インストール済みアプリケーションの情報取得はレジストリ経由の方が速そう。ただx86とx64のアプリケーションは別のレジストリで管理しているので注意が必要です。
require 'win32ole' require 'socket' module REG arch = ENV["PROCESSOR_ARCHITECTURE"] == "AMD64" ? x64 : "x86" UNINSTALLS = if arch == "x64" [ "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\uninstall", "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\uninstall", ] else [ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\uninstall", ] end HKEY_CLASSES_ROOT = 0x80000000 HKCR = 0x80000000 HKEY_CURRENT_USER = 0x80000001 HKCU = 0x80000001 HKEY_LOCAL_MACHINE = 0x80000002 HKLM = 0x80000002 HKEY_USERS = 0x80000003 HKEY_CURRENT_CONFIG = 0x80000005 HKEY_DYN_DATA = 0x80000006 end include REG # File activesupport/lib/active_support/core_ext/hash/keys.rb class Hash def symbolize_keys! keys.each do |key| self[(key.to_sym rescue key) || key] = delete(key) end self end end class Software def initialize(hostname = ".", opt = {}) wmi = conn_server(hostname, opt) @reg = wmi.Get("StdRegProv") end def conn_server(hostname, opt) locator = WIN32OLE.new("WbemScripting.SWbemLocator") if Socket.gethostname == hostname || "." == hostname locator.ConnectServer("." ,"root\\default") else locator.ConnectServer(hostname ,"root\\default", opt[:user], opt[:pass]) end end def each_subkey in_param = @reg.Methods_("EnumKey").InParameters.SpawnInstance_() in_param.hDefKey = REG::HKLM REG::UNINSTALLS.each {|key| in_param.sSubKeyName = key out_param = @reg.ExecMethod_("EnumKey", in_param) out_param.sNames.each {|subkey| yield key + "\\" + subkey } } end def each_products in_param = @reg.Methods_("GetStringValue").InParameters.SpawnInstance_() in_param.hDefKey = REG::HKLM self.each_subkey {|key| product = {} in_param.sSubKeyName = key %w(DisplayVersion DisplayName).each {|label| in_param.sValueName = label out_param = @reg.ExecMethod_("GetStringValue",in_param) product[label] = out_param.sValue.to_s } yield product.symbolize_keys! } end end
こういうのはWin32OLEで書くほうが楽しいです。こんなかんじで実行すればOK.
so = Software.new so.each_products {|h| next if h[:DisplayName].empty? p h }
暑すぎるのでLinuxで使えるパワフルなシステムモニタツールを並べてみた
今年は本当に暑いです。こんなに暑いとキーボードを叩く気分にならんですよ。コンソールで叩くやつだけを挙げておきます。
top
みんな大好きtopコマンド。
htop
みんな超好きhtopコマンド。
atop
個人的にあまり使うことがないatopコマンド。
nmon
AIXのtopasっぽくてあまり好きじゃないnmonコマンド。
slmon
ああ、あったね。slmonコマンド。
dstat
便利!dstatコマンド。
xentop
番外っぽいけど、Xenに付いているtopコマンド。たまに使う。
esxtop
これも番外っぽいやつ。esxiに付いているtopコマンド。おうちのesxiは消してしまったのでキャプチャ取れね。
月額380円の Wi2(ワイツー) 300を使ってみた
Docomo-Wifiが使えるエリアはまだまだ少なくて正直イライラしています。JR駅前のカフェで駅よりの席に座ると駅のWifiがギリギリつながり「ラッキー!」「すぐ切れやがる」という生活はもううんざりしてきたので、月額380円で使いたい放題の Wi2 を申し込みました。
今だとビックカメラ特典でなんと2ヶ月は無料だそうです。でもたかが760円ぐらい、馬券の買い目1点より少ないので、どうったことはないですけど。
http://www.biccamera.com/bicbic/jsp/w/service/wi2/index.jsp
まずは、近所の電源が使えるサンマルクカフェに行って、ベトナムコーヒーのLを頼んで、電源の席を確保して使ってみました。
http://www.musen-lan.com/speed/
380円にしては十分な速度だと思います。Wi2の自動接続サービスにLinuxがないのが悲しいですが、そこは手打ちか適当なスクリプトでも書いて対応したいと思います。
XenServer6.2で俺的にはほぼ完璧になった
ついに Xenserver 6.2 がリリースです。
http://www.xenserver.org/
http://sourceforge.jp/magazine/13/06/28/151500
OSS化されたXenServer 6.2は従来のXenServer Free Editionより高機能になっていて、従来は有償版のみで使えたHA, Dynamic Memory Control,Storage XenMotion等もフリーで使えます。
— Satoshi SHIMAZAKI (@smzksts) 2013, 6月 26
XenServer6.2がOSSになったことが理由なのか知りませんが、有償の機能だったHA(High Availability)やDMC(Dynamic Memory Control) も普通に使えるっぽいです。VMwareやHyper-Vではメモリバルーニングやダイナミックメモリは無償版でも普通に使えいたけどXenServerの無償版ライセンスでは使えなかったので、非常に嬉しいです。
私がXenServerを押している理由は、vCenterやSystemCenterのようなものを導入しなくても、ホストのどれか1つが統合管理(Control Domain)してくれるので、別途サーバを用意する必要がないというところです。無償で統合管理の機能があるので、VMテンプレートやライブマイグレーションも普通に使えます。だいたいはXenServerで事足りるのですが、メモリ管理だけは他の仮想化製品(無償版)と比べて若干の機能不足を感じていましたが、XenServer6.2でやっと無償でDMCが使えるので、これでほぼ完璧になりましたよ!!
無償版だと使えなかったDMCのタブの内容。
DMCはメモリの下限と上限を設定するだけ。
やったね!