ラベル Windows の投稿を表示しています。 すべての投稿を表示
ラベル Windows の投稿を表示しています。 すべての投稿を表示

2010年9月8日水曜日

みくった〜♪のWindows版をMinGWでビルドしてみた

みくった〜♪は、全てのミク廃、そしてTwitter中毒者へ贈る、至高のTwitter Clientを目指すTwitter Client…として@toshi_a氏が開発しているソフトウェアである。

みくった〜♪

主にLinux向けとして開発されているようだが、初公開の時点で「Windows版無いの(´・ω・`)?」と言われたように、Windows版の需要がやはりそれなりに存在する。
そこで、MinGW使ってRuby/GTK2環境を整え、Windowsでもみくった〜♪を動作させることはできないものか?と考え、実際にやってみた。

※ただ使ってみたいだけ、という方はみくった〜♪ for Windowsのページみくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョンからどうぞ。



ビルドに必要なソフトウェアやライブラリは以下の通り。
MinGW GCC 4.5.0
ftp://ftp.jaist.ac.jp/pub/sourceforge/m/project/mi/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20100831/mingw-get-inst-20100831.exe

ruby 1.8.7-p302
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.7-p302.tar.bz2

ruby-gtk2-0.19.4
http://ftp.jaist.ac.jp/pub/sourceforge/r/project/ru/ruby-gnome2/ruby-gnome2/ruby-gnome2-0.19.4/ruby-gtk2-0.19.4.tar.gz

ruby-hmac-0.3
http://deisui.org/~ueno/ruby/hmac.html
http://deisui.org/~ueno/ruby/ruby-hmac-0.3.tar.gz

iconv
ftp://ftp.gnu.org/gnu/libiconv/libiconv-1.13.1.tar.gz

GTK+
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.20/gtk+-bundle_2.20.0-20100406_win32.zip

Win32 OpenSSL
http://www.slproweb.com/products/Win32OpenSSL.html
http://www.slproweb.com/download/Win32OpenSSL-0_9_8o.exe

Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86) OpenSSL用
http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja

可能な限りソースからビルドするようにしたが、OpenSSLとGTK+は面倒だったので、とりあえずWindows用バイナリを利用することにした。…OpenSSLをMinGWでビルドすれば、MSVC++ランタイム要らなくなるのだが…。



MinGWによるビルド環境の構築


以前はMinGW(コンパイラ)とMSYS(サブシステム)を個別に用意し、セットアップする必要があったが、現在はmingw-get-instパッケージに纏められた模様。これをダウンロードし、普通のソフトウェアのインストーラと同じようにウィザードを進めていくだけでビルド環境が整う。
デフォルトでは、Windowsのパス変数もMSYSのパス変数として登録されてしまい、混乱の原因となるので、PATH変数を変更しておく。

$ PATH="/mingw/bin:/usr/local/bin:/bin"




iconvのビルド


一番最初にiconvをビルドする。といっても、普通に

$ ./configure --prefix=/mingw
$ make
$ make install

のような感じでおk。
本当なら/usr/localあたりにprefixを置いて、そこにインストールすべきな筈なのだが、私のCFLAGSやLDFLAGSの認識がおかしいのか、rubyのiconvライブラリのextconf.rbが/usr/localに置いたiconvを見つけられないため、諦めて/mingwにprefixを置く。



必要なライブラリの展開


GTK+のアーカイブを解凍し、そのまま全て/mingwに展開する。
OpenSSLは、インストーラを実行しインストールした先にあるディレクトリを、GTK+同様に/mingwに展開する。
また、OpenSSLを利用するために必要なMicrosoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)もインストールしておく。



Rubyのビルド


いつも通りRubyをビルドする。

$ ./configure --prefix=/ruby
$ make
$ make install

prefixを/rubyにしたが、make installする際にMSYSの/を飛び越えるため(コンパイルしたRubyがインストールに使用されるから?)、Windows側の\rubyにインストールされるので注意が必要。
そして、Windows側にインストールされたRubyを、MinGWの/usr/localあたりに移動しておく。



Ruby/GTK2のビルド


Ruby/GTK2のアーカイブを解凍し、extconf.rbを先程作成したRubyで実行する。

$ /usr/local/bin/ruby extconf.rb

そして後はmake、make installするだけの筈なのだが、MinGWでRuby/GTK2をビルドすると何故か毎度gtkのビルドでコケる。
どうやらこれからビルドされる筈のgtk2.soを、ビルド前にリンクしようとするかららしい。
そこで、gtkのMakefileを編集する。
何らかのエディタでgtk/src/Makefileを開き、LIBS = $(LIBRUBYARG_SHARED)...で始まる行の、-lgtk2を削除。

後はいつも通り。

$ make
$ make install


この時点で、Ruby/GTK2自体の開発/実行環境は整っていることになる。
MSYSでの作業はここで終了。



必要なファイルのみを纏め、最小限のRuby/GTK実行環境を作成


MSYSの/usr/localにはRuby/GTKの実行環境が整っている(ライブラリは足りないが)ので、これを適当なディレクトリにコピーし、rubyディレクトリとする。
rubyディレクトリのbinに、iconv、OpenSSL、GTK+の*.dllをコピー。
そして、RubyのLOAD_PATHのどこかにruby-hmacを展開。
後はみくった〜♪をダウンロードして展開、普通に起動できれば、みくった〜♪実行環境完成となる。



mikutter.exeを作成


毎度コマンドラインでruby mikutter.rbとしたり、バッチファイルを実行するのはどことなく落ち着かない。
また、Rubyの環境すべてがrubyディレクトリに入っているので、配布するにしてもかなりのサイズになってしまう。
そこで、更に必要なファイルだけを纏め、Windowsの実行ファイル形式で配布する形をとる。
exeファイル化には、exerbを利用する。
exerbの使用方法は、
・mkexy mikutter.rbでレシピファイルmikutter.exyを自動生成
・exerb mikutter.exyとすると、mikutter.exeが作成される
という感じである。
ここで作成されたバイナリは、Ruby環境無しで動作するものなので、あとはmikutterのディレクトリ階層とdllの配置をするだけ。

exerbの詳しい使用方法、レシピファイルの書式については、
公式ページ http://exerb.sourceforge.jp/
やmikutter for Windows付属のmikutter.exyを参照して欲しい。



みくった〜♪ 本家
http://toshia.dip.jp/
http://mikutter.d.hachune.net/

みくった〜♪ for Windowsのページ
http://append.hachune.net/mikutter.html

みくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョン
http://file.hachune.net/mikutter/

2009年12月21日月曜日

Multi Thread Multimedia Encoder Frontendの新バージョンのAlpha版を公開

1年ぐらい前から作っていた「lameやoggでマルチスレッドエンコードするフロントエンド」を更新してみた。
更新と言っても、設計は1からやり直し、コードもすべて1から書き直しているので、新ソフトと言ってもいいような位別物になった…気が。



ただ、まだAlpha版なので、おかしい所があるかも知れない上に、Readme.txt等のドキュメント類も無し。
それでも使ってくださるという方は、以下からダウンロードしてください。
https://sites.google.com/a/g.hachune.net/mtmef/home/download/Encoder_v2.0alpha_100103.zip?attredirects=0&d=1
まだWindows版しかありません。(´・ω・`)スマソ
09.01.03
'require': No such file to load -- fileutilsとなる問題を修正しました。
ビルドに失敗していたようです…。

※主な機能追加
・GUIの改良
・ファイル単位での追加も対応(今まではフォルダ単位のみ)
・フィルタ設定のGUI化
・文字コード関連の問題が回避しやすくなった
・ID3タグなどに対応しやすいように改良
・ログ出力機能の強化


自分自身では常用できるレベルなので、後は違う環境で問題が発生しないか、しょーもないバグが無いかなどを確認後、早急にreadme.txt等のドキュメント類を完成させて、正式リリースできれば、とは思っているのだが…何時になるやら…

2009年12月3日木曜日

GoogleがWindows、Mac向けにIMEを公開

Googleが日本語入力ソフトを開発・公開…とあるのだが…
http://www.google.com/intl/ja/ime/
64bit版Windows非対応なため、メイン環境がWindows Server 2008 R2な私は利用することができないという…



なにやら、Web検索の技術を流用しているらしく、MS Office IMEの辞書などに比べて、予測変換できる文の種類が物凄く多いらしい。
…今はOffice IME 2010 Beta使ってるし、まぁいいか…

2009年11月21日土曜日

Microsoft Office Professional Plus 2010 Betaを使ってみた

久しぶりにまったりできる休みになったので、この間一般公開されたMicrosoft Office Professional Plus 2010 の Beta版を使ってみることにした。

まずはPersonal Editionに入っているWord、Excel、Outlook。

Word
Word

Excel


Outlook



次に、Standard以降にしか入っておらず、よく「OutlookいらねーからPowerPoint入れろ(#゚Д゚)ゴルァ!!」と言われるPowerPoint。
PowerPoint



Proffesionalを導入したは良いものの、使いどころが理解されず放置されがちなPublisherとAccess。
Publisher


Access



Ultimateを買うか、Proffesionnal Plusをボリュームライセンス契約するかしないと使えないInfoPath。
InfoPath



使いどころが分かりやすいうえに多そうな気がするのに、何故か2007ではUltimateにしか含まれなかったOneNote。
OneNote



全部2007を基本に作られている感じだが、所々使いやすく、かつ分かりやすくなっている印象を受けた。
また、初回起動も結構早く、OpenOffice.org 3.1のWriterが15秒掛かるPCで、5~10秒で起動することができていた。
無料Officeスイートとは格が違う気が…しなくもない。


Windows Server 2008 R2上で、OpenOffice.org 3.1とOffice Proffesional Plus 2010 Betaを並べるとこんな感じ。



※おまけ
2007用に作成した顔文字辞書が使えなくなってしまったので、再構築して、一応Uploadしてみる。
http://matsucon.net/material/dic/で配布されている辞書を改造、システム辞書としたものです。
http://cid-e1c321b9c41536cb.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/2ch^_kaomozi^_office^_ime^_2010.dic

2009年11月19日木曜日

Microsoft Office Professional Plus 2010 の Beta版が一般公開

MicrosoftがOfficeシリーズの最新版、Office 2010のBeta評価版の一般公開を開始した模様。
TechnetやMSDNの評価版ダウンロードページからダウンロードすることができる。

今回(2010)から、32bit版と64bit版が明確に分かれるようになったらしく、それぞれ自分のシステムにあったインストーラーを入手する必要がある。

必須環境は以下の通り。
次の最小推奨要件を備えた PC:
・500 MHz 以上の 32 ビットまたは 64 ビット プロセッサ
・256 MB 以上のシステム メモリ
・3 GB の空き容量のあるハード ディスク
・1024x768 以上の解像度のモニター
・DVD-R/W ドライブ

サポートされているオペレーティング システム:
・Windows XP Service Pack (SP) 3 (32 ビット)
・Windows Vista SP1 (32 ビットまたは 64 ビット)
・Windows Server 2003 R2 (32 ビットまたは 64 ビット)
・Windows Server 2008 SP2 (32 ビットまたは 64 ビット)
・Windows 7 (32 ビットまたは 64 ビット)

…あれ…? Server 2008 R2は…どこ…?


Technet - Microsoft Office Professional Plus 2010 Beta
http://technet.microsoft.com/ja-jp/evalcenter/ee390818.aspx

MSDN - http://msdn.microsoft.com/ja-jp/evalcenter/ee390822.aspx
http://msdn.microsoft.com/ja-jp/evalcenter/ee390822.aspx

Download Microsoft Office Professional Plus 2010 Beta(英語)
http://www.microsoft.com/office/2010/en/download-office-professional-plus/default.aspx

2009年9月30日水曜日

Microsoftが無償でウィルス(マルウェア)対策ソフトを公開

マイクロソフトがWindows XP、 Vista、 7向けに、無償のウィルス対策ソフト Microsoft Security Essentialsをリリースした模様。

XPモードが7 Proffesionalに標準搭載される事になるので、仮想環境のウィルス対策が一般ユーザーにも求められる状況になっていくだろうこの状況で、Microfsoftが無償のウィルス対策ソフトをリリースしたというのは、なかなか良い感じ…な気がしなくもない。

フリーのウィルス対策ソフトは現時点でもたくさん存在しているが、殆ど「ホームユーザー向け・非営利のみ」だから…ねぇ('A`)


Microsoft Security Essentials
http://www.microsoft.com/security_essentials/default.aspx?mkt=ja-jp



Windows Server 2008 R2 Standardにインストールしようとすると…
Windows Server に Microsoft Security Essentials を インストールしようとした結果
…Server系はやっぱり非対応なのね…(´・ω・`)

2009年9月17日木曜日

はつねさんがシステムに常駐して時間をお知らせしてくれるアプリ「みくろっく」を作ってみた

夏休みも今日で終わり…ということで、最後になんか作ってみようと考えたのは良いものの、大して良いアイディアが思い浮かばなかったので、以前ダイナミックDNSの自動更新ツールをWindowsサービス化したときに、実験として作っていたみくろっく(Windowsサービス版)を改良してみることにした。

機能は、
・Windowsサービスとしてシステムに常駐
・以下のタイミングで音声でお知らせ
 -システム起動時(朝、昼、夜)
 -システム終了時(朝、昼、夜)
 -毎時00分(1~12)
 -毎時15、30,45分
 -5分に1回位、ランダム
・音声にはmp3ファイルを使用可能
・複数の音声ファイルから毎回ランダムで再生することも可能



肝心のはつねさんの音声ファイルが地味に手抜きな気が…
…誰かめぐりねさんとかで作って…(´д`*)アハァ


ダウンロードは以下からどうぞ。


こちらからもダウンロード可能。
https://sites.google.com/a/g.hachune.net/mtmef/home/download/Mikulock_WS_v1.01.zip?attredirects=0


たまには大して役に立たないアプリ作ったっていいよね…(´・ω・`)


※09.09.19 追記
「サービスは予期せぬ原因により終了しました」となり落ちることがある模様なので、
修正版を連休中に作りなおします…

※09.09.20 追記
修正版を公開しました。
多分これで大丈夫…なハズ。

Microsoftが学生向けにWindows Server 2008 R2やExpression Studio 3を無料配布中

MicrosoftのDreamSpark(学生を対象にしたソフトウェア開発製品、アプリケーションデザイン製品などの無償提供プログラム)で、いつの間にか最新のServer向けWindowsであるWindows Server 2008 R2 Standardと、デザインスイートExpression Studio 3が配布されていた。(Expression Studio 3は、現時点で英語版のみ)
https://www.dreamspark.com/default.aspx


私は今年の3月頃に、メールでの申し込みで登録していたアカウントをそのまま使用することができた。
http://projectzero-swb.blogspot.com/2009/03/microsoftos.html

現在メール登録は出来ないようだが、国際学生証を持ってさえいれば登録できる。

※追記
国際学生証を持っていなくとも登録出来る方法が現在もあった。
こちらのほうが簡単な気がする。
http://www.microsoft.com/japan/academic/DreamSpark/linno.mspx


総額計算すると恐ろしいな…これ('A`)

2009年8月26日水曜日

Opera 10 RCが公開されていた件

何故かFirefox嫌い(?)な私が常用しているwebブラウザ、Operaのバージョン10のRelease Candidate版が、Opera Desktop Term Blogにて公開されていた。

http://my.opera.com/desktopteam/blog/2009/08/25/opera-10-0-release-candidate

正式版は9月1日にリリースされる予定らしい。
新しい物好き・Beta版好きな私は、正式版を待たず、早速RC版をインストールしてみた。

Opera 10 RC

Beta3から変わった点は、日本語化された(Beta時代は英語)ことと、デフォルトのUIが変わった位…か?
相変わらずフォントの設定が面倒くさいこと以外は、なかなか良い感じ。




※Firefoxが嫌いというより、私の家の回線が遅い上に不安定で、新しいページを開き損ねた時に、一瞬で前開いていたページを読めるOperaが便利過ぎてずっと使っている、ということだったりする。

Opera turboなど、回線が細くても快適なブラウジングができる機能が他にもあるので、回線が細い人にはとてもオススメ。

2009年8月22日土曜日

Multi thread Media Encoder Frontend v1.2 完成

コマンドプロンプトだと使いにくいって言われるから、そろそろGUI付けようか…(´・ω・`)
と考え続けて半年。
VisualuRubyが無茶苦茶使いやすいことに気付き、とりあえずVisualuRubyで作ることに決めて4日。

ようやくGUI付きのMulti thread Media Encoder Frontendが完成したよ…(´;ω;`)ウッ…
Malti thread Media Encoder Frontend GUI
これで本当に「フロントエンド」を名乗れる…気がしなくもない。
…地味だけど、これでいいよね…('A`)

使用方法、プログラムのダウンロードは、http://mtmef.g.hachune.net/からどうぞ。

2009年8月20日木曜日

MinGWを使ったRuby/GTK2のコンパイルが上手くいかない件

Windowsでも最新のRuby/GTK2を使用できるようにしようと、MinGWを使用したコンパイルに何度も挑戦しているが、どうしても上手くいかない。

gtk2.soを作るところで、ld.exe: cannot find -lruby-gtk2となり、コケてしまう。

環境は、
Windows 7 RC x64
MSYS 1.0.11(32bit)
MinGW 5.1.4(32bit)
Rubyソースruby-1.8.7-p174.tar.gzをmake、D:/RubyGTKにインストール。
GTKバイナリgtk+-bundle_2.16.4-20090708_win32.zipをMSYSの/に展開。
Ruby/GTK2ソースruby-gtk2-0.19.1.tar.gzをmake。


hatsune@HATSUNE-SERVER ~/RubyGTK/ruby-gtk2-0.19.1
$ make
make[1]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib'
make[2]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib/src'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib/src'
make[1]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib'
make[1]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gdkpixbuf'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gdkpixbuf'
make[1]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango'
make[2]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango/src'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango/src'
make[1]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango'
make[1]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/atk'
make[2]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/atk/src'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/atk/src'
make[1]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/atk'
make[1]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk'
make[2]: Entering directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk/src'
gcc -shared -s -o gtk2.so init.o rbgdk.o rbgdkatom.o rbgdkcairo.o rbgdkcolor.o rbgdkcolormap.o rbgdkconst.o rbgdkcursor.o rbgdkdevice.o rbgdkdisplay.o rbgdkdisplaymanager.o rbgdkdragcontext.o rbgdkdraw.o rbgdkevent.o rbgdkgc.o rbgdkgeometry.o rbgdkimage.o rbgdkinput.o rbgdkkeymap.o rbgdkkeyval.o rbgdkpango.o rbgdkpangorenderer.o rbgdkpixbuf.o rbgdkpixmap.o rbgdkproperty.o rbgdkrectangle.o rbgdkregion.o rbgdkrgb.o rbgdkscreen.o rbgdkselection.o rbgdkthreads.o rbgdktimecoord.o rbgdkvisual.o rbgdkwindow.o rbgdkwindowattr.o rbgdkx11.o rbgtk.o rbgtkaboutdialog.o rbgtkaccelerator.o rbgtkaccelgroup.o rbgtkaccelgroupentry.o rbgtkaccelkey.o rbgtkaccellabel.o rbgtkaccelmap.o rbgtkaccessible.o rbgtkaction.o rbgtkactiongroup.o rbgtkadjustment.o rbgtkalignment.o rbgtkallocation.o rbgtkarrow.o rbgtkaspectframe.o rbgtkassistant.o rbgtkbbox.o rbgtkbin.o rbgtkbindingset.o rbgtkborder.o rbgtkbox.o rbgtkbuildable.o rbgtkbuilder.o rbgtkbutton.o rbgtkcalendar.o rbgtkcelleditable.o rbgtkcelllayout.o rbgtkcellrenderer.o rbgtkcellrendereraccel.o rbgtkcellrenderercombo.o rbgtkcellrendererpixbuf.o rbgtkcellrendererprogress.o rbgtkcellrendererspin.o rbgtkcellrenderertext.o rbgtkcellrenderertoggle.o rbgtkcellview.o rbgtkcheckbutton.o rbgtkcheckmenuitem.o rbgtkclipboard.o rbgtkcolorbutton.o rbgtkcolorsel.o rbgtkcolorselectiondialog.o rbgtkcombo.o rbgtkcombobox.o rbgtkcomboboxentry.o rbgtkconst.o rbgtkcontainer.o rbgtkcurve.o rbgtkdialog.o rbgtkdrag.o rbgtkdrawingarea.o rbgtkeditable.o rbgtkentry.o rbgtkentrycompletion.o rbgtkeventbox.o rbgtkexpander.o rbgtkfilechooser.o rbgtkfilechooserbutton.o rbgtkfilechooserdialog.o rbgtkfilechooserwidget.o rbgtkfilefilter.o rbgtkfilesel.o rbgtkfixed.o rbgtkfontbutton.o rbgtkfontselection.o rbgtkfontselectiondialog.o rbgtkframe.o rbgtkgamma.o rbgtkhandlebox.o rbgtkhbbox.o rbgtkhbox.o rbgtkhpaned.o rbgtkhruler.o rbgtkhscale.o rbgtkhscrollbar.o rbgtkhseparator.o rbgtkiconfactory.orbgtkiconinfo.o rbgtkiconset.o rbgtkiconsize.o rbgtkiconsource.o rbgtkicontheme.o rbgtkiconview.o rbgtkimage.o rbgtkimagemenuitem.o rbgtkimcontext.o rbgtkimcontextsimple.o rbgtkimmulticontext.o rbgtkinits.o rbgtkinputdialog.o rbgtkinvisible.o rbgtkitem.o rbgtkitemfactory.o rbgtklabel.o rbgtklayout.o rbgtklinkbutton.o rbgtkliststore.o rbgtkmain.o rbgtkmenu.orbgtkmenubar.o rbgtkmenuitem.o rbgtkmenushell.o rbgtkmenutoolbutton.o rbgtkmessagedialog.o rbgtkmisc.o rbgtknotebook.o rbgtkobject.o rbgtkoptionmenu.o rbgtkpagesetup.o rbgtkpagesetupunixdialog.o rbgtkpaned.o rbgtkpapersize.o rbgtkplug.o rbgtkprintcontext.o rbgtkprinter.o rbgtkprintjob.o rbgtkprintoperation.o rbgtkprintoperationpreview.o rbgtkprintsettings.orbgtkprintunixdialog.o rbgtkprogress.o rbgtkprogressbar.o rbgtkradioaction.o rbgtkradiobutton.o rbgtkradiomenuitem.o rbgtkradiotoolbutton.o rbgtkrange.o rbgtkrc.o rbgtkrcstyle.o rbgtkrecentaction.o rbgtkrecentchooser.o rbgtkrecentchooserdialog.o rbgtkrecentchoosermenu.o rbgtkrecentchooserwidget.o rbgtkrecentdata.o rbgtkrecentfilter.o rbgtkrecentfilterinfo.orbgtkrecentinfo.o rbgtkrecentmanager.o rbgtkruler.o rbgtkscale.o rbgtkscalebutton.o rbgtkscrollbar.o rbgtkscrolledwindow.o rbgtkselection.o rbgtkselectiondata.o rbgtkseparator.o rbgtkseparatormenuitem.o rbgtkseparatortoolitem.o rbgtksettings.o rbgtksizegroup.o rbgtksocket.o rbgtkspinbutton.o rbgtkstatusbar.o rbgtkstatusicon.o rbgtkstock.o rbgtkstyle.o rbgtktable.o rbgtktargetlist.o rbgtktearoffmenuitem.o rbgtktextappearance.o rbgtktextattributes.o rbgtktextbuffer.o rbgtktextchild.o rbgtktextiter.o rbgtktextmark.o rbgtktexttag.o rbgtktexttagtable.o rbgtktextview.o rbgtktoggleaction.o rbgtktogglebutton.o rbgtktoggletoolbutton.o rbgtktoolbar.o rbgtktoolbutton.o rbgtktoolitem.o rbgtktooltip.o rbgtktooltips.o rbgtktreedragdest.o rbgtktreedragsource.o rbgtktreeiter.o rbgtktreemodel.o rbgtktreemodelfilter.o rbgtktreemodelsort.o rbgtktreepath.o rbgtktreerowreference.o rbgtktreeselection.o rbgtktreesortable.o rbgtktreestore.o rbgtktreeview.o rbgtktreeviewcolumn.o rbgtkuimanager.o rbgtkvbbox.o rbgtkvbox.o rbgtkviewport.o rbgtkvolumebutton.o rbgtkvpaned.o rbgtkvruler.o rbgtkvscale.o rbgtkvscrollbar.o rbgtkvseparator.o rbgtkwidget.o rbgtkwindow.o rbgtkwindowgroup.o -L. -Ld:/RubyGTK/lib -L. -LD:/MSYS32/lib -LD:/MSYS32/lib -LD:/MSYS32/lib -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib/src -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/glib/src -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango/src -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/pango/src -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk/src -LD:/MSYS32/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk/src -Wl,--enable-auto-image-base,--enable-auto-import,--export-all,--out-implib=libruby-gtk2.a -lmsvcrt-ruby18 -lgthread-2.0 -lglib-2.0 -lintl -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -lcairo -lruby-glib2 -lruby-glib2 -lruby-pango -lruby-pango -lruby-gtk2 -lruby-gtk2 -lshell32 -lws2_32
D:\MinGW32\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot find -lruby-gtk2
collect2: ld returned 1 exit status
make[2]: *** [gtk2.so] Error 1
make[2]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/hatsune/RubyGTK/ruby-gtk2-0.19.1/gtk'

-----
SUCCEEDED: glib gdkpixbuf pango atk
FAILED: gtk
-----
Done.



…gtk以外はコンパイル出来るのだが…
…諦めようか…(ヽ´ω`)

2009年8月16日日曜日

マルチスレッド対応 マルチフロントエンド(もどき) 改め Multi thread Media Encoder Frontendのまとめサイトがようやく完成

マルチスレッド対応 マルチフロントエンド(もどき)では、どういうソフトなのか分かりづらいという反省点を踏まえ改名。ついでに、物凄く分かりづらかった使い方の説明や、最新版の配布を行うためのまとめサイトを作ってみた。

まとめサイトは以下のリンクから。
http://mtmef.g.hachune.net/


更についでに、ソフト本体の更新も行った。
今回(v1.1)の変更点は、以下の通り。
・lame(mp3)に加え、ogg Vorbis(ogg)、Free Lossless Audio Encoder(flac)、The True Audio(tta)、neroAacEnc(aac、m4a)、Windows Media Audio(wma)によるエンコードに対応。
・ディレクトリ選択時に、ディレクトリパス名の補完をTabキーで行えるようになった。
・-vオプションを付けて起動するか、スレッド数を1にすることで、エンコード/デコード処理の詳細を表示するようにした。
・その他細かな修正


プログラムを直接ダウンロードしたい場合は以下のリンクからどうぞ。
https://sites.google.com/a/g.hachune.net/mtmef/home/download

…(´ぅω・`)ネムタス

2009年8月13日木曜日

Windows 7 x64にMinGW x64環境を構築

折角Windows 7 x64を使っているのに、x86アプリばかり動かしている現状が嫌になったので、MinGW x64をインストールして、Windows x64ネイティブなバイナリを作れるようしようとしていた…のだが、なかなか設定が分からず苦戦していた。

ようやくlameがコンパイルできたので、環境構築手順を纏めてみる。



まず、MinGW-w64環境を構築する。

MinGW-w64のバイナリをhttp://sourceforge.net/projects/mingw-w64/から持ってくる。
私は、現時点の最新版である、mingw-w64-bin_i686-mingw_20090811.zipをダウンロードした。

ダウンロードが終わったら、アーカイブ(zip)を解凍する。
解凍先は、C:\MinGWなど、自分が分かりやすいパスを指定する。
私の場合は、D:\MinGWに解凍した。

解凍後、binフォルダに入っている
x86_64-w64-mingw32-addr2line.exe、x86_64-w64-mingw32-ar.exe......
というファイルを、全て
addr2line.exe、ar.exe......
となるようにリネームする。


一つずつリネームするのが面倒なら、以下の内容のバッチファイルをbinフォルダに作成し、実行すると楽かもしれない。
@echo on
rename x86_64-w64-mingw32-addr2line.exe addr2line.exe
rename x86_64-w64-mingw32-ar.exe ar.exe
rename x86_64-w64-mingw32-as.exe as.exe
rename x86_64-w64-mingw32-c++.exe c++.exe
rename x86_64-w64-mingw32-c++filt.exe c++filt.exe
rename x86_64-w64-mingw32-cpp.exe cpp.exe
rename x86_64-w64-mingw32-dlltool.exe dlltool.exe
rename x86_64-w64-mingw32-dllwrap.exe dllwrap.exe
rename x86_64-w64-mingw32-g++.exe g++.exe
rename x86_64-w64-mingw32-gcc-4.5.0.exe gcc-4.5.0.exe
rename x86_64-w64-mingw32-gcc.exe gcc.exe
rename x86_64-w64-mingw32-gccbug gccbug
rename x86_64-w64-mingw32-gcj.exe gcj.exe
rename x86_64-w64-mingw32-gcov.exe gcov.exe
rename x86_64-w64-mingw32-gfortran.exe gfortran.exe
rename x86_64-w64-mingw32-gprof.exe gprof.exe
rename x86_64-w64-mingw32-jcf-dump.exe jcf-dump.exe
rename x86_64-w64-mingw32-ld.exe ld.exe
rename x86_64-w64-mingw32-nm.exe nm.exe
rename x86_64-w64-mingw32-objcopy.exe objcopy.exe
rename x86_64-w64-mingw32-objdump.exe objdump.exe
rename x86_64-w64-mingw32-ranlib.exe ranlib.exe
rename x86_64-w64-mingw32-readelf.exe readelf.exe
rename x86_64-w64-mingw32-size.exe size.exe
rename x86_64-w64-mingw32-strings.exe strings.exe
rename x86_64-w64-mingw32-strip.exe strip.exe
rename x86_64-w64-mingw32-windmc.exe windmc.exe
rename x86_64-w64-mingw32-windres.exe windres.exe
pause

(最初からgcc.exeのようなファイル名になっている、/mingwフォルダや/x86_64-w64-mingw32フォルダに入っているものを使用しようとすると、コンパイル時に

hatsune@HATSUNE-SERVER ~
$ gcc -v time.c
Using built-in specs.
Target: x86_64-w64-mingw32
Configured with: ../../../build/gcc/gcc/configure --target=x86_64-w64-mingw32 --
prefix=/c/buildbot/vista64-mingw32/mingw-x86-x86_64/build/build/root --with-sysr
oot=/c/buildbot/vista64-mingw32/mingw-x86-x86_64/build/build/root --enable-langu
ages=all,obj-c++ --enable-fully-dynamic-string --disable-multilib
Thread model: win32
gcc version 4.5.0 20090806 (experimental) (GCC)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic'
cc1 -quiet -v -iprefix d:\mingw\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.0/
time.c -quiet -dumpbase time.c -mtune=generic -auxbase time -version -o S:\UserT
emp\hatsune\ccd8FXk1.s
gcc.exe: CreateProcess: No such file or directory

とエラーが発生してしまい、コンパイルできない問題にハマってしまった)





次に、MinGWを使用する上で必要なMSYS環境を構築する。
MSYSバイナリをhttp://sourceforge.net/projects/mingw/から持ってくる。
現時点の最新版である、MSYS-1.0.11.exeをダウンロードした。

ダウンロード後、インストーラーを実行し、MSYSのインストールパスを指定、インストールすると、コマンドプロンプトが開き、
This is a post install process that will try to normalize between your MinGW install if any as well as your previous MSYS installs if any. I don't have any traps as aborts will not hurt anything.
Do you wish to continue with the post install? [yn ]

と出るので"y"を入力。

すると、
Do you have MinGW installed? [yn ]
と出るので、これも"y"を入力。

次に、
Please answer the following in the form of c:/foo/bar.
Where is your MinGW installation?

と出るので、MinGWをインストールしたパスを指定する。
私の場合は、D:/MinGWを指定した。
ここでパスを指定する際に、パスの区切りを"\(円記号・バックスラッシュ)"ではなく"/(スラッシュ)"にする必要があるので注意する。

MSYS Setup

後は、てきとうなCのソースコードを持ってきて、MSYS上でコンパイルして実行する。
lameなら、いつも通り

$ ./configure
$ make
$ make install

とするだけで、コンパイルできる。

タスクマネージャーでそのプロセスを見て、"*32"がプロセス名に付いていなかったら、x64のバイナリが作成・実行出来ているということになる。
lame x64


手順並べるとこんなに簡単なのに、何故あんなに苦労したんだ…('A`)

2009年8月7日金曜日

ダイナミックDNSの自動更新ツールをWindowsサービス化してみた

Windowsサービスアプリケーションの作り方が分かったので、DynamicDNSのアップデートツールを、作り直してみた。

以前作っていたものは、MyDNS専用かつアカウント一つしか使用できなかったのだが、今回は、
・通常のHTTPか、ベーシック認証を利用できるDDNSであればなんでも利用可能
・複数同時登録可能
・Windowsサービスとして動作
というものを作ってみた。

Windowsサービスとして動作するので、Windowsが起動してさえいれば、ログインしていなくても自動的に更新が行われるので、たぶん便利。


プログラム本体は、以下からダウンロードできます。



Windows 7 RC x64でしか動作確認していないので、それ以外(特にXP)で正しく動作するかちょっと不安…(´・ω・`)
…もしコケたら…ごめんね…(´;ω;`)ブワッ

2009年8月3日月曜日

RubyでWindowsのサービスを作る

以前DDNSUpdaterを作った時に、「Windowsサービス化はむりぽ」と書いたが、
ようやくWindowsサービスをRubyで作れるレベルになったので、纏めてみる。

まず、WindowsサービスをRubyで作成する上で必要なライブラリWin32-Serviceを入手する。
RubyGemsを使用して入手するのが一番楽だと思われる。

Win32アプリケーションを作成するにあたって、Win32Utilsはかなり重要になってくる(と思われる)ので、他にも必要としているものが無いか探しておくと、後で悩むことが無くなって良いと思う。

RubyGemsとWin32-Serviceのインストール
http://projectzero-swb.blogspot.com/2009/08/win32-servicerubygems.html


RubyでWindowsサービスを作成する上で必要なことは、
・サービス登録を行うスクリプトの作成
・サービスデーモンの作成
・サービスデーモンに行わせる処理の作成

の3つ。

この中で、・サービス登録を行うスクリプトの作成は、Windows標準付属のsc.exeで代用することも可能だが、そこも自動化できないといろいろ面倒なので、普通にスクリプトを作成する。
作ると言っても、殆どライブラリ付属のサンプルスクリプトのままでおkなのだが…


以下がサービスを管理するクラス。
定数SERVICE_NAME、SERVICE_DISPLAYNAME、SERVICE_DESCRIPTION、SERVICE_COMMANDを編集することによって、どんなサービスにも応用できる…はず。

サービスを登録…service_install
サービスを開始…service_start
サービスを停止…service_stop
サービスを再開…service_resume
サービスを削除…service_uninstall
サービスの状態を返す…service_stat


#! ruby.exe

require 'rubygems'
require 'win32/service'
include Win32

# サービスの作成に必要な情報を定義(ServiceSetupクラスで使用)
SERVICE_NAME        = "Rubyservice"                  # サービスの正式な名前。これで全て管理される。
SERVICE_DISPLAYNAME = "RubyService"                  # サービスの表示名。サービス一覧などに表示される名前
SERVICE_DESCRIPTION = "Rubyで作成したサービスです。" #
# Rubyスクリプトそのままだと、インタプリタのパス指定間違いによる193 0xc1エラーが発生するなど、
# いろいろ面倒なのでexerbでWindows用exeファイル化しておく
SERVICE_COMMAND     = "C:\\Service\\Rubyservice.exe"


class ServiceSetup
  def initialize
    raise TypeError if SERVICE_NAME        == nil || SERVICE_NAME.class        != String
    raise TypeError if SERVICE_DISPLAYNAME == nil || SERVICE_DISPLAYNAME.class != String
    raise TypeError if SERVICE_DESCRIPTION == nil || SERVICE_DESCRIPTION.class != String
    raise TypeError if SERVICE_COMMAND     == nil || SERVICE_COMMAND.class     != String
  end

  # サービスインストール
  def service_install
    Service.new(
                :service_name     => SERVICE_NAME,
                :display_name     => SERVICE_DISPLAYNAME,
                :description      => SERVICE_DESCRIPTION,
                :binary_path_name => SERVICE_COMMAND
                )
    sleep 1
    puts 'サービス ' + SERVICE_NAME + ' をインストールしました。' 
  end

  # サービス開始
  def service_start
    if Service.status(SERVICE_NAME).current_state != 'running'
      Service.start(SERVICE_NAME)
      while Service.status(SERVICE_NAME).current_state != 'running'
        puts 'One moment...' + Service.status(SERVICE_NAME).current_state
        sleep 1
      end
      puts 'サービス ' + SERVICE_NAME + ' を開始しました。'
    else
      puts SERVICE_NAME + " は既に実行されています。"
    end
  end

  # サービス停止
  def service_stop
    if Service.status(SERVICE_NAME).current_state != 'paused'
      Service.pause(SERVICE_NAME)
      while Service.status(SERVICE_NAME).current_state != 'paused'
        puts 'One moment...' + Service.status(SERVICE_NAME).current_state
        sleep 1
      end
      puts 'サービス ' + SERVICE_NAME + ' を停止しました。'
    else
      puts SERVICE_NAME + ' は既に停止しています。'
    end
  end

  # サービス再開
  def service_resume
    if Service.status(SERVICE_NAME).current_state != 'running'
      Service.resume(SERVICE_NAME)
      while Service.status(SERVICE_NAME).current_state != 'running'
        puts 'One moment...' + Service.status(SERVICE_NAME).current_state
        sleep 1
      end
      puts 'サービス ' + SERVICE_NAME + ' を再開しました。'
    else
      puts SERVICE_NAME + " は既に実行されています。"
    end
  end

  # サービスアンインストール
  def service_uninstall
    if Service.status(SERVICE_NAME).current_state != 'stopped'
      Service.stop(SERVICE_NAME)
    end
    while Service.status(SERVICE_NAME).current_state != 'stopped'
      puts 'One moment...' + Service.status(SERVICE_NAME).current_state
      sleep 1
    end
    Service.delete(SERVICE_NAME)
    puts 'サービス ' + SERVICE_NAME + ' を削除しました。'
  end

  # サービスの状態を返す
  def service_stat
    begin
      stat = Service.status(SERVICE_NAME).current_state
    rescue
      return false
    end
    return stat
  end
end




次に、サービスデーモンを作成する。
ここでは例として、DDNSUpdaterのおまけ(?)として作っていた「みくろっく」をWindowsサービスデーモン化してみた。

Win32::Daemonクラスには、
サービスの開始時に実行…service_init
サービスのメイン処理…service_main
サービス停止時の処理…service_stop
サービス一時停止時の処理…service_pause
サービスらい開示の処理…service_resume
を定義することができる。
それぞれのメソッドは、対応するシグナルが送られてきた時に実行される。

通常は、
service_init→service_main
の順で実行される。


#! ruby.exe

begin
  require 'rubygems'
  require 'win32/daemon'
  # require 'win32/sound' # サービスにすると音が出なかったので
  include Win32
  SYSTEM_BINDIR = ENV["ProgramFiles"] + "\\Mikulock"
  SYSTEM_WAVDIR = SYSTEM_BINDIR + "\\Sound"
  SYSTEM_LOGDIR = ENV["ProgramData"]  + "\\Mikulock"
  SYSTEM_BINARY = SYSTEM_BINDIR + "\\mikulock_service.exe"
  SYSTEM_LOG    = SYSTEM_LOGDIR + "\\mikulock.log"

  #Win32::Daemonクラスの継承
  class RubyDaemon < Daemon
    # サービスの初期化
    def service_init
      File.open(SYSTEM_LOG, "a") {|writelog|
        writelog.printf("%-36s - Service Start.\n", Time.now.to_s)
      }
      sleep 10
    end

    module Mikulock
      def self.mikulock_play(play)
        if File.exist?("Sound\\" + play) == true
          IO.popen("mpg123 -q Sound\\#{play}")
          File.open(SYSTEM_LOG, "a") do |writelog|
            writelog.printf("%-36s - Play: %s\n", Time.now.to_s, File.expand_path("Sound\\" + play))
          end
        end
      end

      def self.mikulock_timecheck
        if Time.now.to_a[1] == 0
          case Time.now.to_a[2]
          when 0
            return "0h.mp3"
          when 1, 13
            return "1h.mp3"
          when 2, 14
            return "2h.mp3"
          when 3, 15
            return "3h.mp3"
          when 4, 16
            return "4h.mp3"
          when 5, 17
            return "5h.mp3"
          when 6, 18
            return "5h.mp3"
          when 7, 19
            return "7h.mp3"
          when 8, 20
            return "8h.mp3"
          when 9, 21
            return "9h.mp3"
          when 10, 22
            return "10h.mp3"
          when 11, 23
            return "11h.mp3"
          when 12
            return "12h.mp3"
          end
        elsif Time.now.to_a[1] == 30
          return "30min.mp3"
        else
          return false
        end
      end
    end

    # サービスのメイン処理
    def service_main
      play     = String.new
      play_end = String.new #お知らせが終わったものを記録

      # 最初の一回を設定
      if Time.now.to_a[2] >= 5  && Time.now.to_a[2] < 11
        play = "morning.mp3"
      elsif Time.now.to_a[2] >= 11 && Time.now.to_a[2] < 18
        play = "noon.mp3"
      else
        play = "night.mp3"
      end

      # 音声を再生する為のスレッド
      thread = Thread.new do
        while running?
          if state == RUNNING
            if play != false && play != play_end
              Mikulock.mikulock_play(play)
              play_end = play
            end
            sleep 5
          end
        end
      end

      # サービスの状態がrunningの時のみ繰り返す
      while running?
        if state == RUNNING
          play = Mikulock.mikulock_timecheck
          File.open(SYSTEM_LOG, "a") {|writelog|
            writelog.printf("%-36s - Running\n", Time.now.to_s)
          }
          sleep 5
        else
          sleep 1
        end
      end
    end

    # Stop(停止)シグナルが送られてきた時の処理
    def service_stop
      File.open(SYSTEM_LOG, "a"){|writelog|
        writelog.printf("%-36s - Stop\n", Time.now.to_s)
      }
    end

    # Pause(一時停止)シグナルが送られてきた時の処理
    def service_pause
      File.open(SYSTEM_LOG, "a"){|writelog|
        writelog.printf("%-36s - Pause\n", Time.now.to_s)
      }
    end

    # Resume(再開)シグナルが送られてきたときの処理
    def service_resume
      File.open(SYSTEM_LOG, "a"){|writelog|
        writelog.printf("%-36s - Resume\n", Time.now.to_s)
      }
    end
  end

  # mpg123のインストール先にcdしておく
  Dir.chdir(SYSTEM_BINDIR + "\\mpg123"){
    # このループの中で全ての処理が行われる
    RubyDaemon.mainloop
  }

  # 例外が発生した時は、例外の内容をログに書き込み、さらに例外を発生させる
rescue => error
  File.open(SYSTEM_LOG, "a"){|writelog|
    writelog.printf("%-36s - Error: %s\n", Time.now.to_s, error)
  }
  raise
end





これをそのまま実行しても、`mainloop': Service_Main thread exited abnormally.....となり、実行できないので、
サービス登録クラスを組み込んだスクリプトを利用し、サービスに登録、ログを読みながらデバッグする必要がある。

サービス作成中に良くあるミスは、
・Rubyインタプリタのパス、プログラムのソースのパスが間違っている
・service_mainのwhile running?の中が正しく書かれていない
・while running?の中にsleep 60などと書いてしまい、60秒待たないとサービスを停止できなくなる
・例外処理が不十分でサービスが落ちる
だった。


サービスの登録が終わったら、
コントロールパネル→管理ツール→サービス
を開き、登録したサービスが正しく実行されているか確認する。
サービスの状態が「開始」になっていれば、問題無く動作している…はず。
サービス一覧

OS起動時に自動実行したいときは、「サービス」でMikulockのプロパティを開き、
「スタートアップの種類」を「自動」もしくは「自動(遅延開始)」に設定すれば良い。
サービスのプロパティ
09.08.04 追記
・スクリプトの中で「スタートアップの種類」を「自動」に設定するにはどうしたら…?
:start_type => Service::AUTO_START
を、サービスインストール時の引数に渡せば良い模様。

ここまでで、とりあえずWindowsサービスを利用したRubyアプリケーションが作れるということが分かった。



以前はWin32/Soundを使用し、音を鳴らしていたが、サービスにすると上手く鳴らないようだったので、
mpg123を使用し、mp3を再生するようにしてみたのだが、
mpg123の-qオプションを使用しても、なにかが標準入力か標準出力を開くようで、
「対話型サービスの検出」ウィンドウが現れてしまうという問題が…
デスクトップとの対話
「デスクトップとの対話をサービスに許可する」を無効にすれば一応出現しなくなるが、Windowsのアプリケーションログに残ってしまうので、根本的な解決にはならない。

更に、mpg123には、どんなmp3ファイルを再生しても最後の2〜3秒がカットされてしまうという問題も…


今回作ったみくろっく(Windowsサービス版)のダウンロードは以下から。
Win32-Serviceのテスト用途にどうぞ。


※09.09.17 追記
みくろっく改良版



※09.08.07 追記
Dynamic DNS UpdaterをWindowsサービス化してみた。
以下からダウンロードできます。

Win32-Serviceが欲しかったのでRubyGemsをインストール

RubyでWindowsサービスを作成しようと、Win32-Serviceをインストールしようとしたところ、RubyGemsが無いと面倒くさそうだったので、まずはRubyGemsをインストールすることにした。


09.08.03時点で最新のrubygems-1.3.5.zipをダウンロードしてきて解凍する。
コマンドプロンプトを開き、setup.rbを実行。
C:\Users\hatsune\Desktop\rubygems-1.3.5> ruby setup.rb


バージョンを確認して、
C:\Users\hatsune\Desktop\rubygems-1.3.5> gem -v
1.3.5

となれば、インストールに成功していると思われる。

あとは、好きなライブラリをgemsから持ってくることが出来る。
C:\> gem install win32-service



…と思っていても、上手くいかないことがあるのが普通


今回は、zlibとsslのライブラリが足りないと言われた。
Ruby-mswin32をそのまま使用している場合はまず発生すると思われる。

Ruby-mswin32のインストールを読むと、
http://jarp.does.notwork.org/win32/にライブラリがあるので、これをインストールしろ」とのこと。


仕方が無いので、ライブラリをインストール。
openssl-0.9.8d-1-mswin32.zip
zlib-1.1.4-1-mswin32.zipをダウンロードしてくる。
これを、フォルダ階層を維持しつつ、Rubyのバイナリがインストールしてあるフォルダにコピーする。
(\binはC:\Ruby\binへ、\libはC:\Ruby\libへ…という感じに)


これで実行できる…と思い、再度実行すると、今度はssleay32.dllが見つからないと言われた。
"ssleay32.dll"でググったところ、自分でOpenSSLをコンパイルするか、
OpenSSLのWindows用バイナリを配布してくれているサイトから持ってきて、
ssleay32.dllをコピーすればいいらしい。
(コンパイルするのは面倒なので、http://curl.haxx.se/download/openssl_w32vc6-0.9.8g.7zをダウンロード、インストールした。)


これでようやくRubyGemsが動き、Win32-Serviceをインストールすることが出来た。

2009年7月25日土曜日

マルチスレッド対応 マルチフロントエンド(もどき) を作ってみた

だいぶ前、マルチスレッド対応 lameフロントエンド(もどき)を更新すると言って早一ヶ月…。
ようやくそれなりのモノが完成したので公開することにしてみることにした。

以前作っていたマルチスレッド対応 lameフロントエンド(もどき)を元に、

・機能と安定性、起動速度の向上
・lame(mp3)以外のエンコーダー以外にも対応(設定ファイルで追加可能、NeroAacEnc(m4a)ogg Vorbisの動作を確認)
・コマンドラインで動作させられるものであれば、音楽だけでなく、動画等のエンコーダーにも対応させることが可能になった…かもしれない
・一応オブジェクト指向風味に

…などの改善を行った。
(元にしたと言っても、ソースは1から書き直していたりするのだが…)

その他にも、

・手軽にマルチスレッド化でき、どんなエンコーダーでもマルチコアCPUを有効に使える
・ファイルの名前、サイズ、最終アクセス日時、最終更新日時でフィルタリングをかけ、対象ファイルを絞り込んだりできる
・相変わらずディレクトリ単位での一括エンコードに特化
・結構詳しいエンコードログを記録できる(バイナリ統一すればベンチマークとしても使える…かも?)
・実行ファイルのアイコンにディレクトリ(フォルダ)アイコンをドラッグアンドドロップすると、規定の設定で一発エンコードすることが可能

などといった特徴がある…と思う(´・ω・`)


プログラム本体は以下からダウンロードできます。
http://mtmef.g.hachune.net/

※09.07.27 neroAacEncのコマンドラインオプションが、"-b 256000"ではなく"-b 256"となっている問題を修正しました。
ついでに、ogg Vorbisでのエンコードにも対応させました。
これで、neroAacEncとogg Vorbisをマルチスレッド化できる…ハズ。

※09.08.07 lame ABRのオプションの"--a"とすべきところが、"-a"となっている問題、pdcurses.dllが見つからないと言われる問題を修正しました。
設定ファイルの"-a"となっているところを"--a"にするだけでも回避できます。

※09.08.15 追記
ブログだといろいろ見づらい上に分かりづらいので、一つに纏めてみた
ついでに使い方の解説もしています。
最新版のダウンロードはこちらのページから行えます。
http://mtmef.g.hachune.net/



デフォルトの設定ファイルでは、lame(mp3)かneroAacEnc(m4a)、ogg Vorbisのいずれかのバイナリが必要です。
lameのWindows用バイナリは以下からダウンロードすることが出来ます。
http://www.rarewares.org/mp3-lame-bundle.php
neroAacEncのバイナリは以下からダウンロードすることが出来ます。
http://www.nero.com/jpn/technologies-aac-codec.html
ogg Vorbisのバイナリは以下からダウンロードすることが出来ます。
http://www.rarewares.org/ogg-oggenc.php


フォルダごとに適当にドラッグアンドドロップで登録して、実行するとこんな感じになる。

4つを別々に登録したので、コマンドプロンプトのウィンドウが4枚開いているが、
一つのウィンドウの処理が終わるまで待ち、それが終わった瞬間次の処理に移るようにしているので、
ファイルの整合性に問題が出ることは無い。
ドラッグアンドドロップで大量に登録しても、処理待ち状態になって、他の処理が終了すれば自動的に次の処理が開始することになるので、指定されたスレッド数以上の処理をすること無く処理を行う事が出来る。


5月位からすこーしずつ作り続けて、ようやくここまで…(ヽ´ω`)
後は、ディレクトリ選択や設定変更をGUI上で出来るようにすれば…
ドラッグアンドドロップでのエンコードに対応したんで、そろそろ(もどき)外してもいいかな…('A`)

それにしても、今マルチスレッド対応 lameフロントエンド(もどき)のソースを見ると、こりゃ汚いな…と。
非効率な上、やたらコケるという…
正直、あんなもんリリースしててごめんなさいと言わざるを得ない気が…(´・ω・`)

2009年6月30日火曜日

Windows 7 の割引キャンペーンが…

6月26日〜7月5日の期間限定で、
Windows 7 Home Premium アップグレード版が7777円
Windows 7 Professional アップグレード版が14777円

というキャンペーンがあった。
http://www.microsoft.com/japan/windows/possibilities/buynow/default.aspx?WT.mc_id=jpwun_fy09_w7preorder_srch004

…ハズなのだが、
「売り切れ早すぎワロタ」

10日間の期間設定だったのだが、限定数はあっという間に売り切れ(数時間でほぼ完売)
一人3本まで買えるという、「在庫あったら転売用途に買うだろ、常識的に考えて」な設定が、それに拍車をかけた模様。


更に効率が良いものは無いものか、と探したところ、
Windows 7 勉強会に申し込んで、Technet Plus Direct サブスクリプション 40%Offキャンペーンを購入するのが…一番安い…かも?ということが判明。
新規 40%OFF (定価 39,000 円 → 特別価格 23,400 円)
更新 30% OFF (定価 29,000 円 → 特別価格 20,300 円)

(09年6月30日まで申し込みで、7月中旬頃にお知らせ…なので、今日まで登録が必要なんだ…(´・ω・`))


Technet Plus Direct サブスクリプションは、Windows 7の他、Windows Server、過去のWindows、Officeなど、Microsoft製品を無期限評価できるという権利を、1年間持てるというもの。期限が切れても、一度取得したプロダクトキーは、アクティベーション制限を越えない限り評価できるらしい。
アクティベーション制限は、
いくつかの製品(Windows Server 2008など)は500回まで
その他は、10×10の100回までアクティベーション可
とのこと。
それ以上は、ライセンス認証窓口に問い合わせてね(´・ω・`)、だそうな。

あくまで評価なので、仕事など実稼働環境では使用してはいけないということになっているので、そこは注意しないといけないが…

Technetサブスクリプション FAQ
http://technet.microsoft.com/ja-jp/subscriptions/cc837095.aspx


※追記 09.07.02
まだWindows 7 勉強会に申し込める模様…('A`)
https://profile.microsoft.com/RegSysProfileCenter/wizard.aspx?wizid=32863efb-e1d8-4c76-80d5-e2a01597b919&lcid=1041

ただ、よく見たら
ご好評につき登録期限を 6 月 30 日 (火) より延長いたします。
特典 4 である TechNet Plus Direct サブスクリプション特別割引につきましては、6 月 30 日 (火) までにご登録いただいた方に限らせていただきます。あらかじめご了承ください。(2009.06.22)

と書いてあったので、Technet目当てだと意味無いな、これ…

2009年5月10日日曜日

マルチスレッド対応 lameフロントエンド (もどき) v2.3a


09.07.26 追記
Multi thread Media Encoder Frontend(マルチスレッド対応 マルチフロントエンド)をリリース。
マルチスレッド対応 lameフロントエンド (もどき)より、
高性能で安定性も高い…と思う。
GUIも付いたので、マウスだけでも操作できます。
http://mtmef.g.hachune.net/


ここより下の情報は古いです…(´・ω・`)スマソ





GWが終わったら、バグ取りと機能改善したものをリリースするよ(´・ω・`)、…と言って修正を開始し、とりあえず問題無く動くレベルになったので、リリースしてみた。

今回は、エンコードファイルのフィルタリング機能(ファイル名・ファイルサイズ・アクセス時間・更新時間で判別)と、スレッド数の上限の撤廃をメインに、いろいろ修正した。


以下テンプレ。

どういう処理をするのか、などの解説はこちら

特徴

  • lameのエンコード処理を並列して行うことができ(環境が許す限り無限に)、Corei7・PhenomⅡなどのマルチコア・マルチスレッドCPUや、デュアルプロセッサ環境も有効に使える。
  • ディレクトリごとに一気にエンコードが可能。
  • wav→mp3変換とmp3→mp3変換に対応。
  • Ruby 1.8がインストールしてあれば、Windows、Unix、Linux、MacOSXなどの、どんなOSでも使用することができる(たぶん)
  • Windowsの場合は、Rubyが無くても動く。
  • Cygwinなどは必要ない。
  • プロセスを多重起動しているだけなので、音質に影響するということがない。
  • 大量のファイルを登録しても、登録エラーなどが発生しない(ハズ)
  • エンコードのログを残せる。
  • エンコードにかかった時間を計測できるようにしたので、ファイルやlameバイナリを統一すれば、mp3エンコードのベンチマークとして使える…かもしれない。

今回の変更・更新

  • thread_mtlamef.rbを最適化。全行数が340行から40行に。
  • スレッド数を無限に(エンコードするファイルの数だけ)増やせるようにした。
  • 特定の文字列を含んだファイルやディレクトリを参照すると、強制終了する問題を一つ修正。
    →未発見のものが他にも沢山ありそうな気が...
  • エンコードファイルフィルタリングを出来るようにした(ファイル名、ファイルサイズ、最終アクセス日時、最終更新日時)
  • ディレクトリを変更する(cdする)時に、範囲外のディレクトリを選択すると必ず落ちる問題を解決。
  • ディレクトリ選択時に、"/"でルートディレクトリに移動できない問題を修正。

解決していない問題

  • mp3ファイルの再エンコードが終わってからでないとwavファイルのエンコードが開始できない。
  • ディレクトリごとにしかエンコードできない(ファイルを個別にエンコードすることはできない)
  • CUIである。
  • aiffなどの形式に対応していない。
  • サブディレクトリの数が多いと、マシンスペックによってはディレクトリ一覧表示処理が遅くなる(ディレクトリ数を確認するため)
  • Windows用実行ファイルの起動に、5~10秒ほどかかってしまう。
  • バグが取りきれていない可能性が…(´;ω;`)ウッ…

必ず必要なもの



プログラム本体のダウンロードはこちらから。

旧バージョンの管理が大変なので、全てMulti thread Media Encoder Frontendに纏めました。
http://mtmef.g.hachune.net/


スレッド数の制限が無くなった、ということで、同時に64スレッド実行してみた。

見事にタスクマネージャーがlameだらけに。
エンコテストなので、同じ曲を複数回リネームしてエンコードしているが、気にしないで欲しいんだ…('A`)

2009年4月26日日曜日

マルチスレッド対応 lameフロントエンド (もどき) v2.2a

※追記 09.07.26
Multi thread Media Encoder Frontend(マルチスレッド対応 マルチフロントエンド)をリリース。
マルチスレッド対応 lameフロントエンド (もどき)より、
高性能で安定性も高い…と思う。
GUIも付いたので、マウスだけでも操作できます。
http://mtmef.g.hachune.net/


ここより下の情報は古いです…(´・ω・`)スマソ



シスアドの試験も終わり、久々のゆっくりできる土日を迎えたので、1か月近く更新の止まっていたマルチスレッド対応 lameフロントエンド (もどき)を更新してみた。
今回は、自分で役立つと思って付けたハズの、「再エンコードし、出力されたmp3ファイルの名前には"_re"を付ける」という機能が、場合によっては激しく邪魔だということに気付き、それを使いやすいようにしたのをメインに、いろいろ修正してみた。

以下テンプレ。

どういう処理をするのか、などの解説はこちら

特徴

  • lameのエンコード処理を並列して行うことができ(最大16スレッド)、Corei7・PhenomⅡなどのマルチコア・マルチスレッドCPUや、デュアルプロセッサ環境も有効に使える。
  • ディレクトリごとに一気にエンコードが可能。
  • wav→mp3変換とmp3→mp3変換に対応。
  • Ruby 1.8がインストールしてあれば、Windows、Unix、Linux、MacOSXなどの、どんなOSでも使用することができる(たぶん)
  • Windowsの場合は、Rubyが無くても動く。
  • Cygwinなどは必要ない。
  • プロセスを多重起動しているだけなので、音質に影響するということがない。
  • 大量のファイルを登録しても、登録エラーなどが発生しない(ハズ)
  • エンコードのログを残せる。
  • エンコードにかかった時間を計測できるようにしたので、ファイルやlameバイナリを統一すれば、mp3エンコードのベンチマークとして使える…かもしれない。

今回の変更・更新

  • mp3再エンコード時に、出力mp3ファイル名に付加する文字列を設定できるようにした。
  • 一時ファイル出力用ディレクトリを設定できるようにした。

解決していない問題

  • mp3ファイルの再エンコードが終わってからでないとwavファイルのエンコードが開始できない。
  • ディレクトリごとにしかエンコードできない(ファイルを個別にエンコードすることはできない)
  • CUIである。
  • aiff形式に対応していない。
  • サブディレクトリの数が多いと、マシンスペックによってはディレクトリ一覧表示処理が遅くなる(ディレクトリ数を確認するため)
  • バグが取りきれていない可能性が…(´;ω;`)ウッ…

必ず必要なもの



プログラム本体のダウンロードはこちらから。

旧バージョンの管理が大変なので、全てMulti thread Media Encoder Frontendに纏めました。
http://mtmef.g.hachune.net/


…使った感じは微妙にしか変わっていないように思えるが、中は結構変わって…('A`)

何度修正しても、更に修正したい場所が次々に見つかって、これはいつになったら終わるのか、全く分からない…(´;ω;`)ウッ…