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]

Pixel4a購入

20200826-Pixel4a-1-350x263

SH-06Eからの買い替え。今まで携帯電話・タブレットはバッテリーが持たなくなり替えの入手も困難になるまで使い続けていたものですが、こいつはバッテリー交換もなく約6年半経っても丸一日持つ、2時間通話しても持つ、ということで私的には寿命判定にならない。アプリケーションを終了させましたメッセージが連発して再起動せざるを得ないという不具合があったものの、頻度は月一くらいなのでそれほどストレスも溜まらない。

がAndroidバージョンの古さから、バージョンアップできないアプリがちらほら出始め、某接触確認アプリも入れられない、ついにはLINEからも見捨てられることになったので、ようやく買い替えを決断。そんなおサイフケータイ依存症の私を狙ったかのタイミングで発売されたPixel4aが後継機となったのでした。ライトユーザーがミドルレンジ買って何に使う?

しかしさ配送予定日が27-28日だったのが26日に繰り上がり、それを前日の夜中にいきなり「発送済み」メール送ってくるのはどうかと思うの。これ用のnano SIM配達予定連絡が当日早朝だったIIJmioよりはましだけどw

— posted by mu at 10:34 pm   commentComment [0]  pingTrackBack [0]

今年のココイチスプーン

blog20200119-CocoichiSpoon2020

一発当たり、しかも金。2本目狙おうかな…と欲張ると当たらないコース。

[2020/3/2 追記] 最終結果、銀1本、金3本、打率5割。こんなの絶対におかしいよ!

— posted by mu at 12:59 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.0268 sec.
prev
2022.8
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 31