2016年11月23日水曜日

WPFアプリを作っていて、BackgroundWorkerコントロールを貼り付けようと思ったら無くなっていて困った時

困ったこと
先日、WPFのアプリを作っていて
FormにはあったBackgroundworkerコントロールを貼り付けようと思ったら、
無くなっていて困りました。
どうしたか?
VS2012からasync と awaitという仕組みが使えるようになっており、
こちらを使うことにしました。
この辺を参考にしました。
・参考にしたサイト
http://www.atmarkit.co.jp/ait/articles/1512/02/news019.html
・本家
https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.110).aspx

2016年11月16日水曜日

GlyphTypeFaceInfo V2 リリース

GlyphTypeFaceInfo V2をリリースしました。
http://www.vector.co.jp/soft/winnt/writing/se499620.html

変更点
[バグ修正]フォントファイルを上書きしたことのある環境で実行すると、
起動時にエラーが発生する現象を修正。
(システムに残っている古いフォントは読み込まないように修正。)

2016年11月10日木曜日

Enumchar V3 リリース

EnumChar V3をリリースしました。
http://www.vector.co.jp/soft/winnt/writing/se483244.html

変更点
[機能追加]Unicode領域を追加(追加分を後述)
[バグ修正]フォントファイルを上書きしたことのある環境で実行すると、
起動時にエラーが発生する現象を修正。
(システムに残っている古いフォントは読み込まないように修正。)

[バグ修正]表示フォントの設定に失敗した場合に、代替フォント(MS Sanselif)で表示させるように修正。
[バグ修正]大量にフォントが入っている環境でエラーが発生する現象を修正。
[バグ修正]各コード領域の最後の文字が表示されていない問題を修正。
(例 0x20-0x7fの範囲の場合 0x7fが表示されていなかった。)
新規に追加したコード領域
{"U+0840", "U+085F", "Mandaic"}, // 2016.10.30 add
{"U+08A0", "U+08FF", "Arabic Extended-A"}, // 2016.10.30 add
{"U+1AB0", "U+1AFF", "Combining Diacritical Marks Extended"}, // 2016.10.30 add
{"U+1BC0", "U+1BFF", "Batak"}, // 2016.10.30 add
{"U+1CC0", "U+1CCF", "SundaneseSupplement"}, // 2016.10.30 add
{"U+A9E0", "U+A9FF", "Myanmar Extended-B"}, // 2016.10.30 add
{"U+AAE0", "U+AAFF", "Meetei Mayek Extensions"}, // 2016.10.30 add
{"U+AB00", "U+AB2F", "EthiopicExtended-A"},// 2016.10.30 add
{"U+AB30", "U+AB6F", "LatinExtended-E"},// 2016.10.30 add
{"U+AB70", "U+ABBF", "CherokeeSupplement"},// 2016.10.30 add
{"U+102E0","U+102FF","CopticEpactNumbers"},// 2016.10.30 add
{"U+10350","U+1037F","OldPermic"},// 2016.10.30 add
{"U+10500","U+1052F","Elbasan"},// 2016.10.30 add
{"U+10530","U+1056F","CaucasianAlbanian"},// 2016.10.30 add
{"U+10600","U+1077F","LinearA"},// 2016.10.30 add
{"U+10860","U+1087F","Palmyrene"},// 2016.10.30 add
{"U+10880","U+108AF","Nabataean"},// 2016.10.30 add
{"U+108E0","U+108FF","Hatran"},// 2016.10.30 add
{"U+10980","U+1099F","MeroiticHieroglyphs"},// 2016.10.30 add
{"U+109A0","U+109FF","MeroiticCursive"},// 2016.10.30 add
{"U+10A80","U+10A9F","OldNorthArabian"},// 2016.10.30 add
{"U+10AC0","U+10AFF","Manichaean"},// 2016.10.30 add
{"U+10B80","U+10BAF","PsalterPahlavi"},// 2016.10.30 add
{"U+10C80","U+10CFF","OldHungarian"},// 2016.10.30 add
{"U+11000","U+1107F","Brahmi"},// 2016.10.30 add
{"U+110D0","U+110FF","SoraSompeng"},// 2016.10.30 add
{"U+11100","U+1114F","Chakma"},// 2016.10.30 add
{"U+11150","U+1117F","Mahajani"},// 2016.10.30 add
{"U+11180","U+111DF","Sharada"},// 2016.10.30 add
{"U+111E0","U+111FF","SinhalaArchaicNumbers"},// 2016.10.30 add
{"U+11200","U+1124F","Khojki"},// 2016.10.30 add
{"U+11280","U+112AF","Multani"},// 2016.10.30 add
{"U+112B0","U+112FF","Khudawadi"},// 2016.10.30 add
{"U+11300","U+1137F","Grantha"},// 2016.10.30 add
{"U+11480","U+114DF","Tirhuta"},// 2016.10.30 add
{"U+11580","U+115FF","Siddham"},// 2016.10.30 add
{"U+11600","U+1165F","Modi"},// 2016.10.30 add
{"U+11680","U+116CF","Takri"},// 2016.10.30 add
{"U+11700","U+1173F","Ahom"},// 2016.10.30 add
{"U+118A0","U+118FF","WarangCiti"},// 2016.10.30 add
{"U+11AC0","U+11AFF","PauCinHau"},// 2016.10.30 add
{"U+12480","U+1254F","EarlyDynasticCuneiform"},// 2016.10.30 add
{"U+14400","U+1467F","AnatolianHieroglyphs"},// 2016.10.30 add
{"U+16800","U+16A3F","BamumSupplement"},// 2016.10.30 add
{"U+16A40","U+16A6F","Mro"},// 2016.10.30 add
{"U+16AD0","U+16AFF","BassaVah"},// 2016.10.30 add
{"U+16B00","U+16B8F","PahawhHmong"},// 2016.10.30 add
{"U+16F00","U+16F9F","Miao"},// 2016.10.30 add
{"U+1B000","U+1B0FF","KanaSupplement"},// 2016.10.30 add
{"U+1BC00","U+1BC9F","Duployan"},// 2016.10.30 add
{"U+1BCA0","U+1BCAF","ShorthandFormatControls"},// 2016.10.30 add
{"U+1D800","U+1DAAF","SuttonSignWriting"},// 2016.10.30 add
{"U+1E800","U+1E8DF","MendeKikakui"},// 2016.10.30 add
{"U+1EE00","U+1EEFF","ArabicMathematicalAlphabeticSymbols"},// 2016.10.30 add
{"U+1F0A0","U+1F0FF","PlayingCards"},// 2016.10.30 add
{"U+1F300","U+1F5FF","MiscellaneousSymbolsAndPictographs"},// 2016.10.30 add
{"U+1F600","U+1F64F","Emoticons"},// 2016.10.30 add
{"U+1F650","U+1F67F","OrnamentalDingbats"},// 2016.10.30 add
{"U+1F680","U+1F6FF","TransportAndMapSymbols"},// 2016.10.30 add
{"U+1F700","U+1F77F","AlchemicalSymbols"},// 2016.10.30 add
{"U+1F780","U+1F7FF","GeometricShapesExtended"},// 2016.10.30 add
{"U+1F800","U+1F8FF","SupplementalArrows-C"},// 2016.10.30 add
{"U+1F900","U+1F9FF","SupplementalSymbolsandPictographs"},// 2016.10.30 add
{"U+2B740","U+2B81F","CJKUnifiedIdeographsExtensionD"},// 2016.10.30 add
{"U+2B820","U+2CEAF","CJKUnifiedIdeographsExtensionE"},// 2016.10.30 add

2016年11月6日日曜日

EnumChar バグ情報

Enumcharのバグをまとめます。
EnumCharV2
■フォントファイルを上書きしたことのある環境で実行すると、
起動時にエラー(exception)が発生する

[原因]
フォントをOSに上書きインストールすると、古いフォントが内部的には保持されます。
EnumCharではフォントフォルダのファイルを全部検索するため、
この古いフォントにアクセスしてしまい、エラーとなってました。

[対策]
実体にアクセスできなかった場合は、読み飛ばすように修正。
V3.0.0で対応。


■表示フォントの設定に失敗した場合にエラー(exception)が発生する

[原因]
文字の表示エリアのフォント設定をするときに、
フォントによっては失敗することがあるため。
[対策]
根本解決はできなかったため、
失敗した場合に、代替フォント(MS Sanselif)で表示させるように修正。

V3.0.0で対応。


■大量にフォントが入っている環境でエラー(exception)が発生する。


[原因]
完全にはわからなかったのですが、
どうもメモリの使用量が増加し続けているときに発生することと、
x86でビルドすると現象がおきるみたいでした。
[対策]
起動時にGlyphTypeFaceの情報を取得する処理が若干冗長だったので、見直しをおこないました。
x86ビルドからanyに変更
V3.0.0で対応



■各コード領域の最後の文字が表示されない。

(例 0x20-0x7fの範囲の場合 0x7fが表示されていなかった。)

[原因]
単純なバグです。
for分の回し方がもう1個足りませんでした。
[対策]
for分の回し方を見直しました。
V3.0.0で対応


2016年10月22日土曜日

GlyphTypeFace を new したときに NullReferenceException

発生したこと
Windowsのフォントフォルダに存在するフォントファイルの一覧を取得し、
各フォントファイルのGlyphTypeFaceを生成する処理を実装したところ、
一部のフォントでNullReferenceException
( オブジェクト参照がオブジェクト インスタンスに設定されていません。 )
が発生する場合があることがわかりました。

※EnumCharのユーザー様からの障害報告で気づきました。

例外のスタックトレース
場所 MS.Internal.FontCache.FontFaceLayoutInfo.IntMap.TryGetValue(Int32 key, UInt16& value)
場所 System.Windows.Media.GlyphTypeface.Initialize(Uri typefaceSource, StyleSimulations styleSimulations)
場所 System.Windows.Media.GlyphTypeface..ctor(Uri typefaceSource)
場所 ConsoleApplication1.Program.Main(String[] args)
原因
フォントを上書きインストールしたことのある環境では、
古いフォントがフォントフォルダに残っており、
その古いフォントにアクセスしようとすると、実体が無いようで、
exceptionが発生するというのが原因でした。

下記のサイトが参考になります。
http://d.hatena.ne.jp/itouhiro/20120603
コード
実際にexception が発生するコードがこちらになります。
※実際にビルドするには、PresentationCoreを参照設定する必要があります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media; // 参照設定で PresentationCoreをONにする必要がある。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // フォントファイルのパス取得 
            string fontfolder = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);

            // フォントファイルの一覧取得
            string[] fontfiles = System.IO.Directory.GetFiles(fontfolder);

            foreach (string fontfile in fontfiles)
            {
                // 拡張子を切り出す
                string ext = System.IO.Path.GetExtension(fontfile);

                if ((String.Compare(ext, ".ttf", true) == 0) || (String.Compare(ext, ".otf", true) == 0)) 
                {
                    /* TTF, OTF  */
                    try
                    {
                        Console.WriteLine(fontfile); // debug

                        GlyphTypeface typeface = new GlyphTypeface(new Uri(fontfile));
                    }
                    catch (NullReferenceException nullex)
                    {
                        Console.WriteLine(nullex.Message); // debug
                    }
                }
            }
            Console.ReadKey();
        }
    }
}
実行結果
苦労したこと
・フォントフォルダをExplorerで見る限りは、フォントが1個しか存在しないため、
 原因の特定に時間がかかりました。
・また、現象が発生するフォントをアンインストールしても現象が発生したため、迷宮入りしそうになりました。

2016年10月9日日曜日

UWP で Hello World!

やりたいこと
UWP(Universal Windows Platform) で Hello World! をしたい。
XAMLはいじらないような方針で作成します。

環境 : Visual Studio 2015 community

どんなのを作るか?
小さいですが、Hello World!と表示されてます。
Step1 プロジェクト作成
ファイルメニュー - 新規作成 - プロジェクト を選択する。

新しいプロジェクトダイアログで、Universal - Blank App(Universal Windows)を選択する。
※他はデフォルトで結構です。


Step2 UIデザインにテキストを追加
ソリューションエクスプローラーにて、MainPage.xamlをダブルクリックする。


UIのデザインが表示されるので、ツールボックスから、TextBlockを白いところにドラッグ&ドロップする。

Step3 追加したテキストをHello World!に替える
UIデザインの画面で、Step2で追加したTextBlockを選択し、プロパティウィンドウで、いなづまマークをクリックする。

Loadingの空欄をダブルクリックする。(イベントハンドラを追加してます。)

ダブルクリックすると、空欄にtextBlock_Loadingが入力され、
メイン画面がMainPage.xaml.csに切り替わります。
MainPage.xaml.csのtextBlock_Loadingの中に「textBlock.Text = "Hello World!";」を入力し、
再生ボタンを押すと、立ち上がります。

※自分の環境では、しばらく緑の画面で、でかでかと✕が書かれたものが表示されますが、そのうちHello Worldが表示されます。

2016年6月11日土曜日

Maps Android API タップしたところにマーカーを付ける。

やりたいこと
マップをタップして、そこにマーカーを表示させるようにしたい。

環境
Android Stduio 2.1.2

準備(プロジェクトの作成とか...)知っている人はスキップしてください。
1.File - New - New Project... (もしくは、最初の画面で、Start a new Android Studio project)
2.Application nameと、Company Domainを入力して、Next
 SDKバージョンとか選択して、Next
3.Google Maps Activityを選択する。
4.Activity名とかを入れて、Finish
5.APIキーの取得
google_maps_api.xmlの3行目のURLにアクセスする。
行った先でAPIキーを作成する。
google_maps_api.xmlのYOUR_KEY_HEREにキーを貼り付ける。
地図のタップを拾うイベントリスナーを追加する。
デフォルトで存在するonMapReady()にイベントリスナーを追加するとできます。(12行目からの処理を追加します。)
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera  ← これは最初からある処理です。シドニーにマーカーをさすやつ。
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));


        // 地図タップイベント  ← ここから追加した処理になります。
        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
               @Override
               public void onMapClick(LatLng point) {

                   // タップした位置の表示
                   Toast.makeText(getApplicationContext(), "タップ位置\n緯度:" + point.latitude + "\n経度:" + point.longitude, Toast.LENGTH_LONG).show();

                   // マーカーを追加
                   LatLng latLng = new LatLng(point.latitude, point.longitude);
                   mMap.addMarker(new MarkerOptions().position(latLng).title("test"));

               }
           }
        );

    }
苦労した点
イベントリスナーをどこにおいたらよいのかよくわからず、苦戦しました。
最初、MapsActivityにOnMapClickListnerのinterfaceをもたせようとしたのですが、うまくいきませんでした。
次に、onCreate()の中にsetイベントリスナーを入れたのですが、こちらもうまくいかず、アプリ起動直後に落ちるような感じになりました。

2016年6月9日木曜日

Google Maps Android API 入門

やりたいこと
Google Map APIを使って、地図をつかったサイトをつくってみたいと思い、
料金を調べてみました。

https://developers.google.com/maps/pricing-and-plans/?hl=ja#details
ウェブサイトとかで使う場合は、使い方によっては課金される場合があることがわかりました。
なのでAndroidでアプリを作ることにしました。
地図をだす。(実機)
こちらのページの手順通りに試したところ、実機に地図が表示されるところまでができました。
https://akira-watson.com/android/google-map.html

1.Android Studioで新規プロジェクトを作成して、
2.Map Activityを選択して、
3.google_maps_api.xmlのリンクをクリックして、APIキーを取得して、
4.取得したキーをgoogle_maps_api.xmlに書く。

表示されました。
地図をだす。(genymotion)
genymotionではmapアプリを立ち上げても、地図が表示されません。
こちらもググると情報がでてきたので、こちらのサイトを参考にしたところ表示されました。
http://nelog.jp/how-to-use-google-play-in-genymotion
http://www.teamandroid.com/gapps/
エミュレータは4.1.1を使用しているのですが、
Genymotion-ARM-Translation_v1.1.zip と gapps-jb-20121011-signed.zipを エミュレータにD&Dすることでできました。

Android Studio コンパイルエラー

こんなことがありました。
ほぼデフォルトで作成した新規プロジェクトでコンパイルエラーが起きました。

1.Android Studioを起動して、New-Projectを作成。
2.Google Map Activityを選択する。
3APIキーを取得して、設定する。
4.ビルドする。



コンパイルエラーが発生する。

--------------------
Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(18) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.
Error:Execution failed for task ':app:processDebugResources'.
--------------------
こんなことを試してみた。(だめだったこと)
ググってみて、
build.gradleのバージョンの指定方法を変えるとうまくいくという情報があったので試してみたのですが、
このバージョンを何にすればよいのかわからず、適当にやってみたのですが、うまくいきませんでした。
    buildToolsVersion "23.0.2"    // もともと
    //buildToolsVersion "22.0.1" // こっちに変えてみたりした。

    compile 'com.android.support:appcompat-v7:22.2.1' // もともと
    //compile 'com.android.support:appcompat-v7:23.0.2' // こっちに変えてみたりした。
結局どうなったか?
解決できませんでした。
そうこうしているうちに、Android Studioの更新が通知されてきたので、更新したあとに
再度新規プロジェクトを作りなおしたところエラーが出なくなりました。

う~ん。 VSではこういうことはない。

2016年3月21日月曜日

Andoroid keystore パスワード 忘れた

おこったこと
Google Playに登録しているアプリを更新しようと思ったんですが、
keystoreのパスワードをすっかり忘れてしまってました。

それほど重要なものだとも思っていませんでした。

実は、とても重要で、keystoreが合っていないと、自分のアプリなのに、更新ができなくなるそうです。
対処したこと
こちらを参考に、
パスワードを見つけるプログラムを実行してみました。

そしたら、登録しているアプリの内、1個は簡単にパスワードが見つかりました。

もう一つの方は、まだ見つかってません。
多分ダメそうです。
勉強したこと
keystoreのパスワードはとても重要なので、忘れてもいいやという気軽な感じでつけないほうが良い。

2016年3月6日日曜日

Unity入門3

日経ソフトウェア 2016 4月号の記事の通りにやってみました。


蝶々を捕まえるゲームができましたが、自分でなにかやれる気はしないです。
連載は、今週で終わりです。

2016年1月23日土曜日

Unity 入門 2

今月号(2016/03) の日経ソフトウェア「Unity5 で さくっと ゲームを作ろう」第2回に従ってやってみました。



ユニティちゃんが自由に自然の中を駆け巡ってるとかいてありますが、自由に動く気配がない...

今回の記事とは直接関係ないのですが、
トランスフォームツールで、シーンを移動したり、Unityちゃんの位置を変えたりできることを学習。

2016年1月12日火曜日

Unity 入門 1

今月号(2016 2月号)の日経ソフトウェアから「Unity5でさくっとゲームを作ろう」が始まりました。

今月は、インストールして、Unity chanが表示されるまででした。

でました。