Win8 で通信回線の種別を判定する。(できるとおもう

みむらです。これは完全にメモ書き。
・・・検証環境がないので実験できていませんが(ぉぃ

 

環境:

Windows 8
.net Framework 4.5

 

要求:

・インターネットにつながってる
・容量制限や従量課金の回線じゃないことを判定する。

 

コード:

                var profile = NetworkInformation.GetInternetConnectionProfile();
                if (profile != null)
                {
                    if (profile.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess
                        && profile.GetConnectionCost().NetworkCostType == NetworkCostType.Unrestricted)
                    {
                        // ほげほげ
                    }

                }

 

やっぱり、回線を気にして通信させたいよね、とふと。

あとで組み込もう。

ビット演算と論理演算と高速化と。

みむらです。

「私と小鳥と鈴と」って中学か小学校かでやりませんでしたかね。
どうでもいいですね。ごめんなさい。

C でコードを書いていると、AND 演算や OR 演算をよく使うんですが、
よく “&” と “&&” だったり、 “|” と “||” を間違えていたりします。

や、眠たいときや全力で \バリバリバリバリ/ みたいなことしているときによくやるんですが、
自戒を込めてメモ。 たまにテストで填まった時によく確認するとこれ、ってこともあるので。

 

サンプル

#include <stdio.h>

int main(void){
	int a = 0xFF;
	int b = 0x64;

	printf("BITWISE = 0x%x, LOGICAL = 0x%x",a&b,a&&b);
	return 0;
}

実行するとわかりますが、結果として、

BITWISE = 0x64, LOGICAL = 0x1

こうなるかと思います。

 

つまり、

演算子 意味
& ビットごとの論理AND
&& 論理AND

となるわけで、意味が異なります。

時に、C ですと、結果が 0 以外であれば TRUE として処理するように考えていますと、

演算子を書き間違えていたときに問題が起きるので、

該当箇所は func() != 0 というような感じで書いておくといいのかも、とふと。

 

OR 演算も同じような感じで。

#include <stdio.h>

int main(void){
	int a = 0x100;
	int b = 0x64;

	printf("BITWISE = 0x%x, LOGICAL = 0x%x",a|b,a||b);
	return 0;
}

もちろん結果も、

BITWISE = 0x164, LOGICAL = 0x1

こんな感じで変わってきます。

 

 

最後に高速化について。

C や C++ ではコンパイラによると思うので、私はよくわかりませんが、

C# においては、演算子の使い分けで高速化ができるようです。

& 演算子 (C# リファレンス)

http://msdn.microsoft.com/ja-jp/library/vstudio/sbf85k1c.aspx

&& 演算子 (C# リファレンス)

http://msdn.microsoft.com/ja-jp/library/vstudio/2a723cdk.aspx

こちらのウェブサイトを見比べるとわかるのですが、

& 演算子の場合は双方を評価して結果を出しますが、

&& 演算子の場合は単なる論理 AND のため、最初の演算で結果が確定する場合は2個目以降は演算しません。

要は、

funcA() & funcb()

とあった場合は、結果にかかわらず両方を演算し、

funcA() && funcb()

とあった場合、 funcA() が False を返す場合、 funcb() は実行されません。

これを応用すれば演算が最小限で済み、演算が高速になることが容易に考えられます。

(ただ、評価順を最適化する必要があるかとは思います。)

 

またやろうと思えば、

if(hoge.IsEnable() && hoge.type == Hoge.HOGEHOGE) { }

のような、有効なら細かく調査していく みたいなことも書けるのだとは思いますが、

私のような人には危険な気がしますが。

 

 

そんなこんなで特に私の場合、ビットごとの論理演算をしているかどうか。

これを間違えないようにコードを書きたいですね。

ってことで、よく間違いをやらかすのでメモ。

 


追記(2012/11/04 7:07):

記事についてコメントをいただきました。

最後の部分について、

世間では「ショートサーキット評価」と言うそうで、言語仕様で明確に定義されているとのこと。

http://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1

また、返値もブーリアンではなく最後に評価した値となる言語もあるようで、いろいろとおもしろそうです。

Visual Studio で C++ のテストをするとき、ブレークポイントを貼れない時のチェックポイント。

みむらです。

相変わらずの長々としたタイトルですが、
このブログ、主に私自身が使うので(ぁ タイトルで内容が把握できた方が都合がいいのです。
・・・RSS リーダーとかで読んでる方ごめんなさい。

今回は、某プロダクトのコードを書いている時にはまった現象。

(環境は Visual Studio 2010 にて検証。


現象:

「ブレークポイントは現在の設定ではヒットしません。このドキュメントのシンボルが読み込まれていません。」
と出て、ブレークポイントを設定しても無効になる。

具体的には、ブレークポイントを貼ったところが実行時に無効状態になり、
マウスでポイントすると、上記メッセージがでる。

 

確認箇所および修正:

Google で検索しますといろいろなサイトがヒットしますが、
それらで指示されている部分をまず確認。

要約しますと次の通り。
(引用元 : http://ameblo.jp/waka21/entry-10289918886.html

・プロパティ構成が「Debug」か。
・Debug 構成でビルドされた lib, dll を使っているか。
・リンカ設定を確認し、きちんと読み込まれるように設定されているか。
・プロジェクトプロパティの構成プロパティ –> デバッグ –> 「デバッガーの種類」が正しく設定されているか。

今回はこれらをチェックしても改善しませんでしたが、以下の設定を確認して解決しました。

プロジェクトプロパティにおいて、
構成プロパティ –> C/C++ –> コード生成 –> 「最小ビルドを有効にする」 が 「いいえ(/Gm-)」
に設定されているかどうか。

ということで、「簡易ビルド /Gm」が有効になっていると、
ブレークポイントが貼れなくなることがありますので、填まっている方は是非確認をしてみてはいかがでしょう。

Synaptics 社製タッチパッドで Windows 8 のジェスチャを無効にする。

どうもみむらです。
なんだかんだでほのぼの過ごしております。

先日、愛用していた VAIO VPCZ12AFJ から VPCZ21AJ に乗り換えました。

このマシンにも Windows 8 をインストールして試していたのですが、
どうも操作中にチャームが出てきたりスタートメニューが出てきたりで困っていました。

調べてみると、Synaptics のジェスチャとして、
Windows 8 では、タップ領域の右端からスワイプするとチャームがでてきたり、
左端からスワイプするとアプリケーションが切り替わったり、
上端からスワイプするとアプリバーが出てきたりとか。

タッチディスプレイならうれしいのですが、
さすがにタッチパッドですと、私の環境だと誤作動の原因となりますので、
ジェスチャを無効にしよう、ということで今回の記事の内容へとつながります。

 

ただこの機能を無効にするには、記事執筆現在でレジストリの編集が必要となるため、
あんまりおすすめはできません。

・・・はやくユーティリティ側で対応してくれるとありがたいんですが・・。

 

とりあえず、ジェスチャの詳細については、
http://www.synaptics.com/solutions/technology/windows8
こちらの公式ウェブサイトを参照していただければとおもいます。

 

・・・ちなみに、この記事の元ネタは、
http://www.intowindows.com/how-to-enable-or-disable-touchpad-gestures-in-windows-8/
このあたりから。

 

長くなりますので、記事をこの辺で分割します。

続きを読む

Windows 8 のメールアプリからSSL 通信でメールが送信できるメールサーバの設定。

みむらです。

先ほど、Windows 8 のメールアプリからメールが送信できるようになりまして、
その関係で関係各所に、送信トレイにたまっていたメールが全部送信されていった模様です。

・・送信トレイからのメールの削除機能が非常に欲しいところですが。。そこは私ができるところではないので。。

 

さてさて。

自宅サーバ上にメールサーバを構築している環境など、自分が管理できるメールサーバに対して、
Windows 8 のメールアプリからメールを送信できるようにする というお話。


今回は Postfix + Dovecot の構成で行いました。
なお、詳細な設置方法は他の記事に任せます。

 

ざっくり設定の内容を書きますと、
smtps ポート (465/tcp) を用いまして、 “ラッパーモード” で動作するポートを作りまして、
そこに対して接続させるように設定させます。

 

本来であれば、クライアント側へ SSL による通信を要求した上で暗号通信を開始するのですが、
ラッパーモードですと、接続開始時点から SSL による通信が行われます。

http://www.postfix-jp.info/trans-2.2/jhtml/TLS_README.html

こちらのウェブサイトにもありますように、この設定は全体に対して設定するのはよろしく無いため、
特定のポートを用いて行う、という形になります。

 


設定方法:

/etc/postfix/master.cf:

smtps     inet  n       -       n       -       -       smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject

これを該当行に追記する。

 

また、必要に応じて iptables の設定もごにょごにょいじります。

( SMTPS は 465/tcp ですので、必要に応じてポートを空けてください。 )

 

image

また、アプリケーション側については、

チャームから設定 –> アカウント と進み、該当アカウントの送信メールサーバの設定を、

ポート番号 : 465

サーバはSSLが必要 : Y

送信サーバは認証が必要 : Y

で設定をすれば問題ないかと思われます。

送信と受信で同じユーザ名とパスワードの設定項目は、環境にあわせ、適宜変更してください。

 


ではでは。ひとまず覚え書きまで。