リソースファイル(.resx)を使ったWPFアプリの多言語対応の落とし穴

タイトルの通りですが、リソースファイル(.resx)を使ってWPFアプリを多言語対応させました。
その時にちょっと困ったことがあったので残しておきます。

WPFアプリの多言語対応についてはググればいろんな方法が出てきます。
www.k-karakuri.com

grabacr.net

blog.okazuki.jp


↑の記事を参考にしながら「Resources.ja-JP.resx」を新規作成すれば良いんだなと学んだので、早速新規ファイルの追加です。

f:id:panda531531:20190118002738p:plain
リソースファイルを追加する

ここで、


Resources.ja-JP.resx」だから、「Resource1.resx」の「1」部分を「.ja-JP」に書き換えればおっけー☆(ゝω・)v


と思って追加すると失敗します。。。


よく見てください。


Resources.ja-JP.resx
Resource1.resx


Resources
Resource


「s」が付いてない。。。


というわけで、多言語用のリソースファイルを新規追加する際はデフォルトのファイル名が「Resources」ではなく「Resource」になってるから注意しようねという話でした。
こんな穴に落ちてしまうのは私だけかもしれませんが、後の自分のためにも書き残しておきます。

以上です。

育休からの復職月にボーナスがでる場合はもうちょっとだけ延長した方がいいかも

今年の5月中旬から6月中旬まで1ヶ月間、育休を取っていました。
育休中は社会保険料の支払いが免除されるのですが、ボーナスも同じように免除の対象です。
実際、私が育休中に支払われたボーナスから社会保険料は控除されておらず、ラッキーと思っていたのですが、先日会社から「間違ってたから次のボーナスから引いとくね(๑˃̵ᴗ˂̵)」と言われてしまいました。

育児休業期間中に賞与を支給した場合の社会保険料の取扱い | 出る杭はもっと出ろ!
詳細は上記の記事を見てもらいたいのですが、社会保険料の支払いが免除されるのは

育児休業等を開始した日の属する月からその育児休業等が終了する日の翌日が属する月の前月まで」

なのです!

私の場合、育休が終了した日の翌日が属する月が6月だったので、社会保険料の免除は5月までということになり、6月に支給されたボーナスの社会保険料は免除されませんよ。と…

長期で育休を取る場合はあまり関係無いかもしれないですが、私のように短期的に育休を取るケースはもっと増えてくると思われます。(父親も丸々一年取れるような環境があれば…)

これから育休取る予定の方は、復職月とボーナス支給月が重なっていないか確認してみましょう!
もし重なっているならもうちょっと延ばした方が良いかもしれませんよ!

Xamarin.FormsでDynamicResourceを使ったテーマカラーの切り替えでハマった

Xamarin.Formsで動的なテーマカラーの切り替えを実装していて少しハマった件について書いておきます。

【やりたいこと】

App.xaml内に定義したColorリソースの中身を入れ替えてDynamicResourceで参照している箇所を変えたい

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="sample.App">
  <Application.Resources>
        <ResourceDictionary>
            <Color x:Key="Primary">#000000</Color>
            <Color x:Key="PrimaryDark">#1976D2</Color>
            <Color x:Key="Accent">#00ff00</Color>
            <Color x:Key="LightBackgroundColor">#FAFAFA</Color>
            <Color x:Key="DarkBackgroundColor">#C0C0C0</Color>
            <Color x:Key="MediumGrayTextColor">#4d4d4d</Color>
            <Color x:Key="LightTextColor">#999999</Color>

            <Style TargetType="NavigationPage">
                <Setter Property="BarBackgroundColor" Value="{StaticResource Primary}" />
                <Setter Property="BarTextColor" Value="White" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>

【やったこと】

以下のブログにズバリ書いてあるので、参考にしながら実装しました。
blog.xamarin.com

App.Current.Resources ["backgroundColor"] = Color.White;
App.Current.Resources ["textColor"] = Color.Black;

が、なんどやってもDynamicにリソースが変わってくれません。。。

【調査結果】

いろいろ調べた結果、原因はColorクラスでした。

なんと!
Xamarin.Formsで使えるColorクラスというのはどうやらいくつかあるようなのです!!
(知っている人には当たり前かもしれませんが ^^;)


・System.Drawing.Color ← これを使っていた(不正解)
・Xamarin.Forms.Color ← 正解はこれ
Android.Graphics.Color
・(もしかしたら他にもあるかも?)

Xamarin.Forms.Colorを使えば、Dynamicにリソース変更を反映させることが出来ます。

XAMLのIntelliSenseが効かない&&クイックアクションに「using Xamarin.Forms;」が出てこない
という状況だったのでハマってしまいました。

Xamarin Mac Agentを使ってMacに接続できない(する気配すらない)時の確認ポイント

ちまちまXamarinやってます。

iOS版のビルドなどを実行するにはMacと接続する必要があります。
そのために、「Xamarin Mac Agent」なるものを使うのですが、ハマったのでメモしておきます。

つながらない場合は以下の点を確認してみてください。
つながるようになるかもしれません。

1.Macのリモートログインが有効になっているか

「システム環境設定」→「共有」→「リモートログイン」のチェックボックスを入れてください。
ログインユーザーのアクセスが許可されているか確認して、許可されていない場合は「+」で追加します。

2. XCode(AppleID)の設定が完了しているか

基本的には↓の通りですが、一部異なる箇所がありました。
itblogdsi.blog.fc2.com

Accountボタンを押し、AppleIDを「+」で追加します。
追加したら、AppleIDが表示されますので、View Detailsボタンをクリックします。

私の環境では「View Details」ボタンはありませんでした。
代わりに「Manage Certificates...」ボタンを押します。

iOS Development のCreateボタンを押して、Doneボタンを押します。

私の環境では「iOS Development のCreate」ボタンはありませんでした。
代わりに左下の「+」を押して出てくる「iOS Development」をクリックした後Doneします。

3.ネットワークに繋がっているか

ここでだいぶはまって心が折れかけました。
Xamarin Mac Agentの「接続」ボタンを押せども押せども接続する気配すら見せてくれません。
VirtualBox上のWindowsからMacに接続しようとしていたのですが、なんとネットワークが切断されていました。
直前までは繋がっていたのでなかなか気づけなかった。。。
VMを再起動して問題は解決しました。


以上、誰かの助けになれば幸いです。
誤りなどありましたらご指摘ください。

VisualStudio2017のネイティブメモリ診断機能が使えなくなった時の対処法

VisualStudio 2017便利ですね。

なんと、ネイティブメモリの解析が出来てしまいます。
スナップショット取って比較したり出来るので、メモリリークも簡単に見つかります。

以下の記事は2015ですが、概要はだいたい同じだと思います。
qiita.com

さて、本題ですが、私の環境でネイティブメモリ診断機能を使用していたときに遭遇したエラーと対処方法を忘備録として残しておきます。

【現象】
デフォルトではネイティブメモリの診断機能は無効になっているため、
デバッガーでアプリケーションを起動して有効にした後にデバッガーを再起動する必要があります。
再起動後、診断ツールの「メモリ使用量」にこんなメッセージが出ていました。

既に処理中のヒープセッションが存在するため、ネイティブメモリのプロファイルセッションを開始できません。Windowsは、コンピューターごとに1つのアクティブヒープセッションしかサポートしません。ほかのVisual Studioインスタンスまたはほかのパフォーマンス分析ツールを閉じてください。

なんのこっちゃ。

【対処法】
タスクマネージャーを開いて下のやつをkillってください。
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\DiagnosticsHub.Collection.Service\StandardCollector.Service.exe

その後、再びデバッガーを起動すれば診断ツールが復活していることでしょう。
(少なくとも私の環境では復活しました)

誰かのお役に立てば幸いです。

それではまた。

std::tr2::sys::pathクラスの内容出力系関数の比較

今回はC++の話です。

たまに使おうとするといつも使い方を忘れているstd::tr2::sys::pathクラスについて、
文字列出力関係の関数と出力結果をまとめておきます。


パスの連結や比較なども機能として用意してあるようです。以下にまとめてあります。
が、この記事だと出力系がわかりにくかったので。。。
path クラス (C++ 標準テンプレート ライブラリ)


以下のパスを入力として与えてそれぞれの関数で出力した結果は以下の通りです。
(Windowsを想定しているので「\\」で区切っています)

C:\\TestDir1\\TestDir2\\TestFileName.bmp
関数 出力 区切り文字 説明(違ってたら指摘お願いしますm(_ _)m)
basename() TestFileName - ファイル名(拡張子無し)
branch_path() C:/TestDir1/TestDir2 / ファイルのあるディレクトリまでのパス
directory_string() C:\TestDir1\TestDir2\TestFileName.bmp \ フルパス
extension() .bmp - 拡張子部分
external_directory_string() C:\TestDir1\TestDir2\TestFileName.bmp \ フルパス
external_file_string() C:\TestDir1\TestDir2\TestFileName.bmp \ フルパス
filename() TestFileName.bmp - ファイル名(拡張子有り)
file_string() C:\TestDir1\TestDir2\TestFileName.bmp \ フルパス
leaf() TestFileName.bmp - ファイル名(拡張子有り)
parent_path().string() C:/TestDir1/TestDir2 / ファイルのあるディレクトリまでのパス
relative_path() TestDir1/TestDir2/TestFileName.bmp / ドライブ文字以外?(相対?)
remove_filename() C:/TestDir1/TestDir2 / ファイル名以外
remove_leaf() C:/TestDir1 / leaf()以外?(そうなってないけど。。。)
root_directory() / / ルートディレクトリ名
root_name() C: - ルート名
root_path() C:/ / ルートディレクトリパス
stem() TestDir1 -
string() C:/TestDir1 /


なんだかよくわからない結果ですね。。。
同じ出力結果もちらほらとでています。
Linuxなどで出力した結果を比較するともっとわかりやすくなるのかもしれません。
時間があるときに試してみたいと思います。

わかりやすいリファレンスの場所をご存知の方がいらっしゃれば是非教えてください!

VisualStudio2017で拡張機能をインストールしたら落ちる時の対処法

どーも。panjaです。

さっそくVS2017インストールしてみました。
いろいろ環境を作っていたのですが、ある拡張機能をインストールして再起動するとソリューションを開く際に落ちるようになってしまったので、対処法を残しておきます。
同じような現象で困っている人の助けになれば幸いです。

原因の拡張機能は以下のものです。
Productivity Power Tools 2017
blogs.msdn.microsoft.com

上の記事にも書いてありますが、「拡張機能と更新プログラム」から「Productivity Power Tools 2017」をインストールすると次回起動時に以下の拡張機能群が自動でインストールされるように変わったようです。(VS2015までの同様の拡張機能は一つの拡張機能に機能がてんこ盛りというものでした。)
その中のいくつかの機能を有効にするとソリューションが開けなくなりました。

インストールされる機能一覧は以下の通りです。
表中の「落ちる原因?」列が「◯」になっているものを全て無効化するとソリューションを開けるようになりました。

名前 概要(違っていたら教えてくださいm(__)m) 落ちる原因?
Align Assignments Ctrl + Alt + ]で「=」の位置を揃えてくれます ×
Copy as HTML 選択したテキストをHTML形式でクリップボードにコピーしてくれるらしいです ×
Ctrl+Click Go To Definition Ctrl+クリックで定義に移動します ×
Custom Document Well Visual Studio のドキュメント タブの動作を設定できるようにします*1 ×
Double-Click Maximize 検索ウィンドウなどをダブルクリックすると最大化できるようになります
Editor Guidelines 縦線を表示してインデントをわかりやすくしてくれます
Fix Mixed Tabs タブとスペースが混在している場合に教えてくれるようです
Match Margin キャレットの位置と同じテキストを強調表示してスクロールバーにもわかりやすく表示してくれます ×
Middle Click Scroll マウスの真ん中のボタンクリックでスクロールできるようになります
Peek Help F1を押すと表示されるヘルプをインラインで表示させるためのショートカットキーを設定できるようです
Power Commands for Visual Studio その他の(?)便利機能の詰め合わせのようです ×
Quick Launch Tasks クイック起動ツールのアクセス性を向上させ、タスクを設定する機能を追加します*2 ×
Shrink Empty Lines 意味のある行をより多く表示できるようにテキストや数字を含まない行を縮小します
Solution Error Visualizer ソリューションエクスプローラーでエラーや警告を強調表示してくれるようです
Time Stamp Margin デバッグ出力ウィンドウにタイム スタンプを表示する余白を追加します

また、今回開けなかったソリューションの概要は以下の通りです。
この辺りがかなり関係していそうな気がします。
・もともとはVS2013で作成したソリューション
・(Productivity Power Tools 2017を入れる前に)VS2017で開いた際にアップグレードはしていない
C#C++/CLIC++のプロジェクトを含む
・使用しているサードパーティ製ライブラリ:Boost、XercesC++、GoogleTestなど


「Editor Guidelines」を無効化しなければならないので、インデントがわかりづらくなったのがかなりイタいです。
「Indent Guides」という別の拡張機能もあるようですが、残念ながらVS2017には未だ対応していないようです。同じことが実現できる拡張機能をご存知の方、ぜひぜひ教えてください(`・ω・´)ゞ

*1:よくわかっていません

*2:よくわかっていません