自宅の NAS(samba) に Windows からだけ接続できなかった話

こんにちは、あかぴです。

先日起こった samba の不具合とその解決方法について備忘録としてまとめておきます。

 

以下環境

Raspberry Piの3つの使い方

 

起こったこと

ネットワークドライブとしてエクスプローラー上に存在していた samba のドライブが気付いたら切断されていた。

再接続を試したが一生応答待ちで挙句エクスプローラーが応答停止した。

確認したこと

とりあえず samba が動いている raspberry pi に ping を送った ⇒ 応答確認

ウイルス対策ソフトのカスペルスキーを止めて試した ⇒ 影響なし

スマホから該当のドライブにアクセス ⇒ アクセス成功

raspberry pi 側から samba の再起動 ⇒ 影響なし

windows 側に samba 機能がインストールされているか確認 ⇒ 一部のみ(?)されてるみたい

Windows SMBについて

詳しいことは公式へ 

https://docs.microsoft.com/ja-jp/windows-server/storage/file-server/file-server-smb-overview

解決策

「windows の機能の有効化または無効化」を見ると「SMB 1.0~」と「SMB Direct」という二つがある。これらが関係してそうだけど、自分の環境では後者しか有効になっていなかったので前者も有効にした。

すると、今まで通りにネットワークドライブにアクセスできるようになった。

原因

わからん。

何も、わからん。

インストールしたものが足りてなかったならこの半年以上動いてたのが謎。

最近の Windows update でデフォルト値が変わったとかで無効化されてしまったのかもしれない。

或いは上記の解決策とはなんも関係なく、たまたま有効化に伴う再起動で解決したのかもしれない。

インストール済みの .Net SDK が行方不明になった話

昨日の続きです

Visual Studio 2019 の .Net Core ソリューション内のプロジェクトが全部アンロードされてビビった話

起こったこと

1、発行したアプリを起動しようとすると以下のエラーが出た

Failure processing application bundle. Bundle header version compatibility check failed A fatal error was encountered. Could not extract contents of the bundle

2、昨日適当に指定した SDK のバージョンが悪かったと当たりを付けて別のバージョンをためそうとした

3、dotnet –list-sdks コマンドによると、指定した以外の SDK のバージョンが存在していなかった

4、プログラム一覧だと存在するが、構わず再インストールをしてみたがリストに追加されなかった

 

原因

dotnet の path が変わっており、32bit版が呼ばれるようになっていた

自分のPCは当然64bitであり、SDK も64bit版がインストールされていた。

32bit版の dotnet からは当然32bit版の SDK しか呼ばれないためなんかの拍子にインストールされた一種類のみが表示されていた様子。

 

Program Files(x86)/dotnet とProgam FIles/dotnet の違いは余りにも大きい…

Windows10 64bit では 前者が32ビット用プログラム、後者が64ビット用プログラム

 

対策

環境変数の Path  を書き換える

該当する行の(x86)を消しただけで全て解決した。

ついでに昨日追加した global.json も消したけど問題なく動作した。

 

関連する雑感

VS では global.json が見つからない場合は自動で最新の安定板 SDK を選択するようになっているらしい。それで Path が書き換わるまでは問題なく動作していたようだ。32ビット版 SDK はプレビュー版しかインストールされていなかったためエラーが出るようになったらしい。 global.json で明示的にしていすればプレビュー版も使用できることが逆に問題の切り分けを難しくしたような気もする。

この問題はめちゃくちゃ悩んで「dotnet SDK 消えた」とか「dotnet SDK 参照」とか「dotnet SDK 選択」とか検索しまくったけど、dotnet –list-sdks して出てこないケースについては全然情報を得られなかったのでしんどかった。

 

答えに気付けたきっかけは dotnet –info で表示させた情報を眺めていた時のこと、

        RID: win10-x86

なる行を見つけたこと。dotnet が32bitで実行されてる?というところに気付いてからは早かった。

そもそも –list-sdks の時点で 

        ほにゃほにゃ プレビュー版 [C:\Program Files(x86)\dotnet\sdk]

って表示されてたので、そこで気づけてればもっと早かったかも。

Visual Studio 2019 の .Net Core ソリューション内のプロジェクトが全部アンロードされてビビった話

2020/12/19追記

この話題の本当の意味での解決方法は下になります。

検索してきてこのページだけ見てる人が多いようなので一応…

インストール済みの .Net SDK が行方不明になった話 – メロンパンはカリカリもふもふ (aoiakari.com)

 

 

“Visual Studio 2019 の .Net Core ソリューション内のプロジェクトが全部アンロードされてビビった話” の続きを読む

ラズパイ赤外線装置に予約機能を追加した話~フロント側~

こんにちは、あかぴです。

以前作成した自室のIoT化の派生で、予約機能を実装してみました。

今回はフロント側。詰まった所、詰まされた所を覚え書き。

前回

Raspberry Piの3つの使い方

実装の概要

フロント側の実装も素朴。予約用ページを作って元の画面と自由に行き来できるようにする。予約ページ上で予約したい日時を入力した状態でボタンを押すと予約用phpファイルにPOSTリクエストを飛ばす。その辺のロジックはほぼ流用できた。特筆すべきは日時の入力にDatePickerとTimePickerを使ったこと。これがXamarinFormsの凄いところで、各プラットフォームの日付指定UIと時間指定UIを使うことができる。

 

DatePickerとTimePickerのデータバインディング

Xamarinでは設計方針としてMVVMを用いるのが主流であり、自分もそれに則って作成している。それを補助するフレームワーク(Prism)とかもあるが、MVVMの練習も兼ねているので全部自力で実装している。

さて、MVVMではUIとロジックを分離するためにデータバインディングという仕組みを用いる。テキストボックスならString型変数にバインディングすれば良いというのはわかるが、DatePickerやTimePickerは何型になるのだろうか。結論を言うと

    DatePicker:DateTime型

    TimePicker:TimeSpan型

だった。

 

Andoroid上でのみ発生した不具合と原因と対策

起こったこと

HTTPリクエストを飛ばす所で「定義してない関数を呼んだ」という旨のエラーが出た。

これは前回作った時には起こらなかったが、当時のソースを呼び出してコンパイルしても同様の症状が出たため環境側の問題であると予想された。

原因

デバッグした結果、SSLのオレオレ証明書を通すためにHttpClientのServerCertificateCustomValidationCallbackにコールバックを設定している所で上記エラーが出ていることがわかった。

HttpClientライブラリが古いものになっており、
ServerCertificateCustomValidationCallbackフィールドが存在しないことに原因があるらしい
NuGetで再インストールしたり、参照を変更したり試したものの変わらず

ここで実際に呼ばれているライブラリはXamarin.Andoroidが互換のあるものをいい感じに持ってきてくれているわけなのだが、Xamarinのアップデートに伴い参照の優先度が変わってしまい古いものが呼ばれるようになったものと思われる。

対策

結局依存関係クリアにできなくて別環境でビルドしたら一発で通った。

自分はもともとVS2017で作業をしていたが、VS2019から該当リポジトリにチェックアウトして作業することにした。

自分の環境のVS2017 のXamarinが壊れたということだったのかもしれない。

 

次回予告

Xamarinの本領発揮、iOSアプリの自分のスマホへのインストールができるようになったのでその辺の話をしたいと思ってます。

ラズパイ赤外線装置に予約機能を追加した話~サーバー側~

こんにちは、あかぴです。

以前作成した自室のIoT化の派生で、予約機能を実装してみました。

前回

Raspberry Piの3つの使い方

実装の概要

原理は相変わらず素朴。at コマンドで以前使ってた送信機能を予約実行させるだけ。at の起動方法もめちゃくちゃ素朴で、前回とは別の php ファイルに POST するだけ。その時予約する時間も併せて送信する必要があるが、それはフロントを開発する自分に任せよう。

at コマンドは時間を指定すると入力待ちに入り、その中で行った命令を指定した時間に実行する。他にもファイル指定して実行するとかあるけど、自分は at コマンド内で実行する命令に引数(予約したい赤外線コードのファイル名)を使いたかったので直接入力するようにした。

 

ここまで実装するのに詰まったことを二つ紹介する。

一つ目:atコマンドが無いって言われた

https://smiura3000.blogspot.com/2016/04/raspberry-pilinuxraspbian-atshbash.html
を参考に、
sudo apt-get install at

Raspbian は Linux 標準のコマンドでも結構無いものがあるけど、apt-getでだいたい入れられるらしい

自分はLinuxの内部派閥はよくわかっておらず、ラズパイに乗せてるRaspbian はLinuxの簡易版みたいなイメージだった。最初は最小構成にしておいて必要なコマンドは都度インストールする形式なのは素晴らしき効率化だと思った。

 

二つ目:atコマンドに命令を与える方法

前述の通り、atコマンドに命令を与えるには標準入力で手打ちするかファイル(バッチ)を指定するかの二つしかない。自動で実行するバッチファイル上で標準入力に手打ちってどないすんねんと思ったが、パイプとかあるしなんかあるやろと思って調べた。当然あった。

hoge.sh

    at {時間指定}<< END_OF_INPUT

    命令

    END_OF_INPUT

<<{終了文字} でその前のコマンドが待ち受けする標準入力に以降の中身の{終了文字}が来るまでを投げれるらしい

これをしない場合、atの次の行の命令とatの待ち受けは別のシェルで処理されるので、命令は即時実行されてatは命令を待ち続ける(?)。

詳しいことは以下を読むといいと思う

https://eng-entrance.com/linux-redirect

 

感想と次回予告

サーバー側の実装はだいぶすんなりいった印象。

まあ本当に簡単なことしかしてないので…

 

このままフロント側の記事を書きたかったけど疲れたので一旦オワリ!!

 

.NetCore3.0でユーザーの設定を保存する方法

3.0から変わったっぽいので覚え書き。

以前のバージョンでは.settingsファイルを使ってなんやかんやするのが一番素朴実装だったらしい。「WPF 設定 保存」とかで調べるとだいたいそういう内容が出てくる。

ソリューションエクスプローラーからプロパティを開くと設定という項目があり、そこで保存する値の型や名前を設定できる。ここで用意した値はプログラム上からも容易に呼び出し、書き込みができる便利なものなようだ。

しかし、VS2019ではプロパティ上に設定という項目がない。調べてみると以下のQ&Aがヒットした。

https://stackoverflow.com/questions/56847571/equivalent-to-usersettings-applicationsettings-in-wpf-dotnet-core

 

どうも.NetCore3.0以降ではデフォルトでsettingsファイルを使わないようになったらしい。

自分で追加することはできるようだが、今まで使えていたGUIからの設定変更はできない。

追加した後は自力で設定項目を入力する必要がある。

 

~.settings

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile>
     </Profile>
</Profiles>
~~~~~~ここまで自動生成~~~~~~~~~~~

<Settings>
<Setting Name="変数名" Type="型名" Scope="User or Application">
<Value Profile="(Default)">デフォルト値</Value>
</Setting>
</Settings>
</SettingsFile>

複数使いたい場合は<Setting></Setting>の部分を増やせばいい。

アクセスは今まで通り

Settings.Default.変数名

で大丈夫っぽい。

 

 

Raspberry Piの3つの使い方

こんにちは。あかぴです。

先日の記事でも少し触れましたが、我が家にラズパイを導入しました。

コイツ一台でいろいろやれて便利だったので自身の振り返りがてらまとめておきます。

  1. 赤外線モジュールを使って自室のIoT化
  2. SSDを接続してNAS環境の構築しファイル共有を円滑化
  3. OpenVPNを設置して外からでもLANにアクセスを可能化

これらが一台のラズパイ上で同時に運用されています。それぞれの詳細の前に、まずは前提となるラズパイの仕様です。物は全てAmazonで購入しました。参考までにどうぞ。

ABOX Raspberry Pi 3 Model b+

KSY(RS) Piケース Official for Pi3

BitTradeOne ラズベリーパイ専用学習リモコン基板 [ 完成品 ] ADRSIR

 

1、赤外線モジュールを使って自室のIoT化

 ラズパイサーバーを導入したきっかけです。自室のリモコンを無くすのでスマホから操作できるようにしようと思いました。

就活で使えるように資料まとめたも置いときます。

ソースコード含めた詳細はGitHubに公開してあるのでそちらへどうぞ

https://github.com/SatoAoaka/MyRoomIoT

 

2、SSDを接続してNAS環境を構築

Sambaをインストールして設定しただけですが、NAS環境を構築しました。

速度やレスポンスはぼちぼちですが個人で利用する分には必要十分だと感じます。

自身の利用するデバイス間でのデータのやり取りが非常に楽になりました。

SSDは外部電源の方が安定していいかなとも思いましたが、純正アダプターの電力には余裕があるはずなのでバスパワー電源のSSDを使っています。今のところは問題ありません。もし爆発したりしたら改めてこちらにご報告します。

3、OpenVPNを設置

OpenVPNを設置したことで自宅のLANを経由してのネットワークへの接続が可能になりました。VPNのメリットはいろいろあると思いますが、自分の得られたメリットは大きくは二つです。

一つ目は外から自宅内のLANにアクセスできる→NASのファイルにアクセスできること

二つ目は自宅(日本)からのアクセスを可能にする踏み台が常設されたこと

二つ目に関しては普段はあまり関係ないですけど、たまに海外とか行った先で日本のソシャゲをアプデしたいとか日本の動画を見たいとかなった時に役に立ちます。今まではそういう時は学校のVPNを使ってましたが、いつまでも学生ではいられないので必要になると思います。

 

まとめ

ラズパイ1台でいろいろなことをさせることができました。

一方で、同時に3つのサーバーが動いているからか本体は割と常に熱を持っており、故障が心配ではあります。

 

ネットワークとUnix系の知識が多少あれば簡単に導入できます。費用もラズパイのみなら10kからとお安くなっていますのでお一つどうでしょうか。

気軽な気持ちでSSLしようとしてわからされた話

こんにちは。あかぴです。

自宅のラズパイサーバーに気軽な気持ちでSSL通信を導入しようとした結果大変面倒だったというお話です。

自分しかアクセスしないのでオレオレ証明書で雑に実装して出たエラーがこちら。

AH02562: Failed to configure certificate
SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
AH00016: Configuration Failed

キーが短すぎるらしい。今このサーバーのOpenSSLで作った鍵なんだけど何故…

デフォルトでOpenSSLとmod_sslが入っていたんだけど、どうもOpenSSL側の方がバージョンが古かったみたい。今回はこちらのサイト参考にmod_ssl側の要求を下げた。

必要があって要求が上がっているはずなので、本当はOpenSSL側のバージョンを上げて鍵を作り直すべきな気もする。

※2020/3/13追記

OpenSSLのバージョンは最新だったことがわかった。

キーが短すぎるの意味がそのままで、今は1024bitだと短いと判断されるらしい。

単純に鍵を2048bitで作成しなおした。

その後、mod_ssl側の要求レベルもデフォルトに戻したが普通に起動できた。

 

〇参考サイト

RaspberryPiでオレオレ証明書を発行してSSL通信する。

OpenSSL 0.9.8で作成した鍵をCentOS8のOpenSSL 1.1.1 でも使う方法

 

Xamarinメモ

〇XAML

<ScrollView VerticalOptions=”LayoutOptions.FillAndExpand”
HorizontalOptions=”Center”> 

//スクロールバーを付ける、画面の空スペースをすべて埋める前提で作られてるので複数同じページに付けると死ぬ

 

<StackLayout Padding=”20″>

//よくあるレイアウト縦に並べるか横に並べるか

 

<Label x:Name=”Label1″ Text= “{Binding Path=Name,Mode=OneWay}”
HorizontalTextAlignment=”Center”
FontSize=”Large”
BackgroundColor=”#519961″
Margin=”10″/>

//ラベル。x:Nameでつけた名前を使ってコードで操作できる。Textの中は書き換え自に反映されるような形。

 

<Button Text=”Game Over” FontSize=”Large” Clicked=”メソッド名” Margin=”10″ BackgroundColor=”#A9CCB0″/>

//ボタン。Clicledで押されたときに実行する先を指定できる。

 

 

〇C#

public void メソッド名(object sender, EventArgs e){

}

//ボタンが押されたときのメソッド。()の中はよくわかってない。ボタンの存在するxaml.csに書くといいっぽい。

 

DependencyService.Get<インターフェース名①>().メソッド名()②;


 

public interface インターフェース名①{

void メソッド名()②

}


 

[assembly: Xamarin.Forms.Dependency(typeof(ソリューション名.プラットフォーム名.クラス名③))]

public クラス名③:インターフェース名①{

                public void メソッド名()②{

                }

}

 

//各プラットフォーム事の処理を書きたいときは、インターフェースを使う。一番最初のやつを共通コードに書くと、二つ目のやつ(インターフェース)でどのプラットフォームかを識別してそれぞれのメソッドに飛ばしてくれる。三つ目のメソッドで実際の処理を書く。三つ目のプラットフォーム名はUWPかDroidかiOSのどれかが入る。