Live2Dの基礎知識

Live2Dとは?

Live2D は、日本の Live2D社(旧サイバーノイズ社)が開発した 2Dイラストを立体的に動かす 技術およびソフトウェアです。通常のアニメーションのようにフレームごとに絵を描くのではなく、レイヤー分けされた一枚のイラストを各パーツ毎に変形して立体的な動きを表現できます。

公式サイト


Live2Dの特徴

  • 一枚のイラストを活用
    3Dモデリングを使わず、イラストのパーツを分けて動かすことで立体感を表現。イラストの質感を損なわずに動かせる。
  • モデリングとアニメーションの制作が可能
    Live2D Cubism というソフトウェアを使用し、イラストのパーツを動かしてモデルを作成。モーション付けや表情変化、物理演算(髪や服の揺れ)も可能。
  • ゲーム・VTuber・アプリに活用
    VTuber(バーチャルYouTuber)のモデル制作
    ソーシャルゲーム(キャラクターの表情・動作演出)
    ライブ配信アバター(配信者の顔の動きに合わせて動作)

Live2Dの主なソフトウェア

  1. Live2D Cubism・Live2D Viewer
    モデリング(イラストをパーツごとに動かせるようにする)
    アニメーション(キャラクターの動きを作成・確認)
    無料版と有料版あり(商用利用は基本的に有料)

  2. VTube Studio・Animaze(VTuber用ソフト)
    Live2Dモデルを動かせるVTuber向けソフト。

  3. スマホアプリ・その他
    Mirrativ …Live2Dアバター機能あり
    REALITY(バーチャル配信アプリ) …Live2Dアバター作成可能

Live2Dの使い方(簡単な流れ)

  1. イラスト作成(パーツを分けて描く)
    PhotoshopやCLIP STUDIO PAINTで目、口、髪などを別レイヤーで描く。
  2. Live2D Cubismでモデリング
    各パーツを動かせるように設定し、パラメータ(表情・体の動き)を調整。
  3. アニメーション作成 or 外部ソフトと連携
    ・Cubismで動きを付ける。
    ・VTuberならフェイストラッキングソフトと連携(VTube Studio・Animazeなど)。

まとめ

Live2Dは、一枚絵のイラストを立体的に動かせる技術で、主に VTuberやゲームキャラのアニメーションに活用されています。Live2D Cubismを使えば、絵のクオリティを保ったまま滑らかな動きを作れるので、イラストを動かしたい人には非常に便利なツールです。

Live2D公式サイトにイラストを動かすまでのチュートリアルも用意されているので、興味があれば、無料版のLive2D CubismからLive2Dの制作を試してみてください。

【Windows】WSLを使用したDockerの環境構築

【WSLを使用したDockerの環境構築】

 

WindowsにてDockerを使用する際、Cドライブに環境を用意すると読み込みがすごく遅くなります。

その遅さを解決するためにWSL(Windows Subsystem for Linux)を使用します!!

今回はWSLにてDockerの環境構築をする方法をまとめていきます。

目次
――――――――――――――――――――――――――――
1 WSLの導入
2 Dockerの導入
3 設定
4 まとめ
――――――――――――――――――――――――――――

1..WSLの導入

WSL(Windows Subsystem for Linux)を導入する。
Microsoft Store にてUbuntuをインストールする。
インストール完了後、初回起動時にユーザとパスワードを入力しアカウントを作成します。

WindowsからLinux上のファイルにアクセス
エクスプローラから、\\wsl$\にてアクセス可能です。

2.Dockerの導入

公式サイトからインストーラーをDownloadしインストールする。

https://docs.docker.com/desktop/setup/install/windows-install/

3.設定

Dockerの設定からWSL(今回はUbuntu)を許可してあげると使用することができます。

4.まとめ

こんな感じでWSLを使用し、Dockerの環境構築をしてみました!

ぜひご参考になれば嬉しいです。

データベースのインデックス設計でパフォーマンスを向上させたい

はじめに

データベースのパフォーマンスを向上させる手段としてお手軽でかつポピュラーな方法としてインデックスを作成する方法があります。
しかし、お手軽といってもやみくもに作成すればよいのではなく、しっかりと考えて使わなければ恩恵を受けることはできません。そこで今回は、インデックスを作成するポイントと注意点を最も一般的に使用されるインデックスであるB-treeインデックスを例に解説していきます。

そもそもインデックスとは?

まずはインデックスについて軽く触れます。データベースにおけるインデックスとはレコードを高速に効率よく検索するための≪索引≫です。特定の列を識別できるキー値とそれに結び付けられる実データ、あるいはポインタが格納されています。イメージとしては本の巻末についている索引に近いですね(キー値とポインタ=単語とその単語が載っているページ)。

B-treeインデックス

インデックスと一言にいってもその種類は様々あります。今回は利用頻度の高いB-treeインデックスについて見ていきます(以降インデックスと記されている場合はB-treeインデックスを指している思ってください)。

B-treeインデックスの構造を簡単に図に表すと上記のようになります(正確にはB+treeという構造らしい)
特徴として

  1. ルートノードと子ノードはキー値と子ノードへのポインタを持つ
  2. リーフノードはキー値とデータへのポインタを持つ

といった点が挙げられます

なぜB-treeインデックスが多く使われるのか?

B-treeインデックスには以下のような長所が挙げられます

1.平衡木であるためどのデータに対しても計算量が一定になる

B-treeは平衡木と呼ばれる構造をしています。平衡木はどのリーフもルートからの高さが均一であるため、どんなキーを使ってもリーフまでの距離が一定になります。キー値に左右されず探索を同じ計算量で行うことができます。

2.性能劣化が緩やかである

B-treeは最初に作られたときはきれいな平衡木であるが、テーブルの挿入や更新、削除が繰り返されることで徐々に崩れていき、非木構造のなっていくことがあります。そのため長時間の運用によって探索に費やすコストにばらつきが出るようになってしまいます(自動修復する機能も備わっていますがそれでも長時間運用による劣化は避けられません)。
しかし、B-treeの性能劣化は非常に緩やかであり持続性に優れています。それはB-treeが平衡木であるのと同時に平べったい木であるからです。B-treeのルートからリーフまでの高さは3~5で構成されていることが多く、このように背の低い木はデータの量が増加しても探索速度は変わらない特性があります

3.範囲検索も高速化できる

B-treeは構築されるときに必ずキー値をソートします。そのため特定の値以上・以下を探索というような絞り込みが可能になり、高速化を可能にします

インデックスを作成するのに適した例

インデックスの特徴を押さえたところで次はインデックス作成の恩恵が大きくなる例の特徴について解説していきます

例1:大規模なテーブルに対して作成する

当たり前ですが、レコード数の少ないテーブルにインデックスを作成しても大した恩恵を受けられません。それどころかインデックスは独自のインデックス領域を必要とするため、わざわざ領域を占有してまでインデックスを作成したのに検索性能が上がらない!といった事態になることも考えられます。
では、どのくらいのレコード数がインデックス作成の目安になるのでしょうか。これには明確な基準はなく、ストレージやサーバーの性能といった環境要因について変化しますがレコード数が10万以下の場合はほぼ意味がないと思ってもいいそうです(あくまで目安です)。

例2:カーディナリティの高い列

インデックス作成の判断基準として重要な要素にカーディナリティがあります。カーディナリティとは、ある特定の列における値の種類の多さを表す概念になります。例えば、社員が普通乗用車の運転免許を持っているか否かを表す列「免許所持」の列があった場合、取りうる値はおそらく「TRUE」か「FALSE」の2つでしょう。「免許所持」の列のカーディナリティは「2」ということになります。

このようにカーディナリティの小さい列にインデックスを作成してもあまり意味はありません。カーディナリティの目安は、「特定のキーを指定したときに、全体の5%に絞り込めるだけのカーディナリティがある」ことが目安になります。
しかし、注意点があります。それはカーディナリティが高くても、特定の値にデータが集中している列はインデックスの作成に向いていないという点です。極端な話ではありますが1~10000までの値をとる列があったとしても、1~9999の値は全体の0.1%しか取らず、残りの99.9%は10000の値をとるような列はインデックスの作成に向いていません。

例3:SQLで検索条件や結合条件として使用される列

これも当たり前の話ですが、検索条件や結合条件にならないような列にインデックスを作成しても意味がありません。WHERE句やORDER BY句、テーブル結合でON句に使われるような列にインデックスを作成するようにしましょう。

SQLでの注意点

先ほど、インデックスを作成する列の基準として「検索条件として使用される列」を挙げました。しかし、検索条件として使用されていてもインデックスが使われない場合がいくつかあります。

1.インデックス列に演算を行っている場合

インデックスを作成した列はSQLにおいて「裸」で用いるのが原則となっています

上記ではindex_col列にインデックスが存在するとします。このような場合、インデックスが保持しているデータはあくまで「index_col」に対してであり、「index_col」ではありません。なのでOK例のようなSQLを記述しなければいけません

2.IS NULLが使われている

インデックスはNULLをデータ値としてはみなさず、保持をしません。なのでIS NULLやIS NOT NULLに対しては有効てきではないです。一部のDBMSはIS NULLに対しても有効的に作用しますが、汎用性はあまりありません

3.否定形が使われている

4.前方一致以外のLIKE句の場合

LIKE句を使う場合は、前方一致の場合のみにインデックスが使用されます

以上になります。一部割愛しましたが、ほかにもSQLの記述次第でインデックスが使用されないパターンがあるのでぜひ調べてみてください。

その他の注意事項

SQL以外にもいくつか注意事項があるのでいくつかご紹介したいと思います

1.主キーや一意制約キーの列についてはインデックスを作成する必要がない

DBMSは主キー制約や一意制約を作成する際に、内部的にインデックスを作成しています。そのため、二重にインデックスを作成することになってしまいます。主キーや一意制約キーといった列をSQL文内の条件として使用する場合は、自動的にインデックスが使用されています

2.インデックスによって更新性能を劣化させてしまう

これについてはB-treeインデックスに限らず、インデックス全般に言われていることである。一般的にインデックスは独立したオブジェクトとしてDBMSに保持されている。そのため、インデックスの作成されている対象の列値が更新されると、インデックス内に保持している値も更新しなければならない。つまり、インデックスを作成すればするほどテーブルに対する更新性能が劣化していくというトレードオフの関係に注意してインデックスを作成する必要がある

3.定期メンテナンスの必要性

本記事内でも述べましたが、DBMSを長期的に運用していると、構造がだんだんと崩れていき劣化します。その為、定期的なインデックスの再構築を行うのが望ましいです。
頻度についてはシステムのデータ更新量によるため一概に言えないが、DBMSごとに指標がや調査方法が存在するため、マニュアルで調べてみると良いでしょう。

最後に

以上がインデックスの作成ポイントと注意点になります。こうしてみると実装がお手軽な反面、注意しないといけないことが多いことも分かったと思います。パフォーマンスを改善しようとしたのにかえってパフォーマンスが下がる…なんてことになりたくないですね。また、インデックス・ショットガンと呼ばれるようなアンチパターンも存在するそうなのでいずれ記事にしてみたいと思います。
以上、インデクス設計についてでした!

参考

「達人に学ぶDB設計徹底指南書 第2版」ミック・著

ファイアウォールについて

ファイアウォールって?

ファイアウォール(Fire Wall)とは、「コンピュータネットワークにおいて悪意ある通信や脅威から保護するため、通過させてはいけない通信を阻止するセキュリティシステム」のことを指します。現代で「ファイアウォール」というと、IT分野で使用されることがほとんどだと思います。

ファイアウォールは不正アクセスを遮断し、デバイスの安全性を保つ役割を担っていることから、私達が普段触れているWindowsやMacなどの主要OSにはほぼ必ず搭載されています。デバイスを使用する上では非常に重要な存在だと言えるでしょう。

「ファイアウォール」はどんなのがある?

ファイアウォールには、大きく「2つのカテゴリ」と「3つの保護方式」で分類されます。

1.カテゴリの種類

ファイアウォールは大きく以下2つのカテゴリーに分類され、それぞれで保護する主な対象が異なります。

パーソナルファイアウォール

私達が直接使用する、パソコンやスマートフォンなどの端末を主に保護します。

ネットワーク用ファイアウォール

名前の通り、社内ネットワークなどのネットワーク全体を対象に保護します。ファイアウォールというと、基本的にこちらを指す場合が多いです。

2.保護方式の種類

ファイアウォールは様々な方式で通信の可否を判断します。主な種類として、以下3つの方式があります。

パケットフィルタリング

パケットフィルタリングは、ネットワーク上の通信データを「パケット」という小さな単位で解析して判断する保護方式です。パケットの送信元アドレスや宛先アドレス、使用されるポート番号などの情報を基に通信の可否を判断します。

サーキットレベルゲートウェイ

サーキットレベルゲートウェイは、コネクション単位で通信の可否を判断する保護方式です。対象となるネットワークの中継役としての役割を果たし、ポート指定や制御を可能にします。

アプリケーションレベルゲートウェイ

アプリケーションレベルゲートウェイは、HTTPやFTPなどのアプリケーションプロトコルごとに検査・解析する方式です。プロキシ(代理)サーバーを介して切り離す方式なので、「プロキシ型ファイアウォール」とも呼ばれます。

ファイアウォールで何ができるの?

ファイアウォールは、ネットワークやデバイスを保護するための重要なセキュリティとして認識されています。一口にファイアウォールと言っても、いくつかの機能が存在し、複数の機能が組み合わさることで高度なセキュリティを実現しています。

フィルタリング機能

フィルタリング機能は、ファイアウォールの基礎的な機能の一つです。事前に送信元/送信先のルールを設定し、その設定に基づいて通信の可否を判断します。具体的には、送信元や宛先のIPアドレス、使用されるポート番号、通信のプロトコルなどの情報を基に、通信が安全かどうかを判断します。

IPアドレス変換機能

IPアドレス変換機能は、通常NAT(Network Address Translation)として知られている技術です。この機能は、インターネット上で主に使用する「グローバルIPアドレス」と、社内ネットワークで活用する「プライベートIPアドレス」を変換する役割を果たします。

ログ監視機能

ログ監視機能は、ファイアウォールを通過する全ての通信に関する情報を記録し、それらのログをリアルタイムで監視する機能です。このログには、通信の送信元と宛先のIPアドレス、使用されたポート番号、通信結果(許可・拒否)などの情報が含まれます。

【PHP】標準入力について

PHPの学習中に出てきた標準入力について理解を深めるために書いていこうと思います。

標準入力とは、外部から与えられた入力値を受け取ることができます。
ここでいう外部はキーボードからの意味が多いです。
なので、データはキーボードから入力されるという意味になります。

記載例として以下になります
例:trim(fgets(STDIN));

trim():第一引数に指定した文字列の先頭および末尾にあるホワイトスペースを取り除き、その文字列を返す。
fgets():第一引数に指定したファイルポインタから1行取得し、その文字列を返す。
STDIN:標準入力を表す定数。自動的に標準入力の値が入る。

という感じになります。
業務で見るというよりは、PaizaやSLスタジオなどの学習サイトで見ることが多いので
学習を始めてから懐かしい気分になりました。

以上、標準入力についてでした。

PHPでの配列の取り扱いについて

【PHPでの配列の取り扱いについて】

最近、配列を使っているときになんとなくで実装してるなと思ったので、ちゃんと理解するためにまとめていきたいと思います。

目次
――――――――――――――――――――――――――――
1 配列
2 連想配列(多次元連想配列)
3 比較表
4 まとめ
――――――――――――――――――――――――――――

1.配列
・添え字が数字
・0から始まって要素が増える毎に添え字の数字も1増える

# 初期化
$配列名 = [値1, 値2, 値3];
# 要素の追加
$配列名[] = 値;
# 要素にアクセス
$配列名[キー番号];

2.連想配列(多次元連想配列)
・添え字を自由に決められる配列

# 初期化
$配列名 = [
キー1 => 値1,
キー2 => 値2 ...
];
# 要素の追加
$配列名[キー名] = 値;
# 要素にアクセス
$配列名[キー名];

3.比較表
・それぞれの動きを表にまとめてみました。

コード 配列 連想配列 多次元連想配列
in_array
array_key_exists
array_merge

4.まとめ
配列はちゃんと理解して使うに越したことはないですね。
以上で、「PHPでの配列の取り扱いについて」でした~

Javaのセキュアなコーディング

はじめに

Javaは比較的セキュアなプログラミングである。Javaは文法上のルールが多く、従わなければコンパイルすら通さないため、そういった意味では開発経験が少ない人でも一定の品質を担保することができる。しかしこれはJavaのシステムが必ず安全であると保障したものではない。Javaには粒度の細かなセキュリティ機構が備わっており、取扱いに注意すべきリソースに対するアクセスを制御することができるが、システムの安全性が侵害されることは稀ではない。そこで今回は「Java コーディングスタンダード CERT/Oracle版」を基にいくつかの問題のあるJavaコードとその改善案を中心に紹介していく。また、今回紹介する問題点のはJavaだけに限らないため、自分が普段使用している言語と見比べるとよい。

1,文字列は検査する前に標準化する(IDS01-J)

第三者から値を受けとる場合、入力された値が妥当であるかの検査は必須である。例えばクロスサイトスクリプティング(XSS)はスクリプトを値として与え、攻撃を行う手法であるが、回避手段の方法として<や>の挿入を検査する方法がある。以下はその例である。

 

このような実装はあまりよろしくない。なぜなら入力値に”\uFE64″や”\uFE65″とあった場合、<>を検知できない可能性があるからだ。そのため、検査を行う前に入力値の標準化が必要になってくる。JavaではNormalizerクラスのstaticメソッドであるnormalizeメソッドで正規化を行っていく。以下は上記コードを改良し、文字を検査する前に標準化を行う例である。(今回は第三者からの入力を表現するためにコンソールオブジェクトを明示しているが実際に標準化を確認するにはソースコードで直接”\uFE64″や”\uFE65″を格納するのが望ましい)

 

入力値の検査を標準化前に行ってしまうと不正な値が実行されてしまう可能性があるため、上記のように標準化後に検査を行うことがセキュアなシステム開発に繋がる。

2,データメンバはprivate宣言し、それにアクセスするためのラッパーメソッドを提供する(OBJ01-J)

publicなど公開範囲が広いデータメンバ(以下メンバ変数)を定義してしまうとアクセスを制御することが困難となり、攻撃者に想定外の方法で操作される可能性がある。このようなことを考慮し、メンバ変数はprivateで宣言し、制御の手段としてgetterやsetterといったアクセサメソッドを定義するべきである。以下は問題のあるコードの例である。

 

このようなメンバ変数の定義はやめるべきである。以下のようにprivateで宣言しアクセサメソッドを用意するのが好ましい

 

このように実装すればアクセサメソッドを介さなければメンバ変数を変更できないのでセキュアなコーディングとなる。また、このような実装をカプセル化という。なお、今回は省略しているがsetterメソッドでは入力された値の無害化を行うべきである。

3,privateかつ可変なクラスメンバへの参照を返す前にそのディフェンシブコピーを作成する(OBJ05-J)

可変なメンバへの参照を返すと悪意ある攻撃者にシステムが侵害されてしまう恐れがある。そのため、可変オブジェクトを返す場合にはディープコピーを作成して返すべきである。これをディフェンシブコピーという。以下に問題のあるコードと改善案を記載する。

 

上記は不適切なコード例である。この場合、メンバの参照をそのまま返してしまうため攻撃者に変更される恐れがあるためディフェンシブコピーを作成して返すべきである。以下に改善案を記載する。

 

このように実装することで可変メンバの持つデータを保護することができる。

おわりに

今回はJavaのセキュアなコーディングについて紹介していきました。実際にシステムやアプリケーションを作成する際には、今回紹介した例以上にセキュリティを意識しなければなりません。利用者が安心して利用できるようにするためにはデータを適切に保護し、管理していかなければならないでしょう。

FFFTPは転送モードに気をつけよう

「FFFTP」とは、世界的に普及している有名なFTPソフトの一つで、
Windowsでファイルやデータを転送する際によく用いられています。

今回、業務上でFFFTPを用いた作業において、
ちょっとした問題が発生したので、備忘として記事を残しておきます。

1.発生事象

シェルスクリプト改修のため、FFFTP経由でLinuxサーバ上からシェルをローカル(Windows)に転送。
その後、改修後シェルをFFFTP経由でサーバに転送した後、シェルを実行した際にエラーが発生。

syntax error: unexpected end of file(expecting "fi")

2.原因

シェル改修時にファイルを転送する際、FFFTPの転送モードが“自動転送”モードになっていたため、自動的に改行コードが「CRLF」になっていた。
Linux環境は改行コードが「LF」でないと正常に実行できないため、エラーが発生していた。
(上記のエラーだと、改行後の「fi」(if文の最後)が処理できていない)

3.対応・対策

シェルの改行コードを「LF」に修正後、転送モードを“バイナリ”モードに変更後、再転送。
転送後、シェルを実行すると正常実行できた。
<対策>
①FFFTPのオプションからデフォルトの転送モードを設定できるので、転送モードをバイナリモードに設定しておく。
②ファイルの転送前に転送モードの確認をする。
(今回の事象は②の確認が漏れていたため発生した)

Laravelについて

Laravelとは、2011年後頃に開発されたPHPフレームワークです。

LaravelはMVC規約(Model(モデル)/View(ビュー)/Controller(コントローラー))に基づいたソフトウェア設計です。
MVCとはUI(ユーザーインタフェース)をと内部データを分けるデザインパターンの一つで、
自分以外のソフトウェア設計者が使いやすいようにパターン化してカタログのようにわかりやすくまとめたものになります。

コントローラーソースにメソッドを定義し、URLに紐づけを行い(ルーティング)、
そのURLにアクセスされた際に紐づいたコントローラーを実行することが可能になります。
定義の仕方として、Routeクラスを使用します。 例:Route::get(URL,実行したいメソッド())

以上のように、コントローラーファイルにURLを紐づけ、メソッドでhtmlなどで画面を呼び出し、出力することも可能です。

GitのpushコマンドでPermission denied (publickey).エラーが発生

発生した問題

いつも通りステージングとコミットが完了したのでPushコマンドを実行したらエラーで怒られました。
ついこの間まで何も問題なく実行できたので、何が原因でこのようなことになったのかは解明できませんでしたが、
解決できたため手順を議事録としてまとめます。

発生したエラー

  git@github.com: Permission denied (publickey).
  fatal: Could not read from remote repository.
  Please make sure you have the correct access rights and the repository exists.

解決策

結論からいうと、SSH接続の設定をすることで解決できました。

手順

  1. 「~/.ssh」ディレクトリ内で、以下コマンドを実行し、sshキー(公開鍵・秘密鍵)を生成する
  2. ssh-keygen -t rsa -C [GitHubメールアドレス] -f [作成する鍵の名前]

    上記のコマンドを実行すると、二つのファイルが生成されます。

    • 作成する鍵の名前・・・秘密鍵
    • 作成する鍵の名前.pub・・・公開鍵
  3. GitHubにログインして画面右上のプロフィールアイコンを押したのち、「Settings」ボタンを押してください。
  4. 開かれたページの左側にある「SSH and GPG keys」を押下して開いてください。
  5. 新規でSSH keysの設定を作成してください。
  6. 手順①で生成したファイルに拡張子「.pub」がついているファイルがあるので、中身をコピーして以下画像の赤枠内に貼り「Add SSH key」ボタンで登録することができます。
  7. 登録後に以下コマンドで接続テストを行ってください。
    ssh -T git@github.com

以下のようなメッセージが返ってきたら接続テストOKとなります。

Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.

最後にpushを行って完了です。

git push origin branch