技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

拡張可能な 4TB のNASサーバをほぼ2万で

秋月電子 でRaspberryPi4 4GB 届いたので既存の NAS サーバ(12V-3A)で立ててたサーバが、5V 4A という若干の低電力化を狙って…というか前のNAS(ネットワークストレージ)が ACER の e-machines で流石に古すぎて限界近かったから…

ちなみに、購入は 秋月電子スイッチサイエンス から買ってください。
というのも、Amazon初期不良とかあると色々不便だけど、秋月電子などの専門店なら問い合わせ保証しやすいので、電子工作機器ならこういうところの方が何かあったときのために便利です。(まして首都圏なら秋葉行けば直接やり取りもできるしね…)

使ったのはほぼほぼコレ。
NAS サーバ自体は 1 万円で済んでます。

外部 HD はバルクHD 探せば 6T 1万で用意できるけど、今回は昔から使ってる外部HDを利用。
なので 3T だけど

で足して2万。
ただし前提として、USBのマウス/キーボード+HDMIディスプレイは持ってるものと仮定します。(セットアップに使ったらそのあとは使いません)

ラズパイセットアップ:OS インストール

まず真っ先にやるのが Raspberry pi の OS インストール。

公式サイト から、Raspberry Pi Imager を自分の PC にインストールします。
起動するとこんな感じ

f:id:white-azalea:20201017222447p:plain

OS 指定して

f:id:white-azalea:20201017222619p:plain

このまま SD カード選択して、

f:id:white-azalea:20201017222638p:plain

インストール。
これだけ。

f:id:white-azalea:20201017222817p:plain

起動

セットアップウィザード

っても、SDカード差して、キーボード・マウス挿して、ディスプレイ挿したあとで電源ケーブルを挿すだけ。
ラズパイに電源スイッチとかないので、電源接続=起動です。

こういうときにしれっと役立つのがモバイルディスプレイで、自分はコレ使ってます。
もともと外部で勉強会に持って行く用だったのですがコロナでは…lllorz

ちなみに、これは micro HDMI 接続で、ラズパイ4 が MicroHDMI です。
Micro - Micro ケーブルは中々手に入らないので、事前にこんなのも買っておきました

ELECOM タブレットPC用HDMI変換アダプタ HDMI-micro端子 TB-HDADBK

ELECOM タブレットPC用HDMI変換アダプタ HDMI-micro端子 TB-HDADBK

  • 発売日: 2012/07/20
  • メディア: Personal Computers

で、セットアップに戻りますが、最終的に ssh でしか扱わないので、日本語にして文字化けされるととっても面倒。
よってセットアップ時は、ロケールを日本語に指定はするものの、英語を使用するように設定しましょう。

セットアップ時に「 Use English language」のチェックボックスが出たら迷わずチェックして進みましょう。
Wifi は使いたければどうぞ。

その他セットアップ

セットアップができたら、ラズパイのアイコンから、「Configuration > Raspberry Pi Configuration」を指定して起動し、SSH を有効化します。
ついでに インターフェースを CLI にしてしまいましょう。
どうせそろそろお役御免です。

ここまでやったら、Terminal を起動して

ifconfig を実行し、IP/MAC をメモします。
要するに SSH 先と、IP 固定用の MAC アドレスですね。

ローカルのIPアドレスを固定

これはルータ設定で行います。
ルータの種類によって設定方法が違いますので、ざっくりです。

ちなみに自分は BUFFALO で、「詳細設定」から「LAN > DHCPリース」から設定しました。

ここでは仮に、192.168.11.2 とでもしたとします。

ここまでやったら

sudo reboot

でしれっと再起動。

NAS 化の道

ディスクの用意

外部HDをぶっさすとLinux内部にログが残る。
因みにUSBディスクはかなり古い奴なので紹介なし。

$ dmesg
$ dmesg
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.51-v7l+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1333 SMP Mon Aug 10 16:51:40 BST 2020
[    0.000000] CPU: ARMv7 Processor [410fd083] revision 3 (ARMv7), cr=30c5383d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction cache
[    0.000000] OF: fdt: Machine model: Raspberry Pi 4 Model B Rev 1.2
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] Reserved memory: created CMA memory pool at 0x000000001ec00000, size 256 MiB
[    0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[    0.000000] On node 0 totalpages: 1012736

...中略

[    9.090856] scsi 0:0:0:0: Direct-Access     Hitachi  HDS723030ALA640  MKAO PQ: 0 ANSI: 5
[    9.125766] sd 0:0:0:0: Attached scsi generic sg0 type 0
[    9.139537] sd 0:0:0:0: [sda] 732566624 4096-byte logical blocks: (3.00 TB/2.73 TiB)
[    9.143212] sd 0:0:0:0: [sda] Write Protect is off
[    9.143235] sd 0:0:0:0: [sda] Mode Sense: 28 00 00 00
[    9.144028] sd 0:0:0:0: [sda] No Caching mode page found
[    9.144045] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    9.199839]  sda: sda1

...以下略

sda として認識したらしい。
以前から NAS として使っていたので、パーティションが残っているご様子。
これを機にクリーンにしちゃうかー(と Windows で内容をバックアップ。Ext2Fsd Project を使うとWindowsからext3のドライブが読み込める)

パーティション切りなおすかな

$ sudo fdisk /dev/sda
pi@raspberrypi:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): m

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag
...中略

パーティション情報の確認

Command (m for help): p
Disk /dev/sda: 2.7 TiB, 3000592891904 bytes, 732566624 sectors
Disk model: HDS723030ALA640
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x46a914da

Device     Boot Start       End   Sectors  Size Id Type
/dev/sda1          63 732563999 732563937  2.7T 83 Linux

変える必要なさそうなんだよなぁ(汗
まぁ練習がてら消すか

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (256-732566623, default 256):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (256-732566623, default 732566623):

Created a new partition 1 of type 'Primary' and of size 2.7 TiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

ということで、削除→新規→保存 を実行。
まぁBootパーティション作るわけでもないしね。

で、フォーマット

$ sudo mkfs.ext4 /dev/sda1
mke2fs 1.44.5 (15-Dec-2018)
Found a dos partition table in /dev/sda1
Proceed anyway? (y,N) y
Creating filesystem with 732566368 4k blocks and 183148544 inodes
Filesystem UUID: 3c17655a-88a1-473d-b8cc-27b679af558b
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

openmediavaultのインストール

NAS 化するだけなら、SMB インストールして終了なのだけど、openmediavault なるものが流行りなのでやってみた。

www.openmediavault.org

ただし、そのままインストールするわけにもいかないらしい…がそこは他人の力を借りる。

github.com

便利便利

$ curl -sSL https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

ポーンとコピペして 30 分位放置。
で、インストール後に IP アドレスたたくと

f:id:white-azalea:20201017231516p:plain

デフォルトアカウントは admin/openmediavault なので、これでログイン。

f:id:white-azalea:20201017231619p:plain

とりあえずユーザの設定、Linux ユーザが基本で列挙されているので、好きにするといいよ。
というかここからユーザ管理できるとかかなり楽になりましたね…

f:id:white-azalea:20201017232252p:plain

SMB をインストール

f:id:white-azalea:20201017232503p:plain

この時点で、すでに接続はできる

f:id:white-azalea:20201017233447p:plain

ディスクを認識させて

f:id:white-azalea:20201017233615p:plain

パーティションを認識させます。
一応ここでマウントしてしまいましょう。

f:id:white-azalea:20201017233835p:plain

共有フォルダを作成して

f:id:white-azalea:20201018120604p:plain

SMB の共有に設定

f:id:white-azalea:20201018120854p:plain

この時点で

f:id:white-azalea:20201018121224p:plain

わーい

因みに速度ですが R:35MB/s W:29MB/s な感じで、(古いストレージでUSB2.0なのでその辺がボトルネックになってるのかも)動画を再生したりに不自由ないレベルです。
放熱についても、手で持ってほんのりあったかい程度。NAS程度なら 40度位で済んでるっぽいので、ヒートシンクもいらない感じです。
電力は 5V3A = 15W と 電球より低いぜ ひゃっほう!

複数のインストール済み Java を速攻で切り替える jenv

つってもそんなに難しい話はない。

Install

Mac なら brew だよね。

$ brew install jenv

Homebrew 知らない人はこっち。
brew.sh

ちなみに Windows だと jenv.io なるサイトで Windows で動く Jenv 頑張ってたらしいのだけど、消えていた(2020/09/20 現在)。

インストールされると、実質 ~/.jenv 以下にインストールされます。
インストール後は .bash_profilezsh の場合は ~/zprofile に次の文言を追加

eval "$(jenv init -)"

pyenv とかと違って、こいつ自体に Java インストール機構はない。文字通り環境切り替えよう。
で、登録に関しては /usr/libexec/java_home -V でインストール済み JavaHome ディレクトリを検索。

$ /usr/libexec/java_home -V                                           
Matching Java Virtual Machines (2):
    14.0.1, x86_64: "OpenJDK 14.0.1"    /Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
    11.0.5-zulu-11.35+15, x86_64:   "Zulu 11"   /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home

このパスを利用して

$ jenv add /Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
openjdk64-14.0.1 added
14.0.1 added
14.0 added
14 added

こうすると追加される。
で、この切替を行うにあたっては

$ jenv versions
  system
  11.0
  11.0.2
  14
  14.0
  14.0.1
  openjdk64-14.0.1
* zulu64-11.0.2 (set by /Users/armeria/.jenv/version)

$ jenv --help  
jenv 0.5.4
Usage: jenv <command> [<args>]

Some useful jenv commands are:
   commands    List all available jenv commands
   local       Set or show the local application-specific Java version
   global      Set or show the global Java version
   shell       Set or show the shell-specific Java version
   rehash      Rehash jenv shims (run this after installing executables)
   version     Show the current Java version and its origin
   versions    List all Java versions available to jenv
   which       Display the full path to an executable
   whence      List all Java versions that contain the given executable
   add         Add JDK into jenv. A alias name will be generated by parsing "java -version"

See `jenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/jenv/jenv/blob/master/README.md

$ jenv global openjdk64-14.0.1

$ java --version
openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+14)
OpenJDK 64-Bit Server VM (build 14.0.1+14, mixed mode, sharing)

とまぁこんな感じ。
11 依存のプロダクトと、14 対応の OSS を使うときに切り替えとしては便利です。

マジで日記

データサイエンス系の勉強しようと思ったんですよ、そしたらですね、Windows の標準 JIS キーボード配置が気に入らないのです…。
日本語文章打つ分には JIS 配置で問題ないのだけど、_?> とか記号打ち始めると凄く気になる…しかもこのあたりって、開発で良く使うキーなんですね。

Windows 一辺倒で慣れてるとそれでも気にはならないのですが、あいにくと私は仕事で Mac 使ってまして…(Windows はゲームと環境依存確認用)なので、結局 MacBook に舞い戻ってしまったのです。

その MacBookPro も独自 CPU 積むとかなんとか…しかもそれ向け Mac だと Home brew とかでエラーが出るとかなんとか…

yusukeiwaki.hatenablog.com

うぉぉおおおおお(TT

Xcode 問題は新しいやつ入れれば問題なく動くらしいのだけど、仮想化全滅はないわー…
Arm 系CPUに対応しようとすると、ある意味仕方ない気はするのだけど、悪いけど X86-IA64 系でマトモに仮想化ができるアプデ(+X86 Mac)出てこない限り乗り換えもアプデもする気になれませんね…

真面目な話、iOS 以外の開発者的には Docker はキラーコンテンツなり得る。

これが動かないなら真面目に Mac の利用終了を検討するレベルだと思う。
BSD ベース OS が動き続ける以上は Web 開発者は一定数残っていられるとは思うのだけど…

というか Intel 切ったらしいとすれば、Ubuntu 乗り換え待ったなしなんだよなぁ…。
Ubuntu compatibility な Windows ノートでキー配置も含めて納得行くマシン探すしかないのか…|||orz

プログラム言語の源流をざっくり

目標

プログラムってどう動いてるの?なんでプログラム言語なんてものが必要なの?を理解する。
それが分からないとプログラミング言語のありがたさなんてわからないんで…

初めに 0 と 1 がある

とは皆聞いたことがあるはずだ。プログラムは全部 0 と 1 で動いているんだと。
でも誰も実感なんてできないはずだ。

そこで、死ぬほど単純な 1+1 の結果を表示するプログラムをコンパイルして、その中身を 01 表示する。
長いので一部抜粋するけどこんな感じになる。

010011010101101010010000000000000000001100000000000000000000000000000100000000000000000000000000111111111111111100000000000000001011100000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111110000000000000000000000000000000111000011111101110100000111000000000101101000000100111001101001000011011100000000001010011001100110100100001010101000110100001101001011100110010000001110000011100100110111101100111011100100110000101101101001000000110001101100001011011100110111001101111011101000010000001100010011001010010000001110010011101010110111000100000011010010110111000100000010001000100111101010011001000000110110101101111011001000110010100101110000011010000110100001010001001000000000000000000000000000000000000000000000000000000000001000000010011000011111000000010000001000010110101010000010100010000010000101101010100000101000100000100001011010101000001010001000011010101010111000011010100010000111000101101010100000101000111111100010111010101010101010000000101110010110101010000010100011111110001011101010101000101000000001000001011010101000001010001111111000101110101010011010100000000010100101101010100000101000111111100010111010101000101010000000000010010110101010000010100010101111101000101010100010101000000000110001011010101000001010001000001000010110101010001010100010010101100101101010100000101000110110011010111000101100101010000000001010010110101010000010100011011001101011100101011110101000100000101001011010101000001010001101100110101110001010010010100000000010100101101010100000101000101010010011010010110001101101000000001000010110101010000010100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000010001010000000000000000010011000000000100000101000000000010101011011111011001000101111100000000000000000000000000000000000000000000000000000000000000001110000000000000000000100000000100001011000000010000111000011011000000000000111000000000000000000000000000010100000000000000000000000000000000000000000000000000011010010001001000000000000000000000000000010000000000000000000000000000001000000000000000000000000000000000000001000000000000000000000000010000000000000000000000000000000000100000000000000000000001100000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000001000000000000000000000000000000000000000000000000000000001100000000010000001000000100000000000000000001000000000000000000000001000000000000000000000000000000000000000100000000000000000000000100000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110000100101000000000000000010110100000000000000000000000000000000000100000000000000000000001110000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000000000000000101000000000001000000000000000000000000001000010000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000000100001000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000110010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

うん、読めたもんじゃねぇ。
これでもルールはある(ってかないとコンピュータだって読めない)のだけど、ホント無理。

因みに、初期のコンピュータはこの 0/1 を紙に穴を開けて読み込ませてたらしい。
その頃のコンピュータは表現も何も数字と、かろうじてアルファベットしか返せなかったから、それでもやってやれなくはなかったそうだ…

続きを読む

Pandas の入門にいいかも?

秀和さんホントいい本出しますね。

本の概要

データサイエンスって、手法は一通り調べはしたんだけど、そこからどう応用すればいいんだろう?
そう思ったときに必要なのは何かと考えてみると

現実同様に正規化できてないデータ だったり、 目的とその達成までの考え方 あたりは教科書では中々教えてくれません。

この本はまさにこの部分を手を動かして実感する本です。

ポイント

氏名の書き方の揺れ、全角半角の揺れ、日付の書式揺れなどや、データ欠損の補完。
実務的に機械学習を利用した、ユーザの継続/解約予測、利用回数予測などの各種予測といった、実際に実務でやりたいであろう予測の仕方を説明しています。

Kaggle *1 でも学ぶことはできますが、日本語で十分な説明付き手順があるというのは非常に日本人としてはありがたい。

第一章の使い方

全部書くと、本のネタバレにしかならない気がするので、先頭 10 本のみ。
pandas の使い方を実際にデータいじりながら説明してくれるので、基本と実践が同居してるとてもいい本…というのが個人的印象。

import pandas as pd

customer_master = pd.read_csv('datas/customer_master.csv')
customer_master.head()
customer_id customer_name registration_date customer_name_kana email gender age birth pref
0 IK152942 平田 裕次郎 2019-01-01 00:25:33 ひらた ゆうじろう hirata_yuujirou@example.com M 29 1990/6/10 石川県
1 TS808488 田村 詩織 2019-01-01 01:13:45 たむら しおり tamura_shiori@example.com F 33 1986/5/20 東京都
2 AS834628 久野 由樹 2019-01-01 02:00:14 ひさの ゆき hisano_yuki@example.com F 63 1956/1/2 茨城県
3 AS345469 鶴岡 薫 2019-01-01 04:48:22 つるおか かおる tsuruoka_kaoru@example.com M 74 1945/3/25 東京都
4 GD892565 大内 高史 2019-01-01 04:54:51 おおうち たかし oouchi_takashi@example.com M 54 1965/8/5 千葉県
transaction_1 = pd.read_csv('datas/transaction_1.csv')
transaction_1.head()
transaction_id price payment_date customer_id
0 T0000000113 210000 2019-02-01 01:36:57 PL563502
1 T0000000114 50000 2019-02-01 01:37:23 HD678019
2 T0000000115 120000 2019-02-01 02:34:19 HD298120
3 T0000000116 210000 2019-02-01 02:47:23 IK452215
4 T0000000117 170000 2019-02-01 04:33:46 PL542865

*1:というか他の人の考えや手順も学ぶという意味ならKaggleの方がサンプルは多い

続きを読む

Unity の Humanoid モデルを VRM モデルに変換してみた

目的

Humanoid モデルを VRM モデルに変換して、VirtualMotionCapture でいじれる様にしようか。
尚、説明レベルは「Unityとか名前しか知らない」レベルで。

基本的に、Booth 等で販売されてるモデルは Humanoid*1 ベースが殆ど。

というのも、現実的に VRM 形式だと変更/修正などが容易ではなく、カスタムして使うということが実質不可能だからだと思われる。
(なんかやる方法探せばないこともなさそうではあるけど…)

因みに、著作権の問題から、変換モデルの配布とかはしないので、試す人は買ってどうぞ。

ざっくり流れ

  1. Unity でプロジェクトを作成して、プラグインを突っ込む
  2. お目当てのHumanoidモデルを読み込む
  3. VRM 用にモデルを編集する
  4. VRM エクスポート

事前準備

  1. Unity を用意しましょう。(この記事を書いてる時のバージョンは 2019.4.9f)
    unity.com
  2. Uni-VRM をダウンロードしておきましょう。検証したバージョンは「0.59.0_873a」で、バージョンアップで使えなくなってたらメンゴ
    Releases · vrm-c/UniVRM · GitHub
  3. Humanoid モデルを用意しましょう
    3Dキャラクターに関する人気の同人グッズ6221点を通販できる! - BOOTH
    尚、利用規約に改変が可能かはきっちり見てください。

自分が買ったのはコレ。
booth.pmアルビノっ子大好きなので)

*1:Humanoidは、人型のモデル用に作られたモーションを他の人型モデルにも適用できるようにする仕組みです。 【Unity】Humanoid / Genericアニメーションについての基礎知識 - LIGHT11

続きを読む

VRゲームに自分の姿を好きなキャラモデルで表示して撮影する

目標

この記事で目指すところ

youtu.be

事前準備

以上です。

ざっくり流れ

  1. VRゲームと LIV を入れる
  2. VRM モデルを用意する
  3. VirtualMotionCapture を突っ込む
  4. LIV に VirtualMotionCapture 映像を設定
  5. OBS で録画する

1. VRゲームと LIV を入れる

基本的に Steam 対応の VR ならそれなりにいけるっぽい。
ということで BeatSaber

store.steampowered.com

加えて、LIV (無料)を入れる

store.steampowered.com

ちょっと説明すると、LIV というツールは以下の機能がある。

  1. VR ゲーム中にカメラを配置してゲーム内の映像を表示できる
  2. 現実のWebカメラの映像を取り込む
  3. 上記二つの映像をクロマキーで合成する

起動順序は LIV が先で、「LIV コンポジターをスタートする」(コンポジッターとは、合成機って意味)

f:id:white-azalea:20200829122241p:plain

起動するとこんな感じ

f:id:white-azalea:20200829123006p:plain

「シンクロとスタート」を押すと、ゲームが起動します。
この時真っ黒の画面に映像が映ります。
これが LIV のVR中カメラ映像ですね。

f:id:white-azalea:20200829124913p:plain

ここでカメラ調整とかしたくないので、ゲームだけ修了します。
実写映像を合成するならこのままできますが…まぁ放置で。

2, VRM モデルを用意する

手段はいくつかありますが

  • VroidStudio とかで自作する
    https://vroid.com/studio/
  • Unity の Humanoid モデルを変換する
    VRM モデルをガチで作りたい人は コレ 見て頑張ってください。
    俺はあきらめたよ…
  • VroidHub から適当なフリー VRM を拾ってくる。
    https://hub.vroid.com/
  • BoothVRM のモデルを買う
    因みに、VroidStudio で使えるテクスチャとか有償無償含めて転がってるので、見てみるといい
  • ニコニコ立体 からライセンスを確認しつつ使う
    ライセンスに関しては慎重に。私はサイトは紹介しますが、利用は自己責任で。

因みに私は Booth から素材を集めつつ、VroiStudio で自作しました。
VroidStudio で一旦エクスポートした VRM モデルは編集できないので、服装とか変える場合はその度にエクスポートしましょう。

続きを読む