OmniAICreator/Qiita-1.07M huggingface dataset:
Prometheusで永続化ディレクトリがpermission deniedになる時の対処法

## 問題
Prometheus公式のDocekrイメージを使い、以下の設定でPrometheusをデプロイ。

```yaml:docker-compose.yml
volumes:
  - /data/prometheus:/prometheus
```

デプロイ後にログを確認すると、

```
err="opening storage failed: lock DB directory: open /prometheus/lock: permission denied"
```
というエラーでコンテナが停止していた。

## 原因
Prometheus公式のDockerfile

```dockerfile:Dockerfile
...
RUN mkdir -p /prometheus && \
    chown -R nobody:nogroup etc/prometheus /prometheus

USER       nobody
EXPOSE     9090
...
```

/data/prometheusのディレクトリ情報 (例)

```bash
$ ls -l /data
drwxrwxr-x  3 user1 users 4096  5月 21 00:00 prometheus/
```

Dckerfileを見るとUSER nobodyが設定されている。
そのためnobodyユーザでディレクトリに書き込みが行われるが、
マウントした/data/prometheusディレクトリの所有者がnobodyではなかったためエラーになってしまった。

ちなみに、Prometheusコンテナの/prometheusディレクトリのパーミッションは、
デフォルトで以下のようになっている。

```bash
$ ls -l /
drwxr-xr-x    3 nobody   nogroup       4096 May 21 00:00 prometheus
```

## 解決策
### 1. 実行ユーザをrootに変更する

rootユーザでPrometheusを実行する。
rootユーザで書き込みが行われるためエラーにならないが、
コンテナに必要以上の権限を持たせてしまうためおすすめしない。

docker-compose.ymlに`user: root`を追記

```yaml:docker-compose.yml
version: "2"
services:
  prometheus:
    image: prom/prometheus:v2.9.2
    container_name: prometheus
    user: root #追記
    ports:
      - 9090:9090
    volumes:
      - /data/prometheus:/prometheus
```

### 2. その他ユーザにread, write権限を追加する

誰でも読み書きできるようになってしまうので注意が必要。

chmodでパーミッションを変更

```bash
$ sudo chmod 777 /data/prometheus
```

### 3. ディレクトリの所有者を変更する

chownで所有者を変更

```bash
$ sudo chown nobody /data/prometheus
```

合わせてディレクトリのグループを管理者のグループに設定しておく。

```bash
$ sudo chgrp monitor /data/prometheus
```

## 参考
- [What is the purpose of the nobody user](https://askubuntu.com/questions/329714/what-is-the-purpose-of-the-nobody-user)
セルの枠線に合わせて矩形を描画する

# 概要

セルの枠線に合わせて矩形を描画します.

[前回][1]の「できそうなこと」の検証です.

![draw_rects.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34777/1cf98a20-1226-cc86-c5dc-09f8a722b1b8.gif)

# コード

```vb
' セルの枠線に合わせて図形(矩形)を描画する
Sub DrawRectanglesOnCells()

    '矩形の個数
    Const RectanglesCount = 3

    ' 矩形の位置を計算する基本単位(BasicUnit).
    Dim BasicUnitX
    BasicUnitX = Cells(1, 2).Width
    
    Dim BasicUnitY
    BasicUnitY = Cells(1, 1).RowHeight

    ' 矩形を描画する初期位置(Offset)
    Dim OffsetX
    OffsetX = BasicUnitX * 1
    
    Dim OffsetY
    OffsetY = BasicUnitY * 3
    
    ' 矩形間に入れる空白行
    Dim BlankLineSizeY
    BlankLineSizeY = BasicUnitY * 2
    
    ' 矩形のサイズ
    Dim RectangleWidthX
    RectangleWidthX = BasicUnitX * 2
    
    Dim RectangleHeightY
    RectangleHeightY = BasicUnitY * 3
    
    '''''
    ' 矩形をループで描画する
    Dim i, Left, Top
    
    ' 初期位置
    Left = OffsetX
    Top = OffsetY
    
    For i = 1 To RectanglesCount
        ' 矩形を描画
        Call ActiveSheet.Shapes.AddShape(msoShapeRectangle, Left, Top, RectangleWidthX, RectangleHeightY)
        
        ' 次のTopを計算
        Top = Top + RectangleHeightY + BlankLineSizeY
    Next
End Sub
```




[1]:https://qiita.com/int_main_void/items/1dc98d22bb5560fcfb89#%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8C%E3%81%B0%E3%81%A7%E3%81%8D%E3%81%9D%E3%81%86%E3%81%AA%E3%81%93%E3%81%A8
【Unity】 AudioManagerの作り方

解説（一部修正あり：詳しくは追加へ）
https://youtu.be/0cms8lI8XEA

```csharp:AudioManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    [SerializeField] AudioClip[] seList;

    AudioSource audioSource;

    static AudioManager Instance = null; // staticをつけると別のファイルからでもアクセスできる

    public static AudioManager GetInstance()
    {
        if (Instance == null)
        {
            Instance = FindObjectOfType<AudioManager>(); // AudioManager.csのついたオブジェクトを探して代入する
        }
        return Instance;
    }
    private void Awake()
    {
        if (this != GetInstance())
        {
            // 探してきたオブジェクトが自分自身じゃなければ破壊する（AudioManager.csのついたオブジェクトは1つのみになる）
            Destroy(this.gameObject);
            return;
        }
        audioSource = GetComponent<AudioSource>();
        DontDestroyOnLoad(this.gameObject);
    }

    public void PlaySound(int index)
    {
        audioSource.PlayOneShot(seList[index]);
    }
}

```

#利用方法
・`seList`に音源を設定
・音を鳴らしたい場所で`AudioManager.GetInstance()PlaySound(0)`のコードを書く


#追加
音量にスライダーの値を設定していた。（スライダーはシーンが変わると破壊され、戻ってくると初期の値をとるため毎回同じ値をとる＝音量変えたのに変わらない現象）

```csharp
    void Start()
    {
        AudioManager.GetInstance().PlayBGM(0);
        OnChangedBGMSlider();
        OnChangedSESlider();
    }
```

以下の関数を追加して、スライダーに音量を設定すればOK

```csharp
    void Start()
    {
        AudioManager.GetInstance().PlayBGM(0);
        InitBGMSliderView();
        InitSESliderView();
    }

    public void InitBGMSliderView()
    {
        bgmSlider.value = AudioManager.GetInstance().BGMVolume;
        bgmVolumeText.text = string.Format("{0:0.00}", bgmSlider.value);
    }
    public void InitSESliderView()
    {
        seSlider.value = AudioManager.GetInstance().SEVolume;
        seVolumeText.text = string.Format("{0:0.00}", seSlider.value);
    }
```
Jetson NanoのCPU情報

# はじめに

買う前はGPUのことばかり見ていたので、CPUのことも調べることにした。

## lscpu
まずは`lscpu`から。CPUは`Cortex-A57`だった[1]。いつもなら買う前にチェックするはずが見た瞬間に衝動買いをしてしまったのでチェックしていなかった。

```bash
root@jetson-nano:~# lscpu 
Architecture:        aarch64
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
Vendor ID:           ARM
Model:               1
Model name:          Cortex-A57
Stepping:            r1p1
CPU max MHz:         1428.0000
CPU min MHz:         102.0000
BogoMIPS:            38.40
L1d cache:           32K
L1i cache:           48K
L2 cache:            2048K
Flags:               fp asimd evtstrm aes pmull sha1 sha2 crc32
```
Flagsの意味は参考文献2を参照。

## /proc/cpuinfo
続いて`/proc/cpuinfo`の確認。基本的に`lspci`コマンドで得られる情報と変わらない。

```bash
root@jetson-nano:~# cat /proc/cpuinfo 
processor	: 0
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 1
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 2
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 3
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1
```
各々の意味は
CPU implementer: 0x41 => ARM
CPU architecture: 8 => ARMv8
CPU variant: 0x1 => メジャーバージョン相当
CPU part: 0xd07 => Cortex-A57 (A53の場合は0xd03)
CPU revision: 1 => マイナーバージョン相当

# ホットプラグ対応

次にホットプラグ対応の確認。最初にカーネルのコンパイルオプションを確認すると有効になっている。

```bash
root@jetson-nano:~# zgrep CONFIG_HOTPLUG_CPU /proc/config.gz 
CONFIG_HOTPLUG_CPU=y
```

CPU1をdisableにしてenableに戻してみる。

```bash
root@jetson-nano:~# echo 0 > /sys/devices/system/cpu/cpu1/online 
root@jetson-nano:~# grep processor /proc/cpuinfo 
processor	: 0
processor	: 2
processor	: 3
root@jetson-nano:~# echo 1 > /sys/devices/system/cpu/cpu1/online 
root@jetson-nano:~# grep processor /proc/cpuinfo 
processor	: 0
processor	: 1
processor	: 2
processor	: 3
```
## CPUの速度

現在の速度(動的に変わる)。およそ200〜600MHzで変動。

```bash
root@jetson-nano:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
403200
518400
518400
518400
```

最大値は1428000/1024/1024〜1.36GHzに設定されていた。

```bash
root@jetson-nano:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
1428000
1428000
1428000
1428000
```

## 参考文献
[1] [ARM Cortex-A57 MPCore Processor Technical Reference Manual](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488d/index.html)
[2] [elf_hwcaps.txt](https://github.com/torvalds/linux/blob/master/Documentation/arm64/elf_hwcaps.txt "elf_hwcaps.txt")
RaspbianにUSBストレージを接続するときのメモ


## 環境

```
$ grep "PRETTY_NAME" /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
```

## 目的
USBで接続したストレージを自動的にマウントしたい

## 課題
OS起動する度に、デバイス名「/dev/sd*」が変わってしまう。
そのため、UUIDを指定してマウントする。

## 手順
1. 接続したデバイス名を確認する
2. 接続したデバイスのUUIDを確認する
fstabに追記する

### 接続したデバイス名を確認する
デバイスを接続するとdmesgに表示されるため、それを利用して確認する。
「SCSI」で抽出すれば、簡単に見つけられるはず。

```
$ dmesg |grep SCSI
[    0.083049] SCSI subsystem initialized
[    0.216904] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.272965] Loading iSCSI transport class v2.0-870.
[    5.843078] sd 1:0:0:0: [sda] Attached SCSI removable disk
[   16.091731] sd 0:0:0:0: [sdb] Attached SCSI disk
[   16.093804] sd 0:0:0:1: [sdc] Attached SCSI disk
```
今回の対象は`sdb`でした。

### 接続したデバイスのUUIDを確認する

blkidでUUIDが見れるので、それで確認する。
今回の対象ストレージのパーティションは１つのみなので、`/dec/sdb1`と指定した。

```
$ sudo blkid /dev/sdb1
/dev/sdb1: LABEL="hogehoge" UUID="XXXX-XXXX" TYPE="exfat" PARTUUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
```
欲しい情報である「TYPE」と「PARTUUID」をメモしておく。

### fstabに追記する

以下の書式でマウントするようにした。

```
PARTUUID=<PARTUUID>   <DIR>    <TYPE>    <OPTION>          0       0
```
以下ざっくりと何を記載するのか補足

|設定|説明|
|:--|:--|
|\<PARTUUID>|blkidで取得したUUID|
|\<DIR>|マウント先ディレクトリ ディレクトリは先に作成しておくこと。|
|\<TYPE>|blkidで取得したTYPE|
|\<OPTION>|マウント時のオプション|
\<OPTION>には`nofail`と指定する。
`nofail`を指定する理由は、デバイスが接続されてなければ無視したい為。
(無視しない場合は、デバイスが接続されていなければ、OSが立ち上がらなくなることあり。)

実際に追記した場合の内容を以下に記載。

```
PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /media/usb1    exfat    nofail          0       0
```

fstabに記録後は`mount -a`コマンドで一斉にマウントし、`df`コマンドでマウントできたか確認する

実際に入力したコマンドを以下に記載

- マウントされているか確認

```
$ df|grep /media/usb1
```
- /etc/fstabをバックアップ

```
$ sudo cp -p /etc/fstab /etc/fstab.old
```
- マウント情報を追記

```
$ sudo vi /etc/fstab
```
- マウントポイントのディレクトリを作成

```
$ sudo mkdir /media/usb1
```

- マウント

```
$ sudo mount -a
FUSE exfat 1.2.5
```
- マウントされているか確認

```
$ df|grep /media/usb1
/dev/sdb1       3907017728 1877196800 2029820928   49% /media/usb1
```

## 参考サイト

[【 mount 】コマンド――ファイルシステムをマウントする](https://www.atmarkit.co.jp/ait/articles/1802/15/news035.html)

[fstab](https://wiki.archlinux.jp/index.php/Fstab)
QLab AppleScript: next cue list <cueListの切り替え>

**QLab4でscript cueを使って指定したcue listをアクティブにする.**

はじめにお読みください→[About Qlab AppleScript](https://qiita.com/kooky_mice/private/6ad9380fca6b14eb01a0)  

改良版を作成しました. → [QLab AppleScript: next cue list MK-II <cueListの切り替え>
](https://qiita.com/kooky_mice/items/01e0965554abb060b143)

#AppleScript
Scriptはscript cueのscriptタブに直接書き込む.

```applescript:next_cue_list.scpt
set nextcueName to "Target_cueList"
set selectcueNumber to "select_cueNumber"

tell application id "com.figure53.QLab.4" to tell front workspace
	set current cue list to first cue list whose q name is nextcueName

	tell current cue list
		if selectcueNumber is "" then
			set tagCue to get first cue
		else if selectcueNumber is not "" then
			set tagCue to get every cue whose q number is selectcueNumber
		end if
	end tell
	
	set selected to tagCue
	go
end tell
```


##Setting
+ アクティブにしたいcue listの名前を`set nextcueName to "Target_cueList"`の
**Target_cueList**に指定する.

+ 指定したcue list内の選択したいcueのNumberを`set selectcueNumber to "select_cueNumber"`の**select_cueNumber**に指定する. 未指定でも可能.

+ cue listの名前は日本語にも対応.

+ 指定する名前に""を含む場合はバックスラッシュ(\\)でエスケープする. 
***例)cue listの名前がBGM "Monday"の場合:*** `set nextcueName to "BGM \"Monday\""`

###Variable
- Target_cueList
 - <font color="Red"> 必須 </font>
 - 目的とするcueListの名前を指定する.

- select_cueNumber
 - <font color="Blue"> 任意 </font>(default: first cue)
 - 切り替えてアクティブになったcueListの中で選択するcueNumberを指定する.
 - 未定義の場合、切り替えたcueListの先頭のcueを選択する

###Option
+ script cueを実行時にアクティブにしたcue listのcueをスタートするには`set selected to tagCue`の下に`go`を追加する. 選択状態で待機にする場合には`go`をコメントアウト(`--go`)する. 

#Environment
+ macOS High Sierra (10.13.6)
+ QLab 4.4.5

#Reference
[A CUE LIST A DAY - The QLab Cook Book](https://qlabcookbook.com/1996/01/19/a-cue-list-a-day/)
gatsby.jsのbuild 時の'TypeError: Cannot read property 'split' of null'エラーの対処

#はじめに
`gatsby.js`と`firebase`でアプリを作成しているのですが、上記のエラーが生じ、「`gatsby develop`ではうまくいっているのに`gatsby build`になるとうまくいかない、、、なぜだ、、、」となったので今後の為にメモ。

こちらの[github issue](https://github.com/gatsbyjs/gatsby/issues/6668)がドンピシャで解決してくれたのでこちらを見ればOKだと思います。


#対処方法
##ざっくりbefore/after
**before**

```javascript
const db = firebase.firestore();
const storage = firebase.storage();
const auth = firebase.auth();
```

**after**


```javascript
    
let db, storage, auth;

if (typeof window !== 'undefined') {
    db = firebase.firestore();
    storage = firebase.storage();
    auth = firebase.auth();
}
```

##何をしてるのか
読んでコードのごとく、windowオブジェクトの存在をチェックしてfirebaseの各種moduleを呼び出しています。なんでこんなことをするのか。

##エラーの原因

gatsby.jsはbuildの際にNode.js環境でhtmlをレンダリングするようです。そのため、window objectが存在しません。なのでwindow objectを明示したコードを記述したりするとbuildがうまくいかなかったりします。

今回の場合はwindow objectを使用しているわけではないのですが、Node.js環境でfirebase.auth()を呼び出していることが原因でした。firebaseのclient side sdkはブラウザー環境で使用されることを前提としているため、Node.js環境はダメでしょ!ってなことみたいです。

 `gatsby build`時のlogでwarning出してくれてました。

```
Warning: This is a browser-targeted Firebase bundle but it appears it is being 
run in a Node environment.
```

ちなみに、どこでsplit propertyが呼び出されていてエラーが生じているのかまでは深掘りしていません、、、、


#参考
[[v2] TypeError: Cannot read property 'split' of null when building #6668](https://github.com/gatsbyjs/gatsby/issues/6668)
mavenとjar

■問題点
gitからpullしたスキーマをもとにdbfluteのmanager.batを実行し
自動生成クラス及びH2DBを最新化。
ただし、アプリケーションからDBアクセスしようとするとjarが古いせいか
古いスキーマのテーブルを参照しようとしてエラー

■切り分け
①jarファイルはpomの依存関係が示すjarファイルか？
  ⇒ jarファイルをリネームしアプリケーション起動時にClassNotFoundExceptionが出るかどうか。
     出た場合は②へ
     
②jarファイルだけの問題であるか？
　⇒　別のメンバからjarファイルをもらい自分のPCに配置する。動けばjarファイルが原因　③へ
      変わらなければmavenの依存関係等を疑う。

③どこのソース,クラスファイルをもとにjarファイルが生成されるか。
  ⇒ 何回かjarを作成しなおしたがjarファイルの中のクラスファイルの更新日付が固定であったことから外部から引っ張ってきていると思われる。ばからしいが、Lanを引っこ抜いたあとにjarファイルの作成に失敗すれば外部からということになる。

④外部からではない場合、mavenをクリーンしてみる。クラスファイルおよびソースファイルの一部を
　削除してもなお同様のjarファイルが作成されるのであれば、自分が把握していないパッケージをもとにjarファイルを作成していることになる。その場合、頑張って探すしかないね。
一番わかりやすいパンくずの実装（gem 'gretel') 

今回はパンくずの実装についての記事を分かり易く説明します。

#### パンくずとは？
下記の画像のように画面遷移してきて、自分がどの位置にいるのか視覚的に分かり易く表示しているこれらをパンくずと総称しています。
また、リンクも持たせられるので、画面を戻る際にクリックしたら遷移するのでUI的にも優しいです。

>下記メルカリの参考画像です。
![スクリーンショット 2019-05-22 0.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383660/4b378680-cd7e-7f7e-8157-8e6c9af25c9f.png)


### 導入手順

使用gemは下記です。

```
gem 'gretel'
```
***
### :writing_hand:  _breadcrumbs.html.haml（パンくずview）の説明

パンくずを表示させるViewを部分テンプレートに分けておく。
（分けないでも良いが、変更や調整の際にメンテナンスを容易にするため）
下記以外の方法もあるが、私の場合は分かり易く呼び出されたコントローラーと、その先のアクション名でパンくずの表示を切り替えれるようにcase文を使い組んでいる。
>case文については過去の記事を参考にしてください。
┗ [case文での条件分岐方法](https://qiita.com/params_bird/items/b23f619a2d3e41baa825)

`case params.values_at :controller, :action`の部分は
binding.pryでデバックした際にコントローラー名とアクション名が入っているのを確認できるので、
`when ['users', 'show']`とすることでusersコントローラーのshowアクションに遷移したい際にこちらが参照される。

`breadcrumb :user_showの部分`は次々項で説明する`config/breadcrumbs.rb内`のメソッドを呼び出すためのメソッド名（`readcrumbs.rb側`のメソッド名）。
少し紛らわしいが、先にこちらでメソッド名を命名してしまって`readcrumbs.rb側`に当てがった方がスムーズなので私の場合はこのような手順で進めています。

末尾にあるに下記のコードは、表示を区切る際に間に入る記号などを指定できる。
見慣れない文字が入っている部分はHTMLの特殊文字になる。
下記のサイトのように様々な記号を当てれる。
https://www.benricho.org/symbol/tokusyu_02_arrow.html

```
= breadcrumbs separator: " &nbsp;&nbsp;&#12297;&nbsp; "
```
上記の結果が下記のように変換される。
＞の前後に空白を入れている。
= breadcrumbs separator: " &nbsp;&nbsp;&#12297;&nbsp; "


```app/views/shared/_breadcrumbs.html.haml
- case params.values_at :controller, :action

- when ['users', 'show']
  - breadcrumb :user_show

- when ['user_chat_rooms', 'index']
  - breadcrumb :user_chat_rooms_index

= breadcrumbs separator: " &nbsp;&nbsp;&#12297;&nbsp; "

```
***
### :writing_hand: 部分テンプレート反映の準備


上記の部分テンプレートをパンくずを表示させた場所に下記のようにおく。
大体の場合はヘッダーの下に置かれていることがほとんどだと思うので、
**ヘッダーの部分テンプレート中に組み込ませた方が効率は良いと思う。**

```
 =render 'shared/breadcrumbs'
```

***
### :writing_hand: gretel（パンくず）メソッド作成


次にconfig下にbreadcrumbs.rbを作成し下記のように記述。
**`linkの後に続く部分に画面に表示させたいパンくず名を入力する。`**
後にroot_pathやuser_chat_rooms_path(user_id:current_user.id)とあるが、
こちらはパンくずの表示部がクリックされた際に画面遷移するためのpathなので、クリックして遷移の必要がなければ記述しなくてのよい。
parent :rootの部分は親のメソッド名を記述する。

```config/breadcrumbs.rb
crumb :root do
  link 'ホーム', root_path
end

crumb :user_show do
  link "#{current_user.name}"
  parent :root
end

crumb :user_chat_rooms_index do
  link "メッセージ一覧",user_chat_rooms_path(user_id:current_user.id)
  parent :user_show
end
```

#### 完成
そして最終的には下記のようになる。
![スクリーンショット 2019-05-22 1.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383660/42abb0cf-75df-02f7-c00b-a539529237ad.png)


``
子音を保ったまま音声の無音区間を削除する

# 無音区間が邪魔だから削除したい
DNNに音声データを与えるにあたって無音区間は大敵なようです。特に今私が取り組んでいるリアルタイム音声変換では邪魔です。なのでそれを取り除きます。

### 修正記録
5/22: コードを、median/2以下を削除するものからmaxが定数以下のところを削除する方法に変更。こちらのほうがブレが少なかった。


# 方法
無音区間の削除自体はpydubだとpydub.silence.split_on_silence、librosaだとlibrosa.effects.splitを使えばできます。

しかしこれらの手法は

- db単位で無音区間を定義するため、子音まで削除されてしまう
- まとめてFTなどするときに誤差部分も考慮されて変換されてしまう

といった問題点があります。どちらもできる限り避けたいです。

なので私は先に離散コサイン変換 -> そのまま無音区間削除といった形をとりました。

## コード
```python
sound = np.array(sound.get_array_of_samples()).astype('f')
sound = sound[:2 ** 18].reshape((-1, 2 ** 9))

convert = dct(sound, norm='ortho')

abs_c = np.abs(convert)[:, :comp//2]
where = np.where(np.max(abs_c, axis=1) < 512)[0]

convert = np.delete(convert, where, axis=0)
```

~~離散コサイン変換したものを絶対値にして足し合わせます。無音は基本的に低周波の方にエネルギーを持たないので省けます。
256までを使っているのは、子音は低周波にエネルギーを持たないからです。32など、もっと低い数値でしてしまうと普通の手法と同様に子音が消えてしまいます。~~

~~中央値を2で割っているのはそのままでは消えすぎ感があったからです。もうちょっと工夫の余地があるかも。~~

前の方法だと状況に左右されすぎていたのでもっと単純にmaxで考えることにしました。これだと声が小さいデータの場合ほとんど残らなくなってしまうので、そこそこのボリュームで録音する必要があります。

# 結果
スペクトルを載せときます。
### before
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305208/3ee35e56-afb6-3382-b3e0-182e91f9ea30.png)


### after
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305208/b0a6b343-3023-ce79-5a41-97c1ecff0786.png)

（高周波帯は出力していません）
しっかり削除されているのがわかります。音をチェックしても消えすぎずちょうどいい具合でした。

もっと普遍的な感じのやり方があればいいなあ
日本ICT企業の強みとは

※このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。

以前はヨーロッパで技術を発明し、米国で技術を利用して事業化し、日本で事業を実用化すると言われた時代があったと言われます。
しかし、技術が多様化してグローバルな競争力も高まり、そのような多様化した社会で当たり前の育った若者たちも、日本企業で働く意味を探しているように思います。

ちなみに私はバブルがはじけた後に、業績が回復しはじめた1998年に会社に入社しました。ある意味で企業の地位は確立されており、先輩達が切り開いた道を先輩達に置いてかれずに着いていくのに必死でした。このため、日本企業の強みを改めて考えることもなく、ガムシャラに仕事をしてきたのが正直なところです。
そんな偉大な先輩達が引退しはじめて、我々が企業の中心社員となり、技術革新により従来のビジネスモデルの転換が迫られている現状において、新たに日本企業の強みを考えさせられることが多いのは私だけでしょうか？

危惧しているのは、日本の成長期には、日本の古い風習などにとらわれず、新たなグローバルな視点を持った人材が貴重だったはずです。保守的な日本企業において、グローバルな視点で刺激を与える人材は貴重な存在で、現在の企業ではそういった人たちが企業活動を牽引しはじめています。
ただ、そういった人材は日本の古い文化・風習を破壊することを善しとされてきたため、日本の良さを振り返ることが苦手で、それを嫌う傾向があるように思います。

しかし、グローバル社会であるからこそ、グローバルだけに目を向けていると日本企業の存在価値が失われ、グローバルの荒波に飲まれてしまうのではないかと危惧しており、今こそ日本企業の強みを意識する必要があるのではないかと思ってなりません。

では、日本企業の強みとは何でしょうか？
一般的に日本の良さは高品質や組織力などと言われますが、我々は特別に高品質・組織力を培うための教育を受けてきた意識が無く、仮に高品質や組織力が強みだったとした場合、それは我々が日本の文化や風習の中で自然と身につけたものだと考えられます。
それでは、その強みはどのような文化や風習から日本企業の強みが生まれているのか考える必要があると思っています。
以下に浅はかながら、私が思う日本企業の強みを説明します。

# 農耕文化
国の特徴は、その国の文化が狩猟文化なのか農耕文化なのかが大きく影響していると言います。私は日本の強みには、日本が農耕文化であることが大きく影響していると思っています。
狩猟文化の民族は、その日に獲物を捕まえられるかどうかは、まずは獲物に遭遇できるかが重要で、安定した生活をするのが難しいです。このため、生活するためには、いかに素早く行動し、獲物がいないと分かれば生活拠点を変えることも重要となります。
一方で農耕文化の民族は、農作物を育てやすい土地を探し、その土地に耕して1年後の収穫に向けて計画的に作業することが重要となります。また、収穫が終われば田畑の維持して改善し次の年に備えることになります。
このため、狩猟文化では住まいが定着しないため個人の能力が重要となるが、農耕文化では長く同じ住まいに定着して地域コミュニティが広がってお互いに助け合いがはじまると言われます。
一方で村八分などの言葉があるように、地域のルールに違反すると仲間はずれにされるため、地域の習慣・ルールを守ることが重視されると言われます。

この農耕文化の特徴が日本の強みであるチーム力につながっていると思います。
行動する前に計画を重視し、その計画通りにチームで足並みを揃えて実行して目標を達成することが日本のチーム力の強みの源泉と言えるのではないでしょうか？
ただ、これは弱みでもあります。まずは計画が重視されるあまり、新たなチャレンジへの着手が遅く、計画を立てて行動をはじめたら軌道修正が難しいという特徴です。

ICTの開発現場で言えば、事前に計画を立てて開発を進めるウォータフォール開発は日本のチーム力を発揮しやすいですが、素早く動いて軌道修正するアジャイル開発は日本ではなかなか難しいのは日本の特徴によるものだと思います。

# 四季がある
日本国土の特徴として、四季があることも特徴と言われます。
一年中暑かったり寒かったりする国もある中で、日本には春夏秋冬の四季があり、梅雨などもあります。
日本人はこの四季の変化を感じ取り、農作業の管理を微調整したり、食料が腐らないように食料の保管方法を変更したり、衣替えをしたりする必要があります。

この四季があることにより、日本人の繊細な感覚が生まれ、作業を緻密に調整する感覚が生まれていると思われます。

この四季があることが日本の強みである高品質につながっていると思います。
環境の違いを意識し、それに合わせて慎重に検証を繰り返すのです。
また、農耕文化では、四季への対応を怠ると1年間の生活の死活問題になることも、影響していると思っています。

# 島国である
島国であることも日本の特徴に影響を与えると思っています。
島国では、よそ者の侵入が頻繁に行われないため、よそ者に対する抵抗感・新たな変化への抵抗感が強いと言われます。
逆に地域コミュニティの絆が強く、仲間意識が強いという特長もあります。


#終わりに
さて、どうでしょうか？
文化というものが、どれだけ人間に影響を及ぼしているのか半信半疑である反面で、上記のように考えると日本の根底にある文化が、日本の強み・弱みに通じていると思えてなりません。
この日本の根底にある文化から来る強み・弱みを意識し、日本企業の価値をとらえた上で、グローバルで戦うのか考える必要があるのではないでしょうか？
【HTML】tableタグで表をマークアップするSEO上のメリットとは？

ご存知の通り、`table`タグはテーブル（表）を作成するタグです。

過去には、`table`タグは携帯サイト（ガラケーサイト）を作る際にレイアウト目的で使用されたりしてましたが、 `table`タグは基本的にはテーブル（表）を作成するためのタグです。

そんな`table`タグですが、ちゃんと表をマークアップする際に使用することで、とあるSEO上のメリットに繋がります。

今回は、そんな`table`タグ実は・・・をご紹介します。

#tableタグを使わずにdivタグとCSSでも表は作れる

確かに`div`タグとCSSを使えば、`table`タグを使わなくてもレイアウトを組むことで、表のようなものは作成できるでしょう。

ただ、そういうやり方をオススメしているサイトや人をたまに見かけますが、ぶっちゃけ全くオススメできません。
（SEOを考えると大きなデメリットになるので、、）

その理由としては、Google検索結果の「**強調スニペット**」が関わってきます。

#強調スニペットについて

強調スニペットとは、 Googleサーチで「○○とは」「○○ 意味」など、主に情報の収集を検索意図としたクエリ（インフォメーショナルクエリ）に対して、回答となるページを検索結果の最上部に強調して表示する機能です。

##例）
[「SEO」で検索した結果](https://www.google.com/search?q=SEO)
![「SEO」で検索した結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67591/95846135-a9b2-8819-a815-e4be1e169809.jpeg)

検索結果の最上部に強調されて、SEOの内容を要約した文章が掲載されていると思います。これが「**強調スニペット**」です。

強調スニペットは、検索者の何かを知りたい・探している、また疑問や悩みを解決するために行う検索の意図に対して、最速でその答えを返すことを目的としています。
（※ナレッジグラフと混同されるが、ナレッジグラフと強調スニペットは異なるもの）

#表組み形式のスニペット

強調スニペットには、いくつかのタイプが存在しますが、その一つが**表組み形式**のスニペットになります。
具体的には以下のようなものです。

##例）
[「金相場」で検索した結果](https://www.google.com/search?q=金相場)

![「金相場」で検索した結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67591/26ae8f52-f72f-79d9-ed10-5fdf81b5e102.jpeg)

最上部に掲載されているページの内容を見てみてください。
ページ内に表示されている金相場の表が、Google検索結果にそのまま表として表示されているのがわかるかと思います。

これが**表組み形式**のスニペットです。
表組み形式は価格比較系のクエリに対して表示されるケースが特に多いです。

#どうやって強調スニペットとして設定しているのか？

検索結果での強調スニペットについては、Googleは「Search Console ヘルプ」にて以下のように回答しています。

> *自分のページを強調スニペットとして設定できますか？*

> *ご自分のページを強調スニペットとして設定することはできません。Googleでは、ユーザーの質問に対する> 回答がページに含まれていることをプログラムで判断し、その結果を強調スニペットとして表示します。*

[検索結果での強調スニペット - Search Console ヘルプ](https://support.google.com/webmasters/answer/6229325?hl=ja)

残念ながら、明示的に表組みを強調スニペットとして設定する仕組みは現在のところありません。

#表は必ずtableタグでマークアップしておく

強調スニペットがプログラムで自動生成される以上は、**クローラーに「表」を「表」として認識してもらう必要性**があり、情報を正しく伝える為に`table`タグでマークアップしておく必要があります。

`div`にするのか`table`にするのか、、検索結果での表示のされ方から視えるオーガニック流入の成果を考えれば、ここはSEOの運命の分かれ道といっても過言ではありません。

別のケースで表を画像化するなんていうのは、もってのほか！
たまにそのケースも見かけますが、単純に機会損失しているだけです。

強調スニペットは、表組み形式以外にも、リスト形式や文章形式もありますが、リストに関しては、`li`タグでマークアップすることが重要になってきます。

#最後に

もうお分りですよね？
結局はちゃんと文章構造を理解して、正しいHTMLのマークアップを行なっていれば、SEOに関して何も心配することはありません。
webとネットワーク技術 ~TCP/IP インターネット層~

インターネット層はネットワークで繋がっているコンピュータや機器とのバケット(細切れにしたデータのこと)をやりとりする上でのルールを定めている部分。IP、ARP、ICMPといったプロトコルが組み込まれている。

## ルーティングとは
インターネット層で大きな役割を果たすのがルーティングです。ルーティングはバケットをどこに送るのかを探索し、バケットを中継し、転送してくれます。このルーティングの機能をもった機器がルータになります。バケットは複数のルータを経由して転送先までバケットを送ってくれます。

## IPとは
ルーティング機能を使ってバケットを送信先のIPアドレスへと送る役割のことをIP(Internet Protocol)といいます。

## IPアドレス
ルーティングでバケットを送る住所に当たるのがIPアドレスです。IPアドレスはネットワークでつながったコンピュータやサーバーのような機器をそれぞれ識別するための一意な数字のことです。間違えやすいものとしてMACアドレスがあります。IPアドレスがバケットを届ける最終的な場所であるのに対して、MACアドレスが次にバケットを送る先を指定するのに使われます。

## ICMPとは
IPの働きをサポートしてくれるもので、実際に送ったバケットが転送先に送られているのかを確認し、もし届いていなかった場合はエラーメッセージを通知してくれる役割を持っています。

## ARPとは
IPアドレスに基づいてMACアドレスを取得してくれる仕組みです。IPアドレスで異なるネットワークからの位置情報を割り出せますが、実際に送るとなるとLAN内での通信にはLAN内の位置情報であるMACアドレスが必要になります。ARPはこのMACアドレスをIPアドレスから割り出してくれるものです。
「いかがでしたか」タグについて

# 対象

[いかがでしたか](https://qiita.com/tags/%E3%81%84%E3%81%8B%E3%81%8C%E3%81%A7%E3%81%97%E3%81%9F%E3%81%8B)

# 説明

1. 記事の内容のみを見て（コメントを見ずに）内容を信用しないようにする、警告を促すタグ
記事自体には誤りを含んでいても、コメント欄等の有意な議論を残すため等に利用する。

2. 「しょうもない“いかがでしたかブログ”」を題材として扱った記事

# 出典

[【JS】いかがでしたか！？値渡しと参照渡しの使い分け！？](https://qiita.com/Yametaro/items/21f7b1a4ae09f16f323e)

@lensoukoのコメントより

> [僕はこれでこの系統のネタを知ったかなぁ](https://forest.watch.impress.co.jp/docs/review/1174083.html)
> 窓の杜：しょうもない“いかがでしたかブログ”を警告するGoogle Chrome拡張
> 
> Qiita向けではないけれど、検索して引っかかる人も多いようだし特定の言語をディスってるだけの感じ悪い記事よりはマシかなぁという気はしなくもない
> ただ、タグに「いかがでしたか」か「いかがでしたかブログ」か何かぱっと見いで分かるようにしてあると親切かな
> それなら知ってる人なら初めからネタだと思ってみる事が出来るので

# 補足

本執筆者は@Yametaroさんを「Respect（尊敬）」、「Trust（信頼）」しています。
本記事は、最初の[タグ説明について](https://qiita.com/j5c8k6m8/items/2359627ff8c3778d95f6)のための記事です。
UnityでSQLiteをAndroid(64bit対応)向けに導入する

# UnityでSQLiteをAndroid(64bit対応)向けに導入する

# 概略の手順

- [公式サイト](https://www.sqlite.org/download.html)から最新版を取ってきます。
- パッケージ内のプラグイン名に合わせてDllImportの引数を書き換える(※1)か、逆にAARパッケージ内のプラグイン名を変更(※2)します。
    - ※1) 未検証です。
    - ※2) 例えば`[DllImport ("sqlite3", ~`なら、`sqlite-android~.aar/jni/*/libsqliteX.so` ⇒ `libsqlite3.so`でいけます。
- AARパッケージのままで、"Assets\Plugins\sqlite3\Android"とかに配置します。

# 留意点

- AARパッケージはZIPファイルなので、ファイル名を「sqlite-android-xxxxxxx.aar.zip」などと変更することで内部にアクセスできます。
- パッケージからフォルダ構造ごとファイルを取り出してAssetフォルダに配置することも可能ですが、そのままのファイル名だとビルドの際にUnityの同名チェックに引っかかります。

# 参考
- [SQLiteUnityKit拡張ライブラリ](https://qiita.com/tetr4lab/private/0e8b8cf0f20049e46c7d) (Qiita)
k3OSをWindows10のHyper-Vで動かしてみた

# これなに？
[RancherLabs](https://rancher.com/)が公開している[k3s](https://k3s.io/)の実行に最適化された軽量なLinuxディストリビューションである[k3OS](https://k3os.io/)(こちらの公開もRancherLabs)をとりあえず自宅のWin10のHyper-Vで起動まで試してみたのでその記録です。

---
# 環境とか
- CPU：Intel Core-i9-9900K
- メモリ：DDR4-3000 16GB
- OS：Windows10 Pro ver.1809
- ハイパーバイザー：Hyper-V ver.10.0.17763.1
- k3OS：ver.0.2.0

※Hyper-Vはすでに有効化されている前提で進めますので、ここでは有効化の手順は省きます。

---
# 1. OSイメージの準備
まず、k3OSのISOイメージをダウンロードします。　※DL先：https://github.com/rancher/k3os/releases
今回は記事執筆時点で最新リリースバージョン`v0.2.0`の**k3os-amd64.iso**をダウンロードします。
![k3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/875e811e-642c-57ff-7454-dd13653be8d0.png)

---
# 2. 仮想マシンの作成
「スタートメニュー」→「Windows管理ツール」→「Hyper-V クイック作成」から仮想マシンの作成ウィザードを開きます。
![k3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/ea2406e1-6f90-2e6f-9390-b6d5cc83c08f.png)

---
ダウンロードしたISOイメージを選択するために「ローカル インストール元」を選択します。
![k3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/ad953a48-b837-a29b-e90a-3b67dc74e614.png)

---
Windowsセキュアブートのチェックを外し、「インストール元の変更」からダウンロードしたISOイメージを選択します。
![k3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/a0042ed2-34e4-885a-3d54-8717bdaaffe5.png)

---
ISOイメージを選択したら、「仮想マシンを作成」をクリックして作成します。
※必要に応じて「(その他のオプション)」を開いて仮想マシンの名前を変更したり、仮想ネットワークスイッチを選択してください。
![k3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/8caf8fed-1539-eefe-d21d-3fb8116dda04.png)

---
作成が完了すると以下のような画面になるので、「接続」をクリックします。
![k3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/ce9c1f03-2d88-65bb-1cc7-02b738e58acf.png)

---
# 3. k3OSをインストール
それではさっそく「起動」をクリックして起動してみましょう。
![k3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/448d2afb-ce2c-65ae-d7b1-e4cbd6fc5b5c.png)

---
放置して待っていると、ISOイメージからk3OSがライブ起動します。
![k3-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136925/9a695614-6d4a-4084-6f10-cc104e9dedb8.png)

---
ユーザー名`rancher`でパスワードなしで入れるのでログインし、`sudo os-config`でインストールを始めましょう。
※githubの個人アカウントからsshの公開鍵を取得してデーモンに登録してくれる機能がありますが、今回は外部との通信はさせたくないのでその方法は使いません。

```bash
# 基本はEnter押していくだけです。
# ユーザー名「rancher」のパスワードの設定は適宜してください。
# 最後に出てくる'Your disk will be ～～'は'y'でEnterしないといけません。
```

そうすると、インストールが始まります。しばらく待っていると再びログイン画面になります。
このログインの時のユーザー名も`rancher`ですが、バスワードが聞かれるようになっているはずです。
※聞かれない場合は仮想マシンをもう一度作り直してください。

---
ここまでくればkubernetesのクラスターが構築されて稼働しているはずです、`kubectl`で動作を確認したりPodを起動したりしてみましょう！
※まだ不安定な部分もあるので困ったらREADMEやissueを見に行くといいかもしれません。
※外部ネットワークに接続する場合はHyper-Vで仮想switchを設定すれば通信できます。
　（セキュリティ的に怖いので自分は内部switchだけ構築しました。）

---
# 4. 最後に
イメージも400MBと軽量でAlpineベースでビルドされている(？)みたいですね。
k8s on k3sとかks3 on k3sとかできるのかな？　実用性とかはともかく、できると幅が広がるかもしれないですね。

**以上、おつかれさまでした！**
初投稿と練習

#1,見出し
プログラミング(python,R)を始めて1年半、今まではQiitaを読むだけでしたが、これからは何かやったら、発表しようと思いました。

#2,コード挿入
```python:hello.py
print("hello")
```



#3,リンク
[pubmed](https://www.ncbi.nlm.nih.gov/pubmed/ "パブメド")

#4,字体
_practice_
*practice*
__practice__
**practice**

#5,表
|身長|体重|腹囲|
|:---|:---:|--:|
|180cm|65kg|70|
|左|中|右|

6,最後に
以上練習でした。
"Screen Space - Overlay"なCanvasのuGUI要素が、Orthographicなカメラで3Dオブジェクトの背後に隠れてしまう

# 前提

- unity: 2017.4.27f1、2018.4.0f1
- unity Asset Store: [Alpha Mask](https://assetstore.unity.com/packages/tools/sprite-management/alpha-mask-ui-sprites-tilemaps-particles-3d-29764)

# 状況

- "Screen Space - Overlay"なCanvasに配置したAlpha Maskを施したImageが、Orthographicなカメラで3Dオブジェクトの背後に隠れてしまいます。
- カメラがPerspectiveだと正しく表示されます。
- Android向けにビルドして実機で実行したときに発症し、PC向けビルドでは発症しません。
    - エディタでは起きたり起きなかったりしますが、条件は特定できていません。

# 課題

- カメラのOrthographic/Perspectiveに拠らず、マスクされたuGUIの画像が、3Dの前面に表示されるようにしたいです。

# 結論

- Alpha Maskに含まれる2D用シェーダ(Sprites-Alpha-Mask-WorldCoords.shader)中の、"ZWrite Off"と書かれている辺りに1行追加して、"ZTest [unity_GUIZTestMode]"を加えることで解決可能です。

"unity_GUIZTestMode"は、[マニュアル](https://docs.unity3d.com/ja/current/Manual/SL-CullAndDepth.html)に記述が見つけられなかったのですが、[この辺り](https://support.unity3d.com/hc/en-us/articles/115000531226-What-is-the-value-of-shader-ZTest-mode-unity-GUIZTestMode-)に拠れば「Canvasのタイプに応じて適切な値になる(Screen Space - OverlayならAlways)」もののようです。

# 解決までに試したこと

- unityのバージョンを変えて試しました。
- unityのプロジェクト設定(品質やグラフィック)を色々試しました。
- Alpha Maskの開発元に問い合わせました。
    - (解決したことも報告しましたが、記事執筆時点(2019/5/22)までには何も返信ありません。 ⇒ 5/24 返信をいただき、「次の更新に含めるかも」とのことでした。)
- Alpha Maskのシェーダーを標準のUI用シェーダー(UI-Default.shader)と比較して、相違点をひとつずつ変更して試しました。
[PHP その１]LAMP環境とは？

# シリーズ記事一覧
　[[PHP その０]　Web系初心者だけど今後のためにも１から勉強してみる](https://qiita.com/yaiza/items/d96d7a6c4bbcc9b3cd3d)
　[[PHP その１]　LAMP環境とは？](https://qiita.com/yaiza/items/c830a41c86cf6b3c65f9)
　[[PHP その２]　開発環境の構築とHello World](https://qiita.com/yaiza/items/2a4f807e9bfda07c16f3)
# 物事を知るには大枠から知ろう
プログラムについて新しく勉強するときは、初めにその言語がどんな目的で使用されるのか知ると非常に効率が上がると思う。おそらく言語を数多く学んでいる人は過去に学習したことのある似た用途の言語と無意識に照らし合わせながら学習すると思う。まあだいたい言語の説明がされている体系的な文章には書いてあることだろうと思うが。
だからまずはPHPがどんな目的で、どんな環境で使われているのかから知っていく。

# PHPはどんな目的で使用されるのか
[PHP その0](https://qiita.com/yaiza/items/d96d7a6c4bbcc9b3cd3d)でも記述したため繰り返しとなるが、PHPとはサーバーサイドで動作するスクリプト言語である。この**サーバーサイド言語**であるという点と**スクリプト言語である**という点から、以下のように使われる言語であることが想像できる。

1. サーバーに対してユーザから[要求]が飛んでくる
2. PHPが[要求]をサーバー上で処理する
3. 何かしらの処理した結果をユーザに対して返却する

調べてみるとどうも正しそう。

[【PHP入門講座】 PHPで出来ることと処理の流れ](https://qiita.com/mpyw/items/176fb1f6fb75da74339f)

スクリプト言語って言われたらこんなのか。

```
cmd.exe abc.bat
```

おそらく似たような感じで以下のように実行するのだろう

```
php.exe createReturnHTML.php
```
要求に対してスクリプトを実行して結果となるhtmlを生成してリターンするのだ。

なるほど
React mapをつかってリストを作る

配列データの要素分のリストを作りたい場合は、JSX内でmapを用いて展開するパターンとrenderメソッド内でmapを用いて展開したリストを変数に格納し、JSX内で展開するパターンがある。
##JSX内パターン
```jsx
class App extends React.Component {
  constructor(props) {
    super(props)
    this.state={
      colors: ["red","orange","black","green","blue","white"]
    }
  }
  render(){
    return(
      <div>
        <ul>
          {this.state.colors.map( c =>
            <li>{c}</li>
          )}
        </ul>
      </div>
    )
  }
}

```




##renderメソッド内パターン
```jsx

class App extends React.Component {
  constructor(props) {
    super(props)
    this.state={
      colors: ["red","orange","black","green","blue","white"]
    }
  }
  render(){
    const colorsDOM = this.state.colors.map(c => <li>{c}</li>)
    return(
      <div>
        <ul>
          {colorsDOM}
        </ul>
      </div>
    )
  }
}
```
英数字の判定　python

#isalnum() 
このメソッドは、文字列中ののすべての文字が英数字(a-z, A-Z, 0-9)かどうかを判定する。
>全角文字も判定します

```py
>>> print('aｂ12３'.isalnum())
True
>>> print('ab123#'.isalnum())
False
```

#isalpha() 
このメソッドは、文字列中のすべての文字が英字(a-z, A-Z)かどうかを判定する。
>全角文字も判定します

```py

>>> print('aｂｃD'.isalpha())
True
>>> print('abcd1'.isalpha())
False
```

#isdigit() 
このメソッドは、文字列中のすべての文字が数字(0-9)かどうか判定する。
>全角文字も判定します

```py

>>> print('１2３4'.isdigit())
True
>>> print('123edsd'.isdigit())
False
```

#islower() 
このメソッドは、文字列中のすべての文字が小文字の英字(a-z)かどうか判定する。
>全角文字も判定します
小文字+大文字小文字の区別の無い文字だけで構成された文字列にも True を返します。

```py

>>> print 'abｃd123#'.islower()
True
>>> print 'Abcd123#'.islower()
False
```

#isupper() 
このメソッドは、文字列中のすべての文字が大文字の英字(A-Z)かどうか判定する。
>全角文字も判定します
小文字+大文字小文字の区別の無い文字だけで構成された文字列にも True を返します。

```py

>>> print 'ABCD123#'.isupper()
True
>>> print 'Abcd123#'.isupper()
False
```
プログラマーの仕事ってどんなのがあるの？？

自分のようにプログラミング初心者の人は
何も考えなしに勉強しがちだそうです。

エンジニアにはいったいどんな種類があるか
どの業界、職種があるかを知ることは大事だなと思いました。

以下いろんなサイトからまとめたので
自分みたいなプログラミング初心者は
ぜひ参考にしてみてください。


①Webエンジニア

Webサイトやモバイルサイトで使用するWebアプリ
(ブラウザを介して利用するアプリ)を開発する職業

☆働き方

・SE
プログラマーに指示を出す仕事。
プログラムを書く仕事ではない。

・SIer(システムインテグレータ)
外部からシステム開発の依頼を受けて開発するもの
システム構築する費用で収益を上げている
二次請け、三次請けという構造がある

・Web業界
お客さんからサービス利用料を払ってもらい収益を上げている。
自社サービスのため開発者が社内にいる
WEBを利用したサービスを提供している企業
アジャイル開発(１～１４日でリリースを進める小さな開発
を繰り返し進めていく開発プロセス)が中心

②インフラエンジニア
ITインフラを設計・構築、運用、保守を行うもの
サーバー、ネットワークの深いスキルが必要
お客様の希望のヒアリングし、ITインフラの作成を決定する
企業向けのシステム構築をしている企業
ウォーターフォール開発(大規模開発)が中心

☆働き方

・開発系
基幹系システム、パッケージソフトなど、
実際にユーザーが利用するためのアプリの設計から実装
リリースに至るまでが主な業務

・インフラ系
アプリそのものをデプロイ(Webアプリなどのシステム開発工程において
システムを利用可能な状態にすること)するためのサーバーや、
複数の拠点間でサービスを利用するためのネットワークを構築するもの。
開発されたシステムやアプリを入れるための箱を
設計構築、運用する業務

③クラウドエンジニア

インターネット上にあるコンピュータやサーバを雲に例えることから
クラウドと呼ばれている。
クラウド上でシステムを設計、構築し運用していくこと
クラウド登場以前はシステム開発で必要なハードウェアは
全て自社で管理する「オンプレミス」が一般的だったが、
クラウド登場後は、離れた場所にいる人とでも作業を共有したり、
社内、社外問わずアクセスできるといった様々なメリットがある

☆働き方

オンプレミスからクラウドに移行する企業に向けたサービス。
AWS(Amazon Web Service)が主流のため知見が求められる。
インフラエンジニアの間でもクラウドが導入されており、
今までは現場に行ってエラー対応していたものを
クラウド上で対応することが出来るようになっている。

④機械学習エンジニア

人工知能(AI)開発に特化したエンジニアのこと
PythonやRのプログラミングスキルが必須。
様々なデータを取り扱うためデータサイエンティスト
の知見も必要であり、データからよりよい答えを
導き出すことから数学的知識がかなり必要な分野。

☆働き方
インフラやクラウドとも関連あり。
機械学習エンジニアが人材不足として目立っている。
人材の奪い合いとなり機械学習エンジニアの単価は
相当な額になるとされている。


＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

簡単にまとめてみましたが、
将来性でいうと機械学習エンジニアが一番かと考えますが、
初心者がここに挑戦できる次元のところではないと思いました。

初心者がとっつきやすい言語は、Ryby、Ruby On Rails
だということが分かったのでWeb業界に入れるように
これから勉強していこうと思いました。

Git,Git hub、My SQLの勉強もしていく必要が
あると思うので徐々に広げていこうかなと思ってる次第です。
Magic Leap MagicScript Landscape Application. UiLoadingSpinner

Prepare
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```sh
magic-script init my-sp org.magicscript.sp "Spinner"
cd my-sp
```

**Code**

Change app.js

```jsx
import { LandscapeApp, ui, resources } from 'lumin';
const { 
    UiLinearLayout
  , UiCircleConfirmation
  , UiText
  , EclipseLabelType
  , Alignment
  , UiLoadingSpinner
  , LoadingSpinnerType} = ui;

const {
     FontStyle
   , FontWeight
} = resources;

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const label3d = UiText.Create(
        prism, "Particle FX Style:", FontStyle.kItalic, FontWeight.kBold);
    label3d.setTextSize(0.0393);
    layout.addItem(label3d
      , [0, 0, 0.08, 0]
      , Alignment.CENTER_LEFT);
    
    const loadingSpinner3d = UiLoadingSpinner.Create(
        prism, LoadingSpinnerType.kParticlePackage
    );
    layout.addItem(loadingSpinner3d
      , [0, 0, 0.02, 0]
      , Alignment.CENTER_CENTER);
    
    const label2d = UiText.Create(
        prism, "2D Particle FX Style:", FontStyle.kItalic, FontWeight.kBold);
    label2d.setTextSize(0.0393);
    layout.addItem(label2d
      , [0.08, 0, 0.02, 0]
      , Alignment.BOTTOM_LEFT);
    
    const loadingSpinner2d = UiLoadingSpinner.Create(
        prism, LoadingSpinnerType.k2dSpriteAnimation
    );
    loadingSpinner2d.setSize([0.0314, 0.0314]);
    layout.addItem(loadingSpinner2d
      , [0, 0, 0.02, 0]
      , Alignment.BOTTOM_CENTER);
    prism.getRootNode().addChild(layout);
  }
}
```
**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**
UiLoadingSpinner(Magic Script API Doc)
https://docs.magicscript.org/lumin.ui.UiLoadingSpinner.html

Loading Spinners (UiLoadingSpinner) (Guide C++) 
https://creator.magicleap.com/learn/guides/luminrt-uiloadingspinner

magicscript
https://www.magicscript.org/

Thanks!
RedGL Release Master_V5.0 (WebGL Library)

RedGL Release Master_V5.0 (RedGL is Webgl library)

Release Note : https://github.com/redcamel/RedGL2/releases/tag/Master_V5.0 …
Github : https://github.com/redcamel/RedGL2 
Example : https://redcamel.github.io/RedGL2/example/ 
Document : https://redcamel.github.io/RedGL2/redDoc/ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341019/bcb58163-626b-9302-8379-9351e17c15d1.png)
自分の要件定義

# 自分のやりたい事（要件定義）
- だんだんとズレてきたので、自分のやりたい事（要件）を再定義
- 元々はAPIを叩いてその出力結果の特定箇所を確認。特定の値ならOK、違うならNG。みたいな事を自動で実行出来ないか思った。そしてそれをGOでやりたいと思ったのがきっかえ
- 調べた限りではgoogle apps scriptや他でも出来るようだけど、GOの勉強も兼ねてやってみたいと思った事が事の始まり

# 実際にやってみた
- 本での勉強もだんだんと飽きてきたので、少し早いかもしれないが実際にやってみた
- そしてダメ（涙
- サンプルコードの流用、サンプルコード自体を動かしてみるもダメ
- いつものごとく参った。でも諦めないし諦められない。また明日

```
package main
import (
    "log"
    "net/http"
)
func main() {
    /* GETメソッドでURLにアクセス */
    res, err := http.Get("https://www.google.com/")
    if err != nil {
        log.Fatal(err)
    }
}
```

- 実行結果

```
$ go run google.go 
# command-line-arguments
./google.go:10:5: res declared and not used
```
[Docker for Windows]Kubernetesを動かしてみる

# やること
- kubernetesのダッシュボードを起動させるところまで

# 環境
- Windows 10 Pro
- Docker for Windows
- PowerShell

# 実行手順

## 起動確認
~~~ console:powershell
PS> kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop

~~~

## context切り替え
- 使用するクラスタをdocker-for-desktopに切り替える

~~~ console:powershell
PS> kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
~~~

## master(Docker for windowsが起動しているPC)が1台起動している

~~~ console:powershell
PS> kubectl get nodes
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    22h       v1.10.11
~~~

## 動作しているpodを確認

~~~ console:powershell
PS> kubectl get po --all-namespaces
NAMESPACE     NAME                                         READY     STATUS    RESTARTS   AGE
docker        compose-74649b4db6-8md2t                     1/1       Running   1          22h
docker        compose-api-5fdd448dcf-x4vd2                 1/1       Running   1          22h
kube-system   etcd-docker-for-desktop                      1/1       Running   1          22h
kube-system   kube-apiserver-docker-for-desktop            1/1       Running   2          22h
kube-system   kube-controller-manager-docker-for-desktop   1/1       Running   1          22h
kube-system   kube-dns-86f4d74b45-jgzdn                    3/3       Running   3          22h
kube-system   kube-proxy-8phd7                             1/1       Running   1          22h
kube-system   kube-scheduler-docker-for-desktop            1/1       Running   1          22h
~~~

## kubernetes-dashboardのデプロイ
- kubernetes clusterの管理ができるdashboardをデプロイ
- 設定ファイルは以下のものを使用<br>
https://github.com/kubernetes/dashboard
- 記載されているコマンドを実行

~~~ console:powershell
PS> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

~~~

## アクセストークンの発行

~~~ console:powershell
PS> $TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
PS> kubectl config set-credentials docker-for-desktop --token="${TOKEN}"

~~~

## ダッシュボードを起動しアクセス
~~~ console:powershell
PS> kubectl proxy
Starting to serve on 127.0.0.1:8001
~~~

- 以下にアクセス<br>
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

- ~/.kube/config をセット

![2019-05-21_23h32_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/0e23cadb-a810-7f67-6a9a-a548f7cfbc74.png)

![2019-05-21_23h34_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/78b435d1-d66e-00ba-8e27-10964b1af804.png)

- 無事アクセスが出来ました。
- powersellで行いましたが、手順の最初からWSLで実施する方法もあるようです。
Unity2Dで左右を反転するときにrotation Yを180にするのは良くない

## Unity2Dで左右を反転するときにrotation Yを180にするのは良くない
scale X を-1に設定するのが良いです。

rotation Yを180に設定することは、Y軸の周りに180度回転させることを意味します。
これは2D画面においてはそのコンポーネントの裏側を表示することになります。
この状態だとボタンが動作しないなどの不具合が発生します。
scale X を-1に設定するようにしましょう。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Leetcode #72: Edit Distance

```swift
func minDistance(_ word1: String, _ word2: String) -> Int {
    if word1.isEmpty {
        return word2.count
    }
    if word2.isEmpty {
        return word1.count
    }
    var word1 = Array(word1)
    var word2 = Array(word2)
    var dp = Array(repeating:Array(repeating: 0, count: word2.count + 1), count: word1.count + 1)
    for i in 1...word1.count {
        dp[i][0] = i
    }
    for j in 1...word2.count {
        dp[0][j] = j
    }
    for i in 1...word1.count {
        for j in 1...word2.count {
            if word1[i-1] == word2[j-1] {
                dp[i][j] = dp[i-1][j-1]
            } else {
                dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
            }
        }
    }
    return dp[word1.count][word2.count]
}
```
Google Colaboratory を始めて使うときの注意点

#はじめに
Google Colaboratoryは設定不要で無料で使えるjupyter notebook環境で、GPU、TPUを無料で使えるのが強みです。

[Colaboratory へようこそ - Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

初めて使ってみて引っかかったところを備忘録としてまとめます。
#GPU、TPUを使えるようにする

デフォルトではGPUでもTPUでもないので注意が必要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/a97a16e3-056a-3096-1dc1-b715c66939c0.png"width=60%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/78b3f714-bfa0-3f1b-9861-8107f7d8fdff.png"width=60%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/4a8c0e6e-3314-b6b3-cdeb-1225b739b33a.png"width=60%>



#ファイルの入出力
ファイルのアップロードも簡単です。
###アップロード

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/ef91b7fb-bfcf-fba0-7f19-8c4775fe5be8.png"width=60%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/a85a23fe-b11a-f756-cfc0-152e654bbadf.png"width=60%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/92ee5829-4f3e-366b-05c9-2d4d132d54f4.png"width=60%>

ここで、この方法は簡単ですがアップロードが驚異的に遅い点にも注意が必要です。
Google Driveから読み込むのが速いです。


###ダウンロード

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396634/8b70e92b-7d70-c1ae-3312-85ecb0eb3faa.png"width=60%>



こちらは思いのほか簡単にできるようです。
pandasのseriesにインデックスのリストを渡してまとめて処理する

seriesにリストを渡せることを知ったので具体例を書いておきます。

まず適当にseriesを生成して、


```python
import pandas as pd

labels = ["a","b","c","d","e"]

series = pd.Series(index=labels)
```

a   NaN
b   NaN
c   NaN
d   NaN
e   NaN



```python
series[["a","b","e"]] = [1,2,3]
```

a    1.0
b    2.0
c    NaN
d    NaN
e    3.0


まとめて処理できて便利そうです。
csvをpickleで保存して読み取りを速くする

#はじめに
データ読み込みに毎回何十秒もかかっていたらデータ分析どころではありません。
pickleで保存したら速いようなのでその方法と欠点をまとめます。

#csvをpickleで保存する
```python
import pandas as pd

df = pd.read_csv("/Users/data/alldata.csv")
```
csvを読み込んで

```python
df.to_pickle('alldata.pickle')
```
これでpickleが出力されます。

#pickleを読み込む

```python
df = pd.read_pickle('/Users/data/alldata.pickle')
```
適切なパスを指定して読み込みます。

ちなみに各々かかる時間を計測すると、

```python
%time df1 = pd.read_pickle('/Users/data/alldata.pickle')
%time df2 = pd.read_csv('/Users/data/alldata.csv')
```
CPU times: user 3.36 s, sys: 2.86 s, total: 6.22 s
Wall time: 6.82 s
CPU times: user 29.2 s, sys: 8.65 s, total: 37.8 s
Wall time: 42 s

6倍ほどの差があるようです。

###利点と欠点

pickle速いから全部それでいいや、という訳ではなく、csvはデータが破損してもまだ救いようがありますがpickleは厳しいです。
大事なデータはcsvとpickle両方とも出力しておくのが良いでしょう。
文系学生のプログラミング学習2日目ー悩みー

#誕生日診断作成

今日はドットインストールで誕生日診断をつくりました。
getTime要素やgetAge要素を使って引き算を利用して、生まれてからの日数と年齢を出すシステムです。
JavaScriptでは月を0~11で表すので注意が必要です。
また、配列を使うことでコードが少なくないり、見やすいコードになるので意識していきたいです。




#最近の悩み
ElementByIdというものを使って作成をしたのですが、これの使い方がいまいち分かりませんでした。
動画内の状況では理解できるのですが、いざ自分で何かを作るときにこの知識を使える自信がありません。
ドットインストールやprogateをやることでifやwhileの意味は分かるのですが、いざ実践になったときにどう使うのか分からなくなります。
単純な勉強だけでなく、LP模写であったり、自分でサービス作るなりをしたほうが良いんですかね。
初心者の方々がどのような勉強をしているのか気になります。

終わり
Netlify で記事に設定した日付とURLの日付がズレる

## 概要
どうもこんにちは。わりとニッチな話ではありますが、自分の作っているブログサイトで、記事に設定した投稿日時と、日時をもとに生成されるURLに含まれる日付が合わない、という問題がありました。今日はその詳細や、どうにかして解消した方法などを記事に残してみたいとおもいます。

## 前提
私のブログサイトは Hexo で作成し、Netlify で動かしています。(下記参照)
[Hexo + Gitlab + Netlify で yahoo ジオシティーズの引越し先を作った話 - Qiita](https://qiita.com/tommy_aka_jps/items/565143f5719ed862364b)

Hexo のバージョンは 3.8.0 です。現時点での最新ですね。

## 今回の話
例えば新しい記事に対して、下記のように投稿日時を設定します。

```yml:new-post-example.md
---
title: 記事タイトル
date: 2019-05-21 01:15:43
categories:
- ['小ネタ']
tags:
- 'また小ネタか'
---
```

これをもとにビルドすると、本来であれば下記のようなパスで閲覧できることを期待します。

```:期待されるURL
https://ドメイン/2019/05/21/new-post-example/
```

ところが、このURLでは404になります。実際には下記のようなURLでないとアクセスできません。1日古いです。

```:実際ビルドされたURL
https://ドメイン/2019/05/20/new-post-example/
```

## 結論
**`_config.yml` とは別に Netlify 側のタイムゾーンの設定が必要です。**

Netlify 上で `hexo generate` した場合の記事のURLに含まれる日付文字列の値は **UTC** 基準で決定されているようです。そのため、記事に設定した日付時刻より -9 時間で計算されるようです。UTC と判断した根拠はズレがちょうど 9 時間であったためです。

`_config.yml` に設定した私のサイトの timezone は Asia/Tokyo です。なので本来は UTC+9 時間が期待される値です。

```yml:_config.ymlより一部抜粋
timezone: Asia/Tokyo
```

URLではなくサイトのページに表示される日付は期待した数値が返ってきていますので、`_config.yml` の設定が間違っている、というわけではなさそうです。URLに使われていない、というかんじです。さらに、localhost 環境では build してもURLとのズレは発生しませんでした。完全に build を実行する端末依存ということなのでしょう。ちなみに開発に使っている端末だと JST が表示されますので、localhost 環境では日本時間を元にした URL が生成される、ということになります。

```
$ date
2019年 5月21日 火曜日 01時22分09秒 JST
```

以上から URLの生成には `_config.yml` で設定したタイムゾーンは使われておらず、端末側の明示的な設定が必要ではないか、と考えた次第です。

## Netlify 側で build 時のタイムゾーン設定を変更する

ということで Netlify 側のタイムゾーン設定を変更してみます。Netlify の環境変数を変更する方法が公式ドキュメントで下記のように記載がありました。

[Continuous Deployment#Environment Variables | Netlify](https://www.netlify.com/docs/continuous-deployment/#environment-variables)

> - In the netlify.toml file. Variable values set in the netlify.toml file will override values set in the UI.
> - In your site dashboard under Settings > Build & deploy > Environment > Environment variables. Variable values set under site settings will override the team-level settings.

厳密にはもうひとつがありますがここではスルーします。下記にて簡単にご紹介します。

### 方法1. netlify.toml で設定する
下記ファイルをプロジェクトの直下に作成すればOKです。簡単ですね。環境変数丸見えなので、セキュリティ的にあまりよろしくなさそうな情報はここには書かないほうがいいですが、Git 管理できるというメリットはあります。

```toml:netlify.toml
[build.environment]
  TZ="Asia/Tokyo"
```

より詳しい書き方は下記リンクをご覧ください。

[netlify.toml Reference | Netlify](https://www.netlify.com/docs/netlify-toml-reference/)

### 方法2. Netlify 上で設定する
サイト選択 > settings > Build & Deploy > Environment から設定できます。今回の場合は下記画像のような設定になります。あとは Save を押せば完了です。`netlify.toml` を使った場合とは逆に Git 管理こそできないものの、こっちのほうが安全です。
![スクリーンショット_2019-05-21_15_44_101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/39362674-7242-f965-e805-d4b4f0d93535.png)

環境変数に追加したいものの内容や状況に応じて使い分けてください。タイムゾーンの設定くらいなら別に外部に知られてもそこまで困らないと考えたのでこのケースでは `netlify.toml` に追加して対応しています。

## 結果
タイムゾーンを設定し、再度ビルドをかけたところ無事意図通りのURLで生成されました。一安心です。

## さいごに
似たような件でお悩みの方がもしいらっしゃいましたらご参考いただければと思います。また、これから Netlify に何か成果物をデプロイする予定のある方は何もしないとタイムゾーンが UTC で動いてしまうことを心の片隅に置いてもらえれば幸いです。(ちなみに私はこんなチョイネタを解決するのに数日がかりでした＼(^o^)／)
Failed to execute 'createElement' on 'Document': The tag name provided ('static/media/icon.ac7a4370.svg') is not a valid name.

react-svg-loaderを使い表題のエラーが出た場合はwebpack.configに以下の設定を追加してください

```javascript
config.resolve.extensions.push('.svg')
config.module.rules = config.module.rules.map(data => {
  if (/svg\|/.test( String(data.test)))
    data.test = /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani)(\?.*)?$/
  return data
})
config.module.rules.push({
  test: /\.svg$/,
  use: [
    { loader: require.resolve('babel-loader') },
    { loader: require.resolve('react-svg-loader') }
  ]
})
```