OmniAICreator/Qiita-1.07M huggingface dataset:
ZIP圧縮を織り交ぜながらフォルダをコピーするExcelマクロ

#### これは何か
ファイルパスの長さを考慮しZIP圧縮を織り交ぜながらフォルダをコピーするExcelマクロ

#### なぜ作ったか

事象：客先に成果物を納品するためのDVDを作成する際にエラーが発生
原因：フォルダの階層が深くなりパスの長さが255を超えたため
対処：適当なところでサブフォルダをZIP圧縮する

この「対処」を手動でやっていて面倒だったので自動化したかった


#### SpecialThanks/引用元
以下の記事を参考にさせていただきました
　[VBA で Zip ファイルを作成する](https://qiita.com/RelaxTools/items/375492175ef902e59ca5)

#### 注意
上記の記事をきっかけに、かねてからのアイディアを形にしてみましたが、
まだ実戦投入していないので、意図通りに動くか確認できていません
お気づきの点があればご指摘ください

#### コード
```vb
Option Explicit
' Microsoft Scripting Runtime
' Windows Script Host Object Model

Const MAX_LEN = 200
Const DOT_ZIP = ".zip"
Const DOT_PS1 = ".ps1"

Sub CopyOrArchive(fromDir, toDir)
    Dim fso As FileSystemObject
    Dim wsh As WshShell
    Dim fDic As Dictionary
    Dim cDic As Dictionary
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wsh = CreateObject("WScript.Shell")
    Set fDic = CreateObject("Scripting.Dictionary")
    Set cDic = CreateObject("Scripting.Dictionary")
    

   'コピー対象をDictionaryに格納する処理を呼び出す
    MakeDic fso.GetFolder(fromDir), fDic
    
   'PowerShellのコマンドを編集する
    Dim f, dest, cmd
    For Each f In fDic
        dest = Replace(f, fromDir, toDir, , 1, vbTextCompare) & fDic(f)
        cmd = IIf(fDic(f) = DOT_ZIP, "Compress-Archive", "Copy-Item")
            
        cDic.Add cDic.Count, Join(Array("New-Item", DQ(dest), "-Force"))
        cDic.Add cDic.Count, Join(Array(cmd, DQ(f), DQ(dest), "-Force"))
    Next
        
   'PowerShellのコマンドをファイルに出力し、実行する
    With fso
        Dim ps1
        ps1 = .BuildPath(.GetSpecialFolder(2), .GetTempName & DOT_PS1)
        With .CreateTextFile(ps1)
            .Write Join(cDic.Items, vbLf)
            .Close
        End With
    
        wsh.Run Join(Array("powershell", "-ExecutionPolicy", "RemoteSigned", "-File", DQ(ps1))) , 0, True
        
        .DeleteFile ps1, True
    End With
    

    Set fDic = Nothing
    Set cDic = Nothing
    Set fso = Nothing
    Set wsh = Nothing
End Sub

Function MakeDic(fol, dic)
   'コピー対象をDictionaryに格納する処理
    Dim f
    
   '直下のフォルダ・ファイルのパス長がひとつでも基準を超える場合は
   'このフォルダをZIP圧縮の対象として格納し、処理を抜ける
    dic(fol.Path) = DOT_ZIP
    For Each f In fol.SubFolders
        If Len(f.Path) > MAX_LEN Then Exit Function
    Next
    For Each f In fol.Files
        If Len(f.Path) > MAX_LEN Then Exit Function
    Next
    dic.Remove fol.Path
    
   '直下のフォルダ・ファイルのパス長が基準を超えない場合は
   'ファイルをコピー対象として格納し、サブフォルダは再帰処理する
    For Each f In fol.Files
        dic(f.Path) = vbNullString
    Next
    For Each f In fol.SubFolders
        MakeDic f, dic
    Next
End Function

Function DQ(strPath)
   'ファイルパスをダブルクォーテーションで囲む
    DQ = Replace("""*""", "*", strPath)
End Function
```

#### 欄外
いっそ全部PowerShellで作れたら、とも思うが……
PS2Linux boot on USB-Memory

どなたでも入手が可能で完全にFreeな起動の為に挑戦しています。。
あまり需要があるかどうか..... 
SONY PLAY STATION2 LINUX boot on USB-Memory編
SCPH-37000Lを使用しています。
【必要な準備】
KernelLoader【検索】packageが数種ありますので適当に！
FreeMcBoot【検索】PLAYSTATION2の起動を操作可能にします。

以下をDOWNLOADします。

1.vmlinux.gz
2.initrd.gz
3.DISC.BIN
4.CONFIG.TXT

5.kloader3.0.elf

USB-MemoryのTOPディレクトリにPS2NSとゆう名前でフォルダの作成をして、
USB-Storageである
mass:/PS2NS/に1.VMLINUX.GZ 2.INITRD.GZ 3.DISC.BIN 4.CONFIG.TXTを入れてしまいます。
CONFIG.TXTはUSBのTOPディレクトリです

PS2のメモリ－カ－ドスロットにFreeMcBootを差し込み起動してuLaunch.ELFを起動させます。
導入に必要なSONY PLAYSTATION2の自由起動を可能にするFreeMcBootはAmazon.co.jpで販売されています。。

これを使用して
なにかしろの方法でkloader3.0.elfの起動をさせると自動的にPS2でLinuxが起動します。

現在 Linux Kernel 2.6.35.4を実験していますが、一切HDD無しでPLAYSTATION2で直接Linuxが起動している状態で試行錯誤しています。

X-WindowSystemは以前は機能していたのですが現在は機能していません。

このKernelLoaderProjectのPS2Linuxの導入～運用、開発、実験とか色んな事を行いたいです。

一人で出来るものではありませんので情報をいただければうれしいです。

現在はUSB-Memoryから起動する、組み込み系のLinuxになるのかな.....
Kernel 2.4.17_MontaVistaLinux
Kernel 2.6.35.4
この２種類のみ確認しています。

学べるのは
busybox
chroot
loopデバイス　とか

USBの使用は
 mkdir /mnt
 mkdir /mnt/usb0
 mount -t /dev/sda1 /mnt/usb0

MemoryCardの使用は
mkdir /mc0 (slot1をさします)
mkdir /mc1 (slot2のことです)
mount -t /dev/ps2mcfs /dev/ps2mc00 /mc0
mount -t /dev/ps2mcfs /dev/ps2mc10 /mc1

というコマンドを使い使用をします。

電源を切るとかコマンドが使えなければ　Linux の sysrqキー　を使います
キーボードのAlt + SysRq + B の３個のキーを同時に押すと再起動がかかります
JavaScriptでユーザー定義関数の使い方




###まず、関数とは？
何らかの処理を一つにまとめて、
**関数名**で呼び出せるようにしたもの

##作成方法
```js
funcion 関数名 (引数1,引数2,....)
{
　＜処理＞
　return 戻り値;
}

```
- 関数は英語で[function]
- 引数はカンマで区切る
- 関数を行った時の結果の戻り値をreturnで指定する


```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
...
... 
<title>ユーザー定義関数の作成</title>
<script type="text/javascript">

function priceOfFruit(unitPrice,count){
	var fruit;
	fruit = unitPrice * count;
	return fruit;
}

</script>
</head>
```
※ユーザー定義関数は好きな所で定義することが出来るけども
head関数に定義することで分かりやすくなる。

```html
...
...

<script type="text/javascript">

	var fruit1 priceOfFruit= (100, 5);
	document.write(fruit1,"個</br>")

</script>
</p>
</body>
</html>
```
MySQLには２つの通信方式があるんですってことを知った話

# とある古いプロダクトのDBに入れない・・・
いつもの下記コマンドでログインを試みましたところ・・・

```
$ mysql -uroot -p
```

下記の出力が出てきてしまい、入れません。

```
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
```

sockファイルが無いみたいなので、これを使って、

```
$ ps aux | grep mysql
root      9004  0.0  0.0 115356  3204 ?        S    Jan22   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/tmp/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     9208  0.0 11.3 1504812 459820 ?      Sl   Jan22 133:13 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/tmp/mysql.sock
```

これを見る限り、tmpの下にありそうですね。

シンボリックリンクを貼ってあげればよさそう・・・と思ったのですが、このサーバーあまりにも昔のものすぎてサーバー管理者不明、ドキュメントも無いのでsudoでコマンド実行するためのパスワードが不明ということで、OMG状態でしたので今回は、mysqlになんとか接続できる方法をベテランのエンジニアの方に教えてもらいました。

## 解決策
mysqlの二つ目の通信方法、TCP接続を利用する。

mysqlのデータベースでのユーザーはhostと紐づけられており、

```
mysql> select host,user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | dev-user         |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
```

上記のようになっているので、-hのオプションを指定することによって、ソケット通信を使用せずに、TCP接続で入ることができる。ソケットファイルが無くて通信できなくても、こっちを使えばいいじゃないっていうお話でした。

```
$ mysql -h 127.0.0.1 -u ユーザー名 -p

もしくは

$ mysql -h localhost -u ユーザー名 -p
```
こちらでもDBに接続することができる。
USB per-port power switching

USBハブのポートには5vが給電されているが，ポート毎にon/offできる機能(ppps:per-port power switching)がサポートされているものがある。但し，全てのUSBハブでサポートされている訳ではないので注意が必要。
この機能を利用すると，USBハブに接続している機器の電源をプログラムから制御できるようになる。


## コマンド
Linuxでは，pppsを制御するためのプログラムがいくつか公開されている。

- [uhubctl](https://github.com/mvp/uhubctl)

Debianならaptで導入可能なはず。以降の例はRaspbian Buster上で確認。

### 使い方
```
$ uhubctl -h
uhubctl 2.0.0: utility to control USB port power for smart hubs.
Usage: uhubctl [options]
Without options, show status for all smart hubs.

Options [defaults in brackets]:
--action,   -a - action to off/on/cycle (0/1/2) for affected ports.
--ports,    -p - ports to operate on    [all hub ports].
--loc,      -l - limit hub by location  [all smart hubs].
--vendor,   -n - limit hub by vendor id [any] (partial ok).
--delay,    -d - delay for cycle action [2 sec].
--repeat,   -r - repeat power off count [1] (some devices need it to turn off).
--exact,    -e - exact location (no USB3 duality handling).
--reset,    -R - reset hub after each power-on action, causing all devices to reassociate.
--wait,     -w - wait before repeat power off [20 ms].
--version,  -v - print program version.
--help,     -h - print this text.

Send bugs and requests to: https://github.com/mvp/uhubctl
```
### USB hubの確認
```
sudo uhubctl
Current status for hub 1-1.5 [05ac:1005 Apple Inc. Keyboard Hub 000000000000, USB 2.00, 3 ports]
  Port 1: 0100 power
  Port 2: 0303 power lowspeed enable connect [05ac:021d Apple Inc. Apple Keyboard]
  Port 3: 0100 power
Current status for hub 1-1.2 [05e3:0610 GenesysLogic USB2.0 Hub, USB 2.00, 4 ports]
  Port 1: 0100 power
  Port 2: 0100 power
  Port 3: 0100 power
  Port 4: 0100 power
Current status for hub 1-1 [0424:9514, USB 2.00, 5 ports]
  Port 1: 0503 power highspeed enable connect [0424:ec00]
  Port 2: 0507 power highspeed suspend enable connect [05e3:0610 GenesysLogic USB2.0 Hub, USB 2.00, 4 ports]
  Port 3: 0303 power lowspeed enable connect [04d9:a052 Holtek USB-zyTemp 1.40]
  Port 4: 0303 power lowspeed enable connect [046d:c018 Logitech USB Optical Mouse]
  Port 5: 0503 power highspeed enable connect [05ac:1005 Apple Inc. Keyboard Hub 000000000000, USB 2.00, 3 ports]
```
これで，1-1.5にAppleのキーボード(USB hub付き)と1-1.2にもppps対応のハブ(実際はbuffalo BSH4A05UBK)が接続されていることがわかる。

### portへの給電off
1-1.2として認識されているUSB hubのポート3をoffにする。
`sudo uhubctl -l 1-1.2 -p 3 -a 0`


##pppsをサポートするUSBハブ
* [uhubctlに記載されている一覧](https://github.com/mvp/uhubctl#compatible-usb-hubs)

###動作確認したUSBハブ

|メーカー|製品|ポート|USBバージョン|VID:PID|
|--------|---|-----|------|-----|
|buffalo|BSH4A05U3BK|  4   |3| 05e3:0610|
|Apple| | 3| 2? | 05ac:1005 |
|Elecom| U2H-J4SLWH|4|2|0409:0059|


###非対応らしいUSBハブ
|メーカー|製品|ポート|USBバージョン|VID:PID|
|--------|---|-----|------|-----|
|Anker|A7513 | 7 | 3.0| 1c04:2074|

動作確認は，Rasbianに手元にあったUSBハブを接続して確認していますが，結果を保証するものではありません。

## 応用
USB連動タップは，USBポートに5vが給電されているかどうかで電源のon/offを制御している。pppsでUSBポートへの給電を制御することで，100vの機器もon/off制御できるようになる。

## デモ動画
uhubctlでUSBハブに接続した機器をon/offする様子のデモ動画です。
![uhubctl-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/7dcb23ac-b6ae-a5ae-078c-63d770f85cbc.gif)
Unityから一定間隔でスクリーンショットボタンを押す

#動機
VRChatで表情認識をしたい（願望）：1日目
https://qiita.com/hohoemi108yen/items/df21c1c31c1bfd105851

上の記事のための学習として、UnityからWindowsのキー入力を扱う方法を調べたかった。

#注意点
Unityには「System.Windows.Forms」は標準では導入されていないので、
下記パスからdllファイルをAssetフォルダ下にコピーする必要があった。

`C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll`

#ソースコード
```AutoScreenshot.cs
using UnityEngine;
using System.Windows.Forms;


public class AutoScreenshot : MonoBehaviour
{
    //撮影周期(秒)
    const int PERIOD_SECOND = 500;
    int count;
    void Start()
    {
        count = PERIOD_SECOND;
    }

    void Update()
    {
        if (count == 0)
        {
            SendKeys.SendWait("%{PRTSC}");
            Debug.Log("スクショを撮影しました");

            count = PERIOD_SECOND;
        }
        Debug.Log(count--);

    }
}
```

##参考
アクティブウインドウのスクリーンショットを周期的に撮るだけ
http://shirakamisauto.hatenablog.com/entry/2015/05/21/163421

Unityから他アプリを操作する方法
https://qiita.com/nise_aoi/items/7572a7024f941700add0

【C#】キーエミュレート送信のまとめ【覚書メモ】
http://edutainment-fun.com/hidemaru/microsoft/キーエミュレート送信のまとめ【c】【覚書メモ】_2535.html
【エラー対処】Neo4jでデータベースが大きすぎて一括削除できない


# はじめに

Neo4jで色々とデータをためていると

- ノード数200000
- リレーションはそれ以上

みたいな大量のデータになることがあります。



また、さらに使用環境が貧弱だと一括削除のコマンド

```
match(n) detach delete n
```
が使用できないことがあります。

```
There is not enough memory to perform the current task. Please try increasing 'dbms.memory.heap.max_size' in the neo4j configuration (normally in 'conf/neo4j.conf' or, if you you are using Neo4j Desktop, found through the user interface) or if you are running an embedded installation increase the heap by using '-Xmx' command line flag, and then restart the database.
```


そのため、一部ずつ削除していく必要があります。

# 対処法

```
match(n) with n limit 2000 detach delete n;
```

まず、match(n)で全部のノードを取り出します。
次に2000個にしぼりたいので、別のクエリーにデータを渡すwith句を使用します。
そして、n limit 2000で$2000$個のみに絞りこみ
最後にdetach delete n;で$2000$個を削除できます。
HTML,JavaScriptについて（自分用メモ）

# 注意
>この記事は、僕Marnyがhtml、javascriptを勉強する際のメモ代わりです。初心者なりにいろんなことをメモしていきます

##HTML編

###タイトル設定
```html
<!DOCTYPE html>
<title>

</title>
```

###テキスト記入
```html
<!DOCTYPE html>
<body>

</body>
```

### ボタン追加
```html
<button>

</button>
```
### リンク添付
```html
<body>
<a href="URL"></a>
</body>
```






—————————————————————————————-
##JavaScript編

###htmlにjsを組み込む

```javascript

<script>
ここにいろいろ書く
</script>
```

###ダイアログボックスで表示
```javascript

alert("表示させるメッセージ");
```

### URLを指定したページ遷移
```javascript
<head>
<script>
function 関数名(){
document.location = "URL"
}
</script>
</head>
<body>
　<button onclick="functionで定義した関数">適当な文字</button>
</body>
```

### 関数の定義
```javascript
<head>
<script> 
 function 関数名(){
関数の処理
}
</script>
</head>
```

### クリック判定追加
```html
<body>
<何かしらの行の指定　onclick="jsで指定した関数">判定のつける文字</何かしらの行指定>
</body>
```

###変数の定義、呼び出し
```html
<body>
<script>
var = 変数名;　//定義
console.log(変数名); //呼び出し
</script>
</body>
```
>console.logは開発者ツールのコンソール画面にて、デバックに使うらしい

###変数の定義2
```javascript
let 変数名 = "変数の中身";
console.log(変数名);//これで出力される

//letの値を更新
変数名　= 更新したい内容;
ex) let num = 2; //このときのnumは2
    num += 3;　　//このときのnumは3
```
> letとvarの違い
・letはブロックレベルで定義される
・varは関数でのスコープ（ブロックを抜けても保存される）

###定数の定義
```javascript
const 変数名 = "代入する値";


ex)　const lang = 日本語;
     console.log (lang+"が話せる");
          or
     console.log(`${lang}が話せる`); //${}をテンプレートリテラルという
出力↓
日本語が話せる
```
>定数と変数
・定数とは、文字どうり指定してしまえばほかの値に更新することができない。対して、変数は値の変更が可能である。
・定数を使うメリットとしては、変数とは違い値が変更されないので、何かの拍子で値が変更されてエラー等が出ないことがあげられる。

###条件分岐
```javascript
const = 15;
if (条件式){ //const > 10 とかだとif文内が処理される
   なんかしらの処理
}
```
[条件式]
">  <"   より以上、以下 
" >= <="　その値も含めた以上以下
"!=== ==="　≠,=

###Switch文
```javascript
switch(条件の値){
 case"条件式":
    処理;
   break;
 
 default: // case文のどれでもない場合の処理
  処理
  break;

}
```
> if文をきれいに書いた感じ
.NET CoreでNESを動かしてみる

# はじめに
今回はWindows限定となりますがwinformsを試してみます。
https://github.com/namikitakeo/love-nes

# 実行環境
下記バージョンで動作確認しています。
- Windows 10
- .NET Core 3.0

<pre>
$ dotnet --version
3.0.100
</pre>

# 学習方針
コマンドプロンプトから実行します。

<pre>
$ mkdir LoveNes
$ cd LoveNes
$ dotnet new winforms
</pre>

まずは実行してみます。

<pre>
$ dotnet run
</pre>

以下を移植していきます。
https://github.com/dotnetGame/love-nes

不要なファイルを削除します。

<pre>
NuGet.config
build/
src/LoveNes.Cli/
src/LoveNes.sln
src/LoveNes/IO/ReadWriteExtensions.cs
src/LoveNes/IO/Writer.cs
</pre>

必要なファイルを追加します。

<pre>
src/LoveNes/Host/BitVector16.cs
src/LoveNes/Host/BitVector8.cs
src/LoveNes/Host/Form1.cs
src/LoveNes/Host/Form1.Designer.cs
src/LoveNes/Host/Program.cs
</pre>

プロジェクトを修正します。

```XML:LoveNes.csproj
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

</Project>
```

プログラムを修正します。

```C#:IO/SpanReader.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace LoveNes.IO
{
    public ref struct SpanReader
    {
        private ReadOnlySpan<byte> _span;

        public bool IsCosumed => _span.IsEmpty;

        public SpanReader ReadAsSubReader(int length)
        {
            var reader = new SpanReader(_span.Slice(0, length));
            Advance(length);
            return reader;
        }

        public SpanReader(ReadOnlySpan<byte> span)
        {
            _span = span;
        }

        public uint ReadAsUnsignedInt()
        {
            // var value = _span.ReadBigEndian<uint>();
            uint value = (uint)_span[0]*256*256*256 + (uint)_span[1]*256*256 + (uint)_span[2]*256 + (uint)_span[3];
            Advance(sizeof(uint));
            return value;
        }

        public byte ReadAsByte()
        {
            // var value = _span.ReadBigEndian<byte>();
            byte value = _span[0];
            Advance(sizeof(byte));
            return value;
        }

        public byte[] ReadAsByteArray(int length)
        {
            var value = ReadBytes(length);
            return value.ToArray();
        }

        public ReadOnlySpan<byte> ReadAsSpan(int length)
        {
            return ReadBytes(length);
        }

        public byte[] ReadAsByteArray()
        {
            var bytes = _span.ToArray();
            _span = ReadOnlySpan<byte>.Empty;
            return bytes;
        }

        private ReadOnlySpan<byte> ReadBytes(int length)
        {
            var bytes = _span.Slice(0, length);
            Advance(length);
            return bytes;
        }

        public void Advance(int count)
        {
            _span = _span.Slice(count);
        }
    }
}
```
MRTK v2 で 診断バー（Diagnostics）を消す（Mixed Reality Toolkit、デバッグバー）


# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[今回の記事](https://www.fast-system.jp/unity-mrtk-v2-diagnostics-hidden/)に詳細があるのでぜひご参照ください。*

先日、[MRTK v2](https://github.com/microsoft/MixedRealityToolkit-Unity)が正式にリリースされましたね。

実際にMRTK v2を触ってみた方も多いかと思います、***Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事***になるかと思います。

今回は MRTK v2を使ったときに表示されるこいつを消したいと思います。基本的には便利なツールなんですが、やっぱり邪魔になる時ありますよね。

![WS000000-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/a5a00a1c-e48b-1e9c-3b5a-f0557ec88d8b.jpeg)

# 消し方の手順

## MRTK v2 のダウンロード

MRTK v2 の本体をダウンロードしましょう。

Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。

![WS000000-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/93d50516-0ce0-e677-077c-e48775cbcff4.jpeg)


## Unityに取り込み

ダウンロードした、～.unitypackage をUnityに取り込みましょう。


## 実際に消す設定

まずは、メニューから今のシーンにMRTKをセットアップします。
![WS000001-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/ae2afc37-3ab4-38f1-d590-1b606b2016ac.jpeg)

こんな感じで、***「MixedRealityToolkit」「MixedRealityPlayspace」の２つ***が追加されました。
※メインカメラも削除されます。
![WS000002-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/4dd96ee5-49da-05f4-fe65-a52477d37936.jpeg)

ヒエラルキーから***「MixedRealityToolkit」を選択し、「Copy ＆ Customize」選択***でProfileを作成しましょう。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。
![WS000001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/30ccdc9d-b33a-69e2-bcf5-a37cb2bbee07.jpeg)

Profileをコピーするので、***保存先フォルダ、保存ファイル名を指定***して、***「Clone」ボタンを選択***してください。 
![WS000002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/53a486d8-28a7-d758-efbe-9bc2a7ee958f.jpeg)

先ほどのヒエラルキーに戻り、***「Diagnostics」を選択***し、***「Enable Diagnostics System」のチェックボックスをOFF***にしましょう。

お疲れ様です。上記で設定完了になります。 


# 実行して確認する

何も表示されていない画面なので面白くないですが、実際にDisgnostics画面が非表示になった事が確認できます。

![WS000004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/1dc0b2e5-67b3-688f-f04f-e8aa90d3aa35.jpeg)


# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
MRTK v2 でオクルージョンする（Mixed Reality Toolkit、Occlusion）

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[今回の記事](https://www.fast-system.jp/unity-mrtk-v2-occlusion/)に詳細があるのでぜひご参照ください。*

先日、[MRTK v2](https://github.com/microsoft/MixedRealityToolkit-Unity)が正式にリリースされましたね。

実際にMRTK v2を触ってみた方も多いかと思います、***Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事***になるかと思います。

今回は、実際に Hololens でオクルージョンしたいなと思い、MRTK v2 を使ってオクルージョンしてみたのでその手順をメモ程度に書いていきたいと思います。

# オクルージョンとは？

以下の画像のように、CGの手前に建物などが被るような処理の事をオクルージョンと言います。![WS000000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/7bf6e9d0-2e32-98b9-d2ea-96e6792bbbd5.jpeg)
https://www.youtube.com/watch?v=7ZrmPTPgY3I

# オクルージョン適用手順

## MRTK v2 のダウンロード

MRTK v2 の本体をダウンロードしましょう。

Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。

![WS000000-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/93d50516-0ce0-e677-077c-e48775cbcff4.jpeg)


## Unityに取り込み

ダウンロードした、～.unitypackage をUnityに取り込みましょう。


## 実際にオクルージョンの設定

まずは、メニューから今のシーンにMRTKをセットアップします。

![WS000001-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/0fdda757-d1bd-6d64-d413-d91335d35799.jpeg)


こんな感じで、***「MixedRealityToolkit」「MixedRealityPlayspace」の２つ***が追加されました。
※メインカメラも削除されます。

![WS000002-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/ddc5cad4-3396-ca18-291e-5e02cf215235.jpeg)


次に、オクルージョンをするために環境情報を設定するためのProfileを作成します。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。

「～SpatialAwarenessSystem」を選択し、該当Profileの***「Clone」を選択***しましょう。

![image-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/d8d553c4-733d-9ea0-e9d0-765937e391d9.png)


Profileをコピーするので、***保存先フォルダ、保存ファイル名を指定***して、***「Clone」ボタンを選択***してください。

![WS000004-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/a46d9b7c-f223-8d24-db85-a58a37b9174f.jpeg)


上記で、作成したProfileに自動的に切り替わるので、次に***「Display Option」を「Occlusion」に変更***してください。

![WS000005-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/f2b8f324-c342-b880-76d3-835e5ba713d6.jpeg)


お疲れ様です。上記で設定完了になります。

ちなみに各オプションで使いそうなやつは以下になります。

- Startup Befavior：開始タイミング
- Update Interval：メッシュ更新時間
- Observation Extents：メッシュ範囲
- Physics Layer：メッシュを展開するレイヤー

## Hololensビルドして実行

以上でオクルージョンが設定できました。
シーン上にキューブなどを追加して確認してみてください。

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Unityを複数起動して、同一プロジェクトを共有する方法

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[今回の記事](https://www.fast-system.jp/unity-multi-run-project-share/)に詳細があるのでぜひご参照ください。*

今回は、同一プロジェクトを複数のUnityで共有する方法をご紹介させていただきます。
この方法は１台のPC上で、複数のUnityを起動して実行するやり方になります。
※この方法は通常の使い方ではないので扱いには注意してください。

# プロジェクト共有の使い道

同一プロジェクトを共有する事により、以下メリットがあるのかなと思います。

- マルチユーザゲームなどの開発でつかる
   - 複数ユーザ扱える
- Unityを複数起動するのでデバッグできる
- 変更点が即時で反映される
   - Gitなどで共有するよりお手軽
- プラットフォーム毎のビルド設定を保持して、切り替えの手間を無くす

また、デメリットとしては

- Unityを複数起動するので重い
- Unityの通常の使い方ではないので、不安定になる事も

# プロジェクト共有のやり方

基本的には、***特定のフォルダをシンボリックリンク***する事で、片方のファイルを変更するともう一方のプロジェクトファイルも編集された事になるやり方になります。

対象のフォルダは、以下の３つになります。

- Assets
- ProjectSettings
- Packages

## 実際に試してみる

まずは、こんな感じの適当なプロジェクトを用意しました。
「unity-proj1」に、コピー元プロジェクトが格納された状態です。

![WS000000-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/aaea3ea5-bf9a-dec0-147e-1951bbb2a023.jpeg)

次に、***「unity-proj1」から「unity-proj2」をコピー***して作成します。

![WS000001-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/76c8b53c-2fa9-3e46-d899-7b506e68366e.jpeg)

そして、***「unity-proj2」から「Assets」「Pakcages」「ProjectSettings」を削除***しましょう。
![WS000002-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/67878ae7-c950-6b8e-85a9-ac3d29aa2309.jpeg)
![WS000003-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/8f6acfe0-69e6-f9cb-59b6-85a3cecd6e64.jpeg)

次にこの３つのフォルダを、「untiy-proj1」のフォルダと共有するために、コマンドラインを立ち上げて、シンボリックリンクを張りたいと思います。

***コマンドラインを「管理者権限」***で立ち上げてください。
![WS000004-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/82ce5422-c8da-1013-1f2c-841e124d17bf.jpeg)

そして***次のコマンドを入力***して、ディレクトを共有してみましょう。
```
mklink /d <パス>\unity-proj2\Assets <パス>\unity-proj1\Assets
mklink /d <パス>\unity-proj2\Packages <パス>\unity-proj1\Packages
mklink /d <パス>\unity-proj2\ProjectSettings <パス>\unity-proj1\ProjectSettings
```

コマンドが成功すると、以下のようなメッセージが表示されるので確認しましょう。
***～ <<===>> ～ のシンボリック リンクが作成されました***

上記、コマンドがすべて成功すると以下のように、***「unity-proj2」の「Assets」「Packages」「ProjectSettings」の３フォルダに、ショートカットのような矢印マーク***が表示されます。
![WS000005-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/6b0eeb85-b70e-1f8d-3a08-94ad5859d5f3.jpeg)

## 試した結果

それでは、今作成した「unity-proj2」をUnityで読み込んで立ち上げてみてください。
どうでしょうか、想定通りに同じプロジェクトがそれぞれのUnityで立ち上がった事が確認でいます。
![WS000000-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/c2d5d388-2af7-140e-8e02-740fe3e757c2.jpeg)

実際に、オブジェクトを追加した場合に、別Unityでそれが反映されるか確認してみました、、、見事に反映されましたね！
![project-share2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/f51c4d1d-d69d-82bf-5c41-2732c1411d07.gif)

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
ついに正式対応されるRustのawait/asyncを1.39betaで確認してみた

# ついに正式対応されるRustのawait/asyncを1.39betaで確認してみた

※[こちら](https://ttis.croud.jp/?uuid=eafa5e19-1826-4700-9149-e2ad25f06a4e)にも同じ内容を書いています

　2019年11月リリース予定のRust1.39でついにawait/asyncが正式対応となります。ここにたどり着くまでに色々な紆余曲折があったようです。


## １．待機にawaitを使わない場合

### ソースコード

　内容としてはファンクションを二つ用意して、中で10回ループ、ループごとに500msスリープを入れるという流れです。これをspawnで実行し、全ての処理が終了するまで待ちます。

　このコードでは通常のスレッド用Sleepを使って待機を行っています。

```rs:Test02.rs
#![allow(non_snake_case)]
use std::{thread, time};
async fn foo1() {
  for i in 0..10 {
    std::thread::sleep(time::Duration::from_millis(500));
    println!("foo1:{} Thread[{:?}]", i, thread::current().id());
  }
}
async fn foo2() {
  for i in 0..10 {
    std::thread::sleep(time::Duration::from_millis(500));
    println!("foo2:{} Thread[{:?}]", i, thread::current().id());
  }
}

#[runtime::main]
async fn main() {
  let handles = &mut [runtime::spawn(foo1()), runtime::spawn(foo2())];
  for handle in handles {
    handle.await;
  }
}
```

### 実行結果

　ThreadIdに特徴が現れていますが、完全にマルチスレッドの動きです。スレッドは切り替わらずに、単純にSleepに入っているのが分かります。

```
foo2:0 Thread[ThreadId(2)]
foo1:0 Thread[ThreadId(3)]
foo1:1 Thread[ThreadId(3)]
foo2:1 Thread[ThreadId(2)]
foo2:2 Thread[ThreadId(2)]
foo1:2 Thread[ThreadId(3)]
foo1:3 Thread[ThreadId(3)]
foo2:3 Thread[ThreadId(2)]
foo1:4 Thread[ThreadId(3)]
foo2:4 Thread[ThreadId(2)]
foo2:5 Thread[ThreadId(2)]
foo1:5 Thread[ThreadId(3)]
foo1:6 Thread[ThreadId(3)]
foo2:6 Thread[ThreadId(2)]
foo1:7 Thread[ThreadId(3)]
foo2:7 Thread[ThreadId(2)]
foo1:8 Thread[ThreadId(3)]
foo2:8 Thread[ThreadId(2)]
foo2:9 Thread[ThreadId(2)]
foo1:9 Thread[ThreadId(3)]
```

## ２．awaitを使用した場合

### ソースコード

　ここではawait対応のSleepを使っています。

```rs:Test01.rs
#![allow(non_snake_case)]
use runtime::time::Delay;
use std::{thread, time};
async fn foo1() {
  for i in 0..10 {
    Delay::new(time::Duration::from_millis(500)).await;
    println!("foo1:{} Thread[{:?}]", i, thread::current().id());
  }
}
async fn foo2() {
  for i in 0..10 {
    Delay::new(time::Duration::from_millis(500)).await;
    println!("foo2:{} Thread[{:?}]", i, thread::current().id());
  }
}

#[runtime::main]
async fn main() {
  let handles = &mut [runtime::spawn(foo1()), runtime::spawn(foo2())];
  for handle in handles {
    handle.await;
  }
}
```

### 実行結果

　実行結果を見ると、スリープのawait待機でスレッドが切り替わっているのが分かります。どうやらasync/awaitの非同期処理は、スレッドそのものをいったん止めることで実現しているようです。

```
foo2:0 Thread[ThreadId(4)]
foo1:0 Thread[ThreadId(5)]
foo2:1 Thread[ThreadId(7)]
foo1:1 Thread[ThreadId(9)]
foo1:2 Thread[ThreadId(3)]
foo2:2 Thread[ThreadId(15)]
foo2:3 Thread[ThreadId(16)]
foo1:3 Thread[ThreadId(2)]
foo1:4 Thread[ThreadId(8)]
foo2:4 Thread[ThreadId(12)]
foo1:5 Thread[ThreadId(13)]
foo2:5 Thread[ThreadId(14)]
foo1:6 Thread[ThreadId(10)]
foo2:6 Thread[ThreadId(11)]
foo2:7 Thread[ThreadId(6)]
foo1:7 Thread[ThreadId(17)]
foo2:8 Thread[ThreadId(4)]
foo1:8 Thread[ThreadId(5)]
foo2:9 Thread[ThreadId(7)]
foo1:9 Thread[ThreadId(9)]
```

## ３．まとめ

　Rustがawait/asyncに対応することによって、通信やDB系の処理を書くときの利便性が向上が期待できます。今後、await/asyncを前提に対応がすすめられた便利なパッケージが増えれば、Rustの普及に弾みが付くかもしれません。
intelliJ > RoboPOJOGenerator



# RoboPOJOGenerator とは？


JSonファイルからクラスを自動生成してくれるプラグイン RoboPOJOGenerator 

以下のような操作でクラスファイルがJSonから推論されて生成される。

![Kobito.PaXWVS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/51373dcd-7747-b383-a7d9-44c5f2c3d46a.png "Kobito.PaXWVS.png")


[RoboPOJOGenerator - Plugins | JetBrains](https://plugins.jetbrains.com/plugin/8634-robopojogenerator)


対象は

JSONArrays. key words: JsonToPojo, Json2Pojo, Kotlin, GSON, FastJSON, AutoValue, Jackson, LoganSquare, Moshi
[Ubuntu] aptで``debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable``とエラーが出る

## 解決法

### 1. fuserでロックしているプロセスIDを確認
```
sudo fuser -v /var/cache/debconf/config.dat
```

すると，下記のように表示される．

```
                     USER        PID ACCESS COMMAND
/var/cache/debconf/config.dat:
                     root       8440 F.... frontend
```

### 2. そのPIDのプロセスをkillする

```
sudo kill <PID>
sudo kill -9 <PID>  # 上の行でkillできなかった場合
```

### 3. aptコマンド実行

エラーは出なくなるはず。

### 参考

<https://askubuntu.com/questions/136881/debconf-dbdriver-config-config-dat-is-locked-by-another-process-resource-t>

## 経緯

UbuntuでCPUの温度を見ようとpsensorを入れました．

すると，他のパッケージのバージョンを上げようとしたら，``E: Sub-process /usr/bin/dpkg returned an error code (1)``というエラーが出るようになりました．

以下対処:

1. psensorをremoveしようとしても同じエラーが出る．
2. エラーメッセージを見たら``aspell-en``というパッケージがエラーの原因のようなので，それをremoveしてみる => やはりエラーでタイトルのメッセージが出る．
3. stackoverflowで上記解決策を見つけて成功

なお，``sudo rm /var/cache/debconf/*.dat``で削除するという回答もありましたが，「削除するのは危険」というコメントがあったのでプロセスをkillする方法を取りました．
typeof T したい時

##Generic type と typeof T
Genericタイプを利用して、`typeof T`としたい場合がありますが、エラーとなります。

```
class A<T> {
   constructor(a: typeof T) {
      const n: T = new a()
   }  //=> error
}

```

##解決方法
以下のようにすると、T型のインスタンス生成するコンストラクター,　<b>≒Generic Tのクラス型</b>を表現できます。

```
class A<T> {
   constructor(a: new () =>T) {
      const n: T = new a()
   }
}
```

##例1

```
class A {

}

class GeneratorOfAnotherModel<T> {
  model: (new () => T);

  constructor(model: (new () => T)) {
    this.model = model;
  }

  generate(): T {
    return new this.model();
  }
}

const generator = new GeneratorOfAnotherModel<A>(A);
const a: A = generator.generate();
TypeScript で Redux DevTools extension を使う

公式のJS向けコードをそのまま持ってくると `Property '__REDUX_DEVTOOLS_EXTENSION_COMPOSE__' does not exist on type 'Window'.  TS2339` とコンパイラに怒られてしまう。

そこで、 `window` が `__REDUX_DEVTOOLS_EXTENSION_COMPOSE__` を持つこと、およびその型を明示的にコンパイラに伝える必要がある。

以下の型定義を ts ファイル中に書くだけでいい。

```partial.ts
interface ExtendedWindow extends Window {
  __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
}
declare var window: ExtendedWindow;
```

全体としては以下のような形。

```store.ts
import {
  createStore,
  applyMiddleware,
  compose,
} from "redux";

interface ExtendedWindow extends Window {
  __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
}
declare var window: ExtendedWindow;

const composeReduxDevToolsEnhancers = typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

// TODO: 適宜ミドルウェア定義、本記事とは関係ないので割愛
const middlewares = [];

const store = createStore(
  initReducer(),
  state,
  composeReduxDevToolsEnhancers(applyMiddleware(...middlewares))
);
```
systemdのserviceファイルをsymlinkにする

なんかサービスを作ってlinux上で動かす場合、最近だとsystemdのserviceファイルを書いて、/etc/systemd/system/ の下に置くことになっている。

[10.6. systemd のユニットファイルの作成および変更 Red Hat Enterprise Linux 7 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)

nginxとかもそうなんだけど、こうやって/etc/の下に設定ファイルをおいてしまうと、そのファイルはサービスとは別に管理することになってしまうので、秘伝のソース化しやすい。できればプロジェクトコードと一緒にgit管理下においておきたい。

(別案として、Dockerとかを使ってサーバをまるごとmachine as a serviceに管理できればよりベターかも知れないけど、それはまた別の話)

そのために、/etc/systemd/system/からプロジェクト内に作った moapi.service ファイルにシンボリックを作ってみるのだけど、なんかうまく行かなさそうに見える

```
$ ls -la /etc/systemd/system
total 40
：
lrwxrwxrwx  1 root root   33 2019/10/22 17:28:58 moapi.service -> /var/www/moapi/rack/moapi.service
$ sudo systemctl enable moapi                  
Failed to execute operation: Too many levels of symbolic links
```

[man systemctl](https://www.unix.com/man-page/centos/1/systemctl/)見ると、systemctl linkで作ると良いぽいことが書いてあった


```
$ sudo systemctl link /var/www/moapi/rack/moapi.service
Created symlink from /etc/systemd/system/moapi.service to /var/www/moapi/rack/moapi.service.
$ sudo systemctl enable /var/www/moapi/rack/moapi.service
Created symlink from /etc/systemd/system/multi-user.target.wants/moapi.service to /var/www/moapi/rack/moapi.service.
```

シンボリックリンクで登録する場合、enableまではファイル名で指定してあげないといけないらしい。
以後start/stopは名前だけで実行できるようになる

```
sudo systemctl start moapi
```
【Cassandra】テーブル設計 (随時更新)

## Cassandraテーブル設計の注意点

テーブル設計の考慮点をそこはかとなくまとめていく...

### 機能的なこと

・( RDBがSQLで提供するような )テーブル項目間の結合機能を提供してないことを踏まえる必要
　⇒複数テーブルのデータの結合が必要な場合、以下のように対応する。
　　・クライアント側で複数テーブルから読み取りを行って、アプリケーション側で結合を行う。
　　・結合結果に対応する非正規化されたテーブルを作成する
※複数テーブルを読み取ってアプリケーション側で対応するのは面倒だし、処理中に問題が起こるとよろしくないし、性能的な問題もあるので、非正規化で対応できるのならそれにこしたことはないかな...。

・where句で指定可能なcolumnはprimary keyないしsecondary indexで指定されたcolumnのみ

・クエリで使用可能なソートは、CREATE TABLEコマンドで指定したclustering keyの選択によるのみ
　( SELECTステートメントはORDER BYをサポートするが、clustering keyで指定されている順序に限定 
　　RDBのような任意のソートはできない。)

・clustering keyのcolumn内容でpartition keyのcolumn項目を「逆引き」することはできない。
　⇒逆引き用のlookupテーブルを用意するとか。

・primary keyが一意であること。
　Cassandraは常にupsertなので、偶然同一key値となった場合、エラーなく上書きされてしまうので気をつけないといけない。
※軽量トランザクションを使えば回避できるけど、それはオーバヘッド大。

### 性能的なこと

・テーブル正規化 (非正規化) について、分散DBとしての特性考慮が必要
　・分散DBであり、joinもサポートしないので、読み取りについてはRDBより正規化の短所の面が強く出る。
　　⇒ 発行するクエリに対応するスキーマとすることで、複数回読み込みを回避
　　　　RDB: データモデル化 → クエリ作成
　　　　Cassandra: クエリパスモデル化 → モデルをサポートするテーブル設計

・データを各ノードに均等に分散できるようなpartition keyになっていることが望ましい。
　・単一partitionにread/write が大量に発生すると、ノードの負荷に偏りが発生する。

・巨大なpartitionを作らない。
　・clustering keyで行をrowを追加する構造だと、partitionがどんどん成長する可能性がある。
　　partiton内のcolumn(セル)の上限は2B(20億個）だが、100MB以下が推奨
　・partitonが大きくなりすぎると、repair、ストリーミング、読み取りのパフォーマンスに問題が生じる可能性

・I/Oパターン(読み取り/書き込み) により、Compaction Strategyの使い分け考慮でテーブルを分割する。
　( Compaction StrategyはSStableごと = テーブルごとの設定なので )

・secondary indexについて、cardinalityが極端に高いcolumnへの適用は効率が悪い。
　secondary indexの検索は全ノードに対し実施するが、
　cardinalityが高く、例えば1partitionのみ取得(ほとんどのノードでは対象検出しない)となると、効率悪い。

・secondary indexについて、cardinalityが低いと、大量の応答結果が生成される可能性があるので注意。

・secondary indexの効率悪い場合は、lookupテーブルの利用を検討
※ただし、テーブル間の参照整合性メカニズムを用意しないので、整合性の問題が出ないか考慮
Catalina にアップデートしてデフォルトシェルが zsh になって gulp とか動かなくなった時の対応

Catalina にアップデートしたらデフォルトシェルが bash から zsh になって node 周りのコマンドが通らなくり、作業が止まってヒイッてなった時に対応したことのメモ。

# 結論
最初何がどうなってるのかわからなくて迷子になってけど `.bash_profile` で通していたパスが通らなくなったことでコマンドが通ってなかったようで

```zsh
cat .bash_profile >> .zprofile
```

でコピーして、

```zsh
source ~/.zprofile 
```

で読み込み、もしくはターミナル再起動でとりあえず諸々動くように。
ふぅ、やれやれだぜ。

# 他にやったこと
最終的には上記のみの対応で済んだような気がするけど、以下は最初よくわかってなくてやったこと。

## homebrew のアップデート
以下参考にさせて頂きアップデート。
https://qiita.com/SonoT/items/060c21e9866d5d9603e3

## compass のアップデート
sass のコンパイルで compass 云々と言われてたので Ruby Gems も含めて、以下参考にさせて頂きアップデート。
https://hirashimatakumi.com/blog/5009.html

## scss-lint のアップデート
Atom 上にて scss-lint がプンスカ文句言ってくるようになってしまったので、以下参考にさせて頂きアップデート。よくよく考えると bash の時点でもこのエラー出ていてもおかしくなかったような気もするがとりあえずよしとする。
https://qiita.com/ezawa800/items/621ab0460b066de283c9
【正式リリース版】VS CodeのRemote DevelopmentでRaspberry Pi内のファイルを編集する

# はじめに
Raspberry PiでRemote Developmentを動作させる方法について記載します。
接続先のRaspberry Piを「リモート先」と記載しています。

# 動作環境
* Visual Studio Code
![vscode_env.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86057/8f14e0e0-b390-9a45-50cf-eb223b347951.png)

* Raspberry Pi 3(armv7)
* Raspbian 8.0
* Remote Development 0.17.0
* Remote - SSH 0.47.1

# Remote Developmentとは
リモート先のファイルを編集するVS Code公式の拡張機能です。2019年10月にarmv7のRaspberry Pi対応が正式リリースされました。

以下のようにRaspberry Pi内のファイルを編集できます。
![remote_develop_raspi_ex1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86057/bb21211a-9ff8-48c6-5694-a79412443126.png)

※VS Codeの拡張機能で「Remote VSCode」もありますが別物です。

# 準備

### SSH configファイルを用意
Remote DevelopmentにはRaspberry Piと接続するためのSSH configファイルが必要です。
私は以下のURLを参考にSSH環境及びSSH configファイルを作成しました。
https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh/

Windows環境では以下のパスのconfigファイルをRemote Developmentが参照します。

* C:\Users\\(ユーザー名)\\.ssh\config
* C:\ProgramData\ssh\ssh_config

### 拡張機能のインストール
VS Codeに以下の拡張機能をインストールします。

* [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
* [Remote SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)

# Remote Developmentを動かしてみる

### 1. VS CodeからSSH接続する
「><」が表示されたアイコンをクリックして「Remote-SSH: Connect to host..」をクリックし接続したいConfigを選択するとSSH接続できます。もしくは以下の画像のようにモニタアイコンをクリックすると接続できます。 

![remote_develop_raspi_ex2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86057/ba48d8bb-e911-f538-224a-759bedf3223e.png)

その後、初回などの場合はvscode-serverがインストールされるのでしばらく待ちます。

### 2. リモート先のディレクトリを開く
「フォルダーを開く」ボタンを押下して、開きたいリモート先のディレクトリを選択してOKを押下します。
(「フォルダーを開く」は日本語の拡張機能追加時に表示される)

![remote_develop_raspi_ex3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86057/55c931d7-3e4b-33b5-e9c5-ee93dedc060c.png)

### 3. ファイル編集
通常のVS Codeのようにファイルやディレクトリを作成をしたり開いたりできます。
編集して保存した時にリモート先のファイルに編集内容が反映されます。
また、下のウィンドウよりリモート先のターミナル操作も出来ます。
![remote_develop_raspi_ex4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86057/59d67052-5c74-fe5c-9059-5f8ff32e0a7a.png)

# 参考
https://www.hanselman.com/blog/VisualStudioCodeRemoteDevelopmentOverSSHToARaspberryPiIsButter.aspx
https://github.com/microsoft/vscode-remote-release/issues/13
https://github.com/microsoft/vscode-remote-release/issues/103#issuecomment-497118857
【初心者】VScodeの置換機能でカテゴリを書く

某プログラミングスクールでメルカリ作成中の備忘録です。

カテゴリ多過ぎ
---
パンくずリストを作成しようとしていたところ、肝心の並べるべきカテゴリ作って無いやんけ！となり、
こちら２つの記事を参考に、まずカテゴリ全部入れてしまおうと試みました。

[多階層カテゴリでancestryを使ったら便利すぎた](https://qiita.com/Sotq_17/items/120256209993fb05ebac)
[rubyを使ってメルカリのカテゴリのseedファイルを作る](https://qiita.com/haruki127/items/e17f6fc7072389f0f6e3)


メンバーがすでにancestryを導入して少し作ってくれていたので、seedファイルの方の記事を参考にVScodeの置換機能の練習がてらに並べて見ました。

目標
---
```seed.rb
lady = Category.create(:name=>"レディース")

lady_tops = lady.children.create(:name=>"トップス")
lady_jacket = lady.children.create(:name=>"ジャケット/アウター")

lady_tops.children.create([{:name=>"Tシャツ/カットソー(半袖/袖なし)"}, {:name=>"Tシャツ/カットソー(七分/長袖)"},{:name=>"その他"}])
lady_jacket.children.create([{:name=>"テーラードジャケット"}, {:name=>"ノーカラージャケット"}, {:name=>"Gジャン/デニムジャケット"},{:name=>"その他"}])

```

このlady_tops.children.createの長すぎる配列をコピペと置換で並べます。



手順
---

前任者がancestryの記事を参考に、レディースの子要素を入れ終わったあたりで力尽きていたので、とりあえずレディースの孫要素を全部入れます。

検証ツールのconsoleで$('h3').empty()で要素消せるってかなり目から鱗だったのですが、何故かh4だけ消えてくれず………
<img width="1252" alt="スクリーンショット 2019-10-23 4.11.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/a560aae3-d6f6-4859-8bd5-e7dcf7de40bf.png">

まあ並べる時消せば良いかとそのまま続行、全コピペ
<img width="668" alt="スクリーンショット 2019-10-23 4.33.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/b3925a3d-980c-85a5-522f-7192444849aa.png">

これ以降から検索窓に書いてあるように打っていけば大丈夫です

"その他"の下に改行入れます
<img width="676" alt="スクリーンショット 2019-10-23 4.36.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/94c1f432-0732-91ff-1e0f-37de96030926.png">

孫カテゴリの頭に"すべて"があるので消します
<img width="676" alt="スクリーンショット 2019-10-23 4.38.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/f1ad6075-7f13-4dd2-c552-ae186da21240.png">

囲みます
２枚繋げてます
<img width="676" alt="スクリーンショット 2019-10-23 5.06.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/4e68370a-afaf-6a91-ae5a-c9ef95c11e7b.png">

空のやつを消します
<img width="676" alt="スクリーンショット 2019-10-23 4.41.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/b149ec32-6433-bd54-2903-efac52e9c802.png">

","の後にある改行のみを”、”だけに置き換えることで良い感じに並びました
<img width="676" alt="スクリーンショット 2019-10-23 4.42.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490719/ad1044ff-bf1e-9b7d-8941-895614d298c9.png">
h4消せなかったけど逆にわかりやすくて結果オーライ感
あとはくくってあげるだけですね。他のも同じ要領でやればすぐできそうです。


感想
---
こんな便利機能があるなんて露知らず、手打ちしようとしていました。まるで自転車を漕がず手で押すようなものですね。
仕事でバリバリやってる方々ではやっぱり常識なのでしょうか？もっと効率の良いやり方もありそうですね。
とりあえずの初心者の備忘録でした。
[メモ]ラズパイ4B(4GB): Ubuntu 19.10 (arm64) で USBが動かない、の対応

(2019-12-12更新) イメージが更新されて、OOBでRPi4-4GBでもUSBの問題なく使えるそうです。 
[Updated images of Ubuntu for the Raspberry Pi 2, 3 and 4](https://ubuntu.com/blog/updated-images-of-ubuntu-for-the-raspberry-pi-2-3-and-4)
> With the new images, USB ports are now fully functional out of the box on the 4GB RAM version of the Raspberry Pi 4.


---
せっかくリリースされたのに、キーボードマウスをつないでも認識しない!?


バグ報告: [Bug #1848790: USB not working under arm64 on Pi4](https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1848790)


# TL;DR

↑のトピックで、[正しくパッチを当てたKernelとmoduleの.debを配布してくれてた](https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1848790/comments/11)ので、それを取得して、インストールする。

```bash:
wget https://people.canonical.com/~hwang4/rpiv2/arm64/linux-image-5.3.0-1008-raspi2_5.3.0-1008.9+newupdate_arm64.deb
wget https://people.canonical.com/~hwang4/rpiv2/arm64/linux-modules-5.3.0-1008-raspi2_5.3.0-1008.9+newupdate_arm64.deb
sudo dpkg -i ./linux-modules-5.3.0-1008-raspi2_5.3.0-1008.9+newupdate_arm64.deb
sudo dpkg -i ./linux-image-5.3.0-1008-raspi2_5.3.0-1008.9+newupdate_arm64.deb
```

# 環境
- Raspberry Pi 4B 4GB
- OS: `ubuntu-19.10-preinstalled-server-arm64+raspi3.img.xz` <br> http://cdimage.ubuntu.com/releases/19.10/release/

```bash:カーネルバージョン
#更新前 (1007)
ubuntu@ubuntu:~$ uname -a
Linux ubuntu 5.3.0-1007-raspi2 #8-Ubuntu SMP Thu Oct 10 12:42:47 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux
#更新後 (1008)
ubuntu@ubuntu:~$ uname -a
Linux ubuntu 5.3.0-1008-raspi2 #9+newupdate SMP Mon Oct 21 18:09:52 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
```


# その他
- RAM4GBだとうまく動かなかった、ということで、
`/boot/firmware/usercfg.txt`に、`total_mem=2048`を記述して、2GBに制限すると、USBが認識される、ということも書かれている。

- なので、イメージを焼いた後、WindowsでみれるFAT32ドライブの `usercfg.txt`を↑のように編集して、キーボードをつなげて、カーネルをアップデートさせて、usercfg.txtをもどせばよい、かと。
- (2019-11-04更新)関連: [Fix for Raspberry Pi 4 4GB model’s USB Ports not Working on Ubuntu 19.10](https://www.cnx-software.com/2019/11/04/raspberry-pi-4-4gb-models-usb-ports-dont-work-on-ubuntu-19-10/)
jQuery + moment.jsでカレンダーと連動する前日翌日ボタンをつくる

#前提
使用するのは
jQuery
moment.js
flatpickr(カレンダーライブラリ)

#動作

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="natsume0718" data-slug-hash="OJJWWjv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jQuery + moment.jsでカレンダーと連動する前日翌日ボタン">
  <span>See the Pen <a href="https://codepen.io/natsume0718/pen/OJJWWjv">
  jQuery + moment.jsでカレンダーと連動する前日翌日ボタン</a> by natusme (<a href="https://codepen.io/natsume0718">@natsume0718</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#解説
流れとしては、
１．画面表示されたらDateオブジェクトを作成しmomentでフォーマット、日付表示領域のtextを置き換える

２．前日、翌日ボタンが押されたら、初回時に作成したDateに±1した値をmoment.jsでフォーマットし日付表示領域のtextを置き換える

３．カレンダーで日付が選択されたら、初回時に作成したDateに選択された日付を入れ、moment.jsでフォーマットし日付表示領域のtextを置き換える


##1．画面表示されたらDateオブジェクトを作成しmomentでフォーマット、日付表示領域のtextを置き換える

```html:HTML
<button class="js-previous-date">前日</button>
<span class="js-display-date"></span>
<button class="js-next-date">翌日</button>
<button class="js-calendar">Calendar</button>

```
`js-display-date`をロード後に書き換えています。
`moment(displayDate).format("YYYY/MM/DD")`で`2019/10/23`のような形式に整形しています。

```JS:JS
$(() => {
  
  let displayDate = new Date();
  $(".js-display-date").text(moment(displayDate).format("YYYY/MM/DD"));

```

##２．前日、翌日ボタンが押されたら、初回時に作成したDateに±1した値をmoment.jsでフォーマットし日付表示領域のtextを置き換える

`displayDate.setDate(displayDate.getDate() + 1);`は`displayDate.getDate() + 1`で現在の日付(整数)に+1したものが得られるので、それを日付としてセットしています。
フォーマット部分は初回と同じです。
メソッド化してやってもいいと思います。

```JS:JS

 $(".js-previous-date").on("click", () => {
    displayDate.setDate(displayDate.getDate() + 1);
    $(".js-display-date").text(moment(displayDate).format("YYYY/MM/DD"));
  });

  $(".js-next-date").on("click", function() {
    displayDate.setDate(displayDate.getDate() + 1);
    $(".js-display-date").text(moment(displayDate).format("YYYY/MM/DD"));
  });


```

##３．カレンダーで日付が選択されたら、初回時に作成したDateに選択された日付を入れ、moment.jsでフォーマットし日付表示領域のtextを置き換える

`flatpckr`のイベントである`onValueUpdate`という日付が変更された際に呼び出されるものを用います。
その際に変更した日付を取得できるのでそれをフォーマットしています。
`displayDate`に代入しないと、前日翌日ボタンを押した際に、カレンダーで選択した日付が考慮されなくなるので入れています。
また、引数にわたってくる日付がDateオブジェクトではないので、渡ってくるYY-MM-DDからDateオブジェクトを作成しています

```JS:JS
flatpickr(".js-calendar", {
    onValueUpdate(selectedDates, dateStr) {
      displayDate = new Date(dateStr);
      $(".js-display-date").text(moment(displayDate).format("YYYY/MM/DD"));
    }
  });
```

#あとがき
Vueで一度やったものをjQueryに変えてみましたが、この程度ならjQueryでもいいのかなとは思いました。
間違えやよりよい方法がありましたら、教えていただけますと幸いです
[Angular] 画面を引っ張ってリロード (pull to refresh)

# これはなに？

画面を下に引っ張って(pan down)してリロードする機能が欲しくて作りました。

![pull-to-refresh-sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/0174d7c9-75b2-e30a-883d-cc146ff94992.gif)

このサンプルは、実際にはリロードせず、リロード処理が必要になった回数をカウントして表示しているだけです。

同じようなものはすでにいくつかあると思います。
もしかすると、すでにAngular Materialに入っているかもしれません。
薄目で見てやってください。

# 元ソース

こちら https://stackblitz.com/edit/angular-rxjs-pull-to-refresh を元にしています。

元ソースから以下の点を変更しています。

* アイコン（丸→矢印、ドロップシャドウ付加）
* リロード中にアイコン回転 → 引っ張っている最中にアイコン回転
* リロードが終わるとアイコンが消える → ただちにアイコンが消える
* RxJS 6対応

# ソースコード

こちらに置きました。

https://stackblitz.com/github/sengokyu/angular8-pull-to-refresh-sample

## 主要ファイル

主なファイルです。

```
src
└ app
  ├ pull-to-refresh
  │ └ pull-to-refresh.component.ts  タッチイベントを受け取りアイコンを表示するコンポーネント
  └ services 
    └ load-notify.service.ts 他コンポーネント等へリロードすることを通知するためのサービス
```



## ちょっと解説

自分でもよくわからなくなりそうなRxJS周りの処理を解説します。

### 捕まえるイベント

下記は、タッチイベントを拾う`Observable`です。

```ts:src/app/pull-to-refresh/pull-to-refresh.component.ts
  private readonly touchstart$ = fromEvent<TouchEvent>(document, 'touchstart');
  private readonly touchend$ = fromEvent<TouchEvent>(document, 'touchend');
  private readonly touchmove$ = fromEvent<TouchEvent>(document, 'touchmove');
```

### アイコンの場所と回転の制御

下記は、アイコンの移動と回転をさせるためのパラメータを流す`Observable`です。

`touchstart`イベントが流れたら、代わりに`touchmove`イベントを購読し、移動量を流すようにしています。
`touchend`イベントが流れるまで購読し終わったら、現在位置から画面トップまでマイナス方向の値を流します。

```ts:src/app/pull-to-refresh/pull-to-refresh.component.ts
  private drag$ = this.touchstart$.pipe(
    switchMap(start => {
      let pos = TOP_POSITION;

      return concat(
        this.touchmove$.pipe(
          map(move => move.touches[0].pageY - start.touches[0].pageY),
          tap(p => (pos = p)),
          filter(p => p < this.pullDistance),
          takeUntil(this.touchend$)
        ),
        defer(() => this.tweenObservable(pos, TOP_POSITION, 200)) // 位置を戻す
      );
    }),
    repeat()
  );
```

### リロードするように通知

下記は、コンポーネント初期化時のコールバックです。
サービスを介して画面のリロードが必要になったことを通知します。

`touchstart`イベントが流れたら、代わりに`touchend`イベントを購読し、移動量を流しています。
移動量が規定値以上であれば画面リロードを通知します。

```ts:src/app/pull-to-refresh/pull-to-refresh.component.ts
  ngOnInit(): void {
    // 指を離した時に、規定距離を移動していたらリフレッシュ
    this.touchstart$
      .pipe(
        switchMap(start => {
          return this.touchend$.pipe(
            map(x => x.changedTouches[0].pageY - start.touches[0].pageY)
          );
        }),
        filter(p => p >= this.pullDistance)
      )
      .subscribe(() => this.loadNotifyService.notify());
  }
```

# 感想

* HammerJSとAngular組み込みのアニメーション機能を使って実装していましたが、どうにも期待する動きになりませんでした。
* イベントを絡めたコンポーネントのユニットテストは難しいです（すみません。今回書いてません）。
* RxJSたのしぃ〜。

最後までお読みいただきありがとうございました。
Mac Book Proのディスプレイがつかなくなった

しょうもないことなんですが、本当に焦ったので備忘録！

今朝起きてPCをつけようとしたら何故かディスプレイがつかない現象が起こりました。
数時間前まで普通に使っていたのに。

・キーボードのバックライトは光ってる
・音はする

調べてこちらを参考に記載の処置を行ないました。
https://tamoc.com/mac-black-screen-troubleshooting/
※リセットなどは自己責任です！

でもつかない。
なぜだ、、、。現実逃避でもう一回寝ようかと思ったときに

###Mac Bookを持ち上げたらついた

持ち上げたら、、、持ち上げたら？？？
なぜかはわかりません、、、。
なにかのセンサーが反応していたのかも。

開発マシンなので壊れてしまっては困るので、大切に扱いたいですね。
ついてくれてありがとう、、、。
phpMyAdmin リレーション

# 2つのテーブルを繋げるリレーション
phpMyAdminのSQLで２つのテーブルを繋げるリレーションを忘れないように記事で残しておきたいと思います。
![2019-10-23 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/40da8ed2-c991-e910-55c9-2fe15d174451.png)
![2019-10-23 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/a7b33a04-5700-8338-e9ec-c2f309445a2a.png)
上から順番に1番目がmy_itemsテーブル、2番目がmakersテーブルです。

`SELECT * FROM makers, my_items WHERE my_items.id=1 and makers.id=my_items.maker_id`
上記の一文がリレーションを使ったSQL文です。
`makers, my_items`の部分で繋げるテーブル2種類の名前をカンマを挟んで記述してます。
`WHERE my_items.id=1`でmy_itemsテーブルのidが1のデータを抽出してます。テーブル名.カラム名=値で記述しましょう。
`and makers.id=my_items.maker_id`でmakersテーブルのidカラムとmy_itemsテーブルのmaker_idで2つのテーブルを繋げています。
こちらもテーブル名1.カラム名=テーブル名2.カラム名で記述しましょう。

この一文を実行した結果が下の画像です。
![2019-10-23 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/122bd591-8453-e988-c12f-53eb698aa167.png)
idカラムが2つあるのでわかりにくいですが、my_itemsのmaker_idとmakerのidで繋がってmy_itemsのidが1のデータを抽出してます。

`SELECT * FROM makers, my_items WHERE makers.id=my_items.maker_id`
因みにmy_itemsテーブルのidが１のデータを抽出する文を省いて上の一文を実行すると
makersテーブルのidカラムとmy_itemsテーブルのmaker_idカラムの値を関連付けて全てのデータを表示出来ます。
![2019-10-23 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/bdf840aa-7477-aa73-598c-91af1956e4b5.png)