皆様、あけましておめでとうございます。 1年ぶりですが、本年もよろしくお願いいたします。
さて、タイトルにあるようにsshfsでリモートサーバのディレクトリをマウントして使っていたのですが、
少しオプションを指定するだけで100文字程度になってしまいます。
Xojoに何の関係があるのかと言えば、
・オプションを付加するだけでコマンド行がすごく長くなる
・オプションを覚えられない
等々の困った事があったので、Xojoを使って、コマンドラインを生成するヘルパーアプリを作りました。
通常はshellのalias等で登録しておくのでしょうが、その登録するコマンド行が長すぎるorz
ヘルパーアプリに出来る事:
・サーバのアドレス又はDNS名
・マウントすべきディレクトリPath
・ユーザアカウント
上記の3点から
・マウントポイント
・ボリューム名
の2点を自動生成します。
オプションとして
・カスタムアイコンの指定 + その他の少しのオプション
・aliasにする為の成形
等を施した上で、コマンド行を生成します。
こいつをコピーしてターミナル(私はitermを使っています)にペーストすれば、マウント出来ます。
エイリアスにも成形してくれるので、shellの起動スクリプトに入れておく事で
便利に使えます。
良く使うサーバはテキストファイルに
識別の為のTag,サーバアドレス、ユーザアカウント、ディレクトリパス
を記述しておくとアプリ起動時に読み込んでリスト表示出来ます。
アプリケーションで処理方法を学んで頂ければと思います。
・チェックボックス、ボタン、テキストフィールド
・TextInputStreamを使ったテキストファイルの読み込み
・Stringクラスを使った文字列の成形
・リストボックスの扱い
・アイコンファイルのFinderからのDrag&Drop処理方法
・Shellに渡す際の文字列(特にファイルPath)の扱い
ソースコードは時間が出来て整理出来ればアップします。
【補足】
sshfsでカスタムアイコンが指定出来ます。
sshfsでカスタムアイコンの指定出来ないと思われているのですが、sshfsと
macFUSEのソースを良く読むと設定出来る事がわかります。
デフォルトのアイコンは素っ気ないので、サクッとクールなアイコンを指定しましょう。
でわでわ
補足の補足
カスタムアイコンの指定に関しては、私のmacOS26.2の
環境では全く動作せず、「そんなオプションは知らない」と
怒られるだけでした
-o volicon=と言う文字列はオプション処理を行う
部分には存在しませんでした。
iconpath=はあるのですが、同様に上手く動作しません。
コードから読み取ったのは'-o Module=volicon,volicon='という
指定方法で正しくカスタムアイコン指定が出来るようになりました。
XojoにはC言語の標準関数であるprintfやsprintf等の不定数の引数を持つものはありません。
引数を省略する事の出来るメソッドはあります。
sprintfが使えないと色々と不便なので、似た様なメソッドを作成しました。
ParamArrayを使う事で引数の個数を特定せずに実装出来ます。
Sub FormatString( nFormatStr As String, ParamArray inParam As String )
Var theResultStr As String = ""
Var theTempStr() As String
theTempStr = inFormatStr.Split( "%s" )
If ( theTempStr.Count >= inParam.Count ) Then
//書式の挿入箇所と引数の両方が無くなるまでコピーする
Do
If ( theTempStr.Count > 0 ) And ( inParam.Count > 0 ) Then
theResultStr = theResultStr + theTempStr( 0 ) + inParam( 0 )
theTempStr.RemoveAt( 0 )
inParam.RemoveAt( 0 )
ElseIf ( theTempStr.Count > 0 ) Then
theResultStr = theResultStr + theTempStr( 0 )
theTempStr.RemoveAt( 0 )
ElseIf ( inParam.Count > 0 ) Then
theResultStr = theResultStr + inParam( 0 )
inParam.RemoveAt( 0 )
Else
Exit
End If
loop until ( theTempStr.Count < 0 ) And ( inParam.Count < 0 )
Else
// パラメーターの個数とformatの指示が一致しない
Return( "" )
End If
Return( theResultStr )
End Sub
Stringに限定する事で処理を簡単に出来ます。
整数などを渡したい場合は
FromatString( "This Is Int Value = %s" , theIntValue.ToString("Format") )
とすれば良いだけです。
ごめんなさい。
スクラッチで直接書いたので、Function宣言を忘れていました。
Sub FormatString( nFormatStr As String, ParamArray inParam As String )
↓
Function FormatString( nFormatStr As String, ParamArray inParam As String )
です。
Xojoでこのまま通ると思いますが、使用される場合はご注意を!
sshfsを利用したマウントコマンドを作成するヘルパーアプリの
プロジェクトファイルをGoogleドライブにアップしました。
動作するアプリ本体も同梱していますが、いくつか注意点を挙げます。
このプロジェクトは単独ではビルド出来ません。
いくつかの独自作成のクラスを省いています。
省いた主なクラスは以下の2個です。
・IntervalTimerクラス
・AsyncShellクラス
今回のsshfsマウントコマンドの生成に関する部分では無いので
スキルを磨く為に独自で実装出来れば、嬉しいです。
・IntervalTimerクラス
Timerを継承して、ハンドラを使いやすくするためのクラス
・AsyncShellクラス
ShellとIntervalTimerを使って、外部から(このクラスを利用するメソッド等)
送られたShellコマンドを順次Shellへ投げて、その応答を読み出し依頼が
来るまで捧持しておく。
ヒント:
1,Arrayを継承したQueueクラスを実現すると意外と簡単かも
2,TimerクラスとShellクラスをきちんと理解しましょう
Xojo標準の機能を利用するだけで、簡単にアプリが作成できます。
再配布はご遠慮下さい。著作権は留保しますが、ソースは自由に
お使い下さい。現状はBSDライセンスを想定しています。
では、以下のリンクからお楽しみ下さい。
https://drive.google.com/file/d/1J0JT3rjiz_Wyye98yw5wh2PasG5jzfUp/view?usp=share_link
大事な点を忘れていました。開発者の署名は付いていません。また、Appleの公証も得ていませんので、通常は起動出来ないと
思われます。
(Sentinel.app)等を利用しないと使えないので、ご注意を!
過去にShellクラスを使った時と違っていて、1ラインごとにコマンドをShellへ送ると、状態遷移していないと
言うことが判りました。
そこで、Shellを非同期で使うのでは無く、対話型にして使う事でこの問題を回避したAsyncShell(改)を作っています。
インスタンスを作る時にパラメータで使い分けるように仕様としていますので、使い勝手は変わらないと思います。
また、このSyncShellを用いる事で、アプリ内から直接sshfsでマウントする事が出来るようになります。
多少の作業を行ってから改訂版アプリをアップします。
でわでわ
バージョン1.01をGoogleDriveへアップしました。
https://drive.google.com/file/d/1aGwXq5Be176m496EcjwHX3ykhKktvfUv/view?usp=share_link
主な変更点はアプリからボタンクリックで直接マウント出来るようになりました。
この為にはサーバとクライアント間で鍵を共有しておく必要があります。
個々のケースでの設定は各自でお調べ下さい。
ガイドとしては
1,クライアント側で秘密鍵と公開鍵を生成する
2,サーバ側へ公開鍵をコピーする
3,クライアント側とサーバ側で各々の鍵を利用するように設定する
以上です。
利用するサーバ情報を登録ファイルに記述しておけば、数回のクリックでデスクトップに
マウント出来ます。
当方はターミナル(iTerm2)にエイリアス登録して、ssh接続とディレクトリの
マウントを一度に行い、サーバのメンテなどに使用しています。
尚、sshfsやmacFUSE上の問題点や制限事項などをドキュメントを
しっかり確認して下さい。
でわでわ