03 Feb 2013, 01:00

GoogleTestとEclipseのGDB機能の組み合わせが最強だった件

Eclipse CDTでデフォルトで付いているグラフィカルなGDB用のインタフェースと、GoogleTestなどのxUnitをあわせて利用するとデバッグが捗ったので、メモ。

基本は動的、バグったら静的

方法は以下の通り。

  1. GoogleTestを使ってテストを書いて実行。
  2. テスト失敗したら、失敗したテストケースでブレイクポイントをはる。
  3. GoogleTestを再実行して、ブレイクしたところからステップ実行して、テスト失敗の理由を調査。

基本的には、GoogleTestで自動テストを書いていく。
しかし、テストが失敗し、その原因がよくわからないときはGDBでメモリの値の変化をステップごとに追いながらデバッグをするというスタンスだ。

EclipseのGDB機能はスゴく高性能で、
構造体のネスト構造まで、スケスケ丸見えなのだ(下品 (・∀・)ニヤニヤにや)

キーバインドでパースペクティブを行ったり来たり

キーバインド的には、

GoogleTest実行時 =>「Ctrl+ F11」
GDB起動時          => 「F11」

というようにしている。すると、実行によってEclipseのパースペクティブが[C/C++]と[デバッグ]で切り替えることができる。

設定が必要な場合は、
[ウィンドウ] > [設定] > [実行/デバッグ] > [パースペクティブ]から[C/C++ Application]を選択し、適切に設定すること。

また、ブレークポイントを設定することで、自動的に実行時にはデバッグパースペクティブに切り替えることもできる。
[ウィンドウ] > [設定] > [実行/デバッグ] から設定。(多分、これはデフェルト設定)

セグメンテーション違反対策に効果バツグン!

個人的にとてもいいなと感じたのは、セグメンテーション違反するとその直前でGoogleTestの実行処理を止めることができること。

テストコードがないコードに修正をいれるのは怖いので、まずテストを書いてから修正を入れるようにしているが、このレガシーコードへのテストを書く際に、メモリ獲得を忘れて画面が真っ赤になることがすごくたくさんあるのだ!

この潰し込みが大変で、テストを書くことを諦めることが往々にしてある。
しかし、このgdbを使った方法をとれば、驚くほど効率が上がった。

まとめ

今まで、gdbを積極的には使って来なかった。
(使い方をあまり知らなかったという方が正しいかもしれない)
手動テストなんてありえない!という偏見があったのかもしれない。

物事に偏見をもってはいけないというお話でした。

チャンチャン( ゚∀゚ )

27 Jan 2013, 23:36

美しさってなに?リーダブルコードを読んで思ったこと。

リーダブルコードを読んだので、その感想を。

 

小ネタの玉手箱

本の内容は、ソースコードを読みやすくするためのちょっとした工夫が並べられている。
例えば、目次から抜粋すると、

  • 名前に情報を追加する
  • コメントのためのコメントをしない
  • コードの意図を書く

C言語、JavaScripなど、いろいろな言語で例が書かれているが、問題なく読める。
むしろ、わかりやすさとは言語共通なのだということに気づく。

論理的なif文、for文の作法に加え、コメントや名前の付け方など、見栄えの部分にもたくさんページ数が割かれているところが新鮮。

現実とのジレンマ

コードを書くには文系の才能が必要?

コードを書くことは、文章を書くことにより近いと、最近思う。
わけあって今度、TC検定(テクニカルライティング検定)を受験する。
わかりやすい文章を書くこととわかりやすいコードを書くということは似ているのだ。

プログラミングは理系の才能よりも、文系の才能の方が必要なのでは、と思う。

毎朝の決意表明のために

毎朝、仕事を始める前に15分間読むようにしてきた。
そのことで、毎日読みやすいコードを書くことを朝一に決意するためだ。
(その決意は時間が経つに連れて、”時間がない”という悪魔の囁きによって由来でしまう)

美しさと正しさについて

さあ、リーダブルコードを読んだ。
ソースコードに対する美的感覚を研ぎ澄ませた。
他人のコードに対する醜さにも敏感になった。

しかし、コードレビューで指摘をすることができない。

指摘はするのだけれども、少しだけ指摘する。
他人のコードの汚い部分がたくさんある場合は、遠慮してしまう。

リーダブルコードに書いてあったような、関数分割や命名規約、コメントを実践しようとすると「なんでそんなふうにするの?」と逆に指摘を受けたりする。
それが、「リーダブルコードに書いてあったからです、美しいからです」とはいわない。
「わかりやすいと自分が信じているからです」と応える。

長年の間に身につけた自分のスタイルがあると、そのスタイルに合致するものが美しいと感じて、それ以外のものは醜いと感じるのだろう。それを「間違っています、リーダブルコードに書いてあるこういう書き方の方が正しいんです」とは言えない。

自分は、リーダブルコードをもとに自分のスタイルを見なおそうと思う。

26 Jan 2013, 00:44

[Eclipse CDT]セグメンテーション違反した箇所をGDBで特定する

Eclipse+Cygwin環境でデバッグするとき、いつもはGoogleTestを使っている。

GoogleTestを実行してセグメンテーション違反をすると、Windowsは以下のエラーを返す。

 [main] sample 10968 exception::handle: Exception: STATUS_ACCESS_VIOLATION
1714 [main] sample 10968 open_stackdumpfile: Dumping stack trace to sample.exe.stackdump

例:こんなお粗末ソース

#include

int add(int x, int y)
{
int z;
char *p;

z = x + y;
*p = 1; /* ここでセグメンテーション違反 */
return z;
}

こんなとき、Eclipseの画面からGDBを起動して、どこで落ちたかを調べると便利だったので、メモ。

環境

  • Eclipse 4.2 Juno
  • GDB 7.5
  • Cygwin 1.7.17-1

EclipseでGDBを利用するための設定

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can't find a source file at : hogehoge...

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

Defaultではmainでbreakするように設定されているので、[再開]F8する。

すると、STATUS_ACCESS_VIOLATIONが発生した場所まで移動して、

ソースを表示してくれる。

image

まとめ

今回、xUnitとGDBを組み合わせることでデバッグがさらに効率的になるのではと思い、記事にしてみた。

この方法の前は、いちいちテストやソースにprintやexitを仕込んでいたが、始めっからgdbを使えばよかったなと、今頃ながら気づいたのだった。

xUnitでテストするようになってから、さすがにもう手動でのテストをする気にはなれないが、こんな組み合わせもいいかもしれない。

Eclipse+Cygwin環境でデバッグするとき、いつもはGoogleTestを使っている。

GoogleTestを実行してセグメンテーション違反をすると、Windowsは以下のエラーを返す。

ツꀀツꀀツꀀツꀀツꀀ 1 [main] sample 10968 exception::handle: Exception: STATUS_ACCESS_VIOLATION
1714 [main] sample 10968 open_stackdumpfile: Dumping stack trace to sample.exe.stackdump

例:こんなお粗末ソース

#include

int add(int x, int y)

{

int z;

char *p;

z = x + y;

*p = 1;ツꀀツꀀツꀀ /* ここでセグメンテーション違反 */

return z;

}

こんなとき、Eclipseの画面からGDBを起動して、どこで落ちたかを調べると便利だったので、メモ。

環境

  • Eclipseツꀀ 4.2 Juno
  • GDB 7.5
  • Cygwin 1.7.17-1

EclipseでGDBを利用するための設定

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can’t find a source file at : hogehoge…

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

Defaultではmainでbreakするように設定されているので、[再開]F8する。

すると、STATUS_ACCESS_VIOLATIONが発生した場所まで移動して、

ソースを表示してくれる。

image

まとめ

今回、xUnitとGDBを組み合わせることでデバッグがさらに効率的になるのではと思い、記事にしてみた。

この方法の前は、いちいちテストやソースにprintやexitを仕込んでいたが、始めっからgdbを使えばよかったなと、今頃ながら気づいたのだった。

xUnitでテストするようになってから、さすがにもう手動でのテストをする気にはなれないが、こんな組み合わせもいいかもしれない。

20 Jan 2013, 04:30

Windows7 でPCシャットダウン時にコマンドラインからミュートにするメモ

はじめに

Windowsをシャットダウンするとき、いつもはWindowsに標準であるシャットダウンコマンドを叩いていた。

C:\Windows\System32\shutdown.exe

ノートPCでYoutubeをボリュームMaxにして聞きながら作業し、その後PCをシャットダウンしたとき、次の起動時に大音量で起動音がなる。

電車の中だとけっこう恥ずかしいので、今日はこれを何とかしようと思った。

EcoMonitorをつかうという選択肢

windows7でミュートにするようなVBSを探してみたが、見つからない。(XPならあった)

代わりに、EcoMonitorというフリーソフトを利用するとできることをしった。

EcoMonitor – RedWingsソフトウェア公開場

 

 

EcoMonitorはインストール不要でコマンドラインからミュートを実行できる。
ミュートだけでなく、シャットダウンも実行できる便利なプログラム。

ダウンロードしたファイルを”C:\Program Files (x86)\“とかにおく。
C:\Program Files (x86)\ecomonitorv1003に以下のスクリプトを作成。

shutdown.vbs

Set wShell=CreateObject(“WScript.Shell”)
wShell.Run “EcoMonitor.exe -muteon -shutdown”

-muteonがミュートのオプション。-shutdownがシャットダウンのオプション。

shutdown.vbsのショートカットをデスクトップにおいたり、コマンドランチャーに登録して完了。

これで、電車の中でマナーを守ってプログラミングできるようになったお(^-^)

参考

17 Jan 2013, 22:49

hamcrestとJUnitの依存関係メモ

hamcrest関係のエラーでハマったので、メモ。

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch

エラーメッセージ

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
     at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
     at org.junit.Assert.assertThat(Assert.java:865)
     at test.endtoend.auctionsniper.FakeAuctionServer$SingleMessageListener.receivesAMessage(FakeAuctionServer.java:71)
     at test.endtoend.auctionsniper.FakeAuctionServer.hasRecievedJoinRequestFromSniper(FakeAuctionServer.java:51)
     at test.endtoend.auctionsniper.AuctionSniperEndToEndTest.sniperJoinnAuctionUntilAuctionCloses(AuctionSniperEndToEndTest.java:14)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

原因

junit.jarには、org.hamcrest.Matcher(aとする)ライブラリが一緒に入っている。
外部のhamcrest(bとする)を入れていると、JUNITはaではなく、bを参照しようとして、エラーする。

解決方法

junit.jar ではなく、 junit-dev-.jarを使う。
junit-dev.jarはhamcrestを含んでいないJUNITライブラリ。
こっちを利用することで、junitとhamcrestの依存関係は解消する。

参考

NoClassDefFoundError: org/hamcrest/MatcherAssert

エラーメッセージ

java.lang.NoClassDefFoundError: org/hamcrest/MatcherAssert
     at org.junit.Assert.assertThat(Assert.java:865)
     at test.endtoend.auctionsniper.FakeAuctionServer$SingleMessageListener.receivesAMessage(FakeAuctionServer.java:71)
     at test.endtoend.auctionsniper.FakeAuctionServer.hasRecievedJoinRequestFromSniper(FakeAuctionServer.java:51)
     at test.endtoend.auctionsniper.AuctionSniperEndToEndTest.sniperJoinnAuctionUntilAuctionCloses(AuctionSniperEndToEndTest.java:14)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.MatcherAssert
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
     … 28 more

問題

hamcrestのバージョンが古いのが原因。

解決

hamcreat を1.1から1.3にしたら解決。

参考

08 Jan 2013, 13:00

WordPress完全移行マニュアル(BackWPupでリストア)

前回のエントリで、BackWPupを利用してWordPressで構築したサイトのバックアップを作成できたので、今回はこのデータをリストアしてみます。

前回はロリポップサーバからバックアップしたので、これをさくらインターネットにリストアしてみます。つまり、WordPress移行作業をします。(移行しないけど)

 <a href="http://px.a8.net/svt/ejp?a8mat=25GJVU+5CZJE+D8Y+61JSH" target="_blank"><br /><img border="0" alt="" src="http://www20.a8.net/svt/bgt?aid=130102698009&wid=004&eno=01&mid=s00000001717001015000&mc=1" width="468" height="60" /></a>   

移行手順

  • リストア先の環境を用意
  • リストア先サーバへファイルをアップロード
  • リストア用のBackWPupスクリプトを実行する
  • wp-config.phpを編集する

リストア先の環境を用意

まずは、さくらインターネットの管理画面にアクセスして、 MySQLの新しいデータベースを作成します。

右のツールバーから[データベースの設定] > [データベースの新規作成]を選択。
データベース名を入力して、[データベースを作成する]を選択。

これで、データベースが作成できました。
以下の情報をメモしておきます。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

リストア先サーバへファイルをアップロード

あらかじめBackWPupでバックアップしておいたzipファイルを解凍します。

リストア先のさくらインターネットのWordPressを配置するディレクトリに、解凍したファイルをまるごとアップロードします。

リストア用のBackWPupスクリプトを実行する

リストアをするためにはBackWPupのスクリプトを実行します。
まずは、スクリプトを以下のサイトから手に入れます。

  • Download 窶コ BackWPup.com
    • backwpup_db_restore.php

ダウンロードしたら、WordPressを配置するディレクトリにこのスクリプトもアップロードします。

アップロードしたスクリプトにブラウザからアクセスします。
Select file to restore:と表示されるので、データベースにチェックをつけて、Nextを選択。

メモしておいた情報を元に、フォーマットを埋めていく。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

 

[Restore Done. Please delete the SQL file and this script.]と表示されてリストア終了。

 

追記:2013年6月

なんと、backwpup_db_restore.php がなくなっていた。以下のエントリをもとにsqlのリストアをしてください。

BackWPupのbackwpup_db_restore.phpが消えた!それでもリストアする場合の方法メモ | Futurismo

wp-config.phpを編集する

メモしておいた以下の情報を、WordPressを配置するディレクトリにあるwp-config.phpを開いて修正する。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

 

感動の瞬間

新規URLにアクセスして、リストア終了! (^ ^) vv

はじめてでも、簡単にバックアップできました。
これで、枕を高くして眠ることができます。

07 Jan 2013, 11:54

TweetConsoleを使って、デスクトップからホットキーでtweetする

前回、twitcurlライブラリを利用した自作twitterクライアントでつぶやく方法を書いた。

フリーソフトで、この手のコマンドプロンプトからtwitterを利用するツールはけっこうあるらしく、その中で一つ『TweetConsole』とVBSを組み合わせたTipsを紹介。

TweetConsoleの詳細情報 : Vector ソフトを探す!

 

 

はじめに、twitterの認証が必要(これは、twtcnsl.exeを実行して認証する)

一度認証すれば、あとは認証は必要なく利用できる。

TweetConsoleでつぶやく方法は以下。twtcnslが実行コマンドで /tがオプション。

twtcnsl /t テスト投稿です

ダウンロードしたtwtcnsl.exeをどこかに移動して、前回作ったVBSを少し書き換える。

Program Filesみたいに、パス名に空白が入ると実行できない。

https://gist.github.com/4466704

06 Jan 2013, 10:41

twitcurlでWindowsのデスクトップからホットキーでtwitterにtweetする

はじめに

デスクトップからショートカットでtwitterにつぶやきたいなと思い、いろいろと探してみたがいいフリーソフトがみつからなかったので、twitCurlというC++用のtwitterライブラリを利用して、作ってみました。

[http://www.youtube.com/embed/2FhRoTXbpHM]

 

環境

  • Windows 7 64bit
  • Cygwin 1.7.17-1
  • curlツꀀツꀀツꀀツꀀツꀀ 7.28.1-1

twitcurlを使う

twitcurl – twitcurl is a pure C++ twitter API library based on cURL – Google Project Hosting

twitcurlとは、twitter API用のC++ライブラリ。

これを使えば、C++のソースからtwitter APIを叩くことができる。

twitcurlの導入

twitcurlの導入方法は以下が詳しい

今回は、Windows上のcygwin環境で試してみたので、Linuxの方を参考にした。

まずは、事前にg++,libcurl4-dev, subversion を setup.exeを使って取得しておく。

Curlというのは、ファイル転送用プロトコルをサポートするライブラリで、コレを利用して、HTTPをコマンドラインから利用するらしい。

次に、libtwitcurlをsvnコマンドで取得。

svn co http://twitcurl.googlecode.com/svn/trunk/libtwitcurl

subversionがないと、ソースを取ってこれない。

取得後に、libtwitcurlに移動して、makeコマンドでコンパイルをかける。

libtwitcurl.so.1.0という共用ライブラリが作成されるのでこれを/usr/lib/配下にlibtwitcurl.soとリネームしてコピーする。

mv libtwitcurl.so.1.0 /usr/lib/libtwitcurl.so

サンプルコード改造してつぶやき専用クライアント作成

つぎに、twitcurlのサンプルコードを改造してみて、つぶやき専用にした。

サンプルコードは以下のように持ってこれる。

svn co http://twitcurl.googlecode.com/svn/trunk/twitterClient

こんな感じで改造(というよりも、いらない部分を削除したという方が正しい)

ユーザ名とパスワードを変更する。

デスクトップからtwitterにアクセスするためには、以下の4つのキーの取得が必要。

  • ConsumerKey
  • ConsumerSecuret
  • AuthAccessTokenKey
  • AuthAccessTokenSecret

取得方法はドットインストールで学習した。

コンパイルをかけて実行

コンパイルをかける。

g++ quicktweet.cpp -o quicktweet -l/usr/lib/twitcurl

-ltwitcurlをコンパイルオプションにつければコンパイルできる。

(libtwitcurl.soだけと、libと.soはいらない。自分の場合、どうもパスの通し方がわからないので、フルパスでリンクさせた)

実行するときに、共用ライブラリlibtwitcurl.so.1.0を実行するディレクトリに持ってきておく。Cygwinの場合、共用ライブラリを実行するためには、PATHにlibtwitcurl.so.1.0かあるディレクトリの環境変数を通しておく必要があるけれども、面倒臭いで横着した。

quicktweet.exeにつぶやきたい言葉を渡して実行するとつぶやけた。

VBSからtwitterクライアントを呼び出す

次に、VBScriptからquicktweetを実行できるように、VBScriptを作成。

メッセージボックスを表示させて、メッセージを入力してEnterを押すと、メッセージがquickktweetの引数として渡される。

https://gist.github.com/4466455

VBSにショートカットキーを割り当てる

VBSをホットキーから実行できるようにする。

作成したVBSのショートカットをデスクトップか、[スタートメニュー] > [すべてのプログラムで右クリック] > [開く]を選択して、スタートメニューのフォルダに作成する。

ショートカットを右クリックして、プロパティを選択。

ショートカットの欄で、好きなショートカットを入力する。

ここでは[Ctrl + Shift + T]を割り当てた。

これで、デスクトップのどこからでもつぶやけるようになった。

これで 、お手軽にツꀀ Let’s Tweet。

03 Jan 2013, 16:09

AutoHotkey_Lを使ってWindowsでEmacsキーバインドをするためのメモ

AutoHotkey_LとEmacs用のスクリプトを利用することで、WindowsでEmacsのキーバインドが利用できました。すごく便利なので、メモして置きます。

きっかけ

プログを書くためのエディタにWindows Live Writerを、メールクライアントにOutlookを使っているのだれども、どちらもEmacsキーバインドを実現する方法がありませんでした。

いろいろ探してみたら、どうもWindowsのキーバインド自体をEmacsキーバインドにしてしまえばいいことに気づき、今回の方法に至りました。

AutoHotkkey_Lとは

AutoHotKey_Lとは、Windowsのキーバインドを自由自在に設定できるOSS。
もともとが、AutoHotKeyがその機能を担っていたが、AutoHotKeyの開発が終了してしまい代わりにAutoHotKey_Lが主流となっているらしい。

自分でキーバインドを設定するのもいいが、ネット上にいろんなスクリプトが落ちているので、それを利用しても良い。今回は、そのなかでEmacsキーバインドを実施するためのスクリプトを利用する。

AutoHotKey_Lのダウンロードとインストール

以下のサイトからダウンロードする。

AutoHotkey_L

インストールは実行ファイル(AutoHotkey_L_Install.exe)を実行すればよい。手順どおりに進めばインストール完了。

AutoHotKeyが立ち上がる。
スタートアップに登録しておけば、スタートアップ時に起動するようになる。

Emacsキーバインド用のスクリプトを取得

以下のgithubからemacs.ahkを取得。

https://github.com/usi3/emacs.ahk

emacs.ahkはAutoHotKey_Lの実行ファイルと同じフォルダに入れる。

emacs.ahkの設定

AutoHotKey.ahkの編集画面を開く。
一番最後の行に以下を追加。これで、AutoHotKey.exeを実行したときに、Emacsキーバインドスクリプトも一緒に実行することができる。

#include emacs.ahk

その他、細かいemacs.ahkの改造

私の場合、WindowsのCtrl+C, Ctrll+Vが利用てきなくなるのはいやなので、Cltl+C,Ctrl+Vをコメントアウトした。Ctrl+Y,Ctrl+Wなど、貼り付け系もコメントアウト。コメントアウトは “;“を書く。

example: Ctrl+ V

;^v::
;  If is_target()
;    Send %A_ThisHotkey%
;  Else
;    scroll_down()
;  Return

GoogleChomeは除外する

Chromeに適応すると既存のキーバインドが使えなくなるため、Chromeをキーバインド適応の除外条件に入れる。

特定のアプリケーションを除外する方法は、emacs.ahkのis_target内に以下を追加する。

  IfWinActive,ahk_class (除外したいWindowクラス名)
    Return 1 

参考:http://www.autohotkey.com/docs/commands/IfWinActive.htm

Windowsクラス名を調べるためには、AutoHotKeyを右クリックして、[Winodw Spy]を起動する。アクティブなウィンドウの情報が得られるのでここからWindowクラス名が分かる。

以下、GoogleChromeの例。この場合は”Chrome_WidgetWin_1”となる。

02 Jan 2013, 06:31

WordPress完全バックアップマニュアル(BackWPupでバックアップ)

このブログのレンタルサーバはロリポップを利用し、WordPressで運営しています。

 <img border="0" alt="" src="http://www16.a8.net/0.gif?a8mat=25GJVT+GBMX62+348+63WO1" width="1" height="1" />  

お正月ということで、万が一のデータロストやサーバダウンに備えたバックアップ方法を調べてみました。題して、

WordPress完全バックアップマニュアル

なんだか、完全自殺マニュアルっぽくて、胡散臭さがいい感じです。

[http://www.youtube.com/embed/7BDxGeTnMxY]

 

バックアップ対象について

WordPressのバックアップは、以下の2つに分けられます。

  • WordPress本体のバックアップ
  • MySQLのバックアップ

WordPressの方はサーバにFTPしてデータを持ってきて、データベースの方はMySQLにログインしてバックアップを作成して・・・・

なんて、手動バックアップはバカらしいですね。

WordPress本体とデータベースを自動かつ定期的にバックアップ

できる便利なプラグインないかなーと探したところ、ありました。それが、

BackWPup

です。では、順に見て行きたいと思います。

環境

  • ロリポップ ロリポプラン
  • WordPress 3.5
  • MySQL 5.1.34

BackWPupを使ってバックアップする

BackWPupのインストール

ダッシュポードから[プラグイン] > [新規追加] を選択。
検索で[BackWPup]を見つけて[今すぐインストール]を選択。
インストールされたら[プラグインを有効化]して完了です。

BackWPupをどう設定するか

次に、BackWPupの設定をします。

WordPress本体とデータベースを自動かつ定期的にバックアップ

の全ての要件を満たすために、以下のことを実施します。

  • 毎日2:00に定期バックアップを実行する
  • Dropboxにバックアップする。

バックアップする時間はサーバ負荷の少ない深夜を選びます。
このプラグインの嬉しいところは、バックアップ先にDropboxを選択できることです。
自動でクラウド上に保存できれば、バックアップシステムとしては完璧です。

他にも、FTPができるサーバ、Google Storage、Amazon S3、SugarSyncにもバックアップできるみたいです。

BackWPupの設定方法

ダッシュポードから[backWPup] > [Add New] を選択。
[Job Type]で [File Backup]と[Database Backup]の両方にチェックが入っていることを確認。

[JobSchedule]で[Activate Scheduling]にチェックを入れる。
深夜の2:00に実行するように設定。

[Database Jobs]でバックアップ対象のDBを選択。
ここでは、Defaultのままで特にいじらない。

[File Backup]でバックアップしたいファイルの設定を細かく調整。
自分がいじったのは、[Themes]の部分。不要なテーマはバックアップ対象外に。

送信者 Futurismo

上記は、BackWPup1.xでの情報です。2.xではUIに変更がありました。
設定項目に変更はありません。(そのうち書き直します)

Dropboxをバックアップ対象先に設定

Dropboxをバックアップ先に設定します。
[Backup to Dropbox]のボックスで[Authenticate!]を選択します。

Dropboxの認証サイトに飛ぶので、そこで連携を[許可]します。

送信者 Futurismo

[Root]で[Dropbox]を選択します。
[Folder]でバックアップ先のフォルダを選択します。
フォルダは予め作成しておく必要があります。ここでは、以下のように入力しました。
(ここのパスが間違っていると[Backups]タブでErrorと表示されます)

Buckup/sites/wordpress

最後にバックアップする世代数を入力します。

送信者 Futurismo

 

上の[Job Types]の[Save Changing]を押して、終了です。

バックアップを実行してみる

バックアップのテストをしてみます。
[Jobs]タブから先ほど作成したJobで[Run Now]を選択して、実行してみます。

送信者 Futurismo

すると、黒いコンソール画面に切り替わり、バックアップが実行されます。
数分間、ハラハラドキドキしながら待つと進捗が100%になり、終了します。
さあ、バックアップはされたかな・・・とDropboxを覗いてみます。

ブラボー。バックアップは成功したようです。
backwpup_1_2013-01-02_10-36-38.zipというファイルが作成されました。

コレで枕を高くして眠ることができる。実際にバックアップしたデータをリストアできるかも試してみようと思いますが、長くなったのでまた次回。