<jupyter_start><jupyter_text>Simple HTTP client (認証あり) を使ったファイル取得- ここでは Simple HTTP fileserver の API から python にてファイルを取得する方法を示します ファイル取得の流れ (Private Repository)1. Simple HTTP fileserver にブラウザでログインし "Token" > "Your Token" を取得してください2. "Your Token" に示されている文字列をコピーし ```SimpleClient``` の引数に設定します(必要なのは初回だけです)3. またJWTトークンを保管しておく場所を決めておきます (このトークンは認証許可を示す大事な token ですので、外部に漏れないように管理をお願いいたします)4. JWTトークンは OneTime トークンなのでプログラムごとに別の保存場所を用意してください  import<jupyter_code>%load_ext autoreload
%autoreload 2
from simpleclient import SimpleClient
import io
from PIL import Image
import matplotlib.pyplot as plt
import time
import random
from pathlib import Path

%matplotlib inline<jupyter_output>The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload<jupyter_text>各種設定値と SimpleClient の初期化<jupyter_code>SERVER_URL = "http://YOUR_SERVER_URL"
YOUR_TOKEN = "<PASSWORD>"
JSON_PATH = "auth.json"
MAX_SHOW_IMAGE_COUNT = 500

client = SimpleClient(url=SERVER_URL, jsonPath=JSON_PATH)<jupyter_output><empty_output><jupyter_text>認証の実施- "Your token" を使った初回認証を実施します- 認証に成功すると ```JsonPath``` で指定した場所にサーバーへアクセスするための JWTトークン が保存されます- 認証に失敗する場合は Exception が発生します- 2回目以降は ```JsonPath``` に保存された token を自動的に読み込みます- JWTトークン認証を解除したい場合は ```JsonPath``` に保存されたファイルを削除します<jupyter_code>try:
    client.Authorize(YOUR_TOKEN)
    print("認証成功")
except:
    print("認証失敗")<jupyter_output>認証成功<jupyter_text>ファイルリクエストの実行とパフォーマンス- 必要なファイルの URL を調べファイル取得リクエストを行います- URL がディレクトリの場合はディレクトリに含まれるファイル一覧が JSON 形式でレスポンスされます- URL がファイルの場合 Byte 列でレスポンスされます- Byte列(画像) は PIL Image によって画像化できます<jupyter_code>def RequestFile(requestUrl):
    execList = 0
    execGet = 0

    t0 = time.perf_counter()
    try:
        response = client.Request(requestUrl)
        t1 = time.perf_counter()
        execList += t1 - t0
    except Exception as e:
        print(e)
        exit(0)

    if "list" in response:
        count = 0
        files = list(filter(lambda x: not x["isDir"], response["list"]))
        if len(files) > MAX_SHOW_IMAGE_COUNT:
            files = random.sample(files, MAX_SHOW_IMAGE_COUNT)
        for file in files:
            if not file["isDir"]:
                t2 = time.perf_counter()
                inputImage = Image.open(client.Request(requestUrl + file["path"]))
                t3 = time.perf_counter()
                execGet += (t3 - t2)
                #plt.imshow(inputImage)
                #plt.show()

        print("[listall] %d, [get file count] %d, [exec time] get filelist: %f s, get data per image %f s" % (len(response["list"]), len(files), execList, execGet / len(files)))

def ReadFiles(path: Path):
    execList = 0
    execGet = 0

    t0 = time.perf_counter()
    files = list(path.glob("*"))
    listall = len(files)
    t1 = time.perf_counter()
    execList += t1 - t0
    if len(files) > MAX_SHOW_IMAGE_COUNT:
        files = random.sample(files, MAX_SHOW_IMAGE_COUNT)
    for file in files:
        if file.exists():
            t2 = time.perf_counter()
            _ = Image.open(str(file))
            t3 = time.perf_counter()
            execGet += (t3 - t2)
            #plt.imshow(inputImage)
            #plt.show()
    
    print("[listall] %d, [get file count] %d, [exec time] get filelist: %f s, get data per image %f s" % (listall, len(files), execList, execGet / len(files)))<jupyter_output><empty_output><jupyter_text>認証不要の場合<jupyter_code>requestUrl = "http://YOUR_PUBLIC_REQUEST_URL"
RequestFile(requestUrl)<jupyter_output>[listall] 5000, [get file count] 500, [exec time] get filelist: 0.206407 s, get data per image 0.012483 s<jupyter_text>認証が必要な場合<jupyter_code>requestUrl = "http://YOUR_PRIVATE_REQUEST_URL"
RequestFile(requestUrl)<jupyter_output>[listall] 5000, [get file count] 500, [exec time] get filelist: 0.141354 s, get data per image 0.049660 s<jupyter_text>直接読み込みの場合 ( Path.glob )<jupyter_code>ReadFiles(Path("LOCAL_PATH"))<jupyter_output>[listall] 5000, [get file count] 500, [exec time] get filelist: 0.047707 s, get data per image 0.001111 s
{'fraction_non_alphanumeric': 0.10955126598144899, 'fraction_numerical': 0.023564803208824266, 'mean_word_length': 3.925925925925926, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 28, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '617566', 'license': 'MIT', 'n_tokens_mistral': 1806, 'n_tokens_neox': 1717, 'n_words': 328, 'path': 'client/python/sample.ipynb', 'repo_name': 'michibiki-io/simple-http-fileserver', 'size': '3989'}