技術をかじる猫

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

LightningWebComponent(OSS)で Bootstrap を読み込む

LightningWebComponent をイジってみて、Web Component としてシンプルだなーOSS版も使ってみるかなーと思ったらいきなりドハマリしたのでメモ。

OSS版 LWC を始める

といってもやり方は恐ろしく単純で

$ npx create-lwc-app my-app

これだけでテンプレができる。
とりあえず Web アプリを指定した。

$ npm run watch

これで http://loclhost:3002 にサーバが立つので実行できる。

Bootstrap を読み込んだ(失敗版)

まず、Bootstrap を読み込んで失敗したケース。

index.html でこんなことをしてみたのだが

        <!-- styles -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
        <!-- js -->
        <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>

適用される範囲は LWC アプリケーションの外側のみという残念なことに。

何が起こったのかと思って挙動を調べて見ると、どうも shadow domコンポーネント毎に style が完全独立してて、相互の CSS の影響をうけないんだとかなんとか…
共通的なフォントサイズとかフォントファミリとかどないせーっちゅーねん(汗

と思って調べて見ると

developer.salesforce.com

Because native Shadow DOM is enabled out-of-the-box for Open Source, you can’t just use a global stylesheet that then allows to cascade styles across inheriting Lightning web components. Everything is truly encapsulated, which is one of the huge benefits. ネイティブのShadowDOMはオープンソースですぐに使用できるため、継承するLightningWebコンポーネント間でスタイルをカスケードできるグローバルスタイルシートを使用することはできません。すべてが本当にカプセル化されており、これは大きなメリットの1つです。 You will have to rethink your CSS strategy when it comes to building Lightning web components, or if you want to reuse components that you built and styled on Lightning Platform. Lightning Webコンポーネントの構築に関して、またはLightning Platformで構築およびスタイル設定したコンポーネントを再利用する場合は、CSS戦略を再考する必要があります。 On the other side, you can choose with LWC Open Source to use synthetic shadow as an easier way to interoperate with existing UI if needed. 一方、必要に応じて既存のUIと相互運用するためのより簡単な方法として、合成シャドウを使用するようにLWCオープンソースを選択できます。

Oh...

共通CSS取り込み戦略

ということで、共通CSSを取り込み戦略を調べて見ると

lwc.dev

実際にやってみると

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

CSS だけのモジュールを用意して

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

こんな感じで実行すると

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

てな感じ。
でも目標はあくまで Bootstrap を使うこと。

なので、一旦は cssCommon を削除する(次のトライの邪魔になる)。

Bootstrap を取り込む戦術

Bootstrap を npm 経由で取り込んで CSS で取り込む。

$ npm install bootstrap

としたら、lwc-services.config.js ファイルを開いて、resources をいじくります

module.exports = {
    resources: [
        { from: 'src/client/resources/', to: 'dist/resources/' },
        { from: 'node_modules/bootstrap/dist', to: 'src/bootstrap' },
        { from: 'node_modules/bootstrap/dist', to: 'dist/bootstrap' }
    ],
// 以下略

ここまで書いたら、

npm run build:development

実行するとこんな感じになる

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

ソースディレクトリに Bootstrap を強制配置。
ここまでやったら、全てのコンポーネントの先頭でこんな事すればまずは Bootstrap が使える。

<template>
  <link href="/styles/salesforce-lightning-design-system.css"
    rel="stylesheet" type="text/css" />
</template>

ただし、コレだとコンポーネントすべてで書かなきゃいけないので色々ダメ。
なので、もう少しアレな手段をとってみる。

さっきのように cssCommon コンポーネントを作るけど、今度は Javascript ファイルのみ用意する。
中身はコレ

import { LightningElement } from 'lwc';

export default class CssCommonElement extends LightningElement {

    _bootStrapCss() {
        let _bootstrap = '../bootstrap/css/bootstrap.min.css';
        const styles = document.createElement('link');
        styles.href = _bootstrap;
        styles.rel = 'stylesheet';
        return styles;
    }

    connectedCallback() {
        // テンプレートに無理やり Bootstrap の CSS 挿入
        this.template.appendChild(this._bootStrapCss());
    }
}

connectedCallback() はライフサイクルイベントの一種で、親コンポーネントの下に配置された際に実行されるコールバック。
つまり、初期化が終わって、コンポーネントが表示待機状態に入ったことを意味する。

ここで、スタイルシートを無理やり適用している。

あとは画面上に表示されるコンポーネント全てで LightningElement の代わりに CssCommonElement を継承する。

import CssCommonElement from 'todo/cssCommon';

export default class App extends CssCommonElement {}

この状態で html テンプレートに

<template>
    <button class="btn btn-primary">Bootstrap ぼたーん</button>
</template>

と記述すれば

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

ただし、欠点もある…というのも、CSS ではなくて Js (つまり JQuery を使ったDOM操作)を行う機能はうまく取り込めないらしい。
というのも shadow dom 使ってるせいで、id とかがうまく取れないことが原因のようだ…デスヨネ…

ちなみにこの対応で作ったものがコレ

github.com

参考にどうぞ

拡張可能な 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

続きを読む