OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2の復元を実際に試してみた



https://aws.amazon.com/jp/about-aws/whats-new/2021/04/ec2-enables-replacing-root-volumes-for-quick-restoration-and-troubleshooting/

見るからに有用そうなアップデートがリリースされていたので試してみます。
（せっかく、リリース初日に記事書いたのに公開忘れてたので今更ながら）
![Untitled(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/cd63b6c1-715b-f47f-c2d3-3b2874000103.png)



## これまで

EC2のルートボリュームを破壊しちゃった場合、これまでは以下のような手順で実施していました。
手段①
1. 破壊前のAMI Backupから新規にインスタンス起動
2. バックアップ時点からのデータ変更をできる限りリカバリ
3. エンドポイントを1に切り変える　ex) ELBの付け替えや、EIPの差し替えなど用途に応じて

手段②
1. 適当なインスタンスを起動
2. 破壊されたインスタンスを停止し、rootボリュームをデタッチ
3. 1のインスタンスに、データボリューム（非root）として2をアタッチして、修復
4. 修復したrootボリュームを元のインスタンスに戻してインスタンスを起動し直す

①の方が、シンプルですが、エンドポイントの差し替えが可能な場合のみ、取れる手段であることに注意が必要です。

また、いずれも、サービス停止を伴っていました。
完全に破壊されつくして、サービスも止まっていたなら関係ないかもですが（すぐやるしかない）、復旧作業の実施タイミングが悩ましいところでもありました。
例えば、操作ミスでSSH無効化しちゃったりして、サービス運用は続けられているが、復旧が必要な場合とか。

## これから

EC2インスタンスに対する操作で、簡単に、かつ、ダウンタイムなしでrootボリュームを差し替えられるようになりました！
手段②の改良版というイメージです。

### 条件
以下のいずれかでは、現時点ではこの手法はとれません。

* rootボリュームがインスタンスストアボリュームの場合
* メタルインスタンスのrootボリュームの場合

## デモ

### 1. 下準備

#### Snapshot（AMIでも可）の取得
超重要です。これがないとどうしようもないことは、以前の復旧手順と変わりません。
バックアップ大事！

#### 破壊

sshdのプロセスを止めちゃいます！

``` bash
[ec2-user@ip-10-0-0-157 ~]$ sudo systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service.
```

そして、EC2インスタンスをリブート。

無事（？）、EC2インスタンスを要復旧な状態にすることが確認できました。

``` bash
> ssh -i ~/hoge.pem ec2-user@52.196.184.243
ssh: connect to host 52.196.184.243 port 22: Connection refused
```

### 2. 復旧

#### EC2のトラブルシューティングメニューから復旧

操作は簡単。今回はマネコンで実施しましたが、CLIも提供済みです。

対象のEC2インスタンスに対し、「Monitor and troubleshoot - Replace root volume」を選択します。（下の「Storage」タブからでも可能）
![Screenshot at Apr 30 11-49-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/b685738b-6565-384d-b6f1-aaa17853404d.png)

Snapshotにて、予め作成しておいたバックアップを選択。
「Create replacement task」押下。
![Screenshot at Apr 30 11-56-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/d092707c-8c1c-0a22-4957-e7b6f199bb85.png)

以上。とても簡単 :)

#### 確認
実施後、すぐに完了。
無事、SSH復活。

``` bash
> ssh -i ~/hoge.pem ec2-user@52.196.184.243
Last login: Fri Apr 30 01:51:34 2021 from 210.227.234.114

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 15 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-157 ~]$ 
```

### まとめと注意点
操作があまりに簡単なので、裏で行われているであろうことを図にしてみました。
![Untitled(5) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/31f8bdc0-cfca-8545-8f7a-d0f4ed675d8a.png)

注意点としては、この操作により、rootのEBSボリュームとしては、新たに作られたものに挿し変わります。
つまり、再度、この操作を実施するためには、このEBSのスナップショットが必要になります。

次のミスに備え、再度バックアップを取っておくことをお勧めします。

## 参照
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-restoring-volume.html#replace-root
[Unity]Swift だけで作ったNative PluginでUnityにコールバック

# Swift だけで作った Native Plugin で Unity にコールバックする
* Swift だけで、Unity の iOS の Native Plugin を作る方法を紹介しました

https://qiita.com/fuziki/items/955c2b35514bcfc37969

* Swift から Unity へコールバックしたい場合がよくあります
* 例えば、[Bluetoothを使えるようにするアセット](https://github.com/fuziki/UnityCoreBluetooth)で、検出した BLEデバイスを Unity へ通知する事が可能です
* Unity から Native に関数のポンタを渡しておきます
* iOS では、受け取った関数のポインタを実行します

# 今回のサンプル
* リポジトリはこちらです

https://github.com/fuziki/UnityPluginXcodeTemplate

* [Swift だけで、Unity の iOS の Native Plugin を作る](Swift だけで、Unity の iOS の Native Plugin を作る方法) の内容を前提知識にしています
* 今回は、文字列一つを Swift から Unity へ渡すコールバックを実装します


# 処理の流れ
1. Unity で実行されるコールバックの型と関数を用意する
1. 関数のポインタを渡して、コールバックを登録する関数を実装する
1. 実際に呼び出される関数を実装する
1. コールバックを登録する関数を呼び出す    
   == ここまで C# ここから Swift ===
1. コールバックを登録する関数を実装する
1. 受け取った関数のポインタを実行する

# Unity の実装
## 最終目標

* Swift で作成された任意の文字列で、`swiftPmPlugin_callBackAction` が実行されることを目指します

```c#
private static event Action<string> swiftPmPlugin_callBackAction;
```

## Unity で実行されるコールバックの型と関数を用意する

* コールバックされる関数の型を決めます
* 文字列の引数１つだけです
* 定義には、UnmanagedFunctionPointer を付けます
* 引数には、MarshalAs を付けます

```c#
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void swiftPmPlugin_callBackType([MarshalAs(UnmanagedType.LPStr), In] string message);
```

## 関数のポインタを渡して、コールバックを登録する関数

* 関数のポインタを引数に持つ関数です
* 関数のポインタの引数には、`[MarshalAs(UnmanagedType.FunctionPtr)]` を付けます

```c#
[DllImport("__Internal")]
private static extern void swiftPmPlugin_callBack([MarshalAs(UnmanagedType.FunctionPtr)] swiftPmPlugin_callBackType callback);
```

## Swift から呼び出される関数

* `MonoPInvokeCallback` を付けて、作成したコールバックの型の関数を実装します
* 最終目標である `swiftPmPlugin_callBackAction` を実行します

```c#    
[MonoPInvokeCallback(typeof(swiftPmPlugin_callBackType))]
private static void swiftPmPlugin_callBackHandler(string message)
{
    swiftPmPlugin_callBackAction(message);
}
```

## コールバックを登録する

* Swift から受け取った文字列の処理を `swiftPmPlugin_callBackAction` に実装します

```c#
swiftPmPlugin_callBackAction = (string message) =>
{
    Debug.Log("native message -> " + message);
};
```

* コールバックを登録します

```c#
swiftPmPlugin_callBack(swiftPmPlugin_callBackHandler);
```

# Swift の実装
## C# (c) の呼び出し口を作る
* `@_cdecl` を付けて Swift で関数を定義します
* コールバックは、C言語で定義されるので、`@convention(c)` を付けます
* Swift.String から一度、NSString へ変換して、`UnsafePointer<CChar>` を取得します

```swift
@_cdecl("swiftPmPlugin_callBack")
public func swiftPmPlugin_callBack(_ handler: @convention(c) (UnsafePointer<CChar>) -> Void) {
    let str = "this is swift string"
    let nsStr = str as NSString
    handler(nsStr.utf8String!)
}
```

# Framework の出力と設定

* こちらの記事の `Framework でビルドする` の章以降と同じ手順で実行ビルド可能です

https://qiita.com/fuziki/items/955c2b35514bcfc37969#framework-%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B

* `swiftPmPlugin_callBack` を実行したときに、`swiftPmPlugin_callBackAction` の内容が実行されている事を確認します

# おわりに
* Swift が C言語と親和性が高く、Unity と Swift のやりとりは、コールバックなどを含めて比較的容易に実装が可能です
* Objective-C を挟まなくても大概のことはできそうだと思っています
* また、Cのインタフェースを揃えて、事前に Framework 化すると、Swift 実装の場合でも、PostProcess が不要となるので、Swift での Native Plugin が実装しやすいです
* Swift から Unity コールバックするのは、応用の幅が広いので、活用して行きたいです
Enum を利用した判定ロジック


```java

public enum KensyuStsKbn {
	/** 0:OK_ALL	*/	OkAll(0),
	/** 1:OK_PART	*/	OkPart(1),
	/** 2:NG_ALL	*/	NgAll(2),
	/** 3:NG_PART	*/	NgPart(3);


	/**
	 * OK
	 */
	public static final KensyuStsKbn[] GpOKCheck = {
		OkAll,
		OkPart,
	};
	/**
	 * OKチェック
	 * @return true:OK  / false:NG
	 */
	public boolean isGpOKCheck() {
		return Arrays.asList(GpOKCheck).contains(this);
	}

}


```
VSCodeに関する素人的メモ

## はじめに
当たり前すぎて、ネットでも検索できなかったVSCodeのメモを記録のために残す

## 環境
・Windows10 Home 64bit
・VSCode: 1.49.1 (system setup)

## 実行環境のためにインストールした環境とプラグイン
◆：環境
◇：プラグイン

### 日本語化
◇Japanese Language Pack for VS Code

### python実行環境
参考：[Visual Studio CodeでPythonのデバッグ方法](https://codeaid.jp/vscode-py-debug/)
◆Anaconda 1.9.12
◆python 3.8.3

### Javascript実行環境
参考：[Visual Studio CodeでJavaScriptのデバッグ方法](https://codeaid.jp/vscode-js-debug/)
◇Debugger for Chrome
◇Live Server

### Powershell実行環境
参考：[VS Code を日本語化し、PowerShell 拡張を入れる](http://www.vwnet.jp/windows/PowerShell/2019071701/PowerShellwVSCode.htm)
◇Powershell(MS 製 PowerShell 拡張)

### Git実行環境
参考：[VSCodeでのGitの基本操作まとめ](https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be)
◆Git Bash(https://gitforwindows.org/)
◇Git History

### 素人的メモ（共通編）
・デフォルトでVSCodeをインストールすれば
　C:\Users\[ユーザー名]\.vscode が自動的に作成され、その配下にインストールしたextensionのファイルが保管される
・通常Powershellスクリプトをを実行するには実行ポリシーを都度設定してやるか事前に実行ポリシーを恒久的に変更してやる必要があるが、VSCode上ではいちいち実行ポリシーを設定することなく実行できる
・launch.jsonは「フォルダを開く」で開いたフォルダの直下にある.vscode/launch.jsonを参照する。を
　例えば、「フォルダを開く」でC:\User\[ユーザ名]\を開いたときは
　　C:\User\[ユーザ名]\.vscode\launch.jsonを探しに行くが…
![スクリーンショット 2020-09-24 084803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/959e3f32-7d9f-42c0-b5fc-6db2bab4faa5.png)

　C:\User\[ユーザ名]\work\powershell\ みたいにさらに深い階層でフォルダを開いた場合は
　　C:\User\[ユーザ名]\.vscode\work\powershell\launch.jsonがないと、launch.jsonが見つからないと言い出す。（画像だけでは何のことやらよくわからんが実際にそうなので思い出として画像を貼っておく…）
![スクリーンショット 2020-09-24 084625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/22ade243-82cf-e502-e22d-494cc980396e.png)
Javascript 配列


本日は配列について学習しましたので、そちらについて記事に残していきます。

配列を使わずに複数の値を扱う際は、下記のように何行にも分けて書くことになりますので見づらくなりがちです。

```javascript
let x = "キリン";
let y = "イルカ";
let z = "猫";
```
配列を使って複数の値を扱う際は、[]の中に値を格納するので何が格納されているか分かりやすくなると思います。

```javascript
let animal = ["キリン", "イルカ", "猫"];
```
配列の中身を出力したければ下記のようにすれば出力が可能です。

```javascript
let animal = ["キリン", "イルカ", "猫"];
console.log(animal); // ["キリン", "イルカ", "猫"]
```
また、配列を作ると自動的に値に index と呼ばれる番号が割り当てられるのですが、こちらは0から始まる番号が割り当てられるので注意が必要です。

```javascript
let animal = ["キリン", "イルカ", "猫"]; //"キリン"は[0]、"イルカ"は[1]、"猫"は[2]
let kirin = animal[0];
let iruka = animal[1];
let neko = animal[2];

console.log(kirin); // キリン
console.log(iruka); // イルカ
console.log(neko); // neko
```
このように配列の何番目という形で指定することによって、配列の任意の番号の値を出力することが可能です。

配列の中身の数を知りたい際は、変数名.lengthという形で呼び出すことによって中身の数を出力することが可能です。

```javascript
let animal = ["キリン", "イルカ", "猫"];
console.log(animal.length); // 3
```
VNC接続（macOS→Ubuntu）まとめ

自分用メモ。MacBook ProでUbuntuを操作してみたかった。

# 環境

- サーバー
    - Ubuntu 18.04.2 LTS x86_64
- クライアント
    - macOS 11.4 20F71 x86_64


# 準備（1度やればよい）

## Ubuntu側

```bash
sudo apt update
sudo apt install -y xserver-xorg-core
sudo apt install -y tigervnc-standalone-server tigervnc-common tigervnc-xorg-extension
vncpasswd # 接続する際のパスワードを設定
```

`$HOME/.vnc/xstartup`を次の内容で作成

```sh
#!/bin/sh

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
dbus-launch --exit-with-session gnome-session &
```

とりあえず再起動

```bash
sudo reboot
```

# 接続（毎回やる）


## Ubuntu側

```bash
vncserver -localhost no -geometry 2560x1600 -depth 24
```

`2560x1600`は画面のサイズのことで、MacBookなどに合わせると良いと思う。

```
$ vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		4477
```

この`X DISPLAY #`という番号（この場合は`:1`）を覚えておく。あとでこれに5900を足した数を使う（この場合は1+5900 = 5901）。

（このセッションを殺す場合は次を実行する）

```
vncserver -kill :1
```



## macOS側

```bash
ssh <Ubuntu_user_name>@<Ubuntu_ip_address> -A -t -L 5901:localhost:5901
```

前半は普通のSSH接続と同じような感じ。ここの5901は先程の数を入れる。

macOSのFinderを開いて<kbd>
⌘</kbd> + <kbd>K</kbd>を押すと「サーバへ接続」という画面が出るので、ここに`vnc://localhost:5901`を打ち込んでパスワードを入れれば、Ubuntuの画面が現れる。

![export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686583/d932759c-ae47-20f7-e792-6bc0c03415c6.png)
![ 2021-05-31 12.32.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686583/f905f12c-cda2-6ccd-4187-bd54d219be0e.png)


# 最後に

- Ubuntu側で`vncserver -localhost no -geometry 2560x1600 -depth 24`を実行する過程について、Ubuntuが起動している限りセッションは続くので厳密には毎回やる必要はない
- Ubuntuではmacのキーボードがいまいち使えない。例えばmacでは<kbd>
⌘</kbd> + <kbd>C</kbd>でコピーだが、Ubuntuでは<kbd>
control</kbd> + <kbd>C</kbd>で、<kbd>
⌘</kbd>が使えない（MacBook Proのキーボードを登録しても）。使いたければいちいち登録しなくてはいけないらしい。めんどくさいのでやめた。
Dreamweaverで使えるEmmetでCSSコーディングが時短

<p>Dreamweaverで長年、WEBページのコーディングをしてきましたが、ちょっとしたキーの誤操作で今まで気が付かなかった
コーディングに便利な機能を発見したのでこちらに書き留めておきます。<br>
Emmetとは簡単に言えばショートコードから完全なコードを作成してくれる機能です。<br>
今回の、作業環境は Windows10 Dreamweaver v21.1 です。</p>

<h2>CSSのプロパティや値の後にtabキーを押して生成</h2>
<p>DreamweaverでCSSを作成するときはプロパティ、値の頭文字などのショートコードを打った後にtabキーを押すことで、CSSが生成されます。<br>
ショートコードには一定の規則があります。いくつか試してみて使えそうなものを見つけてください。</p>

<h3>いくつか試した例が以下になります。</h3>
<h4>まず、エディタにテキストを打った状態です。</h4>
<p>各行末にtabキーを打つと以下のように生成されます。<br>
単位やベンダープレフィックスも自動で入ります。</p>
![base2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1570344/a08b7678-480b-d6d1-9c70-0736820398dc.png)

<h4>生成されたCSSが以下の状態です。</h4>
![generate2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1570344/d8b72ecf-c476-02b8-5e6c-b23d8e650ace.png)


<h2>まとめ</h2>
<p>単位の出し分けは、<br>
・指定なし →　px<br>
・p →　%<br>
・e →　em<br>
です。<br>
ベンダープレフィックスは必要なときだけ挿入されます。</p>
<p>Dreamweaverは何文字かテキストを打てば候補を出してくれるので、画期的にコーディング速度が上がるとは思いませんが、
ベンダープレフィックスが自動で挿入されるところは嬉しいです。</p>
AWS Lambdaのはまりどころ

# TL;DR
1. lambdaのレイヤー(作成)にはお作法がある
1. lambdaの裏で動くコンテナは再利用される
1. lambdaのローカル(/tmp)の容量は512MB

# lambdaのレイヤーのお作法(主にpythonの場合)
* pythonというディレクトリにモジュールをインストールする必要がある
* mac(windows)でpipしてはいけない
    * pythonのCモジュールのコンパイルが走ったりするのでmac(windows)上でpipするとそれはlambdaで動かない可能性が高い

## つくりかた
* 古いほう(でも動く)
* ディレクトリ名は必ずpythonにすること

```
docker run --rm -v $(pwd)/python:/python python3.8:latest pip install paramiko -t /python
zip -r paramiko.zip python
```

* 新しいほう(公式)
    * https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

```
docker run --rm -v $(pwd):/var/task amazon/aws-sam-cli-build-image-python3.8:latest \
pip install paramiko -t python/lib/python3.8/site-packages/
zip -r paramiko.zip python
```

# lambdaのコンテナは再利用される
* 今回ファイルを/tmpに書き出して処理するというものをつくったのですが、どうも新しいファイルが更新されない・・・
* よくよく調べてみるとlambdaの裏で動くコンテナは**再利用される**ようだ
    * 特に実行、終了、すぐ同じものを実行のパターン
* なのでファイル操作する場合は必ずファイルの掃除を行いましょうという教訓でした・・・

# /tmpは512MBまで
* これもドキュメント見たら書いていますが、気をつけないと書けなくなってあれ?ってなりますのでご注意を

# まあまあドキュメントに書いてたりする
* 自戒を込めてちゃんと読みましょうね・・・
    * https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html

# 個人的感想
* lambdaは非常に便利
* 実行時間制限やレイヤーの数の制限、容量の制限などあるけどもそれでもなおメリットのほうが多い
* 安い、わざわざEC2立ててとか馬鹿らしいとおもう
* 印象としてはAWSBatchよりもlambdaを小分けにしてStepFunctionsとかで制御したほうがバッチ環境としてはいいんじゃないかと思った
構成図を作ってインフラの勉強 AWS+Rails+Nginx+Unicorn

## はじめに
初めてドメインを取得しAWSでデプロイ(HTTPS)を行いましたので、その復習・備忘録として構成図を作成しました。

## 前提 
- VSCode(Draw.io Integration)
- Ruby on Rails
- AWS(EC2)
- Nginx
- Unicorn

## 構成図
![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1301520/a5643783-09a5-2cc7-73f6-d23f8da1608e.png)

## 大まかな処理の流れ
【Usersからアクセス】
1.Route53でURLをIPアドレスに変換する
2.Certificate ManagerでSSL証明書を取得する
3.Internet GatewayのPORT(443)を通過
4.Application Load Balancerでアベイラビリティーゾーン(東京)にあるWeb Serverにアクセス
　※ターゲットグループはPORT(80)
5.Web Severで静的コンテンツを返してもらい、動的コンテンツはAP Serverに要求
6.5のリクエストに対しRailsを実sこう
7.必要に応じDB Serverを操作し、その結果を処理に埋め込む
8.実行結果をWeb　Serverに返す
9.Web Serverが処理結果を返す
10.ユーザーが確認できる


## 構成図を作成してみて
デプロイを行なっている最中は全てが点でしかなかったものが、構成図を作成することで全体の把握ができました。
もし、間違い等ございましたらご指摘をお願いしますm(__)m
UIpathでデータバックアップ対応した件について

#はじめに

Uipathで社内のBCP(Business Continuity Plan)対応によって日時でデータバックアップを行う事になったのでメモとして記します。
主要システムが止まった時のためにデータのバックアップを行うものになります。
ちなみにUipathは今回始めて触りました。


#想定読者
UipathでOracleDBやDB2に接続してクエリ発行する方(マニアック)
同じようなBCP対応をやることになった方(マニアック)

#実装

内容としては下記になります。
主に使った機能を紹介していきます。

1.対象DBに接続
2.クエリを実行
3.ローカルに保存
4.Zip化(パスワード生成処理は省きます)
5.予め用意していたファイルサーバー上の各フォルダに格納



###1.対象DBに接続

今回接続したDBは、DB2とOracleDBです。
多分ここが一番苦戦したと思います...

使ったものはこちらのUiPath.Database.Activities
https://docs.uipath.com/releasenotes/docs/uipath-database-activities

OracleDBはこちらのインストーラをダウンロードしました。
https://www.oracle.com/database/technologies/instant-client/downloads.html

>Use user or systemdata source name

こちらに事前に作成したdata sourceが表示されるため選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/c3920b45-a1e7-9330-49ee-ef129a19e26d.png)

この後のクエリに接続情報を利用するため変数にOutputパラメータはセットしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/5a7c8356-b168-9375-db8c-50bd6879045d.png)

OracleDBのデータソースを作成する際はこちらのtnsを参照する必要があります。

[oracleインストールのときのtnsnames.oraってなんだよ](https://xakamsi.hatenablog.com/entry/2019/02/18/190953)
[WindowsでOracleDBにOracle Instant ClientでODBC接続する](https://note.kiriukun.com/entry/20151124-oracle-instant-client-odbc)

>NLS_LANG に JAPANESE_JAPAN.JA16EUC を設定

特にこちらを未設定だと後のクエリの文字列が化けます・・・


###2.クエリを実行

クエリの実行系に関してはこちらを参考にしてください。
[【UiPath】SQLServerからデータを抽出して、CSVファイルに出力してみる](https://masagoroku.com/%E3%80%90uipath%E3%80%91sqlserver%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%A6%E3%80%81csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%87%BA%E5%8A%9B)

今回のクエリではwhere句にバインド変数を利用します。
そのまま書いてしまうとエスケープされてしまうので下記のように対応しました。

>WHERE Hoge BETWEEN "+バインド変数A+" And "+バインド変数B+" Order By

>WHERE Hoge IN("+バインド変数A+","+バインド変数B+") ORDER BY


あとはASでダブルクォートの文字列もエスケープされてしまうのでこんな感じに書くとうまくいきます。
>AS ""ホゲホゲ""


###3.ローカルにCSV保存

実行したクエリのデータテーブルの内容をCSVに出力します。
各支店分のCSVを出力するので、出力したデータテーブルに条件を付け加え支店毎に分割してCSV出力しました。

[DataTable操作](http://www.uipath-dojo.com/purpose/datatable)

[CSVファイルの書き込み](http://www.uipath-dojo.com/purpose/text_writecsv.html)


格納先は起動ロボットに依存してしまうため特殊フォルダのパスを取得します。
[デスクトップやマイドキュメントなど特殊なフォルダパスを取得する](https://automation-discovery.work/files/get_special_folders/)



###4.ZIP化

最初はこちらでzipしておりましたが、7zipに変更することになりました。
ちなみにこちらのzipのフォルダ指定は配列指定でした・・・
https://marketplace.uipath.com/ja/listings/zip-unzip-activities


結局この形でzipすることになりました。
最初は「プロセスを開始」で引数にコマンドをいれていたのですが、デプロイ後に実行してみるとロボットの処理スピードの関係でうまくいかなかったためこうなりました。
わざわざ「待機」を挟んでいるのもこれが理由です。

黒くなっている箇所は7zipのコマンドとパスです。
![WS000097.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/a6b997b4-1ac4-5a11-077c-0fcbab8f6f16.jpeg)


###5.予め用意していたファイルサーバー上の各フォルダに格納
ローカルのzipファイルをファイルサーバ上の各フォルダに格納します。
各フォルダに格納する際は、ローカルのzipファイル名とファイルサーバ上のフォルダ名で突合ループさせてそれぞれ格納。
https://docs.uipath.com/activities/lang-ja/docs/move-file

.Netを使ってももちろんできます。
[【UiPath】フォルダの移動をするアクティビティがない？　コードの呼び出しアクティビティで対応してみた。](https://autolazy.hatenablog.jp/entry/2020/10/31/185209)


#最後に
Uipathを初めて触ってみたので何が正しいのかわからないですが、DB2やOracleDBについての記事が少なかったのできつかったです。笑
でもそれ以外は先人の知恵がたくさんあり非常に助かりました..
AWSブログサービスを構築する(2)


 [AWSブログサービスを構築する(1)](https://qiita.com/sanajima/items/ab0b8a2ce44319c44121 "AWSブログサービスを構築する(1)")の続きです。
2021/08/02 追記しました

教材
-

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

やったこと
-

「冗長性のあるブログサービスを構築する」の一部
を実施しました。
ALBを含んだ構成にしました。

⑪から㉒まで、順番に実施しました。


用意するもの
-
Windows10のPC Teraterm 

今回の完成形
-

![AWSブログ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/87a4ba08-3ff3-2850-62c6-03c5141a6a12.jpeg)



実作業
-

※前回作成したはずのWPが、504 Gateway Timeout  と表示され焦りましたが、RDSをスナップショットを取って削除していたことを思い出し、スナップショットからRDSを復元しました。

それでもまだ 504 Gateway Timeout が解決しないので、 [AWSブログサービスを構築する(1)](https://qiita.com/sanajima/items/ab0b8a2ce44319c44121 "AWSブログサービスを構築する(1)")の手順をもう一度実施しました。

はじめてのAMI （AMI作成 → SG作成 ）
-
イメージ取り
⑪EC2のAMIを作成します。
EC2を作成します。（当該EC2を停止してから）

EC2作成時、マイAMIから作成し、アベイラビリティゾーン1cのPublicサブネットに置く

SGはアベイラビリティゾーン1aのEC2と同じSGを指定する
キーペアもアベイラビリティゾーン1aのEC2と同じキーペアを指定する

はじめてのALB（ ALB作成 → SG作成 → TG作成 ）
-
※ロードバランサーはEC2の左側の下のほうにあります。

⑫ロードバランサを作成します。
アプリケーションロードバランサーで、HTTP用、リスナーはHTTP80番。

※参考にしたサービスの、
**いったんHTTP80番で作成して、あとでHTTPSのみ許可にするやり方**が、分かりやすかった。
書籍でもHTTPSから作成する方法がほとんどだったので。

アベイラビリティゾーンは1aと1cに☑を入れます。

⑬ロードバランサーのセキュリティグループを作成します。
新しいセキュリティグループでHTTP80番で作成されます

⑭ロードバランサーで指定するターゲットグループを作成します。
ヘルスチェックの設定では/readme.htmlとします

⑮ロードバランサーの配下に設定するインスタンスを指定します。
今回はアベイラビリティゾーン1aにあるEC2とアベイラビリティゾーン1cにあるEC2を指定しました。

⑯ターゲットグループのタブでヘルスチェックがhealthyになっているか確認。


ここまで実施した人への注意
-
この状態で放置するとワードプレスの表示が崩れたままなので、以降の作業もぶっ続けで行うことをお勧めします。

RDSでの作業
--

⑰どちらかのEC2へログインします(パブリックIPが変更されているかもしれないので注意）

⑱RDSのMysqlにログインします

mysql -h [RDSエンドポイント名] -u [ユーザ名] -p

⑲サイトURLをLBのDNS名に変更する
UPDATE wp_options SET option_value = 'LBのDNS名' WHERE option_name IN ('siteurl', 'home');

⑳ブラウザに「LBのDNS名」を入力するとワードプレスが表示できてしまうことを確認する

SGの設定変更
-

※このままですと、EC2はロードバランサー以外の通信も許可してしまうので、
**ALBからの通信のみ許可するように変更**します。**SGで**。


㉑EC2の画面のセキュリティグループを選択、
**EC2のウェブサーバに設定したSGを選んで**、インバウンドルールを編集。
結構SGを作成しているので、間違えないように。

WEBのSG
LBのSG
RDSのSG

㉒HTTPが二つあるので一番上を削除し。もう一つののHTTPのソースの::/0を削除し、sgと打つ。
LBのSGを選択してルールを保存。

やらなかったこと
-
参考にしたサービスではこのあとRDSも冗長構成にするハンズオンがありましたが、わたしは今回、事情があって実施しませんでした。もちろん後日実施予定です。

追記
-

Route53 ・ ACM・ ALB・ムームードメインで独自ドメインhttps化しました。

①ムームードメインで独自ドメイン取得・決済
②Route53でホストゾーン作成→ムームードメインのコンパネネームサーバに入力
③ACM作成 
④ALB作成
⑤EC2のSG編集
⑤Route53でレコード作成
⑥ヘルスチェック確認

https://recipe.kc-cloud.jp/archives/11188


https://cloud5.jp/aws-hands-on-vpc/
Sprockets::Rails::Helper::AssetNotFound エラーとは

#はじめに

本日からオリジナルアプリに本格的に取り掛かります。

ですが速攻エラー発生。

あまり見る事がないエラーだったので記録しておきます。

#エラー内容

![スクリーンショット 2021-05-31 11.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/5a2d83d8-a0a4-a961-6d0d-ec820182bd89.png)


画像が呼び出せてないんだろうなという事は分かりましたが、和訳サイトで英文を調べてみました。


いつもこのサイトを使っています。

https://www.deepl.com/translator


*The asset "search.png" is not present in the asset pipeline*

和訳:assetに「search.png」がassetパイプラインに存在しない

画像が存在していない事が分かりました。

app > assets > images のディレクトリーを確認した所、やはり*search.png*がありませんでした。


#終わり

少しだけエラー文との戦いから離れていたため、動揺してしましたが、和訳をしなくてもニュアンスで気づけるエラーもある事を知るました。

また戦復帰してエラーをびしばしと解決したいと思います！
S3静的ウェブサイトホスティングの作成

S3静的ウェブサイトホスティング
--
手順が多い。EC2のWeb公開のほうが簡単。。
sorryページの作成方法

①「バケット名をドメイン名と同じに」してS3を作成。
このバケットのブロックパブリックアクセス設定の☑を**全部**はずす。
全世界公開。

②作成したsorryHTMLファイルをアップロードする。

③作成したS3バケットのプロパティページの一番下「静的ウェブサイトホスティング」を編集し「有効」にし、「index.html」「error.html」を入力する。

④作成したS3バケットのアクセス許可の「バケットポリシー」を編集する。
AWS公式ページの

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::Bucket-Name/*"
            ]
        }
    ]
}
```
の「Bucket-Name」を作成したS3バケット名に直して貼り付ける。

エラーが起きる場合はたいてい「バケットポリシー」のコピペミスです。
Route53とレコードと独自ドメイン

Route53
--
ルーティングの種類は、6種類あるらしい。加重ルーティングとか。
:sunny:
![ルーティングポリシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/98e12831-b103-7bdd-2bc2-a240dc6a70e3.png)


レコード
--
いつも迷う。毎回Googleっている。

- Aliaseレコード（Route53独自のレコード）
ドメインとAWSサービスの関連付け
testdom.tk → 111.222.333.444 
変換は1回で済む。追加料金なし

- CNAMEレコード
ドメインとURLの関連付け
testdomein.com → ELB → 111.222.333.444
変換は2回必要。追加料金かかる。


- Aレコード
IPアドレスと紐づける
- AAAAレコード
IPv6と紐づける

- NSレコード
ドメイン情報を管理するサーバを表している。4つある。ネームサーバ。

- SOAレコード
ドメインの管理情報を表す。

独自ドメイン
--
Route53でドメインを購入すると値段が少し高いので、お名前.comかfreenomを使う。
freenomは3か月～12か月無料なのでfreenoｍを使う。

設定の仕方
①freenomでドメイン取得する「testdom.tk」とか。
②freenomのネームサーバを調べておく

>ns「testdom.tk」
ns1.freenom.com
ns2.freenom.com
ns3.freenom.com
ns4.freenom.com

③Route53で「testdom.tk」というホストゾーンを作成する。

>Route53「testdom.tk」
ns77.awsdns.net
ns88.awsdns.com
ns99.awsdns.net
ns111.awsdns.net


③でRoute53で作成したホストゾーン4つをfreenomのネームサーバに上書きする。

④Route53で「レコードを作成」をクリック
シンプルルーティングのまま
サブドメインを入力、

値/トラフィックのルーティング先
--

>- アプリケーションロードバランサー (ALBのとき）
- レコードタイプに応じたIPアドレスまたは別の値　（httpのEC2のとき）
- S3ウェブサイトへのエンドポイントへのエイリアス　（S3のとき）
latexで恥ずい間違いをしていた件

#僕のlatexの使用用途
僕は普段, 大学のレポート(特に数学, 物理などの数式がたくさん出てくる科目)を書くのにlatexをよく使ってます.
自称ヘビーラテクサーですｗ.

#本題
そんな僕ですが, ずっと間違ったまま書いていた記号がありました.
それは$\sin$です.

~~~latex
sin %(1)
\sin %(2)
~~~

(1)の書き方で書いた場合は$sin$と表示されます.
(2)の書き方で書いた場合は$\sin$と表示されます.

些細な違いかもしれませんが, このsinコマンドを知ったのもつい先日で, latex使いとしては失格だと自分では思います.
ああ, 今まで出したレポートの$sin$をすべて$\sin$に書き直したい…

#最後に
ヘビーラテクサー大学生の皆さん, お気を付けください.
CodeBuildを使ってみよう -本編-

#構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/0dfb9111-b2fb-a515-1f14-6d67ea564542.png)


# ビルド対象のディレクトリ構造(SpringBoot)
SpringBootプロジェクトをGradleでビルドし、イメージ化してECRにプッシュします。

```:ディレクトリ構造
.
├── Dockerfile
├── build
├── build.gradle
├── gradle
├── gradlew
├── settings.gradle
└── src
```

#ビルドプロジェクト作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/439d15fc-115f-90b2-47d0-06b84be549ec.png)

ビルドプロジェクトの主な設定は以下の通りです。Dockerを使用する為、特権付与の項目にチェックを入れます。

|  設定名 |  値  |
| ---- | ---- |
|  ソースプロバイダ  |  CodeCommit  |
|  サービスロール  |  管理者権限ロール  |
|  オペレーティングシステム  |  Amazon Linux2 |
|  ランタイム  |  Standard |
|  イメージ|  aws/codebuild/amazonlinux2-x86_64-standard:3.0 |
|  イメージのバージョン  |  aws/codebuild/amazonlinux2-x86_64-standard:3.0-21.04.23 |
|特権付与|あり|

#Buildspec
ルートディレクトリ内にBuildspecファイルを入れる方法もありますが、コンソールから編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/89948b22-29fd-e0bc-2128-64ca986d8c8a.png)
以下がコードです。

```yml:
version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto8
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin accont_id.dkr.ecr.ap-northeast-1.amazonaws.com
  build:
    commands:
      - ./gradlew build
      - docker build -t portforio_backend .
      - docker tag portforio_backend:latest accont_id.dkr.ecr.ap-northeast-1.amazonaws.com/portforio_backend:latest
  post_build:
    commands:
       - docker push accont_id.dkr.ecr.ap-northeast-1.amazonaws.com/portforio_backend:latest
```

**＜成功＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/099e6853-4c40-aabc-7865-665f4b7a145f.png)

**＜ECRにイメージがプッシュされている事を確認＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/b320b10c-bc55-8d9c-cb9f-fff1634afb09.png)


#トラブルシューティング

##ECRへのログインに失敗する
→サービスロールにECRにアクセスできるポリシーがアタッチされている事を確認.

##./gradlew build permission denied
→chmod +x ./gradlew で実行権限を与えたファイルをプッシュします。

##You have reached your pull rate limit.

https://hhhhhskw.hatenablog.com/entry/2020/11/25/180920

こればかりは運のようです。もう一度ビルドを実行します。
（docker loginで回避できるようです。）

#コンテナ内でdockerイメージをビルドする
CodeBuildと同じように、コンテナ内でイメージをビルドしてECRにプッシュできる事をローカル環境で確認しています。

https://qiita.com/ms2geki/items/0353d5c582544b9ed6b2
Dockのアプリケーションからアイコンが消えたとき

自分用メモです。

## 参考にしたページ

[MacでDock内アプリのアイコンが消えた・非表示になった時の対処法](https://workstyle-cafe.com/mac-dock-app-icon-disappear/)
情報、ありがとうございます。

## やること

1. ターミナルを起動
1. コマンド実行  
```
$ sudo find /private/var/folders/ -name com.apple.dock.iconcache -exec rm {} \;
```  
「sudo（root権限)」での実行なのでパスワードを入力する
1. Dockの再起動   
```
$ killall Dock
```
YouTube黒い枠を出さない埋め込み方法

YouTube黒い枠を出さない埋め込み方法でシンプルに実現できたので
自分への備考録としてメモしておきます。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>YouTube黒い枠を出さない埋め込み方法</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .video_container{
            position: relative;
            padding-bottom: 56.25%;
            height: 0;
            overflow: hidden;
        }
        .video_container iframe {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
    </style>
</head>
<body>
    <div class="video_container">
        <iframe src="https://www.youtube.com/embed/7t0EtKlQxyo?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe>
    </div>
</body>
</html>
```

### プラグイン使用

https://github.com/pupunzi/jquery.mb.YTPlayer
ダウンロード後、
「dist/jquery.mb.YTPlayer.min.js」のデータをプロジェクトファイルに追加・読み込み
jQuery本体も読み込む

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="./jquery.mb.YTPlayer.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        #ytPlayerWrap {
            position: relative;
            width: 100%;
            height: 500px;
        }
    </style>
</head>
<body>
    <div id="ytPlayerWrap" class="sample">
        <div id="ytPlayer" data-property="{
            videoURL: 'aqa9h-nL-TA',
            containment: '#ytPlayerWrap',
            autoPlay: true,
            loop: 1,
            mute: true,
            startAt: 0,
            showControls: false,
            showYTLogo: false
        }"></div>
    </div>

    <script>
        $(function(){
            $("#ytPlayer").YTPlayer();
        });
    </script>
</body>
</html>
```
Rials 'rails s'でサーバーが起動しない

# 正常終了せずにterminalを閉じた時
今回は、時々あるterminalでローカルサーバーを起動したまま終了して、
再度ローカルサーバーを立ち上げるときにエラーになる時の解決方法です。

### 解決方法
`rails s`
でローカルサーバーが立ち上がらない。
原因は、サーバーが起動したままターミナルを閉じるとログが残ったままでエラーになる。
その時は、

```bash
lsof -i :3000
```

で、対象のIDを探す。
そして`削除:kill`をする。

```bash
kill -QUIT *PID*
# *PID*には、対象IDの番号を記述する。
```

終わり。

※参照記事

https://qiita.com/jack-oat/items/47e2a5b8fa44d7edb41a

単純ですが、初めの頃は焦りますよね。
データの保存、終了は丁寧にやることが大事だと改めて思いました。
Data + AIサミット2021で発表されたDatabricksの新機能

[Data \+ AI Summit North America 2021 \- Databricks](https://databricks.com/dataaisummit/north-america-2021)で発表された新機能の紹介記事です。

- [Delta Sharingのご紹介 : セキュアなデータ共有のためのオープンプロトコル \- Qiita](https://qiita.com/taka_yayoi/items/f93f1b70fef0f75585be)
   企業間のデータ共有をシンプルにするための新たなオープンソースプロジェクト: 製品間の大規模データのセキュアなリアルタイムのデータ交換を初めて実現

- [Databricks Unity Catalogのご紹介：レイクハウスにおけるデータとAIに対するきめ細かいガバナンス \- Qiita](https://qiita.com/taka_yayoi/items/1ededa3458cfffb2f83b)
    馴染みのあるオープンなインタフェース(SQL)を用いて、レイクハウスのデータにきめ細かいガバナンスとセキュリティを提供

- [Delta Live Tablesのローンチ : 信頼性のあるデータエンジニアリングを簡単に実現 \- Qiita](https://qiita.com/taka_yayoi/items/4062930aa26f3cd14c9f)
    宣言型パイプライン開発、改善されたデータの信頼性、クラウド規模でのプロダクションオペレーションによって、データエンジニアの作業をシンプルなものにします

- [Databricks Machine Learningのご紹介：データネイティブ、コラボレーティブなフルMLライフサイクルソリューション \- Qiita](https://qiita.com/taka_yayoi/items/4f34ceae3b8ba1720b39)
    データネイティブ、コラボレーティブ、全体のMLライフサイクルをサポートする史上初のエンタープライズMLソリューション

- [Databricks AutoMLのご紹介 : 機械学習開発の自動化に対するガラスボックスアプローチ \- Qiita](https://qiita.com/taka_yayoi/items/3bf4f4e89990b299c6c9)
    前処理、特徴量エンジニアリング、モデルのトレーニング、チューニングと言った負荷の高い作業を自動化することで、機械学習モデルを迅速に構築、デプロイできるツール

- [Databricks Feature Store : データ、MLOpsと協調設計された史上初のフィーチャーストア \- Qiita](https://qiita.com/taka_yayoi/items/3772150dd3557272f61d)
    Delta Lake、MLflowと協調設計した史上初となるフィーチャーストア 

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
ROS OPENCV OAK-D 点群表示設定 

OPENCV OAK-D とROSの接続後、RVIZでサンプルプログラムにて点群表示を行いました。


<iframe width="560" height="315" src="https://www.youtube.com/embed/8CzjfOT1niM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


# 環境
mac Big Sar
VMware fusion
ubuntu 20.04
noetic
opencv4

# 設定準備

あれこれと試行錯誤しましたが、結局、noeticで動作しました。
melodicでも動作するとの事ですが、OPENCV３をOPENCV４への
バージョンアップ時にエラーが出たのでひとまず、noeticでテストしました。

※2021/5/31 仮想マシンでテストする際は、現況では仮想マシンがparallesでは、rvizが動作しません。
こちら再現する場合はVMwareなどの仮想マシンで試してください。

下記URLでROS noetic desktopfulバージョンをインストールしてください。
http://wiki.ros.org/noetic/Installation/Ubuntu
ROSが正常にインストール出来た後、下記手順で進めてください。

依存関係設定ubuntu

```
$ cd ~

$ sudo wget -qO- http://docs.luxonis.com/_static/install_dependencies.sh | bash

$ echo "export OPENBLAS_CORETYPE=ARMV8" >> ~/.bashrc

$ source ~/.bashrc
```
VCSツールインストール

```
$ cd ~

$ python3 -m pip install opencv-python

$ sudo apt install python3-vcstool
```

rosdep初期化

```
$ cd ~

$ sudo apt install python3-rosdep

$ sudo rosdep init

$ rosdep update
```
# 設定方法

```
$　cd ~

$　git clone --recursive https://github.com/luxonis/depthai-core.git --branch develop$

$　cd ~/depthai-core

$　mkdir build

$　cd build

$　cmake .. -DBUILD_SHARED_LIBS=ON

$　cmake --build . --config Release --target install

$ cd ~

$　mkdir -p ros_ws/src

$　cd ros_ws/src

$　git clone https://github.com/luxonis/depthai-ros.git --branch noetic-devel

$　git clone https://github.com/luxonis/depthai-ros-examples.git --branch noetic-devel

$　git clone https://github.com/ros-perception/vision_msgs.git --branch noetic-devel

$　cd ~/ros_ws

$　source /opt/ros/<ros-distro>/setup.bash

$　catkin_make_isolated --cmake-args -D depthai_DIR=~/depthai-core/build/install/lib/cmake/depthai

```

# 動作テスト

※動作テスト前に vmwareのUSB3.0へ設定変更してください。
詳細は下記URL参照
https://kb.vmware.com/s/article/2128105?lang=ja

```
$ cd ~/ros_ws

$ source ~/ros_ws/devel_isolated/setup.bash

$ roslaunch depthai_examples stereo_nodelet.launch
```
するとrvizが立ち上がり点群表示されます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/8CzjfOT1niM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

現在、点群表示が白オンリーでros-depthaiパッケージにはRGB表示はまだ
実装されていないようです。


# 参考
https://docs.luxonis.com/projects/api/en/latest/install/#ubuntu

https://github.com/luxonis/depthai-ros/commit/1de08ba77e692c931f6f7ec68b5f883caa6b2176
【PlayCanvas】SkyBoxをスクリプトから回転させる

PlayCanvasで設定したSkyboxをスクリプトから回転させる方法です。

```javascript
const RotateSkybox = pc.createScript('RotateSkybox');

RotateSkybox.prototype.update = function(dt) {
    const a = this.app.scene.skyboxRotation
    const b = new pc.Quat().setFromEulerAngles(0.0 , -0.01, 0.0);
    const r = new pc.Quat();
    r.mul2(a, b);
    this.app.scene.skyboxRotation = r;
};
```

### 実行結果
毎フレーム`-0.01`ずつ回転している
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/426c8a8c-fb8c-da06-f60b-e8224b33ed57.gif)

### 実行URL
https://playcanv.as/p/7IhlYtdc/

#### Sceneについて(APIリファレンス)
https://developer.playcanvas.com/en/api/pc.Scene.html

#### skyboxRotationについて(APIリファレンス)
https://developer.playcanvas.com/en/api/pc.Scene.html#skyboxRotation
CloudFormationのテンプレートを速攻で探しやすく整理する（１）

CloudFormationのテンプレート管理に、GitHubを利用する方は多いと思います。GitHubのバージョン管理やCIワークフローはパワフルなので、システムごとのテンプレート運用には効果的です。

しかし新しいシステムに別案件のテンプレートを流用したいと思った時、案件毎に分かれたリポジトリを探るのは結構大変です。記憶を頼りにリポジトリを開いていく作業は場当たり的で無駄が多いし、やっと見つけてカスタマイズを済ませた後、より最適なテンプレートが別にあったことに気づいたりすると、本当にげんなりします。

よって今回は**CloudFormationテンプレートの流用性**を向上させるために、それらを見通しよく整理する方法をご紹介します。

#1. ForkMe!にテンプレートをアップロードする
テンプレートの整理に、クラウドの設計監理に特化した[ForkMe!（フォークミー）というツール](https://reindeer.tech/ja/index.html#forkme)を使います。JSON/YAMLファイルのインポートに対応しているので、手元のテンプレートをとりあえずどんどんアップロードして、それらを一覧化することができます。またその名が示す通り設計をフォーク（複製）するためのツールなので、テンプレートの流用を考えている方にとって便利な機能が色々あります。

###1-1) まずは[ここから会員登録](https://forkme.cloud/ja/signup/)します。無料です。
###1-2) 「新しい設計」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559449/64791e88-6086-4361-2c6d-5282f6e67f48.png)

###1-3) 手元のCloudFormationテンプレートをアップロードします。
アップロードエリアにドラッグ＆ドロップするか、「アップロード」ボタンを押してCloudFormationテンプレートを投入します。タイトルを決めたら「作成」ボタンを押して、次へ進みましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559449/cf5b1979-9435-d302-c91a-05ae6eb16d8d.png)

* なおスマートフォンではこの操作ができないので、PCで開いてください
* 壊れたJSON/YAMLファイルはアップできません。
* 日本語を除くファイル名が同じ場合はどちらか一方だけがアップされます。例えば「ファイル1.json」と「テスト1.json」はどちらも「1.json」なので、両方はアップできません。
* 最大10ファイルまで選択できるので、1つの設計を複数のテンプレートに分割している場合は一括でアップロードできます。

###1-4) 保存します。
色々表示されますが、まずは気にせず保存ボタンを押し、アップロードを完了させましょう。なお意図的に公開するか閲覧者を招待しない限り、設計は常に**「非公開」**です。あなた以外は閲覧できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559449/81e66b70-c667-197d-0fe7-2f17856ef9af.png)

以上でテンプレートが登録されました。

#2. ForkMe!にアップしたテンプレート集を活用する
一覧ボタンを押すと、先ほどの設計が表示されます。まずはお手元のテンプレートをアップしてあなただけのテンプレート集をつくりましょう。テンプレートが一覧化されることで、大分見通しがよくなると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559449/387e0f12-470a-3ef9-2555-ac75403ef791.png)


再利用したい場合には「ForkMe!」ボタンを押すだけで、その設計に含まれるテンプレート一式がフォーク（複製）され、編集を始めることができます。
なおアップロードされたテンプレートは以下のような機能が使えるようになるので、詳しくは[マニュアル](https://docs.reindeer.tech/forkme_ja.html)を見てください。

* テンプレートに含まれるAWSリソースの一覧化と、概算コストの見積もり
* テンプレートの編集（JSONまたはYAML）
* テンプレートの構文チェック（JSON形式のみ）
* テンプレートの静的解析
* フォーク（複製）
* ダウンロード
* 権限設定（共同編集者の招待、公開／非公開）


#3. 最後に
まずはお手元のCloudFormationテンプレートをアップロードしてみてください！
[次回](https://qiita.com/harashin-midnight-only/items/481de5aa9377a32e64c4)はForkMe!を使って、テンプレートの探しやすさをもう一段レベルアップさせる方法をご紹介します。

#4. 参考
[CloudFormationのテンプレートを速攻で探しやすく整理する（２）](https://qiita.com/harashin-midnight-only/items/481de5aa9377a32e64c4)
ForkMe!について　　　　[https://reindeer.tech/ja/index.html#forkme](https://reindeer.tech/ja/index.html#forkme)
ForkMe!会員登録ページ　[https://forkme.cloud/ja/signup/](https://forkme.cloud/ja/signup/)
ForkMe!トップページ　　[https://forkme.cloud/ja/](https://forkme.cloud/ja/)
ForkMe!マニュアル　　　[https://docs.reindeer.tech/forkme_ja.html](https://docs.reindeer.tech/forkme_ja.html)
クラウドデザイン仕様　　[https://docs.reindeer.tech/index_ja.html](https://docs.reindeer.tech/index_ja.html)
Azureの自己学習の記録２

Azureのサービス名毎に学習した内容や操作方法を記載していく。

# 1.Virtual Machines

## 1-1.雛形のイメージ作成

インストール後に必ず行う作業を行った後に、sysprepを実行し、イメージを作成する。

* 日本語化

* 一時ディスクをDドライブからTドライブに変更
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/change-drive-letter


した後にsysprepを実行。
キャプチャでイメージを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187121/0c4d77c9-695c-fb78-8641-0cfc5038269e.png)
Power Automate DesktopのWebオートメーションUI要素が取得できない

自分のPower Automate DesktopのWebオートメーションUI要素が取得できない問題がありました
すぐ検索しても出てこなかったので、メモしておきます

## 問題
UI要素の追加を押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/bc224fce-20f3-6c94-c6e4-238ceace3832.png)
要素を選択して完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/9ce8d29f-4c9b-886c-73c2-ae23ef9a2856.png)
なにも追加されない。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/f4f8cc77-4729-24c1-a10c-c5368a809298.png)

##解決方法
ブラウザの拡張機能を入れることでできるようになりました～
[拡張機能のインストール](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/setup#install-the-power-automate-browser-extension)

インストールしたときにインストールしてと出ていましたが無視していました、、、(笑)
mediawikiを別サーバへ移転する

# 概要
社内wikiとして使用していたmediawikiを別サーバへ移動させることになった。

## 環境
移転先、移転元ともにはCentOS6。
移転先は既にwebサーバとDBが構築済みとする。
DBはMysqlで稼働しているものとする。
また、ダンプしたsqlファイルとmediawikiのアーカイブをバックアップするためWinSCPを使用する。

## 作業手順
### 移転元サーバでの作業
まずは移転元サーバのwebサーバを停止させる。

```
service httpd stop
```

これまでに社内wikiとしてmediawikiに書き溜めた大切な中身はDBの中身に収まっているので、これを吸い出す必要がある。
吸い出したデータはsqlと呼ばれるファイルとなる。
ちなみにこのようにDBの中身をsqlファイルとして出力することを「DBをdumpする」と言う。
DBをdumpしてsqlファイルとして出力するには`mysqldump`というコマンドを使う。

```
mysqldump -u DBユーザ名 -p DB名 > 出力先ファイル名
```
出力先ファイル名はここでは便宜的に`hogehoge`とする。
この吸いだしたファイルはsqlファイルとされ、mediawikiのディレクトリ内に存在する。
FFTPやsshでそのまま移転先サーバに送ることができるけど、万が一のために手元にバックアップを取っておきたいのでWinSCPでsqlファイルを自分の端末へと保管していおく。<br>
その後、mediawikiそのものもアーカイブ化させてバックアップをとる。

```
cd /var/www/html/
tar zcvf mediawiki.tar.gz ./mediawiki
```

### 移転先サーバでの作業
ここからは移転先サーバでの作業となる。
まずは移転先でもwebサーバが稼働していたら止めとこう。

```
service httpd stop
```
次に移転先データベースに新たにmediawiki用のデータベースとユーザを作成する。

```
mysql -u root -p
create database mediawiki;
create user mediawiki identified by 'パスワード';
grant all on mediawiki.* to mediawiki;
```
mediawikiのアーカイブファイルをSCPで移転先にアップロードする。
直接html配下に上げるのはパーミッションの関係で無理だったので、一般ユーザのホームディレクトリにアップした後にmvコマンドで移動させた。
その後にアーカイブであるgzファイルを解答展開。

```
mv mediawiki.tar.gz /var/www/html
tar zxvf mediawiki.tar.gz
```
次にmediawikiの設定ファイルを編集すて、移転先のグローバルIPを認識させる。

```
cd /var/www/html/mediawiki
vim Localsetting.php
※43行目と44行目の値に移転先のグローバルIPを入力する。
$wgEmergencyContact = "apache@hogehoge";
$wgPasswordSender   = "apache@hogehoge";
```

mediawikiのオーナーとグループをApache(webサーバ)へ設定

```
find mediawiki -exec chown apache {} \;
find mediawiki -exec chgrp apache {} \;
```
最後に吸い出しておいたmdiawikiのデータベースのsqlファイルを移転先サーバにアップロードして、認識させる。

```
mysql -u root -p mediawiki < mediawiki.sql
```
webサーバの起動も忘れずに

```
service httpd start
```
これで、無事アクセスできたら成功。

### 参照

https://www.nakamuri.info/mw/index.php/MediaWiki_%E3%81%AE%E3%81%8A%E5%BC%95%E8%B6%8A%E3%81%97%E6%89%8B%E9%A0%86
hoverで画像表示を変える


# hoverを調べたきっかけ
* 画像をクリックすると詳細ページに遷移する機能を作ってみた
* しかし画像上にカーソルを置いてもクリックできるかどうか見た目だけだとわからない。（アクションがない）
→　ユーザー視点から、画像をクリックできるか分かりにくい印象。
* カーソルを画像上に置くと、クリックできるとわかるような動きが欲しい！
調べるとhoverという機能を発見。実装したので記事にしてみました。

#参照
下記サイトを参考にさせて頂きました！
大変参考になりました、ありがとうございました！
https://lab.sonicmoov.com/markup/css/hover-css/

# 実装したhover
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1440401/433aa243-6ba5-f0d5-0826-d272f24506d9.gif)
このようにカーソルを画面上に置くと、画像が変化し、クリックしやすくなる

#HTML
まずは画像を挿入している部分にクラス名を付ける（今回は、"button grow")

```rails:html.erb
<%= link_to public_public_golfcourse_path(golf_course.id) do %>
  <%= attachment_image_tag golf_course, :image, size: "180x120", fallback: "no_image.jpeg",class: "button grow p-2" %><br>
<% end %>
```

#CSS
HTMLでclassをつけたら、次はCSSにhover対応を記述していく。

```rails:homes.scss
/* Default styles for the demo buttons */
.button {
  // margin: .4em;
  // padding: 1em;
  cursor: pointer;
  // background: $primaryColour;
  text-decoration: none;
  color: $secondaryColour;
}

/* 2D TRANSITIONS */

/* Grow */
.grow {
  display: inline-block;
  transition-duration: $defaultDuration;
  transition-property: transform;

  @include hideTapHighlightColor();
  @include hardwareAccel();
  @include improveAntiAlias();

  &:hover {
    transform: scale(1.1);
  }
}
````


クラス名とCSSを少しいじるだけで、使い勝手のいいものになりました！
【Vue.js】Vue Routerについての理解を整理してみた

#はじめに
Vue.jsの勉強を進めていくと「Vue Router」というものに出会いました。

今回はそのVue Routerについて得た基本的な知識と理解を
備忘録も兼ねて書き記していきます。

#Vue Routerとは
Vue RouterはVue.jsの公式プラグインとして提供されているSPA構築のためのルーティングライブラリです。

ちなみにSPAとは「シングルページアプリケーション」の略称で、
1つのHTMLを読み込んだ後はAjaxで情報を取得し、動的にページを更新するWebアプリケーションを指しています。

[公式ドキュメント](https://router.vuejs.org/ja/)では、
Vue Routerの機能として以下の8点が紹介されています。

>・ネストされたルート/ビューマッピング
>・モジュール式、コンポーネントベースのルータ構造
>・ルートパラメータ、クエリ、ワイルドカード
>・Vue.js の transition 機能による、transition エフェクトの表示
>・細かいナビゲーションコントロール
>・自動で付与される active CSS クラス
>・HTML5 history モードまたは hash モードと IE9 の互換性
>・カスタマイズ可能なスクロール動作

#Vue Routerの使い方
では、Vue Routerの使い方について見ていきます。

Vue Routerを使用するにあたり
JS側では2点、HTML側で1点書くべき内容があります、
それぞれを順に確認します。

【JS側で書くべきこと】
JS側では、ルート定義とルートコンストラクタを用意する必要があります。

ルートとはURLとViewの情報を持っている1つのレコードです。
つまり、ページ遷移に必要な情報をまとめたもので、
例えば以下のように書きます。

```javascript:sample
{
  path: '/main',
  component: {
    template:'<div>メインページです、</div>'
  }
},
{
  path: '/user',
  component: {
    template:'<div>ユーザーページです。</div>'
  }
}
```

次にルートコンストラクタです。
上記で定義したルートをルートコンストラクタを用いたルート初期時のroutesオプションに設定します。
以下がその例です。

```javascript:sample
new VueRouter({
  routes: [
    {
      path: '/main',
      component: {
        template:'<div>メインページです、</div>'
      }
    },
    {
      path: '/user',
      component: {
        template:'<div>ユーザーページです。</div>'
      }
    }
  ]
})
```

【HTML側で書くべきこと】
HTML側ではrouter-view要素、router-link要素を用意します。

router-viewはルート定義で書いたコンポーネントを実際に反映させるために、
router-linkはページを開いてからでもページ遷移ができるようにするために使用します。

以下が書き方の例です。

```html:sample
<div id="app">
  <router-link to="/main">メインページ</router-link>
  <router-link to="/user">ユーザーぺージ</router-link>
  <router-view></router-view>
</div>
```

あとはいつも通りJS側でVueインスタンスを作成し、
ルーターのインスタンスをそのVueインスタンスに渡す処理を書けば
リンククリックでページが切り替わるSPAの完成です。

#参考
[書籍「Vue.js入門 基礎から実践アプリケーション開発まで」](https://www.amazon.co.jp/Vue-js入門-基礎から実践アプリケーション開発まで-川口-和也-ebook/dp/B07J6FP6NQ)
Laravelを調べる：初めてのmigrate編

# Laravelを調べる：初めてのmigrate編

編集中です!!

## モデルの確認

[Laravelを調べる：Docker起動編](https://qiita.com/takeohman/items/2233a3d7f7a627cb8ed5) での展開直後、Models/User.phpがすでに存在していた。

私は慌ててmigrate（後述）してしまい、フィールドを追加し忘れてしまったので、ここは一旦落ち着いて見直すのがよいと思う。


```
app
...
├── Models
│   └── User.php
...
```

```
% tree database
database
├── factories
│   └── UserFactory.php
├── migrations
│   ├── 2014_10_12_000000_create_users_table.php <============これー
│   ├── 2014_10_12_100000_create_password_resets_table.php
│   └── 2019_08_19_000000_create_failed_jobs_table.php
└── seeders
    └── DatabaseSeeder.php
```

## migrationファイル ( 2014_10_12_000000_create_users_table.php )

開発初期段階で必要なフィールドはここを変更することで対応するのでよさそう。（Laravelの定石的なところは未確認）

また、web applicationのバージョンアップでフィールドの追加が必要になった場合には、このファイルはそのままで、別途migrationファイルを追加するのが手順のよう。


```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

```

### sailコマンドによるmigrate

【コマンド】

```bash
$ ./vendor/bin/sail artisan migrate
```


【実行結果】

```bash
$ ./vendor/bin/sail artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (53.22ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (37.86ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (38.45ms)
```


#### データベースを確認してみる。

```bash
$ ./vendor/bin/sail mysql
```


```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| example_app        |
| information_schema |
+--------------------+
```

```
mysql> use example_app;
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_example_app |
+-----------------------+
| failed_jobs           |
| migrations            |
| password_resets       |
| users                 |
+-----------------------+
4 rows in set (0.00 sec)
```
VS Code 1.46 の新機能 - アンカーによる範囲選択機能の追加

https://code.visualstudio.com/updates/v1_46#_accessibility

アンカーを使用した範囲選択機能が追加された。

1. **選択アンカーの設定(Set Selection Anchor)** (`Ctrl`+`K` `Ctrl`+`B`)
1. **アンカーからカーソルへの選択(Select From Anchor to Cursor)** (`Ctrl`+`K` `Ctrl`+`K`)
1. **選択アンカーへ移動(Go to Selection Anchor)** (キー定義なし)
1. **選択アンカーの取り消し(Cancel Selection Anchor)** (`Esc`)

1.を実行するとカーソル位置にアンカー(青色のマーク)がセットされ、カーソルを移動してから2.を実行するとアンカーからカーソル位置までの範囲が選択される。

通常の範囲選択を行う場合は既存の機能で事足りそうだが、範囲選択の途中でカーソルを動かしたいとか、選択開始位置は確定させておいて終了位置は検索で探してから確定、などといった場合に便利そう。

あるいは1.と3.を組み合わせてジャンプ機能的に使うとか。
[Git] 親ブランチをrebaseしたために子ブランチのコミット履歴がおかしくなって統合ブランチにマージできなくなってしまった場合の対処方法

# 事例

当初、こんな感じのブランチ構成とツリーになっているとします。

```
main
┃ [コミットX]
┣ task-1
┃    ┣ task-2
```

**トラブルが発生する流れ（例）：**

１．task-1をmainにマージする際に、mainの最新コミットにrebaseしてからマージした。
２．task-2をmainにマージしようとしたら、コミット履歴がおかしくなっていて、最新mainと複雑なコンフリクトが発生！

```
main
┃ [task-1を最新mainにrebaseしてマージ]
┃ [コミットX]
┣ 
┃    ┣ task-2 →コミット履歴がおかしくなって最新mainにrebaseもマージもできない！
```

こんなケースで、マージできなくなって困った時の対処方法です。
アジャイル開発で、一つの機能を複数人で作り込んでいく場合などはありがちなトラブルかと思います。

# 対処手順

## １．最新のmainブランチを取得する。

`git fetch`
`git checkout main`
`git reset --hard origin/main`

## ２．"task-2"ブランチの名前を"task-2-back"に変更して退避する。

`git branch -m task-2 task-2-back`

## ３．"task-2"ブランチをmainブランチから切り直す。

（カレントブランチが"main"の前提で）
`git checkout -b task-2`

## ４．"task-2-back"ブランチの対象コミットをcherry-pickする。

コミットが一つの場合／複数の場合、コミットをまとめたい場合、cherry-pickでコンフリクトした場合、いろいろあるかと思いますが、こちらの解説記事がとても分かりやすいと思います。
[git cherry-pickを完全マスター!特定コミットのみを取り込む方法](https://www.sejuku.net/blog/71544) - SAMURAI ENGINEER Blog

## ５．リモートにforce pushする。

（カレントブランチが"task-2"の前提で）
`git push -f origin HEAD`
書籍「ユースケースで学ぶDataiku－レンタカーの故障予測－」告知

2022/2/09 追記
 こちらの書籍は、以下の総集編に統合しました。以下をご利用ください。
 プログラミングレスデータ分析のすすめ ユースケース編
　[https://play.google.com/store/books/details?id=841aEAAAQBAJ](https://play.google.com/store/books/details?id=841aEAAAQBAJ)

----



[Dataiku DSS](https://www.dataiku.com/)を扱った書籍２冊目を発行しましたのでお知らせします。

<b>「ユースケースで学ぶDataiku：レンタカーの故障予測」</b>、本日2021/5/31発行です。

基礎から一歩踏み込み、ユースケースをもとにしたDataikuの応用的な使い方について学ぶことができる１冊です。


|<img width="400" alt="cover.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/f92a49fc-7661-1bef-08ed-04d9ec9d59e1.png">|
|:--:|


#本の紹介
本書は、Dataiku 社（https://www.dataiku.com/）が提供する分析ツールDataiku Data Science Studio（Dataiku DSS）を使って、実際の現場でデータ分析を進めるための第⼀歩を踏み出すための⼊⾨書です。本書ではレンタカーの故障予測というユースケースを通じて、Dataiku DSS の実践的な使い⽅を学んでいきます。具体的には、データ加⼯やメンテナンスが必要な⾞を予測する機械学習モデルの作成、およびそのモデルの詳細確認の分析作業を体験することができます。この内容はDataiku Academy で提供されている[「Use Case: Predictive Maintenance」](https://academy.dataiku.com/use-case-predictive-maintenance-1)の内容を⽇本語化しまとめたものとなります。初⼼者の⽅でもデータ分析のことを知っていただけるように、Python やR などの分析⾔語の知識がなくても、Dataiku DSS のGUI を使ってデータ分析を体験できるようになっています。そのため、現場でのデータ分析をどのように進めていけばよいか知りたい⽅には、きっと役⽴てていただける内容となっていると思っております。本書を通じて、実際のビジネス現場でのデータ分析で活⽤いただれば幸いです。

また、本書は「プログラミングレスデータ分析のすすめ」の知識を前提としていますので、先にそちらを読んでおくとより理解が深まります。

#執筆者
[@hktonton](https://qiita.com/hktonton)さんが執筆されています。執筆、おつかれさまでした！

#ダウンロード
以下からダウンロードできます。
https://play.google.com/store/books/details?id=Wf4vEAAAQBAJ

前著　プログラミングレスデータ分析は以下からダウンロード可能です。
技術書典
https://techbookfest.org/product/5117838303952896


以上
Macのターミナルで~/.bash_profileと~/.bashrcが読み込まれない

備忘用にメモ

# 原因
Macの環境変数を追加しようと思い、
~/.bash_profileと~/.bashrcを編集したが、ターミナル起動時に読み込まれない。。。
sorceコマンドで読み込んだら行ける。

```
% echo $SHELL
/bin/zsh
```

。。。。bashじゃないんかい

どうやらmacOS Catalina 以降はzshになっているらしい。


# 解決法
zsh版ののbash_profileとbashrcは以下の通り。
`~/.zprofile`
`~/.zshrc`

自分の場合、すでに作成されていたのでそこに追記すると読み込まれるようになった。
no newline at end of file？

#はじめに
簡単な共同開発に参加させてもらい、チームのプルリクエストを見ていて学びがあったので記事として残す。

# no newline at end of file
GitHubのソースコードに、赤い警告マークのようなものが出ていた。マウスを重ねると`no newline at end of file`と表示されたので、何かと思ったら「ファイルの最後に改行がない」と言われているみたい。

# 解決策
そのままの意味で最後の行に改行を設けることで解決。

ただ、なんでそんなことをするのかよく分からなかったので調べてみると、どうやら「POSIXの仕様上、改行がない行は正しく認識されない」ものみたいだった。

`RuboCop -a`などの実行の際に、何気なく行が修正されていたのだが意味を理解できた。

参考元
[なぜ gcc はファイルの最後に改行がないと警告を出すのか？](http://hiroakiuno.hatenablog.com/entry/20070409/p1)