1月 082015
 

※画像クリックすると Windows ストア に飛びます

Windows ストア アプリでカラーマネジメントに対応した画像ビューアーを作ってみました。

主に技術実証とMSCCを目的としたアプリなため、低機能&低品質で申し訳なく。
フォルダ内にファイル増やしても検知してくれなかったりとかそういう…
何か表示がおかしいなとかあった場合は、アプリを再起動すれば大体直ると思いますので。。
Release 1 では、スリープからの復帰時に画像が復元されないバグがある気がしていますが、直す気力があまり無いです……

Windows Runtime におけるカラーマネジメントの実装方法については、そのうち記事を書きますのでそちらで。。
簡単にいえば、 C++/CX で WIC と Direct2D を使って頑張る感じです。つらい。。。

12月 012014
 

問題

  1. .NET 4 アプリケーションを作る
  2. Microsoft.Net.Http や Microsoft.Bcl.Async を参照する
  3. MsBuild /t:Publish する
  4. 配置した ClickOnce アプリを起動する
  5. アプリは死ぬ

解決策

  1. 参照してるアセンブリファイルをプロジェクトにコピー (公式手順的にはリンクとしてコピーだが物理コピーでも可っぽい)
  2. 「出力ディレクトリにコピー」を「常にコピーする」に変更
  3. 発行!

NuGet で更新する度にコピーし直さないといけないけど……

Microsoft.Net.Http

Issue 8

Symptom

ClickOnce applications targeting .NET Framework 4.0 that reference the Microsoft.Net.Http package may experience a TypeLoadException or other errors after being installed.

Resolution

This occurs because ClickOnce fails to deploy certain required assemblies. As a workaround, do the following:

Right-click on the project and choose Add Existing Item
Browse to the HttpClient net40 package folder
In the File name text box enter *.*
Holding CTRL, select System.Net.Http.dll and System.Net.Http.Primitives.dll
Click the down-arrow next to the Add button and choose Add as Link
In Solution Explorer, holding CTRL select System.Net.Http.dll and System.Net.Http.WebRequest.dll
Right-click the selection, choose Properties and change Copy to Output Directory to Copy always
Republish

引用元:http://blogs.msdn.com/b/bclteam/p/httpclient.aspx

System.Net.Http.Primitives.dll とか System.Net.Http.WebRequest.dll のことも書いてあるけど、 System.Net.Http.dll だけでOKだった。
むしろ System.Net.Http.Primitives.dll をコピーしてると、起動時に「もうあるよ!」的なエラーで死んだ。
そもそも手順的に Primitives をコピーしてるのになぜ WebRequest が出てくるのか……怪しげな説明。。

Microsoft.Bcl / Microsoft.Bcl.Async

Issue 9

Symptom

ClickOnce applications targeting .NET Framework 4.0 that reference the Microsoft.Bcl or Microsoft.Bcl.Async packages may experience a TypeLoadException or other errors after being installed.

Resolution

This occurs because ClickOnce fails to deploy certain required assemblies. As a workaround, do the following:

Right-click on the project and choose Add Existing Item
Browse to the Microsoft.Bcl net40 package folder
In the File name text box enter *.*
Holding CTRL, select System.Runtime.dll and System.Threading.Tasks.dll
Click the down-arrow next to the Add button and choose Add as Link
In Solution Explorer, holding CTRL select System.Runtime.dll and System.Threading.Taks.dll
Right-click the selection, choose Properties and change Copy to Output Directory to Copy always
Republish

引用元:http://blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx

9月 222014
 

知らなかったので少しだけ試したメモ。

概要

  • FlashPlayer 10 から追加された機能っぽい
  • Stage に描写されるモノを sRGB とみなして、モニタプロファイルのカラースペースに変換する機能があるっぽい
  • ソースプロファイルは無視っぽい
    • flash.display.Loader とかにも機能が見当たらないけど、使うリソースを全部sRGBにしておけってことなんですかね
    • Flash Professional に取り込んだ画像は、プロファイル削除されると書いてあるので、つまりそういうことなのかな…sRGBに変換されるかは謎いけど、サンプルではGBR画像の色が狂ってしまってるので、変換なしでプロファイル削除だけの予感

If you import an image with an embedded profile into Flash Professional, the color profile is removed and the image on the Stage appears without its embedded color profile.

  • Linux/Unixは非対応っぽい

Currently, SWF file color correction is not supported on Linux/Unix systems or systems with less than 32-bit color resolution.

バグっぽい?

環境

  • Firefox 32.0.2 + FlashPlayer 15.0.0.152 + CMS有効
    • colorCorrectionSupport: defaultOff
    • colorCorrection: on の時のみカラマネが動作
    • 参照するモニタプロファイル: gfx.color_management.display_profile に設定されたやつ
  • デスクトップ版IE 11 + FlashPlayer 15.0.0.152
    • colorCorrectionSupport: defaultOff
    • colorCorrection: on の時のみカラマネが動作
    • 参照するモニタプロファイル: 「色の管理」で設定したプライマリモニタのプロファイル
  • ストア版IE11 + FlashPlayer 15.0.0.152
    • colorCorrectionSupport: unsupported
    • colorCorrection: うごかないっぽい
9月 092014
 

概要

  • L-02F で W4-820 を用いてインターネット通信をした場合、断続的に無通信状態が発生する
    • 途切れまくるので、正直そのままでは使いものにならない

環境

  • 使用ルーター : LG L-02F
  • 使用PC : Acer Iconia W4-820 (以下W4)
  • 使用SIM : ぷららモバイル LTE 定額無制限プラン

再現条件

  • 他 W4 端末でも再現する
  • PC側に iPod touch 5G, MacBook Pro, Nexus7, iPad mini 等を用いても再現しない
  • ルーター側に URoad-Aero, WR8700N を用いても再現しない
  • L-02F の PWLAN を利用して URoad-Aero 経由でインターネット接続しても再現しない
  • L-02F の Wi-Fi を用いて他PCと通信した場合も再現しない
  • L-02F の設定、W4 の NIC 設定、NIC ドライバで影響があるものは発見できなかった
  • W4 がバッテリ駆動の時は再現し、電源接続時は再現しない

回避策

powercfg -setdcvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 19cbb8fa-5279-450e-9fac-8a3d5fedd0c1 12bbebe6-58d6-4636-95bb-3217ef867c1a 0
パラメータ 説明
-setdcvalueindex バッテリ駆動 時の設定
381b4222-f694-41f0-9685-ff5bb260df2e バランス プラン
19cbb8fa-5279-450e-9fac-8a3d5fedd0c1 ワイヤレス アダプターの設定
12bbebe6-58d6-4636-95bb-3217ef867c1a 省電力モード
0 最大パフォーマンス(1~3は省電力 (低/中/高))
  • この回避策を用いても、Bluetooth にて Arc Touch Mouse Surface Edition を使用している際には不安定となった
    • Bluetooth と Wi-Fi の干渉はよく知られている問題
    • L-02F で 802.11b のみを用いることで多少改善された(割り込みタイミングの問題?)
    • URoad-Aero, WR8700N を使用している場合は問題ない(たまたま?)
    • どうやら 5GHz で接続していても切れることが分かったが、どうせ屋内でしか使えないモードなので放置……
7月 232014
 
  • 調べた分だけ。
  • 割とわかりやすかった:Overview of Custom Storage Providers for ASP.NET Identity | The ASP.NET Site
  • 「ASP.NET Webアプリケーション」テンプレートの認証「個人ユーザーアカウント」で作成されたコードを眺めれば何となく分かる。
  • Microsoft.AspNet.Identity.EntityFrameworkとかはEFのCodeFirstでテーブル初期化とかDB読み書きとかやってくれるやつだけど、CodeFirstが嫌でIUserStore自作するなら不要な感じ。
  • UserManagerがASP.NET Identityの中心的存在の予感。
    • OWIN startup classの中でCreatePerOwinContext()にて初期化用Funcを設定する。

PasswordHasherの入れ替え

[csharp]

public class ApplicationUserManager : UserManager
{
public ApplicationUserManager(IUserStore store) : base(store) { }

public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore(context.Get()));
manager.PasswordHasher = new HogePasswordHasher();
return manager;
}
}

public class HogePasswordHasher : IPasswordHasher
{
public string HashPassword(string password)
{
// 塩を振ったりストレッチングしたりしよう
throw new NotImplementedException();
}

public PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
if (hashedPassword == HashPassword(providedPassword))
return PasswordVerificationResult.Success;
else
return PasswordVerificationResult.Failed;
}
}
[/csharp]

ちなみに、ASP.NET vNext のデフォルトっぽいPasswordHasherは以下の様な実装。

  1. Rfc2898DeriveBytesでSaltサイズのみ指定(128bitでRNGCryptoServiceProviderによって生成されるランダムSalt)にしてパスワードハッシュ生成(1000回ストレッチング)
  2. Salt + パスワードハッシュな文字列を返す(DBとかに保存する文字列になる)

検証時は

  1. DB保存的文字列からSaltとパスワードハッシュを切り離し
  2. そのSaltを利用して、入力されたパスワードからパスワードハッシュを計算
  3. 照合

2.0.0のMicrosoft.AspNet.Identity.PasswordHasher.VerifyHashedPassword()も、vNextのコードで生成したハッシュを使って検証したら成功したので、多分同じロジック。

参考:Identity/src/Microsoft.AspNet.Identity/Crypto.cs

Roleによる認可的な

Controllerで

[csharp]
if(this.User.IsInRole(“Admin”))
{
}
[/csharp]
とか
[csharp]
[Authorize(Roles=”Admin”)]
public ActionResult Index()
{
return View();
}
[/csharp]
とか。

Viewで

[csharp]
@if (this.User.IsInRole(“Admin”))
{
}
[/csharp]
とか。

7月 222014
 

そのうちまとめるつもり。

  • .NETのカラマネ対応APIは、System.Windows.Media, System.Windows.Media.Imagingの中にちょっとだけある。ほぼWPF専用なのではないかという予感…
    クラス / 構造体 概要
    ColorConvertedBitmap WICで一度だけ色変換できるBitmapSource。微妙MarkupExtensionもあるよ。
    ColorContext ICCプロファイル的なやつ。
    Color sRGB/scRGBカラーを扱う。挙動が微妙なこともあり、カラマネ的には役に立たない可能性が。
    BitmapFrameと各種Encoder/Decoder 画像ファイルを取り扱うクラス群。画像プロファイルも読み書きしてくれるっぽい。中身はWICの模様。

  • 内部的にはICM / WCS, WICを利用している。
    • System.Windows.MediaがICMに対応して、System.Windows.Media.ImagingがWICに対応するイメージなのかな?
  • いずれの場合もTransformは使い捨ててるので、パフォーマンスは微妙。
    • WCSプロファイルはTransform生成がかなり遅い(iccの30倍位)ため、非常に残念な事になる。回避するには多分P/Invokeしかない。
  • 残念なことにデバイスプロファイル等、PC/ユーザーに設定されているプロファイルを取得する方法は用意されていないので、ファイルパスを指定するかP/Invokeするしかない。

System.Windows.Media.Imaging.ColorConvertedBitmap

  • 変換元、変換先のColorContextと、変換したいBitmapSourceを指定して色変換できる。
  • これ自身がBitmapSourceを継承してるので、Image.Sourceとかに指定できる。
  • 一度初期化したら変更できない。
  • 内部的にはIWICColorTransformを使ってる。
  • ColorConvertedBitmap のマークアップ拡張機能なんてのもあるが、各プロパティ指定できるの一度きりだし、果てしなく微妙。

System.Windows.Media.ColorContext

  • イメージ的にはICCプロファイルとかと同じ。
  • 内部的にはColorContextHelperを通してICMのOpenColorProfile()GetColorProfileHeader()を利用している。
  • PixelFormatを指定して初期化することでsRGBとかscRGBのColorContextを取得できることになっているが、実際に取得されるのは コントロールパネル>色の管理>詳細設定>デバイスプロファイル に設定されているプロファイルだったり。
    • これはICMのGetStandardColorSpaceProfile()を利用しているからで、sRGBのプロファイルIDを指定しているにもかかわらず上記のような結果になるという謎挙動が原因である。
    • 既定のデバイスプロファイルではなく、ちゃんとsRGBを指定したいならば、自分でURIを指定する必要がある。

System.Windows.Media.Color

  • 一見RGBを抽象化したものに見えるが、実際はsRGB/scRGBカラーを取り扱う構造体である。
  • FromValues()およびFromAValues()にてColorContextを指定できるが、これは非常にややこしいことに「指定されたColorContext」→「既定のデバイスプロファイル(大抵はsRGB)」という変換となる。
    • 最初は「指定されたColorContextのRGB」を表す型なのかと思ってたら全然違った。
    • ComputeScRgbValues()というprivate methodの中で、PixelFormats.Bgra32を用いて変換先ColorContextを初期化しており、このソースを見る限りは本当はsRGBを変換先とするつもりっぽいのだけど、上記ColorContextの謎挙動により既定のデバイスプロファイルが変換先となってしまっている。
    • この変換処理ではColorTransformというinternal classを使っている。それ使わせてくれよ…
      • ColorTransformは、ColorTransformHelperを経由してICMのCreateMultiProfileTransform()TranslateColors()をやってくれるクラス。
    • 一色変換するだけの処理にもかかわらずTransformを使い捨てしており、コスト的にも大分残念な感じになっている。何に使うんだろうこれ…

System.Windows.Media.Imaging.BitmapFrame とか

  • まだあまり試してないが、画像プロファイルの読み書きができそうで良さ気。
  • System.Windows.Media.Imagingは大体WICと同じ雰囲気っぽい?
  • 内部的には完全にWIC依存。
  • でもIWICColorTransformとかは使わせてくれない微妙な感じ…
  • BitmapFrame.Create時などにBitmapCreateOptions.IgnoreColorProfileを指定していないと、埋め込まれた画像プロファイルからsRGB (これも同様にデバイスプロファイルかも知れない) へ変換される
    • 変換されるくせに埋め込まれたプロファイルColorContexts[0]はsRGBに置き換えられず、そのままである
    • これに気付かずにColorConvertedBitmapに食わせると、二重に変換されたりして悲しい思いをする
    • BitmapCreateOptions.IgnoreColorProfileを指定した場合、元のカラースペースを保持した状態で読み込まれる
  • CMYK画像をBitmapFrame.Createする際にBitmapCreateOptions.PreservePixelFormatを指定していない場合も、RGB PixelFormatへ自動変換される
    • 同様に、プロファイルが埋め込まれていた場合ColorContexts[0]はCMYKプロファイルのままである
  • BitmapCacheOption.None以外で読み込んだ場合、その時に指定されたBitmapCreateOptionsで画像がキャッシュされ、再読込時のBitmapCreateOptionsは無視される
    • Streamから読み込む場合はキャッシュの影響は受けないようだが、即時読込するためにはBitmapCacheOption.OnLoadが必要な点に注意

モニタプロファイルの取得

  • .NET じゃ無理ぽ
  • EnumDisplayMonitors()GetMonitorInfo()MONITORINFOEX取得
    →取得したデバイス名からCreateDC()でデバイスコンテキスト取得
    GetICMProfile()でプロファイルパス取得
  • 実コードとかはそのうち…
7月 162014