Category Archives: Win32

結局MBPはWindows10マシンになりました

現状、PHPでSQLのデータのCSVエクスポート、.NET Frameworkアプリでの処理、そしてCSVファイルを生成してアップロードという作業がメインになっております。

しばらくは、MBPのWin10パーティションのサイズが足りなくなり、パーティションの切り直しして再インストールしようと思って古いデスクトップマシンで作業していたけれど、MBPでパーティションのリサイズができたので結局MBPのWin10に戻って作業しております。

MacのOSアップデートもたまに起動したときにするくらいで、XCodeも最近は触っておらず・・・

iPhoneアプリもそろそろライブラリのアップデートリリースしないと

そして、やっとLolipopのSSHを使ってリポジトリを導入することができました。まだセキュリティ周りの仕組みがわかっていない。手順は書けるけど最近のセキュリティ設定はちんぷんかんぷん。

そういえば、アンケートやレビュー書かなくなったなぁ。絶対にどこかでデータ抜かれてるんだろうけど、いちいち時間とられるし、自分から書きに行く行為が一番危ないと思う今日この頃。

やっぱりBeyond Compare

会社を退社してからというもの、フォルダの整理をするまでに至っていなかったので必要なかったのですが、先日Facebookでクリスマスクーポンで20%オフのオファーが表示されたのでPro版を買いました。$60の20%オフで$48。約5500円でMac/Linux/Winとクロスプラットフォームの永久ライセンスならそれで十分。

フォルダ・ファイルの比較を基本として、Windowsエクスプローラーよりの早いファイル管理、ファイルの右クリックからエクスプローラーシェルコマンドが使えるところ、ハードディスクの整理に非常に役に立つツールといえます。あまり必要だとは思わないが、Windows版は日本語もサポートされている。ファイルのバックアップや、ストレージ内の重複したファイルのチェックをしてなるべくローカルで持っておくファイルの減らして行こうと思います。

そのうち、使い方ページを書きたいけれど、英語版を買ったので日本語版を使っている人にはどうだろうか。(その時は日本語版をテスト機に試用版でインストールするか)

日本語版の代理店もあるみたいですけど、できれば直接ウェブサイトから購入しましょう。リンクはこちらから→Scootersoftwareウェブサイト

 

Visual Studio Community C# コードをXamarinでiOSと共有してみる その1

投稿が、日記のようになってきているが、日を追って進んでいるというで。一般的には進捗とか言うんだろうけど、そうなると仕事っぽく報告とか嫌いな感じになっていくのでそういう話はやめて書きたいことだけ書く。

C#プロジェクトのテンプレートに”Shared Project”というものがあり、どのくらいクロスプラットフォーム間でコードが共有できるか試してみました。
結局のところC#で書いたクラスをネームスペース上で使えるようになるというもの。

Desktop Appなり、UWPなり、Androidなり、iOSに依存したコードは書いた時点で、プロジェクト側がエラーを検知するようになっている。
一つのソリューション内に違うプラットフォーム用にプロジェクトを作っておいて、同じコードを使いまわすという想定なのだろう。

C#を中心にコードを書くのに、悪くない環境だ。下にあるスクリーンショットは書くプロジェクトのアイコンを示したもの。

この中でCSSharedProject1というのがShared Project。ちなみに、CPPSharedというのはWin32 C++のShared Project。それぞれ同じ言語でしか共有はできくなっている。Win32でDLLを書いて.NET側からDllImportなりでAPIを取り込むのとどちらがいいのかは、この時点では不明。

Win32で書かれた共有コードをC#に共有するためにはC++CLRでも書けるので、それぞれのクロスプラットフォームではコードレベルでの共有が有効かもしれない。

 

この共有プロジェクトを今回、VisualStudio2017 Communityに含まれることになった、XamarinでAndoidとiOSで共有ができることが確認できた。

注意が必要なのは、XamarinでiOSプロジェクトを書くときは、ネットワーク上にXCodeとVS2017がインストールされたMacが必要になる。しかもXCodeはiOS用にライセンスが必要。幸いiOS用のライセンスはあったのでVS2017 Community for Macをインストールしてサンプルをデバッグしてみた。

Windowsマシンからデバッグをスタートさせ、デバイスにiOS Simulatorを選ぶ。

その時点ではMacにVS2017がインストールされたいなかったので、リモートデバッグができないメッセージがでる。さらにXamarinのガイドでMac側のリモートログインを有効にしないといけないとのこと。(SSHを有効にする)

さらにSSHを有効にし、VS2017をインストールしたところで、デバッグを走らせると今度はXCodeのSDKのバージョンが古い。

今日はここまでで作業終了。

なんという長い手順だ。しかし、MacにVisual Studioをインストールして、リモートデバッグとはMSFTの好むやり方だ。

最近話題になっている、IoTデバイス(ラズパイ)のデバッグも同じ形式。ラズパイにIoT版Windowsをインストールして、デスクトップのVisualStudioからコードを書いてデバッグするという方法をとっている。もともとラズパイはスタンドアローンでパソコンとして動作するものをどうしてもう一台のパソコンを使ってプログラムを書かないといけないのか。Windowsをラズパイにインストールすればそれでいいはずなのに。

コードの共有ができたところで今日はここまで。C#で一度書けば、今のところ考えられる全てのデバイスで使えるのは良いところであろう。で?Arduinoは?やらないの?

 

 

Visual Studio 2017 Community

新規一転、プロジェクトを立ち上げようと、VisualStudio 2017 Proを買って正規の個人ライセンスで行こうと張り切っていたけれど、購入ページをよくみるとVS2017 Communityは Pro版との機能の違いはほとんどないみたいなので検証しつつ試用しながらインストールすることにした。(なんだかまだ環境だけでも長くかかりそうなので現在進行形)

一応価格は、Pro版で、スタンドアローンが$499、1 か月ごとのサブスクリプションで月$45。サブスクリプション版はMacでもつかえて、TFSも使えるようだ。

あとはクラウドサブスクリプション版で、月$45、年$539がある。クラウドサブスクリプションは旧版ののVSのライセンスもついて来て、その他もろもろの特典があるようだ。でもライセンスを買うならスタンドアローン以外に買う理由がない。(マイクロソフトに洗脳されるのは危険だしね)

結果からするとPro版とほぼ同じというのは、本当なようだ。

前回ExpressではWin32 C++プロジェクトで、COMのインスタンス数に制限があったり、スタティックライブラリを使えなかったりで一番使いたいところに制限がかけられていて使い物にならなかった。さらに検証するのに無駄な時間をさいてしまう結果だった(その時はVS2013Proを結局買った)けれど、今のところ既存のプロジェクトを開いてコンパイルも通っている。

一つ、見つかった不具合は、今日(8月15日)15.3のアップデートがリリースされていて、アップデート後Win32 C++プロジェクトをテンプレートから作成すると、文字化けが発生する。原因はテンプレートが吐き出すリソースファイルのテキストフォーマットがUTF-8になっている。UNICODEじゃないといけないんだけど、手動でNOTEPADでSaveAsするしかない。

結果としては、こういう画面になる。

このサイトは自分用のメモ書きなので、一つ一つ手順を書くことはしないが同じ問題に当たった人が検索でここにたどり着ければ、すぐにわかることなので詳細はこれ以上書かないよ。

15.2のWin32のテンプレートの名前はWin32Project1なんだけど、15.3ではWindows デスクトップ アプリケーションとされていて、感が的中。VSのスプラッシュが変わったのも変だと思ったけど。

今日と昨日で、2台のマシンにインストールして、今日インストールしたマシンだけこれが発生してちょっと焦った。2台入れて違うテンプレート名がでるなんてね。今日リリースという偶然で半日無駄にしてしまった。ふう。(お盆明けVS2017を使っている方々、アップデート結構時間かかるので要注意ですよ~。ってアップデート前にこの記事を見る人もいないと思うけど)

あと、SubVersionのプラグイン(ASVN)を入れたのだけれど、ローカルリポジトリを作ろうとするとVSごと固まってしてしまう。(VSが固まった後、OSがアプリケーションクラッシュのダイアログを出す)

原因はASVNプラグインにありそうだけれど、HTTPSのリポジトリは試していないので何とも言えない。MSでAzureのフリーアカウントでTeamServiceでGitを提供してくれるみたいなので、今後はGitでやっていこうかな。今後はGitが主流みたいだしね。(やっとSVNで慣れてきたのに。個人的にはLinux寄りのGitよりも、ApacheよりなSVNの方がすきなんだけど。その辺はどっちも使えないとね)

 

Windows 10 に搭載されているSAPI(音声合成)とCortanaについて

今回はWindows 10の音声合成の環境のアップデート。

Win7, 8, 8.1にはSAPIが搭載されており、sapi.hにOS標準の音声合成APIが含まれていました。Windows10も同様、標準のボイスの情報はSPCAT_VOICESに定義されているレジストリキー(HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices)にあり、バージョンは11.0となっています。

SAPI_REG1

さらに、Speech Platform Language Packでインストールされるボイスは”Speech Server”下に定義されます。このレジストリキーはSpEnumTokens関数でTokenを取得するときに第一引数として使用できます。(ただしSpeech Serverは Speech Platfrom Runtimeをインストールしないと、登録されていないボイスというエラーが返ってきます)

さらに、Windows10で話題のCortana(コルタナ)ですが、同じフォーマットでSpeech_OneCoreに定義されています。このボイスはSpEnumTokens関数で指定可能です。

SpEnumTokensでCortanaのボイスを指定する例)

hr = SpEnumTokens(L”HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices”, strReqAttribute, NULL, &pEnum);

CortanaにはパラメータがSAPIよりも用意されていますが、公開されているかは不明です。今のところ、SAPIから使用可能ということだけでしょうか。あと、日本語Cortanaのボイス名は”Ichiro”と”Ayumi”となっています。

SAPI_REG2

誰を使って、AI作ろうか。

今回作った。SAPIの関数(COMのHRESULTのエラー処理は省略)

HRESULT speak(LPWSTR strSpeakString)
{
	HRESULT hr = S_OK;

	//ISpVoice * pVoice = NULL;
	ISpVoice *pVoice = 0; 
	ISpObjectToken *pToken = 0;
	IEnumSpObjectTokens *pEnum = 0;

	if (FAILED(CoInitialize(NULL)))
	{
		::MessageBoxW(NULL, L"Error to intiliaze COM", L"DBG", MB_OK);
		return S_OK;
	}	

	hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
	if (SUCCEEDED(hr))
	{

		hr = SpEnumTokens(SPCAT_VOICES, L"Language = 411", NULL, &pEnum); //SAPI default voice (OS language pack) 411:Japanese
		//hr = SpEnumTokens(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech Server\\v11.0\\Voices", L"Language = 411", NULL, &pEnum); //Speech Platform v11.0 (Required runtime)
		//hr = SpEnumTokens(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices", L"Language = 411", NULL, &pEnum); //Cortana voice

		ULONG ulCount = 0;
		USHORT usVolume = 0;
		
		long lRate = 0;


		hr = pEnum->GetCount(&ulCount);
		pEnum->Item(0, &pToken);
			
		hr = pVoice->SetVoice(pToken);
		hr = pVoice->GetVolume(&usVolume);
		hr = pVoice->SetVolume(100); //0 - 100

		hr = pVoice->GetRate(&lRate);
		hr = pVoice->SetRate(0); // -10 to 10


		hr = pVoice->Speak(NULL, SPF_PURGEBEFORESPEAK, 0);
		hr = pVoice->Speak(strSpeakString, SPF_IS_XML | SPF_DEFAULT, NULL);
		hr = pVoice->WaitUntilDone(INFINITE);

		if(pToken)
		{
			hr = pToken->Release();
			pToken = 0;
		}

		if (pVoice)
		{
			hr = pVoice->Release();
			pVoice = 0;
		}

		if (pEnum)
		{
			hr = pEnum->Release();
			pEnum = 0;
		}
	}

	if (pToken)
	{
		hr = pToken->Release();
		pToken = 0;
	}

	CoUninitialize();
	return S_OK;
}