2010年10月18日月曜日

Excelのバグ?

Excel本体を2つ立ち上げて、それぞれでファイル操作をしたところ、後に立ち上げた方のシートでは表計算が正常に動作しませんでした。

具体的には、後で立ち上げたExcel側であるファイルを開き、その中で加算を行います。

(例)
A1セルに「1」、B1セルに「2」が入っている。
C1セルに
 =A1+B1
又は
 =SUM(A1, B1)
と入力すると、C1セルの数値が「0」と表示される。
正しい動作であれば「3」と表示されるはず。

既存ファイルの修正でも、新規ファイル作成でも同様の現象が発生しました。
なお、後で立ち上げたExcel本体を終了し、最初に立ち上げたExcel上で同様の操作を行ってみたところ、全く同じ式を入れたのにも関わらず、C1セルには「3」が表示され正常な動作が行われました。

あるExcelシートを片面のディスプレイで見ながら、もう1面のディスプレイでExcelファイルを編集するような場合には注意が必要です。

2010年9月21日火曜日

[Ruby]プロキシ経由だとgem installでエラー

Rubyに手を出してみることにしました。
正確にはRubyが必要な開発環境を導入してみることに。

まずはRubyインストール。
最初、色んなところから本体やらgemやら、Windows用Unixコマンドやらかきあつめてみたんですが・・・
よく見ると一発でインストールできちゃう素敵パッケージがありました。
RubyForgeというところでWindows用exe探したらあります。

動いているかどうかの確認はコマンドプロンプトで

> ruby --version
ruby 1.9.2p0 (2010-08-18 revision 29036) [i386-mswin32]

こんな感じに。

さて、ここからgemインストールに挑戦してみたところエラー発生。
調べるとプロキシ経由だとエラーになるらしい。
コマンドプロンプトから

set http_proxy=http://proxy.hogehoge.jp:8080

と自分のところのプロキシとポート番号を設定して、再度gemると・・・

またエラー。
なんぞそれ。

ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)

と出た後ろに 503エラー?
そのURLをremoveするといいよ、なんていう情報もありましたが、gemコマンドに-yオプションつけてみたらうまく行きました。

2010年9月8日水曜日

VB6.0 文字表示に関する覚書(大層な・・・)

急遽、VB6.0でソフトを作ることになりました。
VC6.0は触ったことはあっても、VBはあんまり・・・

今回はお客様に「見た目」も重視されるようでしたので、画面デザインにも気を配ったのですが、VB6.0の文字表示の指定がなかなか思うように出来ず苦労しました。
別に書くほどの内容でもありませんが、検索した時に自分でひっかかるように(笑)

■Label
・横位置は指定可能(左寄せ、中央、右)
・縦位置は指定不可(必ず上寄せ)

■Button
・横位置は指定不可
・縦位置も指定不可(必ず中央寄せ)
・Enable = False にして押せないボタンをLabel代わりに・・・
 と思ったら、Falseの時は文字が灰色になってしまう罠。
 黒にしたいところも灰になると困る・・・

■Shape
・文字表示できないのでLabelと重ねて使う

■Image
・画像サイズに自動的に合わせてくれる


結局、Imageの性質を利用して、
(1)LabelやButtonを使って画面イメージを作成
(2)画面キャプチャで画像化
(3)画像を各パーツに切り分け、「ボタン風で文字を上寄せ」、「Shape+Label風で文字は中央寄せ」などになるよう多少手を入れて、JPEGまたはGIF形式で保存
(4)Imageを使ってひたすら並べる
としました。
静的な表示内容ならこれが楽でした。

問題は動的な表示の場合ですね。
その場合はプログラム内部で各プロパティをいじるのでしょうか。

2010年7月21日水曜日

[VBA]ワークシート上に置いたDTPickerコントロールの表示崩れ対策

理由あって、会社のPC上でExcel VBAでマクロを組むことになりました。

日付入力で「Microsoft Date and Time Picker Controll 6.0」(DTPicker)を使って、簡単にちょいちょいと作ろうとしたところ(※1)、起動時に奇怪な現象が発生。

(1)該当の.xlsファイルを起動する。
(2)DTPickerの中に赤い「×」が一瞬表示され、設定したサイズとは大きく異なる矩形に変形。
(3)デザインモードにすると設定したサイズで表示しなおされるが、デザインモードを終了すると矩形に戻る。
(4)一応、設定した日付は表示されている。
(5)スクロールしたりして、再描画が走ると設定したサイズで表示される。


何これ?
Google先生に聞いてみるも、あまり発生している人はいないのかこれという解決策は見当たらず。

(5)でシートの再描画が行われると正常に表示されることから、Bookオープン時に強制再描画を行うことで無理やり解決しました。
一瞬、「×」が見えるのがいただけませんが・・・。


※1:会社のPCはVisual StudioのライセンスがあるのでActiveX利用で問題ないかな、ということでAPI呼び出しは見送り。

2010年7月8日木曜日

Jarファイル実行時にClassNotFoundException

eclipseで実行可能なJar形式でJarファイルを作成。
ダブルクリックで実行したら

ClassNotFoundException

・・・。

java -classpath sample.jar com.sample.test.Sample
java -classpath [jarファイル名] [メインクラス名]

でやってもダメでした。
外部ライブラリを抽出してみても、パッケージにしてみてもダメ。
最終的にはJarファイルの隣のフォルダにライブラリをまとめて入れておいて、

java -classpath [jarファイル名] [メインクラス名]

で動きました。
ライブラリのクラスパスがおかしかったってことかしら・・・。
これだとダブルクリックではClassNotFoundになってしまうので、バッチファイルで上のjava実行コマンドを発行して実行してもらうことにしました。

ついでにJarファイルの実行パスをプログラムで取りたかったのですが、結構面倒そうなので、バッチファイルでJarファイルのあるフォルダをカレントディレクトリにして、

System.getProperty("user.dir");

で取ることにしました。
バッチ叩いてもらえないと何も動きません(ぉぃ)

SQLServer2005でバックアップファイルから復元する方法

sqlcmdコマンドを使って

sqlcmd -U [ユーザ名] -P [パスワード] -S [マシン名]\[インスタンス名]

でログインします。
その後に、

RESTORE DATABASE [データベース名] TO DISK = 'バックアップファイルのフルパス'
WITH RECOVERY, REPLACE
GO

で復元できるはず!

・・・できなかったので Management Studio の

新規クエリ > 「master」データベース

にして、上の「RESTORE〜」を書いて実行!
これで復元できました。

参考にさせていただいたサイト
http://infotech.fmfamily.net/modules/blog/details.php?bid=70&date=201003

2010年6月28日月曜日

[Android]SurfaceViewと終了処理

前の記事でSurfaceViewの描画処理が軽いと書きましたが、実際にはViewよりもメモリもCPUパワーも食うけどフレームレートが高くなるよ、が正しいところでしょうか。

携帯アプリだと描画処理にパワーとメモリを食って、キーイベントの割り込みが遅れるなんてこともあったので(かなり前の端末ですが)、描画用スレッドのループにはそれなりのsleepを入れた方が良さそうです。

さて、View#OnDraw(Canvas)で実装していた描画処理をSurfaceViewに変更しました。


【引っかかった点】

・コンストラクタで描画スレッド作ってstart()させちゃダメ
 ⇒surfaceCreated(SurfaceHolder)でやるのが正解。
 (そうやってたつもりでしたが、書く場所間違えてました・・・うっかり?)

・Xperiaの□ボタン押しても、描画スレッドのログが止まらない〜
 ⇒マルチスレッドですものね。
  ゾンビ恐ろしや。
  SurfaceViewをセットしたActivityのOnPause()をオーバーライドして、描画スレッドのループを抜けてスレッド終了させるようにしました。
  こんな感じのメソッドをSurfaceView継承クラスに追加して、OnPause()から呼んでいます。
  このメソッドの後ろにActivity#finish()を記述しています。


public void endLoop() {
synchronized (MainLoop) {
// ループを抜ける
loopflg = false;
}
try{
// スレッドの終了を待つ
MainLoop.join();
} catch( InterruptedException ex ){
Thread.currentThread().interrupt();
}
}

  MainLoop:描画スレッド
  loopflg:trueだとループ、falseでループ脱出
  です。
  他の方の処理を参考にさせて頂きました。