Category: 覚え書

開発環境をVisual Studio Community 2013から、
Visual Studio Community 2015に切り替えてみた。
Visual Studio Community 2015
 

[Microsoft:無料開発ツール – Visual Studio Community 2015]
https://www.visualstudio.com/products/visual-studio-community-vs
 

(さらに…)

スタートアップメニューにショートカットを登録

Windows起動時にアプリを起動させたい場合、スタートアップメニューにアプリを登録することは良くあると思う。

でも、Windows 10や8.1などでは、スタートアップメニューへの登録方法が面倒というか分かりにくく、自作ソフトでもたまに問い合わせが来る。

インストーラでスタートアップに登録すれば確実なんだけど、フリーソフトでインストーラとかは嫌がられる場合も多く、作る手間も掛かる。

そんな訳で、アプリケーション側で、自分自身のショートカットをスタートアップメニューに登録する方法を調べてみた。

 
 

まずは、スタートメニューのフォルダを調べる方法。

// 特殊ディレクトリ(スタートアップ)のパスを取得する
Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

Stringの値が返される。
例)C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Windows\Start Menu

 
 

そして、アプリ自身のexeファイル名の取得方法。

Path.GetFileName(Application.ExecutablePath)

Stringの値が返される。
例)sampleApl.EXE

 
 

あとは、exeのショートカットをスタートメニューのフォルダにコピーするだけ。

・・・。

あれ、どうやらC#やVB.NETではファイルのショートカットを作る機能が無いっぽい。

 

そういえば、前も似たようなことをやった記憶が。。

そうだ、これだ。
[C#] 送るメニューにショートカットを登録/解除する方法

この時も、ショートカット作成に苦労した。

なので、ショートカットの作成は、上記記事の「方法4」を流用し、WSH(Windows Script Host)でショートカットを作成する。
いろいろ方法があるので、詳しくは上記記事を参照。
(さらに…)

YouTube

 

突然、子供が使っているiPod TouchでYouTubeが使えなくなってしまった。

何だかYouTubeをアップデートしたら、アプリのアイコンが消えたと。

そして、App Storeから検索&ダウンロードしなおそうとしても、クラウドマークというか雲のマークのボタンにマスクが掛かりダウンロードできないと。

(さらに…)

ListViewコントロールで、詳細表示(ViewプロパティをDetails)し、アイテムを追加していくと描画処理が異常に重くなる現象が発生。
この問題を解決するのに少しハマったので覚書としてメモっておく。

自作ソフトRSS速報のListView表示で、数十件の項目を表示するのに数分かかることもある。

ListView
描画時にGUIがほぼ固まってしまう。

遅い処理部分をデバッグで調べてみると、

ListViewItem lItm = listView1.Items.Add(FormMain.saveItems[i, j, 0]);

の行で、数秒が掛かっている。
しかも、件数が増えれば増えるほど遅くなっていく。
(さらに…)

エクスプローラーなどでファイルを右クリックしたときに出てくる「送る」メニュー。
この送るメニューにアプリケーションを登録しておくと、選択したファイルの情報を
アプリケーションに渡して起動できるため、使い方によっては便利な機能。
01
例えば、logファイルを”メモ帳”に送って起動するといったことができる。

(さらに…)

ごくたまに画像ロゴを作成するためにGIMPを使用する。
割と簡単にカッコいいロゴを作れるため重宝している。

GIMPでロゴ作成

 

だけど、そこそこ種類があって、どのメニューがどういうロゴだか忘れてしまう。
なので備忘録的にGIMP2.8のサンプル ロゴ画像を載せておくことに。

 

と、その前にロゴ作成方法。

GIMPでロゴ作成

  1. GIMPを起動
  2. [ファイル]→[画像の生成]→[ロゴ]メニュー配下の任意のサブメユーを選択。

(さらに…)

C#でExcelファイルを読み書きするプログラムと、そのプログラム(exe)を配布するためのインストーラを作ってみた。

C#でExcelファイルを読み書きするプログラム
何故態々インストーラを作成するのか?

それは、作成したExcelを使ったプログラムは、exeの配布だけでは他のPCでは動かないため。
Excel関連のDLLも一緒に配布する必要がある。

例えば、前に作成したサンプルアプリの場合、配布時は以下のDLLが必要。

  • Microsoft.Office.Interop.Excel.dll
  • Microsoft.Vbe.Interop.dll
  • office.dll
  • stdole.dll

 

⇒これ、後から気づいたけど実は認識誤り(.NET Framework 3.5までの話)。
 .NET Framework 4以降ではDLL配布を不要にする方法がある。
 説明も後記するので最後までちゃんと読んでね。

 

昔のVisual Studioではセットアッププロジェクト(Windows ベースのアプリケーションのmsiインストーラ)を作成する際、必要なDLLを自動で抽出してくれていた。

インストーラ付きで配布するのが嫌という場合、exeと抽出されたDLLだけを他PCにコピーしても動作する。
ただ、インストーラ無しで、抽出されたDLLを勝手に再配布するのはNGかも知れない。
あと、勿論、配布先PCにもMicrosoft Excelをインストールしておく必要はある。

じゃぁ、昔みたいにインストーラを作ればいい。

と、思ったら、、
Visual Studio 2012以降では、セットアップ プロジェクトが無くなり、ウィザードでインストーラ作成(ディプロイメント)することが出来なくなってしまったらしい。

・・・それは困った。

必要なDLLはMSDNとかに載っているかもしれないけど、前と同じような方法ができないか調べてみた。

 

すると、従来のセットアッププロジェクトに代わり、InstallShield Limited Editionを使ってインストーラを作れることが分かった。
でも、InstallShieldって有料じゃなの?

と思ったけど、このLimited Editionってのは簡易版で無料らしい。

ただ、無料版のVisual Studio Expressでは使えず、Visual Studio Professional以降じゃないと、InstallShield Limited Editionは使えないようだ。

 

という事で、おさらいも兼ねてVisual Studio 2013を使ってExcelを使ったプログラムと、インストーラをInstallShieldで作ってみることにした。

 
 

Excel用のプログラム作成

まずは、C#でExcelを使ったプログラムを作成。
exeの作成方法は、ほぼ前回と同じ。
(さらに…)

C#やVB.NETなどのアプリケーションで、WebサイトやHTMLなどを表示したい場合に使うWebBrowserコントロール。
このWebBrowserコントロールを使えば、簡単にInternet Explorer同等のWebページを表示できる。

でも、最近このWebBrowserコントロールで表示崩れが増えてきたような気がする。

例えば、ここのホームページを表示すると、メニューのスタイルが崩れてしまう。

 

↓WebBrowserコントロールで表示
WebBrowserコントロールで表示

 

(さらに…)

Windows NT/2000/XPの頃、NET SENDコマンドを使って、簡単に他のPCに対してメッセージボックスを通知することができた。
送られてきた方は、急にメッセージボックスが表示され、結構ビビるのだが。

昔、この仕組みというかサービスを利用したフリーソフトを作ったこともあった。

でも、Windows XPでは、”Messenger”サービスが起動していないと使えなくなり(デフォルトは停止)、更にVista以降では、”Messenger”サービス自体が消え、この方法でメッセージ通知することができなくなった。

 

その代わりに、IP Messengerなどのフリーソフトを使う方法もあるけど、相手側もIP Messengerを起動しておかなければならない。

で、いろいろ調べてみたら、Vista以降では、msgってコマンドってのが使えるらしい。

 
 

試しに、コマンドプロンプトから以下のようなコマンドを打ってみる。

msg.exe    (userid)    "(message)"

 userid・・・WindowsログインユーザID
 message・・・表示したいメッセージ

 
例)
msg   osada   “テストメッセージ”

 

すると、指定したユーザー(osada)にメッセージ「テストメッセージ」が通知される。
メッセージボックス「Test Message!」
(さらに…)

iTunes11が11/30に公開されました。
今回はUIを中心に大幅にリニューアルされたということで、早速ダウンロード。
iTunes11
iTunes10はWindowsのUIと異なるせいか、なんか使いにくい。
それが少し改善されているような気がする。
(さらに…)

C#でHTML文書からRSSのURLを取得するサンプル。

このサンプルでは以下の処理を行う。
1.テキストボックスに対象となるHTML(WebサイトのURL)を指定。
2.[RSSのURL取得]ボタン押下。
3.取得したRSSが表示される。
(さらに…)

解約後の携帯ソフトバンク 3G携帯の機種変更後のカメラ使用方法について
先日、iPhoneに機種変したけど、iPhoneの前は、910SH(SHARP)を使用していた。

この旧3G携帯、500万画素のデジカメが付いていて気に入っていたが、携帯解約すると、USIMカードが無くなるのでカメラも使えなくなってしまう。
カメラを起動すると、
「この機能は現在利用できません。ネットワーク自動調整を行ってください。」
と表示される。
(さらに…)

前回のカラーコードを16進数表示するに続き、今回はその逆の16進数文字列からカラー値を求めるサンプルを紹介。

このサンプルでは以下の処理を行う。

  1. テキストボックスに16進数6桁のRGBの値を指定
  2. ボタンをクリックで、ボタンの背景色を指定カラーに変更
  3. ついでにボタンの文字列も色を反転

GUIデザインでは、Formにbutton2という名前のボタンと、textBox1という名前のテキストボックスを貼り付ける。

(さらに…)

C#でカラーの値をRGBカラーコードを表示するサンプル。

このサンプルでは以下の処理を行う。
1.「色の設定」ダイアログを表示。
2.設定した色を使用し、ボタン背景色を変更
3.ボタンの文字色を、背景色の反転カラーに変更
4.設定した色をRGBカラー(16進数6桁の文字列)として表示

GUIデザインでは、Formにbutton1という名前のボタンを貼り付ける。
カラー変更 デザイン

(さらに…)

最近、Windows標準のShift-JISから、Web標準となっている(?)UTF-8への文字コード変換が必要な場合がちらほら出てきている。

マルチプラットフォームでデータをやり取りする場合なんかでもUTF-8が結構使われていたりする。

こういうコード変換なんかは、テキストエディタ等を使えば、簡単に変換できる。
最近ではメモ帳でもUTF-8保存ができるようになったし。

でも、このコード変換が100個、1000個、と数が増えてくると手作業は無理。

そんな訳で、VC++(非.NET)でSJISからUTF-8に変換するプログラムを作ってみることにした。
# バッチで利用したいという理由もあったんで。

しかし、SJISからUTF-8に直接変換するようなWin32APIは用意されていないことに気付いた。
C#やVB.NETならきっと一発で変換できるんだろうけど(多分)。

調べてみると、シフトJISからUTF-8に変換するためには、一回Unicodeに変換させる必要があることが分かった。
あぁ面倒。

まず、MultiByteToWideCharを使用し、SJISからUnicodeへ。
次に、WideCharToMultiByteを使用し、UnicodeからUTF-8へ。

出来上がったプログラムソースは以下のとおり。
(さらに…)

HTMLでサムネイル画像の拡大する方法はいくつかあると思うが、今回はJavaScriptをあえて使用せずCSS(スタイルシート)のみで、画像を拡大してみる。

CSSなら、JavaScriptを自由に使えないブログなどでも簡単に利用できるメリットがある。
# ただし、CSSに対応した割と新しいWebブラウザが必要となる。多分。

サンプルは↓こちら。
# マウスポインタを重ねるとサムネイル画像が拡大表示








覚書き程度ということで、いきなりHTMLソース。
(さらに…)

職場でのお話なんだけど、ノートPCの盗難や、自宅へ持ち込んでウィルスに感染する人がちらほら出てきてセキュリティー対策にうるさくなってきた。

以前はノートPCにBIOSパスワードを仕掛けるぐらいで済んでいたけど、今度はデスクトップPCに対してもBIOSパスワードと、更にハードディスクパスワードを掛けるよう指示が出た。
ウィルスチェックも毎日、完全スキャンするという指示も。

仕事で使用しているPCなんで仕方ないが、これって的を得ているとは思えない。
ウィルスチェックなんかは、完全スキャンなんかすると、マシンによっては5時間以上かかるのもある。
これはさすがに見直され週1回でいいという話にはなったが。。
BIOSパスワード。
これって、盗難されたときのためにパスワードを設定しましょうという話だけど、同じ機種同士なら差し替えたり、ハードディスク(情報)だけ別マシンに付けてしまったり、電池を一回外すだけでリセットされてしまったり、ハードによって異なるらしいけど、抜け穴がいっぱいあるらしい。
BIOSパスワードの解除方法を伝えたいのではなく、BIOSパスワードで安心している人がいたら注意しましょうというお話です。

で、BIOSパスワードだけでは不安なので、今度はHDDパスワードを付けましょうという話になったんだけど、これがまたクセモノ。
職場内で一斉にHDDパスワードかけたはいいが、翌日パスワード忘れが続出。
あちこちで「ピーピー」ビープ音(パスワード3回間違え?)が鳴っている。
物凄いプロフェッショナルな方々なんだけどなぁ。。。

自分はHDDパスワード忘れた場合の対処方法は分かりません。
多分、もう二度と使えなくなってしまうのではないかなと。
なので、HDDパスワードは忘れないように注意しましょう。
でも、付箋紙に書き込んでおくなんて問題外でしょう。
引継ぎする際も忘れずに。

そもそも、デスクトップPCなんて滅多に盗難されんでしょう。
盗まれたくないなら、パスワードじゃなくって物理的にワイヤー錠でガッチリガードすべきだと思うんだけどなぁ。
出入り口の監視カメラで抑止とか。

今回も自分用の覚え書きネタ。

Webサイトの更新日時なんかを調べたい場合、URLに以下を入力するとメッセージボックスが表示される。
もちろん、動的に作成されるWebページは正しく取得できない。

javascript:alert(document.lastModified)


# とある件で更新日時を調べたくなったけど、やり方忘れて少し苦労したのでメモ。

かつてVisual Basic 6.0にはコントロール毎にIndexプロパティが存在し、
簡単にコントロールの配列を扱うことができた。
例えば、

TextBox1(0).Text = "1"
TextBox1(1).Text = "2"

など。

が、VB.NETからIndexプロパティが無くなり簡単には使用できなくなった。
(正確に言うと互換のため残されているが)
オブジェクト指向なんだから自分で作れと言わんばかりに無くなっている。

VB.NETにも無いものはC#にも無い。
C# 2005にも配列用のコントロールは用意してあるようだけど。
(例:TextBoxArray、PictureBoxArrayなど)

で、いざコントロールを配列で使ってみようと思ったところ使い方が分からず
少し悩んでしまった。
またきっと忘れるんで覚書きに追加しておこう。
(さらに…)

最近よく度忘れするので覚書き

C#でデバッグ時に[出力]ペインに情報を書き出す方法
1. Debugモードに切り替え
2. ソース中に
  System.Diagnostics.Debug.WriteLine(“出力される文字”);
3. 実行

前に、とある処理でこんなコーディングをしたことがあった。

// 別スレッド
UINT sampleThread(LPVOID pParam)
{
  CSampleDlg* pDlg = (CSampleDlg*)pParam;
  for( ; 0<pWait ; pWait--){
    // ループ内の処理
  }
  :
}

しかし、これが何故か無限ループに陥ってしまう。
同様のミニプログラムを作成しても再現しない。
なぜか、これを使用している某プログラムのみ発生する。

でも、デバッグモードでは問題なく動作する。

う~ん、怪しい。
試しにこのスレッド処理だけをコンパイラの最適化を無効にしてみた。

// 別スレッド
#pragma optimize( "g", off )
UINT sampleThread(LPVOID pParam)
{
  CSampleDlg* pDlg = (CSampleDlg*)pParam;
  for( ; 0<pWait ; pWait--){
    // ループ内の処理
  }
  :
}
#pragma optimize( "g", on )

すると動くではないか。。。

最適化によってコードのサイズを小さくし実行速度を向上しているようですが、
たまに、こういった不具合にも突き当たります。
# 不具合というか仕様なんでしょうけど。

前に、最適化有無によって倍精度浮動小数点の演算結果(べき乗)が異なるって問題にもぶち当たったことがあったけど、これも最適化有無によるものでした。
浮動小数点の値自体、もともと誤差を含んでいるので、どちらも正しい値なんですが。。。

ちなみに、あとから分かったことは、

for( ; 0<pWait ; pWait--){

for(wkWait=pWait ; 0<wkWait ; wkWait--){

に変更するだけで問題は解決しました。

よく上級の人のソースや、本で、

for(;;)

なんて書き方も紹介してますが、あまり懲りすぎると痛い目にあいます。
特に、複数人で開発している製品なんかは、他人にも分かりやすいコーディングをしなければ、バグ作り込みの原因にも成りかねません。
あまり、性能に影響が無い部分は、なるべく見やすい一般的なコーディングをした
方がよいのでしょう。

最近、物忘れが激しいんでブログに書いておきます。

Windows XPで、ネットワークスピードを調べる方法

知っている限りでは二種類の方法があります。

  • 其の壱
    1. [Ctrl]+[Shift]+[Esc]キーを同時押下。
    2. Windowsタスクマネージャのダイアログが表示されるので[ネットワークタブ]を選択。
    3. 右側のスクロールバーを上下することにより、各アダプタのネットワーク使用率を表示することができる。

(さらに…)