[ カテゴリー » PC関連 ]

XPでMSMQがインストールできない

11の噂が出ている今、まだXP使っている案件があるというのは置いておいて…

あるマシンでMSMQをインストールしようとしたところ、依存関係にあるものが存在しないもしくは削除対象となっているようなメッセージが出て失敗しました。

イベントビューアでMSMQインストーラのエラーが残っていたので見てみると、Lanman Serverが存在しないとのこと。Lanman...LAN Manager? あんなものフツーにWindowsインストールすれば入っているのでは?

…入ってなかったようです。というわけでイーサーネットのプロパティからプロトコル追加→ネットワーク用ファイルとプリンター共有を追加することで、めでたくMSMQがインストールできました。こんなド基礎なものに依存していたとは。

— posted by mu at 12:36 am   commentComment [0]  pingTrackBack [0]

Windowsプロセスキル

備忘録。Windowsでexeを殺す方法(もちろん要権限)

  1. タスクマネージャーから
  2. コマンドラインで
    taskkill /f /im foo.exe
  3. コマンドラインで
    wmic process where 'name='foo.exe'' delete

タスクマネージャーで殺せない(操作が正常に完了したように見えても死んでない)場合はtaskkillコマンドでも殺せないことが多いですが、wmicだと殺せる場合があります。てか、殺せないexeが出るのが困りものですが。

参考

— posted by mu at 07:19 pm   commentComment [0]  pingTrackBack [0]

ieServerにcurlでアクセスするとエラーになる

無料のDDNSサービスieServerの更新作業をcurlで自動化している人もそれなりにいると思います。

先日Raspberry Pi 4を入手したのでRaspberry Pi OS busterを入れて、ieServerに対してcurlコマンドを使用したところ、

curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

とエラー。どうやらサーバー側のSSLが脆弱性のある古いものの場合、最近のクライアントは接続拒否するLink らしい。SSLライブラリで拒否しているみたいなのでwgetでもエラー。

サーバー側が対応してくれるのが一番いいのですが、とりあえずクライアントで対処してみます。古いcurlにダウングレードするのも手ですが、問題があるから接続拒否するようになったわけで、他サーバーへのアクセスまで巻き込みたくない。というわけで古いcurlを入れたDockerコンテナを作り、ieServerだけこいつでアクセスすることにします。

まずDockerfile。Alpineを使いたいところですがARMがサポートされだした3.6でもcurlがエラーを出したのでDebian Jessieにしてます。x86ならAlpineでも行けるかと。
FROM debian:8.11-slim
RUN apt-get update && apt-get install -y curl
CMD curl -X POST -F "username=$USERNAME" -F "password=$PASSWORD" -F "domain=$DOMAIN" -F 'updatehost=1' https://ieserver.net/cgi-bin/dip.cgiLink 
ビルド&ラン。sudo省略 & 全角は各自の環境に置き換えてください。
docker build -t イメージタグ .
docker run -e USERNAME=ユーザー名 -e PASSWORD=パスワード -e DOMAIN=ドメイン --name コンテナ名 イメージタグ
ieServerのIP更新ページLink にアクセスして、アドレス更新時刻がdocker runが終わった時くらいになっていれば成功。次回からはcronなどで
docker container start コンテナ名
で回せば良いかと。

[参考]

— posted by mu at 05:40 pm   commentComment [0]  pingTrackBack [0]

Windowsのネットワークドライブマップはユーザーごとに違うらしい

How can I access a mapped network drive with System.IO.DirectoryInfo? (stack overflow)Link

ネットワークドライブのマップはそれをしたユーザーのみに有効、ということらしい。知らなかった。コマンドラインからでも機能するからExplorer.exeで解釈しているショートカットとは違うけど、こいつもファイルシステムレベルの実装じゃないということか。

私もこのスレッドの下の方に書いてあるように、IISでホストされるWebアプリケーションがマップされたドライブを見つけられず頭を抱えていた状態。IISでホストされるプログラムは"IIS APPPOOL¥アプリケーションプール名"のユーザーで走るから、開発ユーザーでマップしたドライプは見えてなかったわけか。

今回はシンボリックリンクで回避しました。

— posted by mu at 08:03 pm   commentComment [0]  pingTrackBack [0]

WPF習作メモ2

こういうのを作りたいとします。Borderの中にあるチェックボックスをチェックすると、ボーダーの色と太さが変わるというもの。コードビハインド使えば何とでもなるので、XAMLのみ縛りで。
blog20191219-DataBindingToChild

こういうXAMLを書けば普通に動きます。今回の件でStackPanelは必要ないのですが、CheckBoxだけBorderで囲むなんて実用的じゃないですのでオマケ。

<Border>
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="BorderBrush" Value="Gray"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked,ElementName=checkbox1}" Value="true">
                    <Setter Property="BorderBrush" Value="RoyalBlue"/>
                    <Setter Property="BorderThickness" Value="3"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>                
    </Border.Style>
    <StackPanel>
        <CheckBox Name="checkbox1" IsChecked="False" Content="Check for blue border"/>
        <TextBlock Text="Test"/>
    </StackPanel>
</Border>

ただこれの難点は内部のチェックボックスに固有の名前を与えているのでこういうのを作るたびにElementNameを変えたStyleを書く必要があり、メンテナンス性が悪いことです。Styleをリソースで定義して使いまわしたいわけです。子要素から親要素へのBindingはFindAncestorを使えばいいですが逆はどうするかというと、BorderのプロパティChildが内部のStackPanelを指しそれのプロパティChildren[0]がStackPanelの第1子要素CheckBoxを指してくれますので、Bindingパス Child.Children[0].IsCheckedで得られます。

ここからが本題。下記XAMLはうまく動きません。
<Window.Resources>
    <Style x:Key="BorderStyle1" TargetType="{x:Type Border}">
        <Setter Property="BorderBrush" Value="Gray"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Child.Children[0].IsChecked}" Value="true">
                <Setter Property="BorderBrush" Value="RoyalBlue"/>
                <Setter Property="BorderThickness" Value="3"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Border Style="{StaticResource BorderStyle1}">
    <StackPanel>
        <CheckBox Name="checkbox1" IsChecked="False" Content="Check for blue border"/>
        <TextBlock Text="Test"/>
    </StackPanel>
</Border>

理由はXAMLは上から処理されていくから。BorderのStyle={StaticResource...}の部分でBindingパスを解決しようとするのですが、XAML内では後に書いてある子要素のStackPanelやCheckBoxはまだ処理されておらずオブジェクトとして存在してません。つまりBorderのChildはまだnullなのです。ElementNameの場合はXAML上で後ろの物でもちゃんと探してくれるのですが、こちらはダメのようです。

ならばStyleの設定をXAML上で後に書けばいいのです。というわけで、以下のXAMLは動きます。

<Window.Resources>
    <Style x:Key="BorderStyle1" TargetType="{x:Type Border}">
        <Setter Property="BorderBrush" Value="Gray"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Child.Children[0].IsChecked,RelativeSource={RelativeSource Self}}" Value="true">
                <Setter Property="BorderBrush" Value="RoyalBlue"/>
                <Setter Property="BorderThickness" Value="3"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Border>
    <StackPanel>
        <CheckBox Name="checkbox1" IsChecked="False" Content="Check for blue border"/>
        <TextBlock Text="Test"/>
    </StackPanel>
    <Border.Style>
        <Style TargetType="{x:Type Border}" BasedOn="{StaticResource BorderStyle1}"/>
    </Border.Style>
</Border>
注意すべき点があります。
  • Border.Style内のStyleにTargetTypeをちゃんと指定すること。そうでないとこのStyleはUIElementの物として扱われ、その継承クラスであるBorder用に作られたBorderStyle1をBasedOnとして設定できません。
  • リソースStyleでのBindingにRelativeSource Self設定が無いと動きません。これの理由は不明。

— posted by mu at 01:21 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0255 sec.
prev
2024.4
next
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30