プログラミングの最近のブログ記事

20100827_sql_server.jpg

MBP に VMware Fusion を入れて、その上で動かしている Windows 7 Home Premium に、Microsoft Visual Studio Express をインストールしてみた。
この間、メインのデスクトップPCに入れた Visual Basic 2010 Express ね。

SQL Server なんか使わないんだけど、案件として出てくる可能性はあるので、一応、Microsoft SQL Server 2008 Express Service Pack1(x86) も一緒にね。

そしたら、SQL Server 2008 のインストールが異常終了しやがんの。

なんか、インストール進捗状況のインジケータが動かなくなったので、タスクマネージャーで見てみると、CPU の使用率が 100% とかになってるし。ああ、なんか無限ループにでも入ってるのかなあ!?とか思いながらほってたら、10数分後に「Managed SQL Server Installer は動作を停止しました」のエラー表示が・・・

とほほ。
ま、「プログラムを終了します」を選んだら、その後のインストールは無事終了し、Visual Basic 2010 Express 自体は全然問題なく使えた。
本当に、SQL Server のインストールだけ失敗したみたいだな。

まあ、すぐに SQL Server を使う予定はないので、そのままにしておいてもよかったのだが、やっぱ気持ち悪いので駄目もとでもう一回インストーラを実行したら、今度は正常に終了した。:-)

なんやねん、もう。(^^;

Visual Basic 6.0 以降(古っ!)、Microsoft の開発言語とはすっかりご無沙汰なので(先日、Excel で VBA マクロを組んだくらいだ)、早速動作確認。

Visual Basic も 6.0 から .NET になって随分変わったと聞いていたが、ああ、ちゃんと Timer コンポーネントもあるじゃん。:-)
ユーザがプロパティ Interval に設定した(ミリ秒単位の)間隔でイベントを発生させるコンポーネントね。
こいつの存在を知っていると、いちいち Timer クラスを使った処理をコーディングするのが面倒臭いよ。
「Timer コンポーネントはないのかよ!」と。(笑)
Visual Studio 最高ぉ!(笑)

ちゅーことで、早速試しに Timer コンポーネントを使って、徐々にラベルが右にスライドしていく処理を書いてみる。

Public Class Form1

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim x As Integer = Label1.Location.X
        x = x + 10
        Dim xy As New System.Drawing.Point(x, Label1.Location.Y)
        Label1.Location = xy
    End Sub

End Class

こんだけ。
ああ、簡単、簡単。

しかし、Label1.Location.X に直接値を突っ込めないのは面倒臭いな。
直接、Label1.Location.X に値を突っ込もうとしたら、「Expression は値であるため、代入式のターゲットにすることはできません。」って怒られてもうた(^^;
Point 構造体を持った変数を宣言して、そこを経由して Location に突っ込んでやらないといけない。
この辺りは、馴染むのに時間がかかりそうだ(^^;

今度、VB.NET のソースをいじらないといけないかもしれないので、Microsoft Visual Studio の無料版である Express をインストールしてみた。

インストール自体は簡単。

今回は Visual Basic しか必要ないので、Express のサイトから Visual Basic 2010 Express のインストーラ(vb_web.exe)を落としてきて、後はそいつを実行すればネット上から必要なファイルを落としてきて勝手にインストールしてくれる。
途中、SQL Server も一緒にインストールするか聞いてくるので、一緒に入れることにした。

そこそこインストールには時間がかかるので、他の作業などしつつ終了を待つ。
特になんの問題も発生せず終了。

さっそく起動してみると、30日間限定版との表示が。

Microsoft Visual Studio Express は無料だけど、ユーザ登録しないと30日間しか使用できないんだな。

20100824_vb3.jpgということで、Microsoft にユーザ登録するのは本当にイヤなんだけど(何か、この会社、個人情報を良からぬことに使いそうなイメージが昔から・・・(笑))、仕方無いので Windows Live ID の取得をおこなった。

ID を取得すると、画面に VB Express の登録キー(アクティベーション キー)が表示される(メールでも届く)ので、それを Visual Studio に登録してやる。これでOK。

起動時の「このソフトウェアの使用は、評価目的に限ります。」という表示もなくなってバッチリですな。

以前、「iPhoneデベロッパプログラムへの参加のややこしさ」に書いたように、iPhone SDK で作ったプログラムを iPhone 実機でテストをしようとすると、Apple Developer Program に参加しないといけないんだが、これがなかなかややこしい。
まず、Apple Developer Program Activation Code を取得するまでが大変だし、そのコードを使ったアクティベーションも「失敗率」が高い。
結局俺も失敗した。(^^;

その後、「どうせいちゅうねん?」という内容の質問を投げたところ、半日後くらいに "Apple Developer Program Enrollment Update" というタイトルで「あんたのメールを受けて、Program activation 出来るように調整してみたんで、もう一回試してみんさいや」というメールが届いた。
んで、試しに以前届いたメールに乗ってた Activation Code のリンクをクリックしてみたら、無事、アクティベーションに成功したのでありました。

これが 6/30 のこと。

でも、すっかり疲れてしまい、それ以降、iPhone SDK に触ることもなくほったらかしにしてたんだけど、昨日、やっとまたやる気が出て(^^;、実機テストのための環境設定をしたのでありました。

手順がまた面倒くさくて、iPhone アプリに電子署名を埋め込むための証明書の発行とか、iPhone Developer Program Portal での作業が続くよ!

@ITの「ここが大変だよiPhone実機テスト」なんかが分かり易くまとめてるね。
ま、これ読みながらやっても、なかなかすんなりとはいかなかったりするようだけど。(^^;

でも、随分改善はされてきているようだ。

俺は、「シェフの気まぐれアプリ」というサイトの 2008/12/16 に書かれた記事を参考に作業をしていたのだが、ここで「手動で設定」をするように書かれていることのほとんどが実際には自動で終了した。

XCode を起動した状態で iPhone をつなぐと「オーガナイザ」画面が表示されるのだが、この時点で、iPhone Developer Program のページとやりとりしてるようで、Device  とか AppID とかの情報は自動で登録されていたのだ。

ということで、「よう、わけがわからん」状態ではあるが、iPhone Developer Program への認証情報の登録自体は簡単に終わったのである。

で、いよいよ、実機テストだ。

Excel で「ふりがな」なんか扱ったことがなかったんで(何せ、Excel 関係のあんまりややこしい仕事はやったことないし(^^;)、ちょっとハマってしまった。

あるシート上の名簿(ふりがな付)をソートして、その結果で新しい名簿を作成するのだが、ソート用のテンポラリシート(tmpSht)から例えば

.Cells(i, j) = Sheets(tmpSht).Cells(i, j)

みたいに値をセットしちゃうと、ふりがな情報は移らないんじゃね。

それ知らなかったんで、

.Cells(i, j).Phonetics.Visible = True

とかしてやればいいのか?とか、色々試したけど駄目。

.Cells(i, j).SetPhonetic
.Cells(i, j).Phonetics.CharacterType = xlHiragana
.Cells(i, j).Phonetics.Visible = True

なんてやると、新しくふりがなが自動セットされるだけなので意味無し。
せっかく、元の名簿の方で「栗男」を「くりお」って修正しているのに、新しい名簿には「くりおとこ」とか載っちゃって(^^; 怒られるで、ほんま。(^^;

結局、

Sheets(tmpSht).Cells(i, j).Copy .Cells(i, j)

つう具合に、セルを丸ごとコピーしないと駄目なのね・・・
これで、ふりがな情報も消えることなく新しいセルにコピーされる。

ただ、これすると、セルの書式情報(フォントや表示位置などの情報)までコピーされちゃうので、

.Cells(i, j).Font.Name = "MS Pゴシック"
.Cells(i, j).Font.Size = 12
.Cells(i, j).VerticalAlignment = xlCenter

みたいに書式をセットし直してやらんといかんのが面倒くせえ。(^^;

何か、他に良い方法があったら教えてください>識者の方

つ~か、Mac な方は、あの鬱陶しいリソースフォークをどのように処理されてるんでしょうねえ?

いや、例えば Web サイトのデータを、FTP でディレクトリ丸ごとアップとかするときとか、例えば ._index.html とかも上がっちゃうじゃん。こういうの、どうしてるんでしょう?

ああ、Mac のアプリは、リソースフォークのデータファイルはちゃんと無視してくれるのか?
俺が Windows と Mac でファイルを共有して作業しているが故の悩みなのか?

出先で MacBook Pro でプログラムなんかを直して、自宅の Windows 7 でアップすると、サーバ上にリソースフォーク関連ファイルがぞろぞろと・・・(^^; むぎーーー!!と、中年紳士らしからぬ声を上げてしまいますよ!!

関係するファイルを一括削除してくれるツールを探してみたけど、Win95/98 用とか、なんか古いものばっかだなあ(^^; まあ、Windows 7 でも動くだろうけど。

自分でちょいプロ作ってもいいんだけど、.htaccess とかを間違って消しちゃったらいかんから、まあ、削除するファイルは決め打ちにした方がいいじゃろ?
で、対象のファイルは、

.fseventsd
.Spotlight-V100
.Trashes
._*

の他に何があるんじゃろ?

一昨日、Mac OS X で開いた SD カード覗いてみたけど、ドットファイルの代表格とされる .DS_Store は無かったな。

ああ、子ディレクトリを総舐めにする再帰処理書くの面倒くせえなあ。(^^;

InternetExplorer7 では動いている JavaScript が Firefox3 では動かない件。

JavaScript が

function setMsg(){
    var msg = new Array();
    msg[0]    = "選択してください";
    msg[1]    = "1番選択されました";
    msg[2]    = "2番選択されました";
    form1.text1.value    = msg[form1.select1.selectedIndex];
}

こんな感じで、本文が、

<form name="form1">
選択:<select name ="select1" onChange="setMsg();">
<option value="0" selected>-- 選択してください --</option>
<option value="3">1番目</option>
<option value="8">2番目</option>
</select><br>
メッセージ :<input type="text" name="text1" value="">
</form>

こんな感じ。
つまり、プルダウンで値を選択すると、その値によって異なるメッセージをセットしているだけだ。

一応、setMsg 関数の頭に alert 文を突っ込んでやると、ちゃんとダイアログボックスが開くので、onChange="setMsg();" による関数の実行はされているようだ。

Firefox3 のエラーコンソールを見ると、

エラー: form1 is not defined

と出ている。

どうも、name 属性値で要素を指定することが出来ないようで。
ID 指定で要素をオブジェクト化し、それを使用する形に記述(W3C 標準の記述?)しないといかんようですな。
InternetExplorer7 と比べて、Firefox3 はこの辺りのチェックが厳密なようで。

ということで、form に'form1'という ID を指定し、document.getElementById で form1 という element オブジェクトに ID='form1' の要素を突っ込み、それを参照するようにすればOK!

◆JavaScript

function setMsg(){
    var msg = new Array();
    msg[0]    = "選択してください";
    msg[1]    = "1番選択されました";
    msg[2]    = "2番選択されました";
    var form1    = document.getElementById("form1");
    form1.text1.value    = msg[form1.select1.selectedIndex];
}

◆本文

<form id="form1" name="form1">
選択:<select name ="select1" onChange="setMsg();">
<option value="0" selected>-- 選択してください --</option>
<option value="3">1番目</option>
<option value="8">2番目</option>
</select><br>
メッセージ :<input type="text" name="text1" value="">
</form>

ま、あと、裏技的に、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

を、

<html>

という記述に修正すれば W3C 標準のチェックはかからなくなるので JavaScript は動くが、画面の表示が正常に行われなくなる場合もあるじゃろうね。

今回、SSI の使えないサーバ上で、CGI や PHP で出力する HTML 内に Perl スクリプトの吐く内容を動的にセットしたい案件があって、SSI が使えないので iframe で CGI の出力結果をはめ込むようにしたんだが、新着情報のように表示件数が変化する部分は、
動的に高さを調整したい。

こう言うときは、JavaScript と組み合わせて制御するしかなく、

「IFRAMEの高さ可変」
http://nacky.s206.xrea.com/notebook/archives/2007/06/10-012813.php

というサイトを参考に組み込んでみたのだが、どうも、本来のコンテンツの高さよりも余分に高さ設定がされてるような・・・

画像にコピーして見てみたら、20px くらい高い。
高さ判定してるところで、無条件に -20 するようにしようかと思って JavaScript 見てみたら、

document.getElementById(ID).style.height = parent.frames[NAME].document.height +20 +"px" ;

みたいに、わざわざ本来の高さに +20 してあった。

ああ・・・なんだ、そうだったのか。ちゃんとソースを見てませんでした。(^^;

どうも、本来の高さキツキツに高さ設定をすると、Netscape 系のブラウザではスクロールバーが出てしまうので、その対策のようだ。
今回、うちの案件ではデザイン上の理由で scrolling="no" 固定にしているのでスクロールバーのことは考えなくて言い。

ということで、+20 の部分を削って、

document.getElementById(ID).style.height = parent.frames[NAME].document.height +"px" ;

としました。これでバッチリ。

↑件のサイトのオーナー様。素敵な JavaScript をありがとうございました。

実は、JavaScript はよく知らないので、簡単なことでも引っかかってしまう。

今日も、

<form method="post" action="hogehoge.cgi" name="form1" onSubmit="return check();">
【性別】<br>
<input name="性別" type="radio" value="男性">男性 <br>
<input name="性別" type="radio" value="女性">女性 <br>

こういうラジオボタンの選択状況をチェックする Script を書いた。
ボタンが選択されるまでは value 値もセットされないわけだから、

if (document.form1.性別.value.length == 0) {
    alert('性別を選択してください。');
    return false;
}

なんて感じでええんかな・・・と思ってたら、大間違い。

InternetExplorer7 は実行エラーを出すけど(ま、内容はわかりづらいけどね(^^;)、FireFox3 は何のエラーも出さずに、移行の処理をキャンセルして終わるだけ(hogehoge.cgi が submit される)。

正しくは、

if ((document.form1.性別[0].checked == "") && (document.form1.性別[1].checked == "")) {
    alert('性別を選択してください。');
    return false;
}

こう、書かないと。

JavaScript が世に出てきたときは、まあ、セキュリティの面から見ても、今後もお遊び程度のオブジェクトの制御に使われるくらいだろうと、よもやこんなに JavaScript でがりがり処理を書く時代がくるなんて思いもしなかった。
なもんで当時全然覚える気がなくて、今頃になって色々勉強しているというわけだ。とほほ。

ま、JavaScript というよりも、オブジェクト指向言語全体を苦手としてるんだけどな。あいたたた・・・

このアーカイブについて

このページには、過去に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のカテゴリはパソコンです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら