May 26, 2020

MacBookからサーバーにsftpのバッチスクリプトを使えるようにする方法

MacBook の sftp で、 -b オプションの バッチスクリプトを使えるようにする方法

-b オプションの バッチスクリプトは、パスワード認証ではなくて公開鍵認証の設定をしておかないと使えない。

[準備] 

sftp や ssh で、パスワード認証でログインできていること。

[公開鍵認証の設定方法]


watakushi-no-MacBook-Air:xxxx myaccount$ cd ~
watakushi-no-MacBook-Air:~ myaccount$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/myaccount/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <==(無しでよい)
Enter same passphrase again: <==(無しでよい)
Your identification has been saved in /Users/myaccount/.ssh/id_rsa.
Your public key has been saved in /Users/myaccount/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:zMvT1Y/ZP3dwUr0PSkAHOsTk/cNI6cUN2BXBnoL0hT0 myaccount@watakushi-no-MacBook-Air.local
The key's randomart image is:
+---[RSA 3072]----+
|          *++.++.|
|         =.o.+oo |
|        o.o.o =o.|
|       o +.. E .+|
|        Soo.+ =.o|
|       . + +.o+*.|
|        + o...o=+|
|         .  .o .=|
|                =|
+----[SHA256]-----+
watakushi-no-MacBook-Air:~ myaccount$ ls -la .ssh
total 24
drwx------   5 myaccount  staff   160 May 26 22:11 .
drwxr-xr-x+ 20 myaccount  staff   640 May 13 12:01 ..
-rw-------   1 myaccount  staff  2635 May 26 22:11 id_rsa  <=(ssh-keygen が生成した秘密鍵)
-rw-r--r--   1 myaccount  staff   590 May 26 22:11 id_rsa.pub <=(ssh-keygen が生成した公開鍵 : 次に ssh-copy-id でサーバーへ登録する)
-rw-r--r--   1 myaccount  staff   644 Jan 30  2015 known_hosts
watakushi-no-MacBook-Air:~ myaccount$ ssh-copy-id -i ~/.ssh/id_rsa.pub serveraccount@myserver.com
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/myaccount/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
serveraccount@myserver.com's password: <=(正しい password 必要)
......
Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'serveraccount@myserver.com'"
and check to make sure that only the key(s) you wanted were added.

watakushi-no-MacBook-Air:~ myaccount$ sftp serveraccount@myserver.com
Connected to myserver.com.   <=(password なしで接続可能になる == -b オプションで、sftp のバッチスクリプトを渡せるようになった)
sftp> quit
watakushi-no-MacBook-Air:~ myaccount$


May 24, 2020

自分が借りているWebサーバーの性能

目的

スマホアプリ やる勉Eng に すべてのMP3を含めると アプリサイズ350MBとなり、システム上限(iOS 200MB Android 100Mb)を超えてしまう。

当面の対策として、はみ出る MP3 を 自社のレンタルサーバー(ファイル容量制限無し)に置くことにするが、その対策で、 サーバーの通信性能的に、何人のユーザーをサポートできるか、ざっくり計算したい。

結論

とりあえず、同時ユーザー 140人から200人、(30分のMP3の5分しか再生しないとする)条件がよければ、1000人ぐらいなら、 スマホアプリに入りきらないMP3は、サーバーに置いても、スムースにアクセスすることができそうだ。

ただし、近い将来には、はみ出る MP3 を バックグラウンドでダウンロードしておき、サーバーの負荷を 分散化するアプリケーションが必要になる。

実験

curl でダウンロードの速度を計測

環境条件

サーバーはアメリカ合衆国にあり、計測地・自宅は、日本の千葉県で、光ファイバーで接続。

計測結果

13.2 MB(13,871,348 byte)のMP3ファイル(再生時間30分=1800秒の音声ファイル)のダウンロードをcurlで計測
所要時間 12秒 、 平均速度 1128 Kbyte/sec と表示された。

考察

一般的に、スムースな音声再生一回線には、64k bit/sec(=8 k byte/sec) 必要とされる。
これを上記MP3ファイルサイズと再生時間で検証すると
  7,706 byte/sec(=13871348/1800) = 62k bit/sec
となり、64k bit/sec が妥当な数値であることがわかる。

したがって、このサーバーでは、最大で
    141(=1128/8) 人
が同時にMP3をスムースにダウンロード再生できる。

(実際は、WEBブラウザのバッファリングで改善されるだろうし、ユーザはやごく一部分の5分程度の再生のみで終わるから負荷は、ずっと軽い)

また、このMP3ファイルを一時間にダウンロードできる回数は、
  300(=3600/12) 回/一時間
となり、最大で300人まで一時間につき利用できる。

このMP3ファイルは、圧縮度が悪い。他のMP3ファイルは、 1800秒で、9MBぐらいのサイズ。 つまり、1.47(=13.2/9)倍楽である。つまり、1.5倍の余裕が期待できる。


May 19, 2020

iOS FIle System の 調査

iOSアプリにMP3ファイル(複数)を含めたら、200MBを超えてしまった。Appleの推奨は、200MB以下。 対策案は、「 MP3は、アプリがURLからダウンロードしてきて、データとして保持し、それを webView から使う」できるか、調査・実験が必要になった。

From About the iOS File System by Apple

まとめ

iOS app は、 Sandbox と呼ばれるディレクトリの下のみアクセスできる。

 Sandbox の 下は、 Bundle Container(AppName.app), Data Container(Documents/), iCloud Container の三つに分かれる。

Bundle Container には、アプリケーション本体とリソースファイルが入り、 read のみ許可される

Data Container には、アプリケーションが作成(ダウンロード)したデータを保存する。

Bundle Container と Data Container は、単純な隣のディレクトリではない、ディレクトリパスは、階層が深く途中に暗号コードが這っていて、共通部が全くない。

Appleの推奨は、動画や音楽は、Data Container にダウンロードし、iCloudのバックアップ対象から外すべきであること( You can exclude files from the backup by calling -[NSURL setResourceValue:forKey:error:] using the NSURLIsExcludedFromBackupKey key. HowTo)

Data Container の ひとつのhtml ファイル を webView に swiftから指定して表示できる、方法はここ load html file to UIWebview from documents directory on ios with swift ()

Mp3のダウンロード例 Xcode: Download mp3 file [closed]
Mp3のダウンロード例 How to play mp3 audio from URL in ios swift

Swift memo GuidedTour
let : an immutable constant 定数定義, 
var : a a mutable variable 変数定義,   
  var 名称 = 値
  var 名称 : 型 = 値
  var 名称 = [ ,,, ]   //配列(自動拡張)
  var 名称 = [ "インデックス":"",,, ]   //文字インデックス配列(自動拡張)

暗黙の型変換はなし

""" で、複数行テキスト定数の定義開始と終了
"... \(変数名称)..."  文字列での変数引用

  var 名称 : 型? = 値   // ? は、 optionals を意味し、 nil または型の値を持つ
  // ?? は、デフォルトバリューオペレーター

関数を呼ぶときは、ラベル名: を付ける
greet(person: "Bob", day: "Tuesday")

API memo
NSURLAn object representing the location of a resource that bridges to URL;
NSURLSessionDownloadTask : A URL session task that stores downloaded data to a file
NSURLSessionTask : A task, like downloading a specific resource, performed in a URL session
NSURLSession An object that coordinates a group of related, network data-transfer tasks.
 downloadTaskWithURL:completionHandler:
NSAllowsArbitraryLoads : A Boolean value indicating whether App Transport Security restrictions are disabled for all network connections. (Remember to add this in your info.plist)

結論 webView は、Bundle ContainerとData Containerの両方を同時に扱えない

swiftから、Bundle Container(またはData Container)の下のhtmlファイル(またし外部WEBサイトURL) を指定してwebView を起動すると、webViewは、それらを表示できる。

[href=/action=/src="file://..." 指定が禁止] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、"src=" 指定で、自分と別ディレクトリのData Container(またはBundle Container)の下のimg/audioファイルを"src=" 指定するには、"file:///" とならざるを得ないため、セキュリティ違反となるから、呼び出せない。

[href=/action=/src="https://..." 指定が可能] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、img/audioタグの "src=" 指定で、https://指定で インターネットのファイル を指定して動作できる。

[href=/action=/src="onlyFileName.ext" 指定が可能webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、img/audioタグの "src=" 指定で、自分と同じディレクトリ(またはサブディレクトリ)のファイル を指定して動作できる("file:///"を指定しないで済むため)。

[ローカルファイルからXMLHttpRequest禁止 ] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、XMLHttpRequest 関係を呼び出しても、 呼ばれたサーバ側は、呼び出し側をローカルと判断して、セキュリティ違反となるため、エラー応答されてしまう。

webViewのjavascript は、swift にメッセージを送り関数を起動することができるが、リターン値は無しとなる。

swiftのライブラリは、 外部サイトのURLを指定して、 htmlなどのファイルをダウンロードできる。

swiftは、起動したwebViewのjavascriptの関数を好きなタイミングで呼び出せる。リターン値は無しとなる。

"iOS Simulator could not hardlink copy |Apple Developer Forums"

「src="data:image/png;base64,」形式  ( RFC2397  The "data" URL scheme )で、swiftから javascriptに ファイルの中身を渡せると思われるが未検証。

以上




May 12, 2020

Apple IOS 開発 テスト協力者の設定方法

Apple の iPhone の IOS アプリ開発(弊社なら "やる勉")で、テストに協力してくれる人(社外も含めて)を App Store Connect (=Apple Developer Programのアプリの管理機能)に設定する方法について

アプリ開発元がすること

(1) テスト協力者の"APPLE ID"(=mail-address)を入手

(2) App Store Connect / Users and Access で、"Developer"を追加

    テスト協力者の"APPLE ID"(=mail-address)を "Developer"として追加(+)
招待メールがAppleから送信される

(3) App Store Connect / My Apps "やる勉" / TestFlightで、"Build"を追加

    test する APP の Build(=Version) を 指定する。

(4) App Store Connect / My Apps "やる勉" / TestFlightで、"tester"を追加

    "App Store Connected Users" で、先に追加した"Developer"を追加
招待メールが送信される


テスト協力者がすること

(1) "APPLE ID"(=mail-address) を アプリ開発元に連絡する。

(2) "Developer"として招待メールが来るので、承諾する。

(3) "APP Store" から testFlight アプリをインストールしておく

(4) "tester"として招待メールが来るので、承諾する。

(5) testFlight アプリが起動して、testするアプリがインストールされて、テストできる。