プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

IISとASP.NETとApplicationPoolをいじっていたらよくわからない現象に悩まされたこと

原因がわかっていないので私が気付いている範囲で環境とかやったことを書きます

環境

Windows Server 2012 R2

アプリ

ASP.NET MVCでWeb API 2 (だっけ?)を作成

Web API内ではサードパーティー製の64bit DLL (Cで使うやつ)をラップしたDLLをP/Invokeで使用

サードパーティー製DLLはそこそこ大きくてそれが読むデータも大きい (データサイズは関係ないかも)

やったこと

Administratorですべてセットアップ(ランタイムのインストールとか)

アクセス権とか面倒なのでAdministratorで動くApplicationPoolを新たに作成

アプリは上記ApplicationPoolで動かすように

現象

OSを起動してWeb APIにアクセスすると30分以上応答がかえって来ない

P/InvokeしていないAPIにアクセスするとすぐに応答を返してくれる

応答が返ってこない時のディスクアクセスとかCPU使用率はそんなに上がっていない

一度応答を返すとそのあとは普通に返ってくる

応答を返し始めるタイミングは不明 (ログとか見ていると突然返す感じ)

iisreset等で再起動かけた場合はすぐに返ってくる (返ってこない場合もあったかも)

応答が返ってこない間にApplicationPoolのpingエラーで勝手にApplicationPoolが再起動させられているっぽい (?)

解決策 (?)

使用するApplicationPoolをDefaultAppPoolに戻したら現象は発生しなくなった

ユーザー(Administratorsグループ)を新規に作ってそのアカウントでApplicationPoolを動かしても問題なし (新規ユーザーは一度もログインしていない)

 

うん、全然わからない

とりあえず動いているからいいやって感じで終了

WPFで雑にウォーターマーク付きのテキストボックスを作る

ウォーターマークのあるテキストボックス(未入力だと透かしがでるやつ)がたまにほしくなりますよね

ガッツリ作る必要もない時はテンプレートで適当に作ってしまえばいいんじゃない?

<Window.Resources>
    <Style x:Key="WatermarkTextbox" TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid Background="White">
                        <ScrollViewer x:Name="PART_ContentHost" Margin="5,0,0,0" VerticalAlignment="Center"/>
                        <TextBlock x:Name="WaterMarkLabel" Text="{TemplateBinding Tag}" Opacity=".5" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0,0,0" Visibility="Collapsed"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Text" Value="">
                            <Setter Property="Visibility" TargetName="WaterMarkLabel" Value="Visible"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid Background="Blue">
    <TextBox Style="{StaticResource WatermarkTextbox}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Tag="Input please"/>
</Grid>

できあがり

f:id:puni-o:20161215110421g:plain

TextBox.TagをTextBlock.Textに入れて、TriggerでTextが空白の時に表示しているだけです

Xamarin.iOSでUITextFieldの変更イベントをとる

CodeBehind(?)でUITextFieldの変更イベントを知りたいとおもいました

ほかのコントロール(UISlider等)と同じようにやればいいとおもっていました

var _text = new UITextField();

_text.ValueChanged += (sender,e)=>
{
// 変更
};

こんな感じに書いたんですが、これじゃダメだったんですね

_text.AddTarget((sender,e)=>
{
// 変更
},UIControlEvent.EditingChanged);

これなら呼ばれます

理由はNativeなやつにValueChangedが無いからとかなんとかってBugzillaに書いてありました

864 – ValueChanged event is not fired for UITextField

多分忘れたころにまた引っかかると思います