[{"data":1,"prerenderedAt":4158},["ShallowReactive",2],{"all-tags":3},[4,1491,2416,2748,3522,3614],{"id":5,"title":6,"body":7,"date":1478,"description":1479,"extension":1480,"meta":1481,"navigation":428,"path":1482,"seo":1483,"stem":1484,"tags":1485,"__hash__":1490},"blog\u002Fblog\u002Fanime-encode-study.md","アニメエンコードの研究(笑)",{"type":8,"value":9,"toc":1452},"minimark",[10,14,18,21,24,29,91,98,101,104,156,159,165,168,174,180,186,189,195,201,207,210,213,216,289,292,298,304,310,316,322,325,331,334,340,343,349,352,355,358,1401,1404,1408,1414,1419,1424,1427,1430,1433,1436,1439,1445,1448],[11,12,13],"h2",{"id":13},"アニメエンコード",[15,16,17],"p",{},"録画などを容量節約のために高効率なコーデックで再エンコードをすることです。",[15,19,20],{},"元データが大体1.4GBで大体300~400MBくらいに削減できるような設定を狙っていきます。",[11,22,23],{"id":23},"使用するツール",[25,26,28],"h3",{"id":27},"nvenc","NVEnc",[30,31,34,35],"div",{"className":32},[33],"remark-link-card-plus__container","\n  ",[36,37,45,46,82,34],"a",{"href":38,"target":39,"rel":40,"className":43},"https:\u002F\u002Fgithub.com\u002Frigaya\u002FNVEnc","_blank",[41,42],"noreferrer","noopener",[44],"remark-link-card-plus__card","\n    ",[30,47,34,50,34,64],{"className":48},[49],"remark-link-card-plus__main",[30,51,45,54,45,59,34],{"className":52},[53],"remark-link-card-plus__content",[30,55,58],{"className":56},[57],"remark-link-card-plus__title","GitHub - rigaya\u002FNVEnc: NVENCによる高速エンコードの性能実験",[30,60,63],{"className":61},[62],"remark-link-card-plus__description","NVENCによる高速エンコードの性能実験. Contribute to rigaya\u002FNVEnc development by creating an account on GitHub.",[30,65,45,68,45,76,34],{"className":66},[67],"remark-link-card-plus__meta",[69,70],"img",{"src":71,"className":72,"width":74,"height":74,"alt":75},"https:\u002F\u002Fgithub.githubassets.com\u002Ffavicons\u002Ffavicon.svg",[73],"remark-link-card-plus__favicon",14,"",[77,78,81],"span",{"className":79},[80],"remark-link-card-plus__url","github.com",[30,83,34,86],{"className":84},[85],"remark-link-card-plus__thumbnail",[69,87],{"src":88,"className":89,"alt":75},"https:\u002F\u002Fopengraph.githubassets.com\u002F9febcaf3aa6b3e42e58e7c3f0204086035c14995646f335a1005436ac6c6f56f\u002Frigaya\u002FNVEnc",[90],"remark-link-card-plus__image",[15,92,93,94,97],{},"rigaya氏が開発しているツールです。性能と画質を調査することを目的としているソフトウェアらしいですが、普通にツールとして利用可能です。",[95,96],"br",{},"\nというかそっちが目的でしょ。しらんけど。",[11,99,100],{"id":100},"コマンド",[15,102,103],{},"基本的なコマンドは次の通り。",[105,106,110],"pre",{"className":107,"code":108,"language":109,"meta":75,"style":75},"language-shell shiki shiki-themes catppuccin-macchiato","nvencc -i \"input.mkv\" --avhw -c hevc --audio-codec libopus --audio-bitrate 128 -o \"output.mkv\"\n","shell",[111,112,113],"code",{"__ignoreMap":75},[77,114,117,121,125,128,131,134,137,140,143,146,150,153],{"class":115,"line":116},"line",1,[77,118,120],{"class":119},"siK8c","nvencc",[77,122,124],{"class":123},"sSZ1V"," -i",[77,126,127],{"class":123}," \"input.mkv\"",[77,129,130],{"class":123}," --avhw",[77,132,133],{"class":123}," -c",[77,135,136],{"class":123}," hevc",[77,138,139],{"class":123}," --audio-codec",[77,141,142],{"class":123}," libopus",[77,144,145],{"class":123}," --audio-bitrate",[77,147,149],{"class":148},"s7Qn8"," 128",[77,151,152],{"class":123}," -o",[77,154,155],{"class":123}," \"output.mkv\"\n",[15,157,158],{},"各オプションの解説をしておきます。",[25,160,162],{"id":161},"i-inputmkv",[111,163,164],{},"-i “input.mkv“",[15,166,167],{},"ファイルを入力します。",[25,169,171],{"id":170},"avhw",[111,172,173],{},"--avhw",[15,175,176,177,179],{},"ファイルの読み込みにGPUを使用する。h264であれば使用可能。",[95,178],{},"\nCPUを使用するよりも高速です。",[25,181,183],{"id":182},"c-hevc",[111,184,185],{},"-c hevc",[15,187,188],{},"使用するコーデックを選択します。割とどの環境でも再生可能なhevcを選択しています。",[25,190,192],{"id":191},"audio-codec-libopus-audio-bitrate-128",[111,193,194],{},"--audio-codec libopus --audio-bitrate 128",[15,196,197,198,200],{},"音声をopusでエンコードする。ビットレートは128kbpsです。",[95,199],{},"\nWindowsのメディアプレイヤー以外なら再生できる。",[25,202,204],{"id":203},"o-outputmkv",[111,205,206],{},"-o \"output.mkv\"",[15,208,209],{},"出力ファイル。",[11,211,212],{"id":212},"現時点で使用しているコマンド",[15,214,215],{},"私が今使っているコマンドです。",[105,217,219],{"className":107,"code":218,"language":109,"meta":75,"style":75},"nvencc -i \"input.mkv\" --avhw -c hevc --qvbr 24 -u P6 --output-depth 10 --lookahead 32 -b 4 --bref-mode each --aq --aq-temporal --audio-codec libopus --audio-bitrate 128 -o \"output.mkv\"\n",[111,220,221],{"__ignoreMap":75},[77,222,223,225,227,229,231,233,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,279,281,283,285,287],{"class":115,"line":116},[77,224,120],{"class":119},[77,226,124],{"class":123},[77,228,127],{"class":123},[77,230,130],{"class":123},[77,232,133],{"class":123},[77,234,136],{"class":123},[77,236,237],{"class":123}," --qvbr",[77,239,240],{"class":148}," 24",[77,242,243],{"class":123}," -u",[77,245,246],{"class":123}," P6",[77,248,249],{"class":123}," --output-depth",[77,251,252],{"class":148}," 10",[77,254,255],{"class":123}," --lookahead",[77,257,258],{"class":148}," 32",[77,260,261],{"class":123}," -b",[77,263,264],{"class":148}," 4",[77,266,267],{"class":123}," --bref-mode",[77,269,270],{"class":123}," each",[77,272,273],{"class":123}," --aq",[77,275,276],{"class":123}," --aq-temporal",[77,278,139],{"class":123},[77,280,142],{"class":123},[77,282,145],{"class":123},[77,284,149],{"class":148},[77,286,152],{"class":123},[77,288,155],{"class":123},[15,290,291],{},"追加されたオプションの解説をしておきます。",[25,293,295],{"id":294},"qvbr-24",[111,296,297],{},"--qvbr 24",[15,299,300,301,303],{},"品質ベースの可変ビットレートです。24はそこそこって感じの値です。",[95,302],{},"\nもし画質が悪いようであれば値を小さくするといいです。ファイルサイズは大きくなりますけどね。",[25,305,307],{"id":306},"u-p6",[111,308,309],{},"-u P6",[15,311,312,313,315],{},"プリセットです。P6は画質と速度のバランスが最も良い値らしいです。",[95,314],{},"\n最も品質がいいのはP7。速度はあまり変わらない(10fpsくらい下がるだけ)",[25,317,319],{"id":318},"output-depth-10",[111,320,321],{},"--output-depth 10",[15,323,324],{},"10bitで出力する。背景のグラデーションなどが美しくなる。気持ち圧縮効率も上がるらしいですよ。",[25,326,328],{"id":327},"lookahead-32",[111,329,330],{},"--lookahead 32",[15,332,333],{},"先読みするフレーム数です。ビットレートの配分がいい感じになるそうです。",[25,335,337],{"id":336},"b-4-bref-mode-each",[111,338,339],{},"-b 4 --bref-mode each",[15,341,342],{},"Bフレームの設定です。Bフレームの参照をすべてのフレームにしています。",[25,344,346],{"id":345},"aq-aq-temporal",[111,347,348],{},"--aq --aq-temporal",[15,350,351],{},"空間・時間的な最適量子化を有効にする。ビットレートの配分をいい感じにする設定。",[15,353,354],{},"というような設定です。",[15,356,357],{},"変換用のpyスクリプトも書いたので残しておく。",[105,359,364],{"className":360,"code":361,"filename":362,"language":363,"meta":75,"style":75},"language-python shiki shiki-themes catppuccin-macchiato","import subprocess\nfrom pathlib import Path\nimport tkinter as tk\nfrom tkinter import filedialog, messagebox\n\nEXTS = {\n    \".mkv\",\n    \".mp4\",\n    \".m2ts\"\n}\n\ndef pick_input_dir() -> Path | None:\n    root = tk.Tk()\n    root.withdraw()\n    root.attributes(\"-topmost\", True)\n    folder = filedialog.askdirectory(title=\"入力フォルダ\")\n    root.destroy()\n    return Path(folder) if folder else None\n\ndef process_videos(input_dir: Path) -> int:\n    output_dir = input_dir \u002F \"out\"\n    output_dir.mkdir(exist_ok=True)\n\n    count = 0\n    for path in input_dir.iterdir():\n        if not path.is_file():\n            continue\n        if path.suffix.lower() not in EXTS:\n            continue\n        output_path = output_dir \u002F path.name\n        cmd = [\n            \"nvencc\",\n            \"-i\", str(path),\n            \"--avhw\",\n            \"-c\", \"hevc\",\n            \"--qvbr\", \"24\",\n            \"-u\", \"P6\",\n            \"--output-depth\", \"10\",\n            \"--lookahead\", \"32\",\n            \"-b\", \"4\", \"--bref-mode\", \"each\",\n            \"--aq\", \"--aq-temporal\",\n            \"--audio-codec\", \"libopus\",\n            \"--audio-bitrate\", \"128\",\n            \"-o\", str(output_path)\n        ]\n\n        print(\"Running\",\" \".join(cmd))\n        result = subprocess.run(cmd)\n        if result.returncode != 0:\n            print(f\"Failed: {path.name}\")\n            continue\n        count += 1\n        print(f\"Done: {path.name} -> {output_path}\")\n\n    return count\n\ndef main() -> None:\n    input_dir = pick_input_dir()\n    if input_dir is None:\n        return\n\n    if not input_dir.exists() or not input_dir.is_dir():\n        messagebox.showerror(\"エラー\", \"有効なフォルダが選択されませんでした。\")\n        return\n\n    processed = process_videos(input_dir=input_dir)\n    messagebox.showinfo(\"完了\",f\"{processed}個の動画を処理しました\")\n\nif __name__ == \"__main__\":\n    main()\n","henkan.py","python",[111,365,366,376,390,404,423,430,443,452,460,466,472,477,504,525,537,561,589,601,630,635,664,681,704,709,720,743,762,768,797,802,822,833,841,860,868,881,894,907,920,933,956,969,982,995,1012,1018,1023,1053,1075,1096,1130,1135,1147,1182,1187,1195,1200,1216,1228,1243,1249,1254,1284,1307,1312,1317,1337,1371,1376,1393],{"__ignoreMap":75},[77,367,368,372],{"class":115,"line":116},[77,369,371],{"class":370},"sIF4r","import",[77,373,375],{"class":374},"sFaBz"," subprocess\n",[77,377,379,382,385,387],{"class":115,"line":378},2,[77,380,381],{"class":370},"from",[77,383,384],{"class":374}," pathlib ",[77,386,371],{"class":370},[77,388,389],{"class":374}," Path\n",[77,391,393,395,398,401],{"class":115,"line":392},3,[77,394,371],{"class":370},[77,396,397],{"class":374}," tkinter ",[77,399,400],{"class":370},"as",[77,402,403],{"class":374}," tk\n",[77,405,407,409,411,413,416,420],{"class":115,"line":406},4,[77,408,381],{"class":370},[77,410,397],{"class":374},[77,412,371],{"class":370},[77,414,415],{"class":374}," filedialog",[77,417,419],{"class":418},"slVFb",",",[77,421,422],{"class":374}," messagebox\n",[77,424,426],{"class":115,"line":425},5,[77,427,429],{"emptyLinePlaceholder":428},true,"\n",[77,431,433,436,440],{"class":115,"line":432},6,[77,434,435],{"class":374},"EXTS ",[77,437,439],{"class":438},"sXptk","=",[77,441,442],{"class":418}," {\n",[77,444,446,449],{"class":115,"line":445},7,[77,447,448],{"class":123},"    \".mkv\"",[77,450,451],{"class":418},",\n",[77,453,455,458],{"class":115,"line":454},8,[77,456,457],{"class":123},"    \".mp4\"",[77,459,451],{"class":418},[77,461,463],{"class":115,"line":462},9,[77,464,465],{"class":123},"    \".m2ts\"\n",[77,467,469],{"class":115,"line":468},10,[77,470,471],{"class":418},"}\n",[77,473,475],{"class":115,"line":474},11,[77,476,429],{"emptyLinePlaceholder":428},[77,478,480,483,486,489,492,495,498,501],{"class":115,"line":479},12,[77,481,482],{"class":370},"def",[77,484,485],{"class":119}," pick_input_dir",[77,487,488],{"class":418},"()",[77,490,491],{"class":418}," ->",[77,493,494],{"class":374}," Path ",[77,496,497],{"class":438},"|",[77,499,500],{"class":148}," None",[77,502,503],{"class":418},":\n",[77,505,507,510,512,515,518,522],{"class":115,"line":506},13,[77,508,509],{"class":374},"    root ",[77,511,439],{"class":438},[77,513,514],{"class":374}," tk",[77,516,517],{"class":418},".",[77,519,521],{"class":520},"s57MT","Tk",[77,523,524],{"class":418},"()\n",[77,526,527,530,532,535],{"class":115,"line":74},[77,528,529],{"class":374},"    root",[77,531,517],{"class":418},[77,533,534],{"class":520},"withdraw",[77,536,524],{"class":418},[77,538,540,542,544,547,550,553,555,558],{"class":115,"line":539},15,[77,541,529],{"class":374},[77,543,517],{"class":418},[77,545,546],{"class":520},"attributes",[77,548,549],{"class":418},"(",[77,551,552],{"class":123},"\"-topmost\"",[77,554,419],{"class":418},[77,556,557],{"class":148}," True",[77,559,560],{"class":418},")\n",[77,562,564,567,569,571,573,576,578,582,584,587],{"class":115,"line":563},16,[77,565,566],{"class":374},"    folder ",[77,568,439],{"class":438},[77,570,415],{"class":374},[77,572,517],{"class":418},[77,574,575],{"class":520},"askdirectory",[77,577,549],{"class":418},[77,579,581],{"class":580},"skVQi","title",[77,583,439],{"class":438},[77,585,586],{"class":123},"\"入力フォルダ\"",[77,588,560],{"class":418},[77,590,592,594,596,599],{"class":115,"line":591},17,[77,593,529],{"class":374},[77,595,517],{"class":418},[77,597,598],{"class":520},"destroy",[77,600,524],{"class":418},[77,602,604,607,610,612,615,618,621,624,627],{"class":115,"line":603},18,[77,605,606],{"class":370},"    return",[77,608,609],{"class":520}," Path",[77,611,549],{"class":418},[77,613,614],{"class":374},"folder",[77,616,617],{"class":418},")",[77,619,620],{"class":370}," if",[77,622,623],{"class":374}," folder ",[77,625,626],{"class":370},"else",[77,628,629],{"class":148}," None\n",[77,631,633],{"class":115,"line":632},19,[77,634,429],{"emptyLinePlaceholder":428},[77,636,638,640,643,645,648,651,654,656,658,662],{"class":115,"line":637},20,[77,639,482],{"class":370},[77,641,642],{"class":119}," process_videos",[77,644,549],{"class":418},[77,646,647],{"class":580},"input_dir",[77,649,650],{"class":418},":",[77,652,609],{"class":653},"srmJT",[77,655,617],{"class":418},[77,657,491],{"class":418},[77,659,661],{"class":660},"sxfwU"," int",[77,663,503],{"class":418},[77,665,667,670,672,675,678],{"class":115,"line":666},21,[77,668,669],{"class":374},"    output_dir ",[77,671,439],{"class":438},[77,673,674],{"class":374}," input_dir ",[77,676,677],{"class":438},"\u002F",[77,679,680],{"class":123}," \"out\"\n",[77,682,684,687,689,692,694,697,699,702],{"class":115,"line":683},22,[77,685,686],{"class":374},"    output_dir",[77,688,517],{"class":418},[77,690,691],{"class":520},"mkdir",[77,693,549],{"class":418},[77,695,696],{"class":580},"exist_ok",[77,698,439],{"class":438},[77,700,701],{"class":148},"True",[77,703,560],{"class":418},[77,705,707],{"class":115,"line":706},23,[77,708,429],{"emptyLinePlaceholder":428},[77,710,712,715,717],{"class":115,"line":711},24,[77,713,714],{"class":374},"    count ",[77,716,439],{"class":438},[77,718,719],{"class":148}," 0\n",[77,721,723,726,729,732,735,737,740],{"class":115,"line":722},25,[77,724,725],{"class":370},"    for",[77,727,728],{"class":374}," path ",[77,730,731],{"class":370},"in",[77,733,734],{"class":374}," input_dir",[77,736,517],{"class":418},[77,738,739],{"class":520},"iterdir",[77,741,742],{"class":418},"():\n",[77,744,746,749,752,755,757,760],{"class":115,"line":745},26,[77,747,748],{"class":370},"        if",[77,750,751],{"class":370}," not",[77,753,754],{"class":374}," path",[77,756,517],{"class":418},[77,758,759],{"class":520},"is_file",[77,761,742],{"class":418},[77,763,765],{"class":115,"line":764},27,[77,766,767],{"class":370},"            continue\n",[77,769,771,773,775,777,780,782,785,787,789,792,795],{"class":115,"line":770},28,[77,772,748],{"class":370},[77,774,754],{"class":374},[77,776,517],{"class":418},[77,778,779],{"class":374},"suffix",[77,781,517],{"class":418},[77,783,784],{"class":520},"lower",[77,786,488],{"class":418},[77,788,751],{"class":370},[77,790,791],{"class":370}," in",[77,793,794],{"class":374}," EXTS",[77,796,503],{"class":418},[77,798,800],{"class":115,"line":799},29,[77,801,767],{"class":370},[77,803,805,808,810,813,815,817,819],{"class":115,"line":804},30,[77,806,807],{"class":374},"        output_path ",[77,809,439],{"class":438},[77,811,812],{"class":374}," output_dir ",[77,814,677],{"class":438},[77,816,754],{"class":374},[77,818,517],{"class":418},[77,820,821],{"class":374},"name\n",[77,823,825,828,830],{"class":115,"line":824},31,[77,826,827],{"class":374},"        cmd ",[77,829,439],{"class":438},[77,831,832],{"class":418}," [\n",[77,834,836,839],{"class":115,"line":835},32,[77,837,838],{"class":123},"            \"nvencc\"",[77,840,451],{"class":418},[77,842,844,847,849,852,854,857],{"class":115,"line":843},33,[77,845,846],{"class":123},"            \"-i\"",[77,848,419],{"class":418},[77,850,851],{"class":660}," str",[77,853,549],{"class":418},[77,855,856],{"class":374},"path",[77,858,859],{"class":418},"),\n",[77,861,863,866],{"class":115,"line":862},34,[77,864,865],{"class":123},"            \"--avhw\"",[77,867,451],{"class":418},[77,869,871,874,876,879],{"class":115,"line":870},35,[77,872,873],{"class":123},"            \"-c\"",[77,875,419],{"class":418},[77,877,878],{"class":123}," \"hevc\"",[77,880,451],{"class":418},[77,882,884,887,889,892],{"class":115,"line":883},36,[77,885,886],{"class":123},"            \"--qvbr\"",[77,888,419],{"class":418},[77,890,891],{"class":123}," \"24\"",[77,893,451],{"class":418},[77,895,897,900,902,905],{"class":115,"line":896},37,[77,898,899],{"class":123},"            \"-u\"",[77,901,419],{"class":418},[77,903,904],{"class":123}," \"P6\"",[77,906,451],{"class":418},[77,908,910,913,915,918],{"class":115,"line":909},38,[77,911,912],{"class":123},"            \"--output-depth\"",[77,914,419],{"class":418},[77,916,917],{"class":123}," \"10\"",[77,919,451],{"class":418},[77,921,923,926,928,931],{"class":115,"line":922},39,[77,924,925],{"class":123},"            \"--lookahead\"",[77,927,419],{"class":418},[77,929,930],{"class":123}," \"32\"",[77,932,451],{"class":418},[77,934,936,939,941,944,946,949,951,954],{"class":115,"line":935},40,[77,937,938],{"class":123},"            \"-b\"",[77,940,419],{"class":418},[77,942,943],{"class":123}," \"4\"",[77,945,419],{"class":418},[77,947,948],{"class":123}," \"--bref-mode\"",[77,950,419],{"class":418},[77,952,953],{"class":123}," \"each\"",[77,955,451],{"class":418},[77,957,959,962,964,967],{"class":115,"line":958},41,[77,960,961],{"class":123},"            \"--aq\"",[77,963,419],{"class":418},[77,965,966],{"class":123}," \"--aq-temporal\"",[77,968,451],{"class":418},[77,970,972,975,977,980],{"class":115,"line":971},42,[77,973,974],{"class":123},"            \"--audio-codec\"",[77,976,419],{"class":418},[77,978,979],{"class":123}," \"libopus\"",[77,981,451],{"class":418},[77,983,985,988,990,993],{"class":115,"line":984},43,[77,986,987],{"class":123},"            \"--audio-bitrate\"",[77,989,419],{"class":418},[77,991,992],{"class":123}," \"128\"",[77,994,451],{"class":418},[77,996,998,1001,1003,1005,1007,1010],{"class":115,"line":997},44,[77,999,1000],{"class":123},"            \"-o\"",[77,1002,419],{"class":418},[77,1004,851],{"class":660},[77,1006,549],{"class":418},[77,1008,1009],{"class":374},"output_path",[77,1011,560],{"class":418},[77,1013,1015],{"class":115,"line":1014},45,[77,1016,1017],{"class":418},"        ]\n",[77,1019,1021],{"class":115,"line":1020},46,[77,1022,429],{"emptyLinePlaceholder":428},[77,1024,1026,1030,1032,1035,1037,1040,1042,1045,1047,1050],{"class":115,"line":1025},47,[77,1027,1029],{"class":1028},"snoqg","        print",[77,1031,549],{"class":418},[77,1033,1034],{"class":123},"\"Running\"",[77,1036,419],{"class":418},[77,1038,1039],{"class":123},"\" \"",[77,1041,517],{"class":418},[77,1043,1044],{"class":520},"join",[77,1046,549],{"class":418},[77,1048,1049],{"class":374},"cmd",[77,1051,1052],{"class":418},"))\n",[77,1054,1056,1059,1061,1064,1066,1069,1071,1073],{"class":115,"line":1055},48,[77,1057,1058],{"class":374},"        result ",[77,1060,439],{"class":438},[77,1062,1063],{"class":374}," subprocess",[77,1065,517],{"class":418},[77,1067,1068],{"class":520},"run",[77,1070,549],{"class":418},[77,1072,1049],{"class":374},[77,1074,560],{"class":418},[77,1076,1078,1080,1083,1085,1088,1091,1094],{"class":115,"line":1077},49,[77,1079,748],{"class":370},[77,1081,1082],{"class":374}," result",[77,1084,517],{"class":418},[77,1086,1087],{"class":374},"returncode ",[77,1089,1090],{"class":438},"!=",[77,1092,1093],{"class":148}," 0",[77,1095,503],{"class":418},[77,1097,1099,1102,1104,1108,1111,1115,1117,1119,1122,1125,1128],{"class":115,"line":1098},50,[77,1100,1101],{"class":1028},"            print",[77,1103,549],{"class":418},[77,1105,1107],{"class":1106},"sB-em","f",[77,1109,1110],{"class":123},"\"Failed: ",[77,1112,1114],{"class":1113},"s_ZFR","{",[77,1116,856],{"class":374},[77,1118,517],{"class":418},[77,1120,1121],{"class":374},"name",[77,1123,1124],{"class":1113},"}",[77,1126,1127],{"class":123},"\"",[77,1129,560],{"class":418},[77,1131,1133],{"class":115,"line":1132},51,[77,1134,767],{"class":370},[77,1136,1138,1141,1144],{"class":115,"line":1137},52,[77,1139,1140],{"class":374},"        count ",[77,1142,1143],{"class":438},"+=",[77,1145,1146],{"class":148}," 1\n",[77,1148,1150,1152,1154,1156,1159,1161,1163,1165,1167,1169,1172,1174,1176,1178,1180],{"class":115,"line":1149},53,[77,1151,1029],{"class":1028},[77,1153,549],{"class":418},[77,1155,1107],{"class":1106},[77,1157,1158],{"class":123},"\"Done: ",[77,1160,1114],{"class":1113},[77,1162,856],{"class":374},[77,1164,517],{"class":418},[77,1166,1121],{"class":374},[77,1168,1124],{"class":1113},[77,1170,1171],{"class":123}," -> ",[77,1173,1114],{"class":1113},[77,1175,1009],{"class":374},[77,1177,1124],{"class":1113},[77,1179,1127],{"class":123},[77,1181,560],{"class":418},[77,1183,1185],{"class":115,"line":1184},54,[77,1186,429],{"emptyLinePlaceholder":428},[77,1188,1190,1192],{"class":115,"line":1189},55,[77,1191,606],{"class":370},[77,1193,1194],{"class":374}," count\n",[77,1196,1198],{"class":115,"line":1197},56,[77,1199,429],{"emptyLinePlaceholder":428},[77,1201,1203,1205,1208,1210,1212,1214],{"class":115,"line":1202},57,[77,1204,482],{"class":370},[77,1206,1207],{"class":119}," main",[77,1209,488],{"class":418},[77,1211,491],{"class":418},[77,1213,500],{"class":148},[77,1215,503],{"class":418},[77,1217,1219,1222,1224,1226],{"class":115,"line":1218},58,[77,1220,1221],{"class":374},"    input_dir ",[77,1223,439],{"class":438},[77,1225,485],{"class":520},[77,1227,524],{"class":418},[77,1229,1231,1234,1236,1239,1241],{"class":115,"line":1230},59,[77,1232,1233],{"class":370},"    if",[77,1235,674],{"class":374},[77,1237,1238],{"class":370},"is",[77,1240,500],{"class":148},[77,1242,503],{"class":418},[77,1244,1246],{"class":115,"line":1245},60,[77,1247,1248],{"class":370},"        return\n",[77,1250,1252],{"class":115,"line":1251},61,[77,1253,429],{"emptyLinePlaceholder":428},[77,1255,1257,1259,1261,1263,1265,1268,1270,1273,1275,1277,1279,1282],{"class":115,"line":1256},62,[77,1258,1233],{"class":370},[77,1260,751],{"class":370},[77,1262,734],{"class":374},[77,1264,517],{"class":418},[77,1266,1267],{"class":520},"exists",[77,1269,488],{"class":418},[77,1271,1272],{"class":370}," or",[77,1274,751],{"class":370},[77,1276,734],{"class":374},[77,1278,517],{"class":418},[77,1280,1281],{"class":520},"is_dir",[77,1283,742],{"class":418},[77,1285,1287,1290,1292,1295,1297,1300,1302,1305],{"class":115,"line":1286},63,[77,1288,1289],{"class":374},"        messagebox",[77,1291,517],{"class":418},[77,1293,1294],{"class":520},"showerror",[77,1296,549],{"class":418},[77,1298,1299],{"class":123},"\"エラー\"",[77,1301,419],{"class":418},[77,1303,1304],{"class":123}," \"有効なフォルダが選択されませんでした。\"",[77,1306,560],{"class":418},[77,1308,1310],{"class":115,"line":1309},64,[77,1311,1248],{"class":370},[77,1313,1315],{"class":115,"line":1314},65,[77,1316,429],{"emptyLinePlaceholder":428},[77,1318,1320,1323,1325,1327,1329,1331,1333,1335],{"class":115,"line":1319},66,[77,1321,1322],{"class":374},"    processed ",[77,1324,439],{"class":438},[77,1326,642],{"class":520},[77,1328,549],{"class":418},[77,1330,647],{"class":580},[77,1332,439],{"class":438},[77,1334,647],{"class":374},[77,1336,560],{"class":418},[77,1338,1340,1343,1345,1348,1350,1353,1355,1357,1359,1361,1364,1366,1369],{"class":115,"line":1339},67,[77,1341,1342],{"class":374},"    messagebox",[77,1344,517],{"class":418},[77,1346,1347],{"class":520},"showinfo",[77,1349,549],{"class":418},[77,1351,1352],{"class":123},"\"完了\"",[77,1354,419],{"class":418},[77,1356,1107],{"class":1106},[77,1358,1127],{"class":123},[77,1360,1114],{"class":1113},[77,1362,1363],{"class":374},"processed",[77,1365,1124],{"class":1113},[77,1367,1368],{"class":123},"個の動画を処理しました\"",[77,1370,560],{"class":418},[77,1372,1374],{"class":115,"line":1373},68,[77,1375,429],{"emptyLinePlaceholder":428},[77,1377,1379,1382,1385,1388,1391],{"class":115,"line":1378},69,[77,1380,1381],{"class":370},"if",[77,1383,1384],{"class":374}," __name__ ",[77,1386,1387],{"class":438},"==",[77,1389,1390],{"class":123}," \"__main__\"",[77,1392,503],{"class":418},[77,1394,1396,1399],{"class":115,"line":1395},70,[77,1397,1398],{"class":520},"    main",[77,1400,524],{"class":418},[11,1402,1403],{"id":1403},"比較する",[25,1405,1407],{"id":1406},"vmaf","VMAF",[15,1409,1410,1411,1413],{},"FFMetricsというツールを使って入力ファイルとエンコードされたファイルの画質比較を行う。許容は95程度。",[95,1412],{},"\n05:00~07:00の2分間を比較しています。",[15,1415,1416],{},[69,1417],{"alt":75,"src":1418},"https:\u002F\u002Fimag.samenoko.work\u002Fuploads\u002F1775438628597-uxd7lj.png",[15,1420,1421],{},[69,1422],{"alt":75,"src":1423},"https:\u002F\u002Fimag.samenoko.work\u002Fuploads\u002F1775438695811-5657p3.png",[15,1425,1426],{},"結果は画像の通りで、97。90以上が高画質とされています。つまりそこそこということですね。",[25,1428,1429],{"id":1429},"ファイルサイズ",[15,1431,1432],{},"元データが1.34GB、ビットレートが8147kbpsで、出力ファイルが242MB、ビットレートが1433kbpsです。",[15,1434,1435],{},"大体8割削減されたことになります。ダイエット大成功！！",[11,1437,1438],{"id":1438},"おわり",[15,1440,1441,1442,1444],{},"現時点でかなりの設定を出せています。",[95,1443],{},"\nまぁ互換性とかライセンスの問題でHEVCとかAV1って再生できない環境も多いので、いい加減オープンでフリーな高効率なコーデックが出てほしいですね。",[15,1446,1447],{},"それでは！",[1449,1450,1451],"style",{},"html pre.shiki code .siK8c, html code.shiki .siK8c{--shiki-default:#8AADF4;--shiki-default-font-style:italic}html pre.shiki code .sSZ1V, html code.shiki .sSZ1V{--shiki-default:#A6DA95}html pre.shiki code .s7Qn8, html code.shiki .s7Qn8{--shiki-default:#F5A97F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sIF4r, html code.shiki .sIF4r{--shiki-default:#C6A0F6}html pre.shiki code .sFaBz, html code.shiki .sFaBz{--shiki-default:#CAD3F5}html pre.shiki code .slVFb, html code.shiki .slVFb{--shiki-default:#939AB7}html pre.shiki code .sXptk, html code.shiki .sXptk{--shiki-default:#8BD5CA}html pre.shiki code .s57MT, html code.shiki .s57MT{--shiki-default:#8AADF4}html pre.shiki code .skVQi, html code.shiki .skVQi{--shiki-default:#EE99A0;--shiki-default-font-style:italic}html pre.shiki code .srmJT, html code.shiki .srmJT{--shiki-default:#EE99A0}html pre.shiki code .sxfwU, html code.shiki .sxfwU{--shiki-default:#C6A0F6;--shiki-default-font-style:italic}html pre.shiki code .snoqg, html code.shiki .snoqg{--shiki-default:#F5A97F;--shiki-default-font-style:italic}html pre.shiki code .sB-em, html code.shiki .sB-em{--shiki-default:#A6DA95;--shiki-default-font-style:italic}html pre.shiki code .s_ZFR, html code.shiki .s_ZFR{--shiki-default:#F5BDE6}",{"title":75,"searchDepth":378,"depth":378,"links":1453},[1454,1455,1458,1465,1473,1477],{"id":13,"depth":378,"text":13},{"id":23,"depth":378,"text":23,"children":1456},[1457],{"id":27,"depth":392,"text":28},{"id":100,"depth":378,"text":100,"children":1459},[1460,1461,1462,1463,1464],{"id":161,"depth":392,"text":164},{"id":170,"depth":392,"text":173},{"id":182,"depth":392,"text":185},{"id":191,"depth":392,"text":194},{"id":203,"depth":392,"text":206},{"id":212,"depth":378,"text":212,"children":1466},[1467,1468,1469,1470,1471,1472],{"id":294,"depth":392,"text":297},{"id":306,"depth":392,"text":309},{"id":318,"depth":392,"text":321},{"id":327,"depth":392,"text":330},{"id":336,"depth":392,"text":339},{"id":345,"depth":392,"text":348},{"id":1403,"depth":378,"text":1403,"children":1474},[1475,1476],{"id":1406,"depth":392,"text":1407},{"id":1429,"depth":392,"text":1429},{"id":1438,"depth":378,"text":1438},"2026-04-06","アニメエンコードの研究をしているログです。","md",{},"\u002Fblog\u002Fanime-encode-study",{"title":6,"description":1479},"blog\u002Fanime-encode-study",[1486,1488],{"name":1487},"雑記",{"name":1489},"エンコード","jWW2Tx7UfoXpBYmmvLTf2JAJFSTa3c-ZnWStr3zWmvo",{"id":1492,"title":1493,"body":1494,"date":2402,"description":2403,"extension":1480,"meta":2404,"navigation":428,"path":2405,"seo":2406,"stem":2407,"tags":2408,"__hash__":2415},"blog\u002Fblog\u002Fcloudflare-zero-trust-home-access.md","Cloudflare Zero Trustで宅外から宅内のネットワークへアクセスする",{"type":8,"value":1495,"toc":2388},[1496,1500,1503,1536,1542,1545,1548,1555,1558,1581,1584,1588,1605,1729,1732,1800,1803,1843,1847,1853,1856,1872,1926,1943,2021,2024,2102,2105,2127,2135,2138,2182,2185,2193,2200,2224,2227,2292,2296,2303,2349,2352,2367,2370,2376,2379,2385],[11,1497,1499],{"id":1498},"cloudflare-zero-trust","Cloudflare Zero Trust",[15,1501,1502],{},"Cloudflareが提供するZero Trustセキュリティモデルに基づいた包括的ネットワークセキュリティプラットフォームらしいです。",[30,1504,34,1506],{"className":1505},[33],[36,1507,45,1511,34],{"href":1508,"target":39,"rel":1509,"className":1510},"https:\u002F\u002Fwww.cloudflare.com\u002Fja-jp\u002Fzero-trust\u002F",[41,42],[44],[30,1512,34,1514,34,1525],{"className":1513},[49],[30,1515,45,1517,45,1521,34],{"className":1516},[53],[30,1518,1520],{"className":1519},[57],"Cloudflare One | 俊敏で真に統合されたSASEプラットフォーム",[30,1522,1524],{"className":1523},[62],"「統合SASEプラットフォーム」の約束が実現。安全なAI導入への近道を進みましょう。従業員、AIエージェント、インフラストラクチャをつなぎ、保護します。",[30,1526,45,1528,45,1532,34],{"className":1527},[67],[69,1529],{"src":1530,"className":1531,"width":74,"height":74,"alt":75},"https:\u002F\u002Fwww.cloudflare.com\u002Ffavicon.ico",[73],[77,1533,1535],{"className":1534},[80],"www.cloudflare.com",[15,1537,1538,1539,1541],{},"らしいんですが今回の目的はセキュリティよりも便利のほうが重要なので、ここらへんのすごさには触れません。",[95,1540],{},"\nｽﾝﾏｾﾝ。",[11,1543,1544],{"id":1544},"なにがしたいか",[15,1546,1547],{},"外にいるときに家の中のネットーワークにアクセスしたい。これだけです。",[15,1549,1550,1551,1554],{},"旅館やカフェ(田舎にはそんなものは無いが)などから",[111,1552,1553],{},"192.168.0.40","で接続できるようにしたい…って感じ。",[11,1556,1557],{"id":1557},"アカウントのセットアップなど",[15,1559,1560,1561,1563,1569,1570,1572,1575,1577,1578,1580],{},"ここでは詳細に説明しません。っていうか使い始めたのが2年前とかなり前なので、覚えていません。",[95,1562],{},[36,1564,1568],{"href":1565,"rel":1566},"https:\u002F\u002Fdash.cloudflare.com",[1567],"nofollow","Cloudflareの管理画面","のサイドバーに",[95,1571],{},[69,1573],{"alt":75,"src":1574},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fb951970562bd-20251222.png",[95,1576],{},"\nZero Trustという項目があるのでそこをクリックして案内に従ってください。",[95,1579],{},"\n設定した当時とかなりUIが変わっていて説明できません。すみません。",[15,1582,1583],{},"おそらくチーム名を決めると思うのですが、それを控えておきましょう。",[11,1585,1587],{"id":1586},"idプロバイダーを追加する","IDプロバイダーを追加する",[15,1589,1590,1591,1593,1594,1596,1599,1601,1602,1604],{},"デフォルトでメールアドレスを使用したワンタイムコードを利用可能です。しかしこれは不便なのでGoogleアカウントとかでログインできると便利だよね。",[95,1592],{},"\nってことで追加しましょう。",[95,1595],{},[69,1597],{"alt":75,"src":1598},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fb7b33758a7af-20251222.png",[95,1600],{},"\nZero Trustのサイドバーの「インテグレーション」の「IDプロバイダー」を開きます。",[95,1603],{},"\n画像では既にGoogleが追加されていますが気にしないでいいです。",[15,1606,1607,1610,1612,1613,1615,1618,1620,1621,1623,1626,1628,1629,1631,1632,1634,1635,1640,1641,1643,1646,1648,1649,1651,1654,1656,1657,1659,1662,1664,1665,1667,1670,1672,1673,1675,1678,1680,1681,1684,1685,1688,1689,1691,1694,1696,1697,1699,1702,1704,1705,1707,1710,1712,1713,1715,1718,1720,1721,1723,1726,1728],{},[69,1608],{"alt":75,"src":1609},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fd8e30a80fa89-20251222.png",[95,1611],{},"\nまずは「IDプロバイダーを追加する」をクリックし、",[95,1614],{},[69,1616],{"alt":75,"src":1617},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F79f49984abf1-20251222.png",[95,1619],{},"\n「Google」を選択する。",[95,1622],{},[69,1624],{"alt":75,"src":1625},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F57a89fac6dff-20251222.png",[95,1627],{},"\n選択すると画像のような画面に変わります。右側に手順が載っております。英語ですけど。",[95,1630],{},"\n名前は分かりやすいもの(例:Google)にします。",[95,1633],{},"\n続いて",[36,1636,1639],{"href":1637,"rel":1638},"https:\u002F\u002Fconsole.cloud.google.com\u002F",[1567],"Google Cloud Console","にアクセスし、",[95,1642],{},[69,1644],{"alt":75,"src":1645},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fe0e14d9a8363-20251222.png",[95,1647],{},"\n「APIとサービス」を開き、",[95,1650],{},[69,1652],{"alt":75,"src":1653},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F82c2234a065b-20251222.png",[95,1655],{},"\n「OAuth同意画面」を開きます。",[95,1658],{},[69,1660],{"alt":75,"src":1661},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F8815353d613b-20251222.png",[95,1663],{},"\n「クライアント」を選択し、「クライアントを作成」をクリックします。",[95,1666],{},[69,1668],{"alt":75,"src":1669},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fb9601643ad31-20251222.png",[95,1671],{},"\nアプリケーションの種類は「ウェブアプリケーション」、名前は適切なものを入力します。",[95,1674],{},[69,1676],{"alt":75,"src":1677},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fb858aae10ee6-20251222.png",[95,1679],{},"\n承認済みのJavaScript生成元には",[111,1682,1683],{},"https:\u002F\u002F\u003C設定したチーム名>.cloudflareaccess.com","を、承認済みのリダイレクトURIには",[111,1686,1687],{},"https:\u002F\u002F\u003C設定したチーム名>.cloudflareaccess.com\u002Fcdn-cgi\u002Faccess\u002Fcallback","を設定します。",[95,1690],{},[69,1692],{"alt":75,"src":1693},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fff5525003e55-20251222.png",[95,1695],{},"\nあとは「作成」をクリックします。",[95,1698],{},[69,1700],{"alt":75,"src":1701},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F1d4485a28781-20251222.png",[95,1703],{},"\nすると「クライアントID」と「クライアントシークレット」が表示されるので、",[95,1706],{},[69,1708],{"alt":75,"src":1709},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F785e31de043c-20251222.png",[95,1711],{},"\nCloudflare側の入力欄にそれぞれコピペする。あとは保存するだけです。",[95,1714],{},[69,1716],{"alt":75,"src":1717},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F26db95831097-20251222.png",[95,1719],{},"\nIDプロバイダー一覧の画面で先程作成したプロバイダーの欄にある「テスト」をクリックしてみて",[95,1722],{},[69,1724],{"alt":75,"src":1725},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F4c85c58b7376-20251222.png",[95,1727],{},"\n画像のようにログイン中のGoogleアカウントの情報が表示されるか、Googleアカウントの選択画面が現れれば大丈夫です。",[11,1730,1731],{"id":1731},"トンネルの追加",[15,1733,1734,1737,1739,1740,1742,1745,1747,1748,1750,1753,1755,1756,1758,1761,1763,1764,1767,1768,1770,1773,1775,1776,1778,1781,1783,1784,1786,1789,1791,1792,1794,1797,1799],{},[69,1735],{"alt":75,"src":1736},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F2852721d005f-20251222.png",[95,1738],{},"\nサイドバーの「ネットワーク」から「コネクタ」を開き、「トンネルを作成する」をクリックする。",[95,1741],{},[69,1743],{"alt":75,"src":1744},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F0d610b62e1ae-20251222.png",[95,1746],{},"\nトンネルの種類は「Cloudflared」にする。",[95,1749],{},[69,1751],{"alt":75,"src":1752},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fe48ae318a8aa-20251222.png",[95,1754],{},"\nトンネル名は適当なものを付けます。私は「myhome」と。ひねりもねぇ。",[95,1757],{},[69,1759],{"alt":75,"src":1760},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F20009a0d1000-20251222.png",[95,1762],{},"\n次はコネクタのインストールです。お使いのサーバーのOSとアーキテクチャを選択して、表示されるコマンドを実行して",[111,1765,1766],{},"cloudflared","をインストールします。",[95,1769],{},[69,1771],{"alt":75,"src":1772},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F768d47457583-20251222.png",[95,1774],{},"\nインストールが終わったら画像の欄にあるコマンドを実行してコネクタを接続します。",[95,1777],{},[69,1779],{"alt":75,"src":1780},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Feb9ad3b579f2-20251222.png",[95,1782],{},"\n接続が成功したら「Connectors」に何かが表示されるはずです。",[95,1785],{},[69,1787],{"alt":75,"src":1788},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fca5c51894b91-20251222.png",[95,1790],{},"\n「トラフィックのルーティング」という画面が表示されると思いますがこの画面はスキップしていいです。サイドバーの「ネットワーク」→「コネクタ」をクリックすると戻れます。",[95,1793],{},[69,1795],{"alt":75,"src":1796},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F4f6b79653e5b-20251222.png",[95,1798],{},"\n作成したコネクタが表示されてステータスが緑であればOKです。",[11,1801,1802],{"id":1802},"ルートを設定",[15,1804,1805,1808,1810,1811,1813,1816,1818,1819,1821,1824,1826,1827,1830,1831,1834,1835,1837,1840,1842],{},[69,1806],{"alt":75,"src":1807},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F9d3c1b0b3062-20251222.png",[95,1809],{},"\nさっき作成したコネクタの三点リーダーをクリックし「設定」を開きます。",[95,1812],{},[69,1814],{"alt":75,"src":1815},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fc56570432cce-20251222.png",[95,1817],{},"\n「CIDR」タブに移動し、「CIDRルートを追加」をクリックします。",[95,1820],{},[69,1822],{"alt":75,"src":1823},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F955a81a7c3ff-20251222.png",[95,1825],{},"\nCIDRと説明を適当に入力します。私の家は",[111,1828,1829],{},"192.168.0.xx","なので",[111,1832,1833],{},"192.168.0.0\u002F24","です。",[95,1836],{},[69,1838],{"alt":75,"src":1839},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fd5f3496f581e-20251222.png",[95,1841],{},"\nCIDRの画面に表示されればOK!",[11,1844,1846],{"id":1845},"管理ネットワークの作成","「管理ネットワーク」の作成",[15,1848,1849,1850,1852],{},"家の中にいるか、外に居るかを判断するためにビーコンみたいなサーバーを立てます。",[95,1851],{},"\nラズパイとか自宅サーバーで大丈夫です。TLSエンドポイントが必要だそうです。",[15,1854,1855],{},"今回はDockerで立ててみます。Dockerでなくても大丈夫ですが。",[15,1857,1858,1859,1862,1863,1866,1867,1869,1871],{},"適当なディレクトリを作成し、その中に",[111,1860,1861],{},"certs","ディレクトリと",[111,1864,1865],{},"nginx.conf","を作成します。",[95,1868],{},[111,1870,1861],{},"ディレクトリに自己TLS証明書を作成します。",[105,1873,1877],{"className":1874,"code":1875,"language":1876,"meta":75,"style":75},"language-bash shiki shiki-themes catppuccin-macchiato","openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout privkey.pem -out fullchain.pem -subj \"\u002FCN=Generic SSL Certificate\"\n","bash",[111,1878,1879],{"__ignoreMap":75},[77,1880,1881,1884,1887,1890,1893,1896,1899,1902,1905,1908,1911,1914,1917,1920,1923],{"class":115,"line":116},[77,1882,1883],{"class":119},"openssl",[77,1885,1886],{"class":123}," req",[77,1888,1889],{"class":123}," -x509",[77,1891,1892],{"class":123}," -newkey",[77,1894,1895],{"class":123}," rsa:4096",[77,1897,1898],{"class":123}," -sha256",[77,1900,1901],{"class":123}," -days",[77,1903,1904],{"class":148}," 3650",[77,1906,1907],{"class":123}," -nodes",[77,1909,1910],{"class":123}," -keyout",[77,1912,1913],{"class":123}," privkey.pem",[77,1915,1916],{"class":123}," -out",[77,1918,1919],{"class":123}," fullchain.pem",[77,1921,1922],{"class":123}," -subj",[77,1924,1925],{"class":123}," \"\u002FCN=Generic SSL Certificate\"\n",[15,1927,1928,1929,1931,1934,1936,1937,1939,1940,1942],{},"で作成可能です。",[95,1930],{},[69,1932],{"alt":75,"src":1933},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fc1265ed68131-20251222.png",[95,1935],{},"\n作成できました。",[95,1938],{},"\n次に",[111,1941,1865],{},"を書きます。次のように。",[105,1944,1948],{"className":1945,"code":1946,"filename":1865,"language":1947,"meta":75,"style":75},"language-nginx shiki shiki-themes catppuccin-macchiato","events {\n    worker_connections 1024;\n}\n\nhttp {\n    server {\n        listen 443 ssl;\n        ssl_certificate \u002Fcerts\u002Ffullchain.pem;\n        ssl_certificate_key \u002Fcerts\u002Fprivkey.pem;\n\n        location \u002F {\n                return 200;\n            }\n    }\n}\n","nginx",[111,1949,1950,1955,1960,1964,1968,1973,1978,1983,1988,1993,1997,2002,2007,2012,2017],{"__ignoreMap":75},[77,1951,1952],{"class":115,"line":116},[77,1953,1954],{},"events {\n",[77,1956,1957],{"class":115,"line":378},[77,1958,1959],{},"    worker_connections 1024;\n",[77,1961,1962],{"class":115,"line":392},[77,1963,471],{},[77,1965,1966],{"class":115,"line":406},[77,1967,429],{"emptyLinePlaceholder":428},[77,1969,1970],{"class":115,"line":425},[77,1971,1972],{},"http {\n",[77,1974,1975],{"class":115,"line":432},[77,1976,1977],{},"    server {\n",[77,1979,1980],{"class":115,"line":445},[77,1981,1982],{},"        listen 443 ssl;\n",[77,1984,1985],{"class":115,"line":454},[77,1986,1987],{},"        ssl_certificate \u002Fcerts\u002Ffullchain.pem;\n",[77,1989,1990],{"class":115,"line":462},[77,1991,1992],{},"        ssl_certificate_key \u002Fcerts\u002Fprivkey.pem;\n",[77,1994,1995],{"class":115,"line":468},[77,1996,429],{"emptyLinePlaceholder":428},[77,1998,1999],{"class":115,"line":474},[77,2000,2001],{},"        location \u002F {\n",[77,2003,2004],{"class":115,"line":479},[77,2005,2006],{},"                return 200;\n",[77,2008,2009],{"class":115,"line":506},[77,2010,2011],{},"            }\n",[77,2013,2014],{"class":115,"line":74},[77,2015,2016],{},"    }\n",[77,2018,2019],{"class":115,"line":539},[77,2020,471],{},[15,2022,2023],{},"あとはDocker Composeのファイルを書きます。",[105,2025,2030],{"className":2026,"code":2027,"filename":2028,"language":2029,"meta":75,"style":75},"language-yaml shiki shiki-themes catppuccin-macchiato","services:\n  nginx:\n    restart: unless-stopped\n    image: nginx:latest\n    ports:\n      - 7676:443\n    volumes:\n      - .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n      - .\u002Fcerts:\u002Fcerts:ro\n","compose.yml","yaml",[111,2031,2032,2039,2046,2056,2066,2073,2081,2088,2095],{"__ignoreMap":75},[77,2033,2034,2037],{"class":115,"line":116},[77,2035,2036],{"class":520},"services",[77,2038,503],{"class":438},[77,2040,2041,2044],{"class":115,"line":378},[77,2042,2043],{"class":520},"  nginx",[77,2045,503],{"class":438},[77,2047,2048,2051,2053],{"class":115,"line":392},[77,2049,2050],{"class":520},"    restart",[77,2052,650],{"class":438},[77,2054,2055],{"class":123}," unless-stopped\n",[77,2057,2058,2061,2063],{"class":115,"line":406},[77,2059,2060],{"class":520},"    image",[77,2062,650],{"class":438},[77,2064,2065],{"class":123}," nginx:latest\n",[77,2067,2068,2071],{"class":115,"line":425},[77,2069,2070],{"class":520},"    ports",[77,2072,503],{"class":438},[77,2074,2075,2078],{"class":115,"line":432},[77,2076,2077],{"class":418},"      -",[77,2079,2080],{"class":123}," 7676:443\n",[77,2082,2083,2086],{"class":115,"line":445},[77,2084,2085],{"class":520},"    volumes",[77,2087,503],{"class":438},[77,2089,2090,2092],{"class":115,"line":454},[77,2091,2077],{"class":418},[77,2093,2094],{"class":123}," .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n",[77,2096,2097,2099],{"class":115,"line":462},[77,2098,2077],{"class":418},[77,2100,2101],{"class":123}," .\u002Fcerts:\u002Fcerts:ro\n",[15,2103,2104],{},"今回はポート7676で待ち受けるように。あとは立ち上げるだけです。",[105,2106,2108],{"className":1874,"code":2107,"language":1876,"meta":75,"style":75},"sudo docker compose up -d\n",[111,2109,2110],{"__ignoreMap":75},[77,2111,2112,2115,2118,2121,2124],{"class":115,"line":116},[77,2113,2114],{"class":119},"sudo",[77,2116,2117],{"class":123}," docker",[77,2119,2120],{"class":123}," compose",[77,2122,2123],{"class":123}," up",[77,2125,2126],{"class":123}," -d\n",[15,2128,2129,2130,2132],{},"curlを実行してみて、返ってくれば大丈夫です。",[95,2131],{},[69,2133],{"alt":75,"src":2134},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fab30bb4f1a28-20251222.png",[15,2136,2137],{},"次にSHA-256のフィンガープリントを抽出します。",[105,2139,2141],{"className":1874,"code":2140,"language":1876,"meta":75,"style":75},"openssl x509 -noout -fingerprint -sha256 -inform pem -in certs\u002Ffullchain.pem | tr -d :\n",[111,2142,2143],{"__ignoreMap":75},[77,2144,2145,2147,2150,2153,2156,2158,2161,2164,2167,2170,2173,2176,2179],{"class":115,"line":116},[77,2146,1883],{"class":119},[77,2148,2149],{"class":123}," x509",[77,2151,2152],{"class":123}," -noout",[77,2154,2155],{"class":123}," -fingerprint",[77,2157,1898],{"class":123},[77,2159,2160],{"class":123}," -inform",[77,2162,2163],{"class":123}," pem",[77,2165,2166],{"class":123}," -in",[77,2168,2169],{"class":123}," certs\u002Ffullchain.pem",[77,2171,2172],{"class":438}," |",[77,2174,2175],{"class":119}," tr",[77,2177,2178],{"class":123}," -d",[77,2180,2181],{"class":123}," :\n",[15,2183,2184],{},"上のコマンドを実行して",[105,2186,2191],{"className":2187,"code":2189,"language":2190,"meta":75},[2188],"language-text","sha256 Fingerprint=98D.........\n","text",[111,2192,2189],{"__ignoreMap":75},[15,2194,2195,2196,2199],{},"みたいなのが得られます。",[111,2197,2198],{},"Fingerprint=","以降の文字列を控えておきましょう。",[15,2201,2202,2205,2207,2208,2210,2213,2215,2216,2218,2221,2223],{},[69,2203],{"alt":75,"src":2204},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fe8920360a2dd-20251222.png",[95,2206],{},"\nZeroTrustの管理画面のサイドバーの「チームとリソース」から「デバイス」を開き、「デバイスプロファイル」タブに移動します。",[95,2209],{},[69,2211],{"alt":75,"src":2212},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F82abc7f75759-20251222.png",[95,2214],{},"\n「管理ネットワーク」を見つけ、「新しい管理ネットワークを追加する」をクリックします。",[95,2217],{},[69,2219],{"alt":75,"src":2220},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fde57cbe5f878-20251222.png",[95,2222],{},"\n名前は適当なものを、ホストとポートは先程立てたWebサーバーのものを、SHA-256は先程控えたフィンガープリントを入力し「保存」",[11,2225,2226],{"id":2226},"スプリットトンネルの設定",[15,2228,2229,2230,2232,2235,2237,2238,2240,2243,2245,2246,2248,2251,2253,2254,2257,2258,2261,2262,2264,2267,2269,2270,2272,2275,2277,2278,2280,2281,2283,2284,2286,2289,2291],{},"この設定が結構重要です。",[95,2231],{},[69,2233],{"alt":75,"src":2234},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F12c55b47f3a1-20251222.png",[95,2236],{},"\nさっきの「デバイスプロファイル」タブの画面まで戻り、プロファイル一覧の「デフォルト」の三点リーダーを開き、「設定」をクリックします。",[95,2239],{},[69,2241],{"alt":75,"src":2242},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F3610d1996239-20251222.png",[95,2244],{},"\n「スプリットトンネル」の項目を見つけ、「IPとドメインを除外する」にチェックが入っていることを確認して「管理」をクリックします。",[95,2247],{},[69,2249],{"alt":75,"src":2250},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Ff576126a633e-20251222.png",[95,2252],{},"\n開いたら",[111,2255,2256],{},"10.0.0.0\u002F8","と",[111,2259,2260],{},"192.168.0.0\u002F16","にチェックを入れ、「アクション」から「削除を確認」をクリックします。削除できたら前の画面に戻り、一番下にある「プロファイルを保存」をクリック。",[95,2263],{},[69,2265],{"alt":75,"src":2266},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F7cd9d51be6b9-20251222.png",[95,2268],{},"\nプロファイル一覧画面で「新しいプロフィールを作成」をクリック。",[95,2271],{},[69,2273],{"alt":75,"src":2274},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F55b27bfe612d-20251222.png",[95,2276],{},"\n名前は適当に、式はセレクターに「管理ネットワーク」オペレーターに「is」値を先程作成した管理ネットワークにする。",[95,2279],{},"\nこれを設定したら一番下にある「プロファイルを作成」をクリックする。",[95,2282],{},"\n続いてさっき新たに作成したプロファイルの設定画面を開き、スプリットトンネルが除外になっていることを確認し「管理」を開く。",[95,2285],{},[69,2287],{"alt":75,"src":2288},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fb2a86a41b727-20251222.png",[95,2290],{},"\nセレクターを「IP Address」に、値を家のCIDRにして宛先を保存して、前の画面に戻り、一番下の「プロファイルを保存」をクリックします。",[11,2293,2295],{"id":2294},"warpクライアントをインストール","WARPクライアントをインストール",[15,2297,2298],{},[36,2299,2302],{"href":2300,"rel":2301},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fwarp\u002Fdownload-warp\u002F",[1567],"Cloudflare WARP ダウンロード",[15,2304,2305,2306,2308,2309,2311,2314,2316,2317,2319,2322,2324,2325,2327,2330,2332,2333,2335,2338,2340,2341,2343,2346,2348],{},"からCloudflare WARPをダウンロードしてインストールします。",[95,2307],{},"\nインストールが終わり起動したらシステムトレイアイコンをクリックして",[95,2310],{},[69,2312],{"alt":75,"src":2313},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F0797dd0b41b6-20251223.png",[95,2315],{},"\n歯車アイコンをクリックし、環境設定を開きます。",[95,2318],{},[69,2320],{"alt":75,"src":2321},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F9a10ad48ea98-20251223.png",[95,2323],{},"\n設定ウィンドウのサイドバーの「アカウント」を開き、「Cloudflare Zero Trustにログイン」をクリックし、表示される案内を読み次へとか同意するを押してると",[95,2326],{},[69,2328],{"alt":75,"src":2329},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fd97dbc985b37-20251223.png",[95,2331],{},"\n上の画像のようなウィンドウが出ます。ここには設定したチーム名を入力します。",[95,2334],{},[69,2336],{"alt":75,"src":2337},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Ff230ca9a4cfe-20251223.png",[95,2339],{},"\nログインが成功するとWARPを開くか聞かれるので開きます。",[95,2342],{},[69,2344],{"alt":75,"src":2345},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F06e6fae4b43a-20251223.png",[95,2347],{},"\n表示がオレンジ色のWARPから青色のZero TrustになっていればOKです。",[11,2350,2351],{"id":2351},"テスト",[15,2353,2354,2355,2358,2359,2361,2364,2366],{},"Cloudflare WARPをインストールしたスマホからモバイルデータを使用して",[111,2356,2357],{},"192.168.0.30","にアクセスしてみました。",[95,2360],{},[69,2362],{"alt":75,"src":2363},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fe7658c2e2b05-20251223.jpg",[95,2365],{},"\nはい。出来ていますね。",[11,2368,2369],{"id":2369},"今回のポイント",[15,2371,2372,2373,2375],{},"実は他の記事で紹介されている方法では家の中で使うときにも一度Cloudflareを経由してしまい、遅くなってしまうんですよね。",[95,2374],{},"\nそこで「管理ネットワーク」という機能を使って家の中にいるのかを判断してプロファイルを切り替えるっていうそういう感じにしました。",[11,2377,2378],{"id":2378},"以上",[15,2380,2381,2382,2384],{},"以上です。やたら長いので分けて書けば良かったかもしれぬ。",[95,2383],{},"\nn番煎じ感のある記事で申し訳ないです。",[1449,2386,2387],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .siK8c, html code.shiki .siK8c{--shiki-default:#8AADF4;--shiki-default-font-style:italic}html pre.shiki code .sSZ1V, html code.shiki .sSZ1V{--shiki-default:#A6DA95}html pre.shiki code .s7Qn8, html code.shiki .s7Qn8{--shiki-default:#F5A97F}html pre.shiki code .s57MT, html code.shiki .s57MT{--shiki-default:#8AADF4}html pre.shiki code .sXptk, html code.shiki .sXptk{--shiki-default:#8BD5CA}html pre.shiki code .slVFb, html code.shiki .slVFb{--shiki-default:#939AB7}",{"title":75,"searchDepth":378,"depth":378,"links":2389},[2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401],{"id":1498,"depth":378,"text":1499},{"id":1544,"depth":378,"text":1544},{"id":1557,"depth":378,"text":1557},{"id":1586,"depth":378,"text":1587},{"id":1731,"depth":378,"text":1731},{"id":1802,"depth":378,"text":1802},{"id":1845,"depth":378,"text":1846},{"id":2226,"depth":378,"text":2226},{"id":2294,"depth":378,"text":2295},{"id":2351,"depth":378,"text":2351},{"id":2369,"depth":378,"text":2369},{"id":2378,"depth":378,"text":2378},"2025-12-23","Cloudflare Zero Trustを使用して、外部から自宅のネットワークに安全にアクセスし、かつ宅内では直結で通信する「管理ネットワーク」の設定方法を解説します。",{},"\u002Fblog\u002Fcloudflare-zero-trust-home-access",{"title":1493,"description":2403},"blog\u002Fcloudflare-zero-trust-home-access",[2409,2411,2413],{"name":2410},"Cloudflare",{"name":2412},"Zero Trust",{"name":2414},"自宅サーバー","2ldmvCO7cXBji8VmaWJxMtWP7zg5epmK9e9yU5FuyqI",{"id":2417,"title":2418,"body":2419,"date":2739,"description":2740,"extension":1480,"meta":2741,"navigation":428,"path":2742,"seo":2743,"stem":2744,"tags":2745,"__hash__":2747},"blog\u002Fblog\u002Fkoukounoaida_yattakoto.md","高校の卒業が確定したので3年間やったことを振り返る",{"type":8,"value":2420,"toc":2714},[2421,2425,2431,2437,2441,2445,2451,2454,2458,2464,2467,2470,2476,2492,2495,2507,2510,2523,2529,2532,2536,2539,2548,2551,2554,2558,2561,2567,2570,2584,2587,2590,2594,2598,2604,2608,2614,2617,2620,2626,2632,2635,2639,2645,2648,2651,2655,2658,2664,2668,2674,2677,2686,2690,2693,2696,2699,2705,2711],[11,2422,2424],{"id":2423},"高校卒業","高校卒業🎉",[15,2426,2427,2428,2430],{},"単位認定のテストを終えて、嬉しいかな高校の卒業が確定しました。",[95,2429],{},"\n進路は決まっていません😭。",[15,2432,2433,2434,2436],{},"記念というか、自分の中で振り返るという目的で、高校生の間に何をしていたかを振り返ってみようかなって思います。",[95,2435],{},"\n面接のための振り返りかもしれません。ハハハハ",[11,2438,2440],{"id":2439},"_1年生","1年生",[25,2442,2444],{"id":2443},"マイクラサーバー初構築","マイクラサーバー初構築!!",[15,2446,2447,2448,2450],{},"使わなくなったSurfaceBookにUbuntuを導入して、マイクラサーバーを構築・運用しました。",[95,2449],{},"\nあの頃はCLIに慣れていなかったのでGUIでネットワークの設定を済ませ、GUIを無効化してサーバーとして運用していましたね。",[15,2452,2453],{},"なおそのSurfaceBookはバッテリーが膨張して廃棄しました。蓋がパカって開いてましたw",[25,2455,2457],{"id":2456},"misskeyインスタンスの構築","Misskeyインスタンスの構築",[15,2459,2460,2461,2463],{},"Dockerを使用してMisskeyを構築しました。",[95,2462],{},"\n構築といってもドキュメントに書いてあるコマンドをポイポイ貼るだけなので、とても簡単です。",[15,2465,2466],{},"公開のためにCloudflare Tunnelを使用しました。とても便利。",[25,2468,2469],{"id":2469},"自作パソコンを組む",[15,2471,2472,2473,2475],{},"今のパソコンを組みます。",[95,2474],{},"\n前使っていたパソコンは",[2477,2478,2479,2483,2486,2489],"ul",{},[2480,2481,2482],"li",{},"CPU: Intel Core i7 4700K",[2480,2484,2485],{},"RAM: DDR3 24GB",[2480,2487,2488],{},"GPU: NVIDIA GeForce RTX 3060",[2480,2490,2491],{},"SSD: 256GB",[15,2493,2494],{},"って感じのよわよわパソコンだったので、適当にパーツを買い、",[2477,2496,2497,2500,2503,2505],{},[2480,2498,2499],{},"CPU: AMD Ryzen 5 5600G",[2480,2501,2502],{},"RAM: DDR4 32GB",[2480,2504,2488],{},[2480,2506,2491],{},[15,2508,2509],{},"って感じに微妙にアップグレードしました。当時からスペックアップはしていて、現状は",[2477,2511,2512,2515,2517,2520],{},[2480,2513,2514],{},"CPU: AMD Ryzen 7 5700X",[2480,2516,2502],{},[2480,2518,2519],{},"GPU: NVIDIA GeForce RTX 4060 Ti 16GB",[2480,2521,2522],{},"SSD: 2TB",[15,2524,2525,2526,2528],{},"になっています。AM5はメモリ高騰が落ち着くまで移行できない気がしています。",[95,2527],{},"\nグラボが壊れたらお財布が爆死します；；",[15,2530,2531],{},"…みたいな感じで1年生を過ごしていましたね〜。何にもしてない気がします！！",[11,2533,2535],{"id":2534},"_2年生","2年生",[25,2537,2538],{"id":2538},"中古ワークステーション購入",[15,2540,2541,2542,2544,2545,2547],{},"24時間動かすサーバー用途として中古のワークステーションを購入しました。",[95,2543],{},"\nCPUがXeon E3-1225 v5で、RAMが16GB、256GBのSSDがついてるやつ。",[95,2546],{},"\n中古で大体22000円くらいだったかな？安い！",[15,2549,2550],{},"ここら辺からLinuxについて理解を深め始めています。今も初心者のままではありますけど。",[15,2552,2553],{},"このサーバーはメディアサーバー、ファイルサーバー、VaultWardenを動かして運用しています。",[25,2555,2557],{"id":2556},"wordpress構築","WordPress構築",[15,2559,2560],{},"nginxとphp-fpmを組み合わせ、WordPressを構築しました。",[15,2562,2563,2564,2566],{},"自宅サーバーで公開はCloudflare Tunnel経由ですがパフォーマンスをそこそこ高く構築できたので満足でした。",[95,2565],{},"\nテーマはyStandardを使用していました。",[15,2568,2569],{},"無駄にセキュリティを固めて",[2477,2571,2572,2575,2578,2581],{},[2480,2573,2574],{},"ログイン画面パス変更",[2480,2576,2577],{},"ログイン画面から管理画面への遷移を防ぐ",[2480,2579,2580],{},"IPホワイトリスト",[2480,2582,2583],{},"ログイン試行回数制限",[15,2585,2586],{},"みたいなことを導入してました。意外と攻撃されるものなんです。",[15,2588,2589],{},"…って感じ。この年も何もしていない。",[11,2591,2593],{"id":2592},"_3年生","3年生",[25,2595,2597],{"id":2596},"raspberry-pi入手","Raspberry Pi入手",[15,2599,2600,2601,2603],{},"親からラズパイ3b+をもらいました。",[95,2602],{},"\n性能が低いのでなんでもできるってわけではありませんでしたが、AirPlayのレシーバーとして使ってました。",[25,2605,2607],{"id":2606},"astronuxtでブログ作成","Astro・Nuxtでブログ作成",[15,2609,2610,2611,2613],{},"AstroとNuxtを触り始めたんです。",[95,2612],{},"\nこのブログはAstro製ですが、一応Nuxtでも作って見てたんです。",[15,2615,2616],{},"私にはJS,TS,CSSの素養が無いので、今もそんなに書けません。",[25,2618,2619],{"id":2619},"ドアチャイムを作成",[15,2621,2622,2623,2625],{},"父親の知人のお店のドアチャイムを作成しました。",[95,2624],{},"\nラズパイとセンサーを組み合わせドアが開いた時にフォルダ内のランダムな音源を再生するって感じの。",[15,2627,2628,2629,2631],{},"その父親の知人はパソコンに詳しく無いためsmbでドラッグ&ドロップするだけで音源を追加できるようにしました。",[95,2630],{},"\n構築用のスクリプトもあるので、壊れてもすぐに再設置が可能っていう。",[15,2633,2634],{},"言語はPythonだよ。",[25,2636,2638],{"id":2637},"archlinux入門","ArchLinux入門",[15,2640,2641,2642,2644],{},"ArchLinuxを触り始めたのがこの年だった気がします。",[95,2643],{},"\n最初はGnomeを使用していましたがやっぱり「Hyprland触ってみたい！！」ってなって、設定を色々してイケてるデスクトップを作成しました。",[15,2646,2647],{},"結局保守が面倒くさくてGnomeに戻したんですけどね。",[15,2649,2650],{},"あとLinuxとNvidiaの相性の悪さを痛感した。マジふざけんな!!!!!!",[11,2652,2654],{"id":2653},"all","ALL",[25,2656,2657],{"id":363},"Python",[15,2659,2660,2661,2663],{},"中学の時から触っていましたが高校の間もPythonを触ってましたね。",[95,2662],{},"\nなんていうか、変なツールを開発したり、APIを作ったりDiscordのBOTを作ったりとか。",[25,2665,2667],{"id":2666},"docker","Docker",[15,2669,2670,2671,2673],{},"Dockerも環境を汚さないためになんとか使っています。",[95,2672],{},"\nいまだにDockerfileも満足に書けないくらいには定着しないので、もう少し本腰を入れないと。",[25,2675,2410],{"id":2676},"cloudflare",[15,2678,2679,2680,2682,2683,2685],{},"Cloudflareのサービスを結構使ってます。",[95,2681],{},"\nこのブログだってCloudflare Workersを使用していますし、自分用のいくつかのサービスもCloudflare Tunnelで公開しているし、",[95,2684],{},"\n宅外から宅内のネットワークにアクセスするとかも、Cloudflareのサービスを利用しています。",[25,2687,2689],{"id":2688},"linux","Linux",[15,2691,2692],{},"Linuxをなんとか触っていました。UbuntuはもちろんArch,RHEL系も使ったりしましたね。",[15,2694,2695],{},"基本的なコマンドは覚えた気がします。Windowsから乗り換えれるくらいには覚えたけど、AviUtlが動かないのとNvidiaとの相性が悪いので乗り換えはできていません。",[11,2697,2698],{"id":2698},"最後に",[15,2700,2701,2702,2704],{},"この3年間を振り返ると特に大きな成果も努力もなかったような気がします。",[95,2703],{},"\nいや、色々やってた気もするんだけどここに書くほどでも無い感じかなぁ。",[15,2706,2707,2708,2710],{},"気になるものを手当たり次第手を伸ばして触っているだけなんでね。",[95,2709],{},"\n今後は一つの分野をしっかりと学んでいきたいという意気込みがあります。",[15,2712,2713],{},"それでは、また。",{"title":75,"searchDepth":378,"depth":378,"links":2715},[2716,2717,2722,2726,2732,2738],{"id":2423,"depth":378,"text":2424},{"id":2439,"depth":378,"text":2440,"children":2718},[2719,2720,2721],{"id":2443,"depth":392,"text":2444},{"id":2456,"depth":392,"text":2457},{"id":2469,"depth":392,"text":2469},{"id":2534,"depth":378,"text":2535,"children":2723},[2724,2725],{"id":2538,"depth":392,"text":2538},{"id":2556,"depth":392,"text":2557},{"id":2592,"depth":378,"text":2593,"children":2727},[2728,2729,2730,2731],{"id":2596,"depth":392,"text":2597},{"id":2606,"depth":392,"text":2607},{"id":2619,"depth":392,"text":2619},{"id":2637,"depth":392,"text":2638},{"id":2653,"depth":378,"text":2654,"children":2733},[2734,2735,2736,2737],{"id":363,"depth":392,"text":2657},{"id":2666,"depth":392,"text":2667},{"id":2676,"depth":392,"text":2410},{"id":2688,"depth":392,"text":2689},{"id":2698,"depth":378,"text":2698},"2025-12-19","高校の3年間にやったことを振り返ります。",{},"\u002Fblog\u002Fkoukounoaida_yattakoto",{"title":2418,"description":2740},"blog\u002Fkoukounoaida_yattakoto",[2746],{"name":1487},"atdYEpzT49IZ6flvGWizAuxqgrKI4KgaEoQ-EJmB4PI",{"id":2749,"title":2750,"body":2751,"date":3507,"description":3508,"extension":1480,"meta":3509,"navigation":428,"path":3510,"seo":3511,"stem":3512,"tags":3513,"__hash__":3521},"blog\u002Fblog\u002Flibrechat-ollama-local-llm.md","LibreChat+OllamaでローカルLLM",{"type":8,"value":2752,"toc":3484},[2753,2757,2797,2800,2804,2843,2846,2849,2852,2921,2924,2927,2930,2955,2962,2965,2981,2984,2990,2993,3008,3011,3017,3019,3034,3037,3044,3049,3180,3185,3190,3331,3334,3337,3352,3359,3364,3367,3372,3375,3378,3381,3407,3410,3435,3440,3443,3446,3451,3456,3459,3461,3472,3475,3478,3481],[11,2754,2756],{"id":2755},"librechat","LibreChat",[30,2758,34,2760],{"className":2759},[33],[36,2761,45,2765,2790,34],{"href":2762,"target":39,"rel":2763,"className":2764},"https:\u002F\u002Fwww.librechat.ai\u002F",[41,42],[44],[30,2766,34,2768,34,2779],{"className":2767},[49],[30,2769,45,2771,45,2775,34],{"className":2770},[53],[30,2772,2774],{"className":2773},[57],"LibreChat - The Open-Source AI Platform",[30,2776,2778],{"className":2777},[62],"LibreChat brings together all your AI conversations in one unified, customizable interface.",[30,2780,45,2782,45,2786,34],{"className":2781},[67],[69,2783],{"src":2784,"className":2785,"width":74,"height":74,"alt":75},"https:\u002F\u002Fwww.librechat.ai\u002Ffavicon-32x32.png",[73],[77,2787,2789],{"className":2788},[80],"www.librechat.ai",[30,2791,34,2793],{"className":2792},[85],[69,2794],{"src":2795,"className":2796,"alt":75},"https:\u002F\u002Fwww.librechat.ai\u002Fimages\u002Fsocialcards\u002Fdefault-image.png",[90],[15,2798,2799],{},"ChatGPTみたいなUIを提供するやつです。",[11,2801,2803],{"id":2802},"ollama","Ollama",[30,2805,34,2807],{"className":2806},[33],[36,2808,45,2812,2836,34],{"href":2809,"target":39,"rel":2810,"className":2811},"https:\u002F\u002Follama.com\u002F",[41,42],[44],[30,2813,34,2815,34,2825],{"className":2814},[49],[30,2816,45,2818,45,2821,34],{"className":2817},[53],[30,2819,2803],{"className":2820},[57],[30,2822,2824],{"className":2823},[62],"Ollama is the easiest way to automate your work using open models, while keeping your data safe.",[30,2826,45,2828,45,2832,34],{"className":2827},[67],[69,2829],{"src":2830,"className":2831,"width":74,"height":74,"alt":75},"https:\u002F\u002Follama.com\u002Fpublic\u002Ficon-16x16.png",[73],[77,2833,2835],{"className":2834},[80],"ollama.com",[30,2837,34,2839],{"className":2838},[85],[69,2840],{"src":2841,"className":2842,"alt":75},"https:\u002F\u002Follama.com\u002Fpublic\u002Fog.png",[90],[15,2844,2845],{},"ローカルでLLMを動作させることのできるツールです。",[15,2847,2848],{},"以上の２つを合わせてローカルでAIを動作させていきたいっていう話。",[11,2850,2851],{"id":2851},"環境",[2853,2854,2855,2866],"table",{},[2856,2857,2858],"thead",{},[2859,2860,2861,2864],"tr",{},[2862,2863],"th",{},[2862,2865],{},[2867,2868,2869,2881,2891,2901,2911],"tbody",{},[2859,2870,2871,2875],{},[2872,2873,2874],"td",{},"CPU",[2872,2876,2877],{},[2878,2879,2880],"strong",{},"Ryzen 7 5700X",[2859,2882,2883,2886],{},[2872,2884,2885],{},"RAM",[2872,2887,2888],{},[2878,2889,2890],{},"32GB",[2859,2892,2893,2896],{},[2872,2894,2895],{},"SSD",[2872,2897,2898],{},[2878,2899,2900],{},"1TB",[2859,2902,2903,2906],{},[2872,2904,2905],{},"GPU",[2872,2907,2908],{},[2878,2909,2910],{},"NVIDIA RTX 4060 Ti 16GB",[2859,2912,2913,2916],{},[2872,2914,2915],{},"OS",[2872,2917,2918],{},[2878,2919,2920],{},"ArchLinux",[15,2922,2923],{},"今回はDockerで動かしていきます。",[11,2925,2926],{"id":2926},"セットアップ",[25,2928,2929],{"id":2929},"リポジトリのクローン",[105,2931,2933],{"className":1874,"code":2932,"filename":100,"language":1876,"meta":75,"style":75},"git clone https:\u002F\u002Fgithub.com\u002Fdanny-avila\u002FLibreChat\ncd LibreChat\n",[111,2934,2935,2946],{"__ignoreMap":75},[77,2936,2937,2940,2943],{"class":115,"line":116},[77,2938,2939],{"class":119},"git",[77,2941,2942],{"class":123}," clone",[77,2944,2945],{"class":123}," https:\u002F\u002Fgithub.com\u002Fdanny-avila\u002FLibreChat\n",[77,2947,2948,2952],{"class":115,"line":378},[77,2949,2951],{"class":2950},"sizsb","cd",[77,2953,2954],{"class":123}," LibreChat\n",[25,2956,2958,2961],{"id":2957},"envの作成",[111,2959,2960],{},".env","の作成",[15,2963,2964],{},"リポジトリ内にあるexampleをコピーする。",[105,2966,2968],{"className":1874,"code":2967,"filename":100,"language":1876,"meta":75,"style":75},"cp .env.example .env\n",[111,2969,2970],{"__ignoreMap":75},[77,2971,2972,2975,2978],{"class":115,"line":116},[77,2973,2974],{"class":119},"cp",[77,2976,2977],{"class":123}," .env.example",[77,2979,2980],{"class":123}," .env\n",[15,2982,2983],{},"内容は特にいじらなくていい。",[25,2985,2987,2961],{"id":2986},"librechatyamlの作成",[111,2988,2989],{},"librechat.yaml",[15,2991,2992],{},"これもリポジトリ内にあるexampleをコピーする。",[105,2994,2996],{"className":1874,"code":2995,"filename":100,"language":1876,"meta":75,"style":75},"cp librechat.example.yaml librechat.yaml\n",[111,2997,2998],{"__ignoreMap":75},[77,2999,3000,3002,3005],{"class":115,"line":116},[77,3001,2974],{"class":119},[77,3003,3004],{"class":123}," librechat.example.yaml",[77,3006,3007],{"class":123}," librechat.yaml\n",[15,3009,3010],{},"現時点では内容は編集しない。",[25,3012,3014,2961],{"id":3013},"docker-composeoverrideyamlの作成",[111,3015,3016],{},"docker-compose.override.yaml",[15,3018,2992],{},[105,3020,3022],{"className":1874,"code":3021,"filename":100,"language":1876,"meta":75,"style":75},"cp docker-compose.override.yml.example docker-compose.override.yml\n",[111,3023,3024],{"__ignoreMap":75},[77,3025,3026,3028,3031],{"class":115,"line":116},[77,3027,2974],{"class":119},[77,3029,3030],{"class":123}," docker-compose.override.yml.example",[77,3032,3033],{"class":123}," docker-compose.override.yml\n",[15,3035,3036],{},"これも現時点では内容を編集しない。",[25,3038,3040,3043],{"id":3039},"docker-composeoverrideymlの編集",[111,3041,3042],{},"docker-compose.override.yml","の編集",[15,3045,3046,3048],{},[111,3047,2989],{},"をマウントしたり、Ollamaを追加します。",[105,3050,3052],{"className":2026,"code":3051,"filename":3042,"language":2029,"meta":75,"style":75},"services:\n    api:\n        volumes:\n            - type: bind\n              source: .\u002Flibrechat.yaml\n              target: \u002Fapp\u002Flibrechat.yaml\n    ollama:\n        image: ollama\u002Follama:latest\n        container_name: ollama\n        restart: unless-stopped\n        gpus: all\n        ports:\n            - \"11434:11434\"\n        volumes:\n            - .\u002Follama:\u002Froot\u002F.ollama\n",[111,3053,3054,3060,3067,3074,3087,3097,3107,3114,3124,3134,3143,3153,3160,3167,3173],{"__ignoreMap":75},[77,3055,3056,3058],{"class":115,"line":116},[77,3057,2036],{"class":520},[77,3059,503],{"class":438},[77,3061,3062,3065],{"class":115,"line":378},[77,3063,3064],{"class":520},"    api",[77,3066,503],{"class":438},[77,3068,3069,3072],{"class":115,"line":392},[77,3070,3071],{"class":520},"        volumes",[77,3073,503],{"class":438},[77,3075,3076,3079,3082,3084],{"class":115,"line":406},[77,3077,3078],{"class":418},"            -",[77,3080,3081],{"class":520}," type",[77,3083,650],{"class":438},[77,3085,3086],{"class":123}," bind\n",[77,3088,3089,3092,3094],{"class":115,"line":425},[77,3090,3091],{"class":520},"              source",[77,3093,650],{"class":438},[77,3095,3096],{"class":123}," .\u002Flibrechat.yaml\n",[77,3098,3099,3102,3104],{"class":115,"line":432},[77,3100,3101],{"class":520},"              target",[77,3103,650],{"class":438},[77,3105,3106],{"class":123}," \u002Fapp\u002Flibrechat.yaml\n",[77,3108,3109,3112],{"class":115,"line":445},[77,3110,3111],{"class":520},"    ollama",[77,3113,503],{"class":438},[77,3115,3116,3119,3121],{"class":115,"line":454},[77,3117,3118],{"class":520},"        image",[77,3120,650],{"class":438},[77,3122,3123],{"class":123}," ollama\u002Follama:latest\n",[77,3125,3126,3129,3131],{"class":115,"line":462},[77,3127,3128],{"class":520},"        container_name",[77,3130,650],{"class":438},[77,3132,3133],{"class":123}," ollama\n",[77,3135,3136,3139,3141],{"class":115,"line":468},[77,3137,3138],{"class":520},"        restart",[77,3140,650],{"class":438},[77,3142,2055],{"class":123},[77,3144,3145,3148,3150],{"class":115,"line":474},[77,3146,3147],{"class":520},"        gpus",[77,3149,650],{"class":438},[77,3151,3152],{"class":123}," all\n",[77,3154,3155,3158],{"class":115,"line":479},[77,3156,3157],{"class":520},"        ports",[77,3159,503],{"class":438},[77,3161,3162,3164],{"class":115,"line":506},[77,3163,3078],{"class":418},[77,3165,3166],{"class":123}," \"11434:11434\"\n",[77,3168,3169,3171],{"class":115,"line":74},[77,3170,3071],{"class":520},[77,3172,503],{"class":438},[77,3174,3175,3177],{"class":115,"line":539},[77,3176,3078],{"class":418},[77,3178,3179],{"class":123}," .\u002Follama:\u002Froot\u002F.ollama\n",[25,3181,3183,3043],{"id":3182},"librechatyamlの編集",[111,3184,2989],{},[15,3186,3187,3189],{},[111,3188,2803],{},"を使うように設定します。",[105,3191,3193],{"className":2026,"code":3192,"filename":2989,"language":2029,"meta":75,"style":75},"version: 1.3.6\nendpoints:\n  custom:\n    - name: \"Ollama\"\n      apiKey: \"ollama\"\n      baseURL: \"http:\u002F\u002Follama:11434\u002Fv1\u002F\"\n      models:\n        default:\n          - \"qwen3.5\"\n        fetch: true\n      titleConvo: true\n      titleModel: \"current_model\"\n      summarize: false\n      summaryModel: \"current_model\"\n      modelDisplayLabel: \"Ollama\"\n",[111,3194,3195,3205,3212,3219,3232,3242,3252,3259,3266,3274,3284,3293,3303,3313,3322],{"__ignoreMap":75},[77,3196,3197,3200,3202],{"class":115,"line":116},[77,3198,3199],{"class":520},"version",[77,3201,650],{"class":438},[77,3203,3204],{"class":148}," 1.3.6\n",[77,3206,3207,3210],{"class":115,"line":378},[77,3208,3209],{"class":520},"endpoints",[77,3211,503],{"class":438},[77,3213,3214,3217],{"class":115,"line":392},[77,3215,3216],{"class":520},"  custom",[77,3218,503],{"class":438},[77,3220,3221,3224,3227,3229],{"class":115,"line":406},[77,3222,3223],{"class":418},"    -",[77,3225,3226],{"class":520}," name",[77,3228,650],{"class":438},[77,3230,3231],{"class":123}," \"Ollama\"\n",[77,3233,3234,3237,3239],{"class":115,"line":425},[77,3235,3236],{"class":520},"      apiKey",[77,3238,650],{"class":438},[77,3240,3241],{"class":123}," \"ollama\"\n",[77,3243,3244,3247,3249],{"class":115,"line":432},[77,3245,3246],{"class":520},"      baseURL",[77,3248,650],{"class":438},[77,3250,3251],{"class":123}," \"http:\u002F\u002Follama:11434\u002Fv1\u002F\"\n",[77,3253,3254,3257],{"class":115,"line":445},[77,3255,3256],{"class":520},"      models",[77,3258,503],{"class":438},[77,3260,3261,3264],{"class":115,"line":454},[77,3262,3263],{"class":520},"        default",[77,3265,503],{"class":438},[77,3267,3268,3271],{"class":115,"line":462},[77,3269,3270],{"class":418},"          -",[77,3272,3273],{"class":123}," \"qwen3.5\"\n",[77,3275,3276,3279,3281],{"class":115,"line":468},[77,3277,3278],{"class":520},"        fetch",[77,3280,650],{"class":438},[77,3282,3283],{"class":148}," true\n",[77,3285,3286,3289,3291],{"class":115,"line":474},[77,3287,3288],{"class":520},"      titleConvo",[77,3290,650],{"class":438},[77,3292,3283],{"class":148},[77,3294,3295,3298,3300],{"class":115,"line":479},[77,3296,3297],{"class":520},"      titleModel",[77,3299,650],{"class":438},[77,3301,3302],{"class":123}," \"current_model\"\n",[77,3304,3305,3308,3310],{"class":115,"line":506},[77,3306,3307],{"class":520},"      summarize",[77,3309,650],{"class":438},[77,3311,3312],{"class":148}," false\n",[77,3314,3315,3318,3320],{"class":115,"line":74},[77,3316,3317],{"class":520},"      summaryModel",[77,3319,650],{"class":438},[77,3321,3302],{"class":123},[77,3323,3324,3327,3329],{"class":115,"line":539},[77,3325,3326],{"class":520},"      modelDisplayLabel",[77,3328,650],{"class":438},[77,3330,3231],{"class":123},[11,3332,3333],{"id":3333},"起動",[15,3335,3336],{},"ここまで設定を進めたら起動します。",[105,3338,3340],{"className":1874,"code":3339,"filename":100,"language":1876,"meta":75,"style":75},"docker compose up -d\n",[111,3341,3342],{"__ignoreMap":75},[77,3343,3344,3346,3348,3350],{"class":115,"line":116},[77,3345,2666],{"class":119},[77,3347,2120],{"class":123},[77,3349,2123],{"class":123},[77,3351,2126],{"class":123},[15,3353,3354,3355,3358],{},"ブラウザから",[111,3356,3357],{},"http:\u002F\u002Flocalhost:3080","にアクセスすると、",[15,3360,3361],{},[69,3362],{"alt":75,"src":3363},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F8f931ac8ea08-20260323.png",[15,3365,3366],{},"こんな感じの画面が現れます。Sign upしてください。",[15,3368,3369],{},[69,3370],{"alt":75,"src":3371},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F20c286e091ec-20260323.png",[15,3373,3374],{},"ログインすると、こんな感じ。",[11,3376,3377],{"id":3377},"ollamaのモデルをpull",[15,3379,3380],{},"ollamaでモデルをpullします。今回はqwen3.5を。",[105,3382,3384],{"className":1874,"code":3383,"filename":100,"language":1876,"meta":75,"style":75},"docker exec -it ollama ollama pull qwen3.5\n",[111,3385,3386],{"__ignoreMap":75},[77,3387,3388,3390,3393,3396,3399,3401,3404],{"class":115,"line":116},[77,3389,2666],{"class":119},[77,3391,3392],{"class":123}," exec",[77,3394,3395],{"class":123}," -it",[77,3397,3398],{"class":123}," ollama",[77,3400,3398],{"class":123},[77,3402,3403],{"class":123}," pull",[77,3405,3406],{"class":123}," qwen3.5\n",[15,3408,3409],{},"モデルをpullしたら再起動します。",[105,3411,3413],{"className":1874,"code":3412,"filename":100,"language":1876,"meta":75,"style":75},"docker compose down && docker compose up -d\n",[111,3414,3415],{"__ignoreMap":75},[77,3416,3417,3419,3421,3424,3427,3429,3431,3433],{"class":115,"line":116},[77,3418,2666],{"class":119},[77,3420,2120],{"class":123},[77,3422,3423],{"class":123}," down",[77,3425,3426],{"class":418}," &&",[77,3428,2117],{"class":119},[77,3430,2120],{"class":123},[77,3432,2123],{"class":123},[77,3434,2126],{"class":123},[15,3436,3437],{},[69,3438],{"alt":75,"src":3439},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fc96a9aae3047-20260323.png",[15,3441,3442],{},"モデルの選択画面に現れればOKです。",[11,3444,3445],{"id":3445},"話してみる",[15,3447,3448],{},[69,3449],{"alt":75,"src":3450},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fedebedca3cea-20260323.png",[15,3452,3453],{},[69,3454],{"alt":75,"src":3455},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F39083ef68b05-20260323.png",[15,3457,3458],{},"ちゃんと話せます。",[11,3460,1438],{"id":1438},[15,3462,3463,3464,3466,3467,3469],{},"今回はここまでです。",[95,3465],{},"\nここでは書いていませんが検索まで設定してます。",[95,3468],{},[69,3470],{"alt":75,"src":3471},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F6e5888869252-20260323.png",[15,3473,3474],{},"いいぽよ。",[11,3476,3477],{"id":3477},"更新履歴",[15,3479,3480],{},"2026\u002F03\u002F24: 一部内容に誤りがあったため修正",[1449,3482,3483],{},"html pre.shiki code .siK8c, html code.shiki .siK8c{--shiki-default:#8AADF4;--shiki-default-font-style:italic}html pre.shiki code .sSZ1V, html code.shiki .sSZ1V{--shiki-default:#A6DA95}html pre.shiki code .sizsb, html code.shiki .sizsb{--shiki-default:#ED8796;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s57MT, html code.shiki .s57MT{--shiki-default:#8AADF4}html pre.shiki code .sXptk, html code.shiki .sXptk{--shiki-default:#8BD5CA}html pre.shiki code .slVFb, html code.shiki .slVFb{--shiki-default:#939AB7}html pre.shiki code .s7Qn8, html code.shiki .s7Qn8{--shiki-default:#F5A97F}",{"title":75,"searchDepth":378,"depth":378,"links":3485},[3486,3487,3488,3489,3502,3503,3504,3505,3506],{"id":2755,"depth":378,"text":2756},{"id":2802,"depth":378,"text":2803},{"id":2851,"depth":378,"text":2851},{"id":2926,"depth":378,"text":2926,"children":3490},[3491,3492,3494,3496,3498,3500],{"id":2929,"depth":392,"text":2929},{"id":2957,"depth":392,"text":3493},".envの作成",{"id":2986,"depth":392,"text":3495},"librechat.yamlの作成",{"id":3013,"depth":392,"text":3497},"docker-compose.override.yamlの作成",{"id":3039,"depth":392,"text":3499},"docker-compose.override.ymlの編集",{"id":3182,"depth":392,"text":3501},"librechat.yamlの編集",{"id":3333,"depth":378,"text":3333},{"id":3377,"depth":378,"text":3377},{"id":3445,"depth":378,"text":3445},{"id":1438,"depth":378,"text":1438},{"id":3477,"depth":378,"text":3477},"2026-03-23","LibreChatとOllamaを組み合わせて、ローカル環境で大規模言語モデル（LLM）を動作させる方法を解説します。",{},"\u002Fblog\u002Flibrechat-ollama-local-llm",{"title":2750,"description":3508},"blog\u002Flibrechat-ollama-local-llm",[3514,3516,3517,3519],{"name":3515},"ai",{"name":2666},{"name":3518},"llm",{"name":3520},"ローカルllm","70Y3GKjsJwqYS1z54qt9P2ozne14EEXcnMqOyjquMfI",{"id":3523,"title":3524,"body":3525,"date":3605,"description":3606,"extension":1480,"meta":3607,"navigation":428,"path":3608,"seo":3609,"stem":3610,"tags":3611,"__hash__":3613},"blog\u002Fblog\u002Fmuryoudemisskey.md","ほぼ無料でMisskeyインスタンスを立てたよ",{"type":8,"value":3526,"toc":3596},[3527,3530,3541,3544,3547,3550,3558,3561,3564,3576,3579,3590,3593],[11,3528,3529],{"id":3529},"ほぼ無料",[15,3531,3532,3533,3535,3540],{},"私はMisskeyのインスタンスを立てました。",[95,3534],{},[36,3536,3539],{"href":3537,"rel":3538},"https:\u002F\u002Fmsk.samenoko.work",[1567],"ここから","から見ることが出来ます。",[15,3542,3543],{},"これを運営するにあたってほとんどお金がかかりません。(電気代を除く)",[11,3545,3546],{"id":3546},"スタック",[25,3548,3549],{"id":3549},"サーバー",[15,3551,3552,3553,1834,3555,3557],{},"まずMisskeyを動かしているサーバーは",[2878,3554,2414],{},[95,3556],{},"\n毎月固定でお金がかかるわけではないので素晴らしいです。イニシャルコストはかかりますけど。",[15,3559,3560],{},"電気代は除きます。",[25,3562,3563],{"id":3563},"公開",[15,3565,3566,3567,3572,3573,3575],{},"インターネットへの公開は",[36,3568,3571],{"href":3569,"rel":3570},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fnetworks\u002Fconnectors\u002Fcloudflare-tunnel\u002F",[1567],"Cloudflare Tunnel","を使用しています。",[95,3574],{},"\nポート開放が不要でついでにHTTPSになるし、DDoS保護も付いてくる。",[25,3577,3578],{"id":3578},"メール",[15,3580,3581,3582,3572,3587,3589],{},"パスワードの再設定などのお知らせメールを配信するために",[36,3583,3586],{"href":3584,"rel":3585},"https:\u002F\u002Fresend.com\u002F",[1567],"Resend",[95,3588],{},"\nユーザー数なんて無いから無料枠に収まります。",[25,3591,3592],{"id":3592},"オブジェクトストレージ",[15,3594,3595],{},"オブジェクトストレージにはCloudflare R2を使用しています。",{"title":75,"searchDepth":378,"depth":378,"links":3597},[3598,3599],{"id":3529,"depth":378,"text":3529},{"id":3546,"depth":378,"text":3546,"children":3600},[3601,3602,3603,3604],{"id":3549,"depth":392,"text":3549},{"id":3563,"depth":392,"text":3563},{"id":3578,"depth":392,"text":3578},{"id":3592,"depth":392,"text":3592},"2026-04-09","ほぼ無料でMisskeyインスタンスを立てただけ",{},"\u002Fblog\u002Fmuryoudemisskey",{"title":3524,"description":3606},"blog\u002Fmuryoudemisskey",[3612],{"name":1487},"h-Encg2X51Tq0ci0X1FpP2IR0bX5GYlHdlcuB5cBDVo",{"id":3615,"title":3616,"body":3617,"date":3605,"description":4145,"extension":1480,"meta":4146,"navigation":428,"path":4147,"seo":4148,"stem":4149,"tags":4150,"__hash__":4157},"blog\u002Fblog\u002Fsumaho-de-qwen.md","Qwen3.5をAndroidスマホで動かしてみよう！(not 実用的)",{"type":8,"value":3618,"toc":4136},[3619,3623,3626,3629,3632,3635,3649,3652,3656,3696,3702,3723,3726,3773,3776,3807,3810,3813,3816,3842,3846,3884,3890,3941,3944,3963,3966,3979,3990,3993,3996,4036,4039,4072,4079,4084,4087,4092,4095,4100,4103,4109,4112,4115,4120,4123,4125,4131,4133],[11,3620,3622],{"id":3621},"え-androidスマホでllmを","え!! AndroidスマホでLLMを!?",[15,3624,3625],{},"出来らあっ！",[15,3627,3628],{},"…。始めます。",[11,3630,3631],{"id":3631},"今回の環境",[15,3633,3634],{},"Galaxy S26 12\u002F256GBを使います。",[2477,3636,3637,3640,3643,3646],{},[2480,3638,3639],{},"Snapdragon 8 Elite gen 5",[2480,3641,3642],{},"DDR5X 12GB",[2480,3644,3645],{},"UFS4.1 256GB",[2480,3647,3648],{},"Android 16",[15,3650,3651],{},"みたいな感じです。一応最新ハイエンド。",[11,3653,3655],{"id":3654},"termuxの準備","Termuxの準備",[30,3657,34,3659],{"className":3658},[33],[36,3660,45,3664,3689,34],{"href":3661,"target":39,"rel":3662,"className":3663},"https:\u002F\u002Ff-droid.org\u002Fja\u002Fpackages\u002Fcom.termux\u002F",[41,42],[44],[30,3665,34,3667,34,3678],{"className":3666},[49],[30,3668,45,3670,45,3674,34],{"className":3669},[53],[30,3671,3673],{"className":3672},[57],"Termux | F-Droid - 自由かつオープンソースのAndroidアプリ・リポジトリ",[30,3675,3677],{"className":3676},[62],"パッケージを伴ったターミナル・エミュレーター",[30,3679,45,3681,45,3685,34],{"className":3680},[67],[69,3682],{"src":3683,"className":3684,"width":74,"height":74,"alt":75},"https:\u002F\u002Ff-droid.org\u002Fassets\u002Ffavicon_yJPr4UNteJc-cseeq16P0Hvl1kDbJjTVYcj-KA6-_Fs=.ico",[73],[77,3686,3688],{"className":3687},[80],"f-droid.org",[30,3690,34,3692],{"className":3691},[85],[69,3693],{"src":3694,"className":3695,"alt":75},"https:\u002F\u002Ff-droid.org\u002Frepo\u002Fcom.termux\u002Fen-US\u002Ficon_7jMZ7XD80oeucmGEaTwktIRZexLtGWvJfKdVD6Wu2SI=.png",[90],[15,3697,3698,3699,3701],{},"からapkをダウンロードして、インストールします。",[95,3700],{},"\n起動したらミラーの最適化とパッケージのアップデートを行いましょう。",[105,3703,3705],{"className":107,"code":3704,"language":109,"meta":75,"style":75},"termux-change-repo\npkg upgrade -y\n",[111,3706,3707,3712],{"__ignoreMap":75},[77,3708,3709],{"class":115,"line":116},[77,3710,3711],{"class":119},"termux-change-repo\n",[77,3713,3714,3717,3720],{"class":115,"line":378},[77,3715,3716],{"class":119},"pkg",[77,3718,3719],{"class":123}," upgrade",[77,3721,3722],{"class":123}," -y\n",[15,3724,3725],{},"完全に蛇足ですが、私はSSHできるようにしておきました。",[105,3727,3729],{"className":107,"code":3728,"language":109,"meta":75,"style":75},"# sshと自動起動用のパッケージをインストール\npkg install openssh termux-services\n# パスワードを設定\npasswd\n# 自動起動の設定\nsv-enable sshd\n",[111,3730,3731,3737,3750,3755,3760,3765],{"__ignoreMap":75},[77,3732,3733],{"class":115,"line":116},[77,3734,3736],{"class":3735},"sfEIy","# sshと自動起動用のパッケージをインストール\n",[77,3738,3739,3741,3744,3747],{"class":115,"line":378},[77,3740,3716],{"class":119},[77,3742,3743],{"class":123}," install",[77,3745,3746],{"class":123}," openssh",[77,3748,3749],{"class":123}," termux-services\n",[77,3751,3752],{"class":115,"line":392},[77,3753,3754],{"class":3735},"# パスワードを設定\n",[77,3756,3757],{"class":115,"line":406},[77,3758,3759],{"class":119},"passwd\n",[77,3761,3762],{"class":115,"line":425},[77,3763,3764],{"class":3735},"# 自動起動の設定\n",[77,3766,3767,3770],{"class":115,"line":432},[77,3768,3769],{"class":119},"sv-enable",[77,3771,3772],{"class":123}," sshd\n",[15,3774,3775],{},"接続するときは",[105,3777,3779],{"className":107,"code":3778,"language":109,"meta":75,"style":75},"ssh a@\u003CスマホのIP> -p 8022\n",[111,3780,3781],{"__ignoreMap":75},[77,3782,3783,3786,3789,3792,3795,3798,3801,3804],{"class":115,"line":116},[77,3784,3785],{"class":119},"ssh",[77,3787,3788],{"class":123}," a@",[77,3790,3791],{"class":438},"\u003C",[77,3793,3794],{"class":123},"スマホのI",[77,3796,3797],{"class":374},"P",[77,3799,3800],{"class":438},">",[77,3802,3803],{"class":123}," -p",[77,3805,3806],{"class":148}," 8022\n",[15,3808,3809],{},"ユーザー名は何を指定しても大丈夫です。",[11,3811,3812],{"id":3812},"必須パッケージのインストール",[15,3814,3815],{},"今回はllama.cppを使用して動かすので、ビルドするために必要なパッケージを入れていきます。",[105,3817,3819],{"className":107,"code":3818,"language":109,"meta":75,"style":75},"pkg install git clang cmake wget libandroid-spawn\n",[111,3820,3821],{"__ignoreMap":75},[77,3822,3823,3825,3827,3830,3833,3836,3839],{"class":115,"line":116},[77,3824,3716],{"class":119},[77,3826,3743],{"class":123},[77,3828,3829],{"class":123}," git",[77,3831,3832],{"class":123}," clang",[77,3834,3835],{"class":123}," cmake",[77,3837,3838],{"class":123}," wget",[77,3840,3841],{"class":123}," libandroid-spawn\n",[11,3843,3845],{"id":3844},"llamacppのビルド","llama.cppのビルド",[30,3847,34,3849],{"className":3848},[33],[36,3850,45,3854,3877,34],{"href":3851,"target":39,"rel":3852,"className":3853},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp",[41,42],[44],[30,3855,34,3857,34,3868],{"className":3856},[49],[30,3858,45,3860,45,3864,34],{"className":3859},[53],[30,3861,3863],{"className":3862},[57],"GitHub - ggml-org\u002Fllama.cpp: LLM inference in C\u002FC++",[30,3865,3867],{"className":3866},[62],"LLM inference in C\u002FC++. Contribute to ggml-org\u002Fllama.cpp development by creating an account on GitHub.",[30,3869,45,3871,45,3874,34],{"className":3870},[67],[69,3872],{"src":71,"className":3873,"width":74,"height":74,"alt":75},[73],[77,3875,81],{"className":3876},[80],[30,3878,34,3880],{"className":3879},[85],[69,3881],{"src":3882,"className":3883,"alt":75},"https:\u002F\u002Frepository-images.githubusercontent.com\u002F612354784\u002Fc59e3320-a236-4182-941f-ea3f1a0f50e7",[90],[15,3885,3886,3887,3889],{},"を使ってLLMを動かします。",[95,3888],{},"\nまずはビルドを行いますよ。",[105,3891,3893],{"className":107,"code":3892,"language":109,"meta":75,"style":75},"git clone https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp.git\ncd llama.cpp\ncmake -B build\ncmake --build build --config Release -j6\n",[111,3894,3895,3904,3911,3922],{"__ignoreMap":75},[77,3896,3897,3899,3901],{"class":115,"line":116},[77,3898,2939],{"class":119},[77,3900,2942],{"class":123},[77,3902,3903],{"class":123}," https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp.git\n",[77,3905,3906,3908],{"class":115,"line":378},[77,3907,2951],{"class":2950},[77,3909,3910],{"class":123}," llama.cpp\n",[77,3912,3913,3916,3919],{"class":115,"line":392},[77,3914,3915],{"class":119},"cmake",[77,3917,3918],{"class":123}," -B",[77,3920,3921],{"class":123}," build\n",[77,3923,3924,3926,3929,3932,3935,3938],{"class":115,"line":406},[77,3925,3915],{"class":119},[77,3927,3928],{"class":123}," --build",[77,3930,3931],{"class":123}," build",[77,3933,3934],{"class":123}," --config",[77,3936,3937],{"class":123}," Release",[77,3939,3940],{"class":123}," -j6\n",[15,3942,3943],{},"ビルド中にエラーで落ちることがあります。その際は",[105,3945,3947],{"className":107,"code":3946,"language":109,"meta":75,"style":75},"cmake --build build --config Release -j6\n",[111,3948,3949],{"__ignoreMap":75},[77,3950,3951,3953,3955,3957,3959,3961],{"class":115,"line":116},[77,3952,3915],{"class":119},[77,3954,3928],{"class":123},[77,3956,3931],{"class":123},[77,3958,3934],{"class":123},[77,3960,3937],{"class":123},[77,3962,3940],{"class":123},[15,3964,3965],{},"を連打すると終わります。",[105,3967,3969],{"className":107,"code":3968,"language":109,"meta":75,"style":75},"ls .\u002Fbuild\u002Fbin\n",[111,3970,3971],{"__ignoreMap":75},[77,3972,3973,3976],{"class":115,"line":116},[77,3974,3975],{"class":119},"ls",[77,3977,3978],{"class":123}," .\u002Fbuild\u002Fbin\n",[15,3980,3981,3982,3985,3986,3989],{},"で",[111,3983,3984],{},"llama-server","とか",[111,3987,3988],{},"llama-cli","が見えればOKです。",[11,3991,3992],{"id":3992},"動かしてみる",[15,3994,3995],{},"さて動かしてみますよ。Qwenを。今回はunslothのQwen3.5-0.8B-GGUFを動かしてみます。",[30,3997,34,3999],{"className":3998},[33],[36,4000,45,4004,4029,34],{"href":4001,"target":39,"rel":4002,"className":4003},"https:\u002F\u002Fhuggingface.co\u002Funsloth\u002FQwen3.5-0.8B-GGUF",[41,42],[44],[30,4005,34,4007,34,4018],{"className":4006},[49],[30,4008,45,4010,45,4014,34],{"className":4009},[53],[30,4011,4013],{"className":4012},[57],"unsloth\u002FQwen3.5-0.8B-GGUF · Hugging Face",[30,4015,4017],{"className":4016},[62],"We’re on a journey to advance and democratize artificial intelligence through open source and open science.",[30,4019,45,4021,45,4025,34],{"className":4020},[67],[69,4022],{"src":4023,"className":4024,"width":74,"height":74,"alt":75},"https:\u002F\u002Fwww.google.com\u002Fs2\u002Ffavicons?domain=huggingface.co",[73],[77,4026,4028],{"className":4027},[80],"huggingface.co",[30,4030,34,4032],{"className":4031},[85],[69,4033],{"src":4034,"className":4035,"alt":75},"https:\u002F\u002Fcdn-thumbnails.huggingface.co\u002Fsocial-thumbnails\u002Fmodels\u002Funsloth\u002FQwen3.5-0.8B-GGUF.png",[90],[15,4037,4038],{},"次のコマンドを実行します。",[105,4040,4042],{"className":107,"code":4041,"language":109,"meta":75,"style":75},".\u002Fbuild\u002Fbin\u002Fllama-server -hf unsloth\u002FQwen3.5-0.8B-GGUF --host 0.0.0.0 --port 2323 --reasoning-budget 0\n",[111,4043,4044],{"__ignoreMap":75},[77,4045,4046,4049,4052,4055,4058,4061,4064,4067,4070],{"class":115,"line":116},[77,4047,4048],{"class":119},".\u002Fbuild\u002Fbin\u002Fllama-server",[77,4050,4051],{"class":123}," -hf",[77,4053,4054],{"class":123}," unsloth\u002FQwen3.5-0.8B-GGUF",[77,4056,4057],{"class":123}," --host",[77,4059,4060],{"class":148}," 0.0.0.0",[77,4062,4063],{"class":123}," --port",[77,4065,4066],{"class":148}," 2323",[77,4068,4069],{"class":123}," --reasoning-budget",[77,4071,719],{"class":148},[15,4073,4074,4075,4078],{},"この状態で",[111,4076,4077],{},"http:\u002F\u002F\u003CスマホのIP>:2323","にアクセスすると…。",[15,4080,4081],{},[69,4082],{"alt":75,"src":4083},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fe032c563fd07-20260406.png",[15,4085,4086],{},"こんな画面が出ます。適当に会話を試みましょう。",[15,4088,4089],{},[69,4090],{"alt":75,"src":4091},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002F569cef96f1ec-20260406.png",[15,4093,4094],{},"日本語は荷が重そうです。",[15,4096,4097],{},[69,4098],{"alt":75,"src":4099},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fd83426738787-20260406.png",[15,4101,4102],{},"私は英弱なので翻訳を。",[105,4104,4107],{"className":4105,"code":4106,"language":2190},[2188],"こんにちは！私はTongyi Labが開発した最新の大規模言語モデル、Qwen3.5です。\n膨大なテキストコーパスで学習済みで、質問への回答からクリエイティブなコンテンツの生成まで、幅広いタスクでお手伝いできます。今日はどのようなお手伝いができますか？😊\n",[111,4108,4106],{"__ignoreMap":75},[15,4110,4111],{},"開発元はアリババな気もしますけど、なにせ0.8Bなので。気にしない気にしない。",[15,4113,4114],{},"生成自体は1.4トークン\u002F秒と激遅です。ちなみに私のメインパソコン(R7 5770X+RTX 4060 Ti)では",[15,4116,4117],{},[69,4118],{"alt":75,"src":4119},"https:\u002F\u002Fstorage.googleapis.com\u002Fzenn-user-upload\u002Fce80ba874e37-20260406.png",[15,4121,4122],{},"216トークン\u002F秒です。こっちはGPUでAndroidはCPUですからね。分が悪いレベルの話ではないのですけど。",[11,4124,2378],{"id":2378},[15,4126,4127,4128,4130],{},"以上です。完全に自己満足ですが、一応動いたのに驚いてます。",[95,4129],{},"\nできればOpenCLを使った推論もやらせてみたいですね。出来たらですけど。",[15,4132,1447],{},[1449,4134,4135],{},"html pre.shiki code .siK8c, html code.shiki .siK8c{--shiki-default:#8AADF4;--shiki-default-font-style:italic}html pre.shiki code .sSZ1V, html code.shiki .sSZ1V{--shiki-default:#A6DA95}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sfEIy, html code.shiki .sfEIy{--shiki-default:#939AB7;--shiki-default-font-style:italic}html pre.shiki code .sXptk, html code.shiki .sXptk{--shiki-default:#8BD5CA}html pre.shiki code .sFaBz, html code.shiki .sFaBz{--shiki-default:#CAD3F5}html pre.shiki code .s7Qn8, html code.shiki .s7Qn8{--shiki-default:#F5A97F}html pre.shiki code .sizsb, html code.shiki .sizsb{--shiki-default:#ED8796;--shiki-default-font-style:italic}",{"title":75,"searchDepth":378,"depth":378,"links":4137},[4138,4139,4140,4141,4142,4143,4144],{"id":3621,"depth":378,"text":3622},{"id":3631,"depth":378,"text":3631},{"id":3654,"depth":378,"text":3655},{"id":3812,"depth":378,"text":3812},{"id":3844,"depth":378,"text":3845},{"id":3992,"depth":378,"text":3992},{"id":2378,"depth":378,"text":2378},"Qwen3.5をAndroidスマホで動かしてみたかったログ",{},"\u002Fblog\u002Fsumaho-de-qwen",{"title":3616,"description":4145},"blog\u002Fsumaho-de-qwen",[4151,4153,4155],{"name":4152},"Android",{"name":4154},"Termux",{"name":4156},"llama.cpp","6ze60E6sxTxUHYMddQ-Yqm0WvHbCISPRQmhv6Rg-htY",1775738147827]