OmniAICreator/Qiita-1.07M huggingface dataset:
Uipath日本語化で旧バージョンのロボにトラブル発生！

#ロボットがいきなり動かなくなった

Uipathはこれまでは英語表記だったので、英語表記で避けていた方も少し扱いやすくなりましたよね。

◎日本語画面イメージ
<img width="960" alt="2018-10-10_23h01_29.png" src="https://qiita-image-store.s3.amazonaws.com/0/214565/b7ed5c54-e796-e704-b82c-3d991d28ba0f.png">

でもいい事ばかりではありませんでした。

なんと！旧バージョンで作ったロボットがいきなり動かなくなくなったんですよ。

ただ私も現役エンジニアですので、そこは調べて自己解決しましたので、今回はその方法をご紹介します。

#アップデート結果にがく然となる

パソコンを立ち上げてみると、Uipath Studioが自動アップデートされていました。

旧バージョンで作成していたロボットは、パッケージを作成し直せばよいかなと安易に考えていました。

◎パブリッシュ画面
<img width="478" alt="2018-10-09_08h37_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/214565/b7461b1b-27c3-3f17-78e9-1bde4960102d.png">
<img width="290" alt="2018-10-09_08h37_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/214565/191cbb4f-1a19-bf74-6884-d26bbe96b3eb.png">

ですが、ロボットを起動してみると
　
「ブラウザーと通信ができません。Uipath拡張機能を確認してください」

と言うエラーメッセージが出てきて全く動きません。

◎エラーメッセージ画面
<img width="404" alt="uipath_ランタイム実行エラー.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/214565/1c8f5cc3-3d79-8c6e-488a-3977af308a0f.jpeg">

ブラウザーはGoogleクロームを利用していたので、拡張機能は入れていました。

「ん？何でこのエラーなの？」

と思いましたが、日本語化されたことによってこれまでの拡張機能が使えなくなった様です。
#拡張機能を入れ直してみる

Uipathのサイトを探ってみると、日本語化したUipath StudioでGoogleクロームの拡張機能を追加する手順を見つけました。

原因が拡張機能だけなら、これを追加すれば解決するはずと思い

再度Googleクロームの拡張機能を追加して、もう一度パッケージを作り直してみました。

◎拡張機能を選択します
<img width="960" alt="2018-10-09_23h44_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/214565/08b54f3e-c2b0-a745-32fd-047c3b5350cf.png">


すると、今まで何事もなかったように動かす事が出来ました。

#バージョンアップも良し悪しです

自動でバージョンアップしてくれるのはいいですが、旧バージョンに不具合が出るなら、もう少しフォローや不具合が出た時の対応方法をサイトに事例をあげて、注意喚起をして欲しかったですね。

まぁこういったツールでは、ありがちな話なので特に目くじらを立てる事もありませんがITエンジニアじゃない方でしたら、かなり困ると思いましたね。
Visual Studio Code の日本語化（locale.jsonの設定だけでは日本語化されない場合）


Visual Studio Code（以後VSCode）の日本語化について、他のサイトでよく説明されている手順（locale.jsonの設定）だけでは、自分の環境では日本語化されませんでしたので、自分の環境での日本語手順を記載します。

導入環境

* Windows 7 (SP1) Ultima x64
* VSCode(User Installer) x64 (Ver:1.27.1) （※インストール先はデフォルトではありません）

## Japanese Language Pack を導入

VSCodeの左端にあるアクティビティーバー（縦型のツールバー）の拡張機能メニューを開いて、入力欄に "japanese" と入力し、 フィルタリング表示された Japanese Language Pack の Install をクリックします。

![vscode_japanese1.PNG](https://qiita-image-store.s3.amazonaws.com/0/299676/2cac2d17-481b-0fca-35db-c3fa486fe087.png)

## locale.json で日本語を指定

Japanese Language Pack の使用法にも書いてあるとおり、設定をしなければ日本語化されません。

Ctrl+Shift+P を押してコマンド パレットを表示させ、"config" と入力し、Configure Language を選択します。
次に、表示されたlocale.json 内で "locale": "en"を、"ja" に変更します。

![vscode_japanese2.PNG](https://qiita-image-store.s3.amazonaws.com/0/299676/cf6f5df3-c476-b7cb-3587-1f529ae0d6f8.png)

## VSCode の再起動

インストールした Japanese Language Pack をreloadしても反映されないので、VSCode を再起動することでメニューが日本語化されることを確認します。

![vscode_japanese3.PNG](https://qiita-image-store.s3.amazonaws.com/0/299676/59b44dc8-7450-5c4e-7123-4ddfa3fe98e9.png)

以上です。  
locale.json だけ設定しても日本語化されない方の助けになれば幸いです。
MacBook に Ubuntu をセットアップしてみたメモ

# はじめに

MacBook に Ubuntu をセットアップしてみたメモです。自動ではケアしてくれない要素があり、少しだけ工夫が必要でした。

# 対象

MacBook Pro (13-inch, Mid 2012)
https://support.apple.com/kb/SP649?locale=ja_JP

Ubuntu 18.04 LTS Bionic Beaver
細かくは 18.04.1 desktop amd64 です。

# 手順

概略は下記です。

1. DISK 下準備（GPT 新規テーブル作成，EFI パーティーション作成）
1. Ubuntu Installer でブート（ないしリブート）
1. 普通にインストール
1. （有線で The Internet に繋ぐ）
1. 無線 LAN ドライバインストール
1. 再起動

## DISK 下準備

ここが「自動でケアしてくれない要素」になります。これをやっておかないとインストーラの終了直前の行程でエラーになります。ひどい。
いずれの処理も Linux 上のコマンドで実施できます。Ubuntu Installer ディスクで Live モードで起動して操作するのが良いと思います。
下準備の完了後、そのままインストーラを実行すると失敗する場合があるようです。再起動しましょう。

## EFI パーティーション

EFI パーティーションのパラメータは下記で成功しています。

- 第１パーティーション
- ID == 0xEF00
- 容量 512MiB
- FAT32 でフォーマット

容量はもっと小さくても平気だと思います。実際数パーセントも使っていません。けれど 0.5GiB なんてディスク全体容量の数パーセント未満でしょうから、気にしない。

※太る (C)ロケットマン

## 無線 LAN ドライバインストール

この行程は場合によっては不要かもしれません。

手元の MacBook に搭載された無線 LAN 用 LSI は Broadcom 社の BCM4331 rev2 で、Ubuntu 18.04.1 インストール直後はドライバの初期化でエラーが出ており、使用できない状態でした。
このエラーは下記パッケージをセットアップすることで解消します。要再起動（試してませんが insmod でも足りるかも）。

- firmware-b43-installer

Stack Overflow 等にオフラインでセットアップする手順があるっぽいです。未検証ですが有線も使えない場合はお試しください。

# オマケ

今となってはイリーガル感が否めませんが、Windows PC の BIOS モードで GPT なディスクから Linux を起動する Tips を[コチラ](https://www.miraclelinux.com/tech-blog/qwi8ni)に掲載しています。
Illustrator CC で指定フォルダ以下のすべての ai ファイルを開いて何かするスクリプト

# 概要

Illustrator を使っていると、複数の ai ファイルをまとめて png や jpg 画像形式にエクスポートしたい、などといった一括処理をしたくなることがあります。

その際の大枠の流れをメモします。



# コード

好きな名前のテキストファイル（下例では "for_all.jsx"） を作成してテキストエディタを以下のように編集して `[ここで何か処理をする]` の部分に処理を書きます。

```js:for_all.jsx
// ダイアログを表示してフォルダ選択
var inputFolder = Folder.selectDialog( "Please select top level folder to process");
// 選択フォルダ内の *.ai ファイルリストを取得
var fileList = inputFolder.getFiles("*.ai");

for(var i=0; i < fileList.length; i++)
{
	var fileRef = fileList[i];
	
    // illustrator でファイルを開く
	var docRef = app.open(fileRef);
	
    // [ここで何か処理をする]

    // 保存しないでドキュメントを閉じる
	docRef.close(SaveOptions.DONOTSAVECHANGES);
}
```

# スクリプトの使い方

Illustrator を開いて `[ファイル] > [スクリプト] > [その他のスクリプト] (or Ctrl+F12キー)` を選ぶとファイル選択ダイアログが出てきます。上記のスクリプトファイルを選択してください。
選択するとスクリプトが直ちに実行されます。
Visual Studio 2017でC++ライブラリ「Boost」を入れる方法

#はじめに
AtCoderで競技プログラミングをする中で最大公約数・最小公倍数を出力したい
場合があります。
C++17にgcdとlcm関数があるのですが、AtcoderはC++14までしか対応していないので
使うことができません・・・
そこで最強ライブラリ**Boost**を導入して、この問題を解決しようという記事です。

使用環境：
Windows10
Visual Studio2017
boost 1_68_0

#Boostのダウンロード
以下のURLからBoostの最新バージョンをダウンロードします。
https://www.boost.org/users/download/#live
<img width="556" alt="boost.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/109300/55c0fc3e-2988-efd0-19ff-5c8fe4c26b78.png">
Windowsなら一番下をダウンロードすれば問題ないと思います。

Cドライブ直下に解凍！

#ビルド
```ruby:コマンドプロンプトの画面
C:\WINDOWS\system32>cd C:\boost_1_68_0
C:\boost_1_68_0>bootstrap.bat
```
bootstrap.batでビルドします

ビルドが終わったら

```ruby:×86
b2.exe toolset=msvc-14.1 link=static runtime-link=static,shared --build-dir=build/x86 address-model=32 -j5 install --includedir=C:\boost_1_68_0\include --libdir=C:\boost_1_68_0\stage\lib\x86
```
```ruby:×64
b2.exe toolset=msvc-14.1 link=static runtime-link=static,shared --build-dir=build/x64 address-model=64 -j5 install --includedir=C:\boost_1_68_0\include --libdir=C:\boost_1_68_0\stage\lib\x64
```
と打ち込みます。

かなり長い時間かかります。


#Visual Studioの設定

画面上のプロジェクト➞～のプロパティを選択

C/C++ ➞ 全般 ➞ 追加のインクルードディレクトリに下記を追加

```ruby:
C:\boost_1_68_0\include\boost-1_68
```

リンカー ➞ 全般 ➞ 追加のライブラリディレクトリに下記を追加

```ruby:×86
C:\boost_1_68_0\stage\lib\x86
```

```ruby:×64
C:\boost_1_68_0\stage\lib\x64
```
これで準備完了です！

#gcdを使ってみよう！

```C++
#include <iostream>
#include <numeric>
#include <boost/math/common_factor_rt.hpp>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	
	cout << gcd(n, m) << endl;
}

```

最大公約数が出てきたら成功です！
やったー！

#参考
数学
https://boostjp.github.io/tips/math.html
Linux～Windows間でファイル転送する方法

# はじめに
WindowsからLinuxの環境に接続する際にTeraTermを使うことが多いと思います。
そのため、WindowsからTeraTermで接続し、ファイル転送をする手順を自分用メモにまとめました。似たようなことをしたい方の参考になればと思います。

# 環境
Ubuntu 16.04　※CentOSなどでも良い
Windows10（TeraTerm使用）

# 1. Ubuntuにssh設定
デフォルトではsshが使えない状態のため、sshをインストールします。

```
$ sudo apt-get install ssh
```
※apt-getをする際はインターネットに接続必要
これでsshが使える状態になりました！

# 2. TeraTermからssh接続
sshを使って接続します。
画面に沿って接続先IPアドレスやユーザ名・パスワードを入力していくと、最終的にコマンドに~~~$ と表示されます。

# 3. ファイル転送
TeraTermで「ファイル」→「SSH SCP」を選択します。
すると別画面が表示され、画面上部にSendボタン、画面下部にReceiveボタンが表示されていると思います。

例えば、Windows(クライアント)からUbuntu(サーバ)にファイルを送信したい場合は、画面上部のFrom: に送信したいファイルを選択し、To: に送信先を指定します。Sendボタンを押すことでUbuntuにファイルが送信されます。

反対に、Ubuntu(サーバ)からWindows(クライアント)へファイル送信したい場合は、画面下部のFrom: に送信したいファイル、To: に送信先を指定し、Receiveボタンを押すことでWindowsへファイルが送信されます。

# おまけ：ZIPファイルの取り扱い
上記のSSH SCPを使った方法では1つのファイルしか送信できないため、複数ファイルを送信したい場合はZIPファイルとして送信する方法があります。
ubuntuでZIPファイルを解凍する際は、

```
$ unzip (ファイル名).zip
```
を実行すると実行時ディレクトリに解凍されたファイルが作成されます。
【第一回】Raspberry piで並列処理を行う

# 目的

Raspberry piを使用して並列計算を行う
MPIについての学習兼並列処理についても学習

# 用意するもの
Raspberry Pi * 2台以上

以下
pi-cluster01　：　master
pi-cluster02　：　node
pi-cluster03　：　node

と、して、同一ネットワーク上かつssh通信が出来ること。

# MPIとは

MPI(Message Passing Interface)
１つの目的を複数のコンピュータで分散・並列処理する際に、この実行基盤の１つが MPI （Message Passing Interface）と呼ばれる仕様・規格。
MPICH, Open MPI など複数の実装系が存在しています。

有名所でいうと「32 ノード構成・ド派手な The RPiCluster」
動画もあります。

http://netbuffalo.doorblog.jp/archives/4783572.html

上記の実行には「python-mpi4py」を使用しています。

# お試しで1ノードで並列Hello World

まずは1ノードで環境を作成していきます。
必要なパッケージを各ノードへインストールします

``` bash
# apt-get install python-mpi4py
```

次に並列処理に対応したプログラムを作成します。

``` Python:hello_world.py
#!/usr/bin/env python
"""
Parallel Hello World
"""
 
from mpi4py import MPI
import sys
 
size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()
 
print "Hello, World! I am process %d of %d on %s." % (rank, size, name)
```

上記の実行結果はこちら

``` bash
# mpirun -np 4 hello.py 
Hello, World! I am process 0 of 4 on rasko01.
Hello, World! I am process 1 of 4 on rasko01.
Hello, World! I am process 2 of 4 on rasko01.
Hello, World! I am process 3 of 4 on rasko01.
```

##### 簡単にプログラムの解説
* MPI_COMM_WORLDは、コミュニケータとよばれる概念を保存する変数
* コミュニケータは、操作を行う対象のプロセッサ群を定める
* 初期状態では、０番～numprocs –１番までのプロセッサが、１つのコミュニケータに割り当てられる
  この名前が、“MPI_COMM_WORLD”
* RANKとは各「MPIプロセス」の「識別番号」のこと。

##### 補足
ちょっとMPIを勉強してる人なら疑問に思うと思いますが、
MPI_Init()と、MPI_Finalize()がありません。
これらの関数はmpi4pyモジュールの初回import時と、プロセス終了時に、それぞれ自動的に呼ばれているとのことです。

---

今回はここまで
第二回からは実際に複数ノードを使用してプログラムを実行します。
双方向マイクロペイメントチャネルの invalidation tree について

#何の話？
ビットコインは単位時間あたりに処理できるトランザクション数に限りがあります。
所謂スケーラビリティ問題です。これを解決するために、トランザクションの処理をブロックチェーンの外で行うマイクロペイメントチャネルというアプローチがあります。
invalidation tree とは、双方向マイクロペイメントチャネルの基本構造です。

元の論文は:point_down:
[A Fast and Scalable Payment Network with Bitcoin Duplex Micropayment Channels](https://www.tik.ee.ethz.ch/file/716b955c130e6c703fac336ea17b1670/duplex-micropayment-channels.pdf)

#前提知識
- 単方向マイクロペイメントチャネルの知識
- トランザクションのタイムロックの知識
- マルチシグの知識
- ( segwit の知識 )

#準備
それぞれ 1BTC 保持している Alice と Bob が、双方向(Alice ⇔ Bob)で資金のやりとりをすることを考えます。双方向にやり取りを行うには、単方向のマイクロペイメントチャネルを2つ作れば良いはずです。ここで、

`Cab : Alice ⇒ Bob の単方向チャネル`
`Cba : Bob ⇒ Alice の単方向チャネル`

と定義します。各チャネルでの資金の初期状態は以下の通りです。

`Cab: Alice(1BTC), Bob(0BTC)`
`Cba: Alice(0BTC), Bob(1BTC)`

ここで、Alice ⇒ Bob へ 1BTC の支払い、Bob ⇒ Alice へ 0.5BTC 支払いを行うと、以下の様に変化します。

`Cab: Alice(0BTC), Bob(1BTC)`
`Cba: Alice(0.5BTC), Bob(0.5BTC)`

現在、Alice の保有資金は 0.5BTC、Bob は 1.5BTC ですが、Cab の Alice の資金が枯渇してしまっているため、**Alice は資金を保持しているのにも関わらず、Bob へ送金することが出来ません。**

#双方向マイクロペイメントチャネル
invalidation tree とは、簡単に説明すると単方向チャネルをリセットする仕組みです。
上記の Cab, Cba を以下のようにリセットします。

`Cab: Alice(0.5BTC), Bob(0BTC)`
`Cba: Alice(0BTC), Bob(1.5BTC)`

この時、以前のチャネルを invalidate ( 無効に ) する必要があります。
invalidation tree では、タイムロックを利用して invalidate しています。

![tree.png](https://qiita-image-store.s3.amazonaws.com/0/296896/bd3d9871-e0ab-d4aa-063e-97e6e9f533ff.png)
[A Fast and Scalable Payment Network with Bitcoin Duplex Micropayment Channels](https://www.tik.ee.ethz.ch/file/716b955c130e6c703fac336ea17b1670/duplex-micropayment-channels.pdf) から

図では invalidation tree の深さは d = 3 になっています。
d は 1 でも問題ないです。d が大きいとリセット回数の上限が増えます。

●は Alice, ○ は Bob, :last_quarter_moon: ←こんなやつがマルチシグです。
四角形はトランザクション、T はロックタイムです。
図右端の、micropayment channels が単方向ペイメントチャネルになります。
その結果、一番右の :last_quarter_moon: は、マルチシグですが仮想的に 1 つのパーティに資金が保有されている形になります。

図では 3 回リセットが起こり、計 4 回のパスが発生しています。
1 回目 : 100 - 100 - 100
2 回目 : 99 - 100 - 100
3 回目 : 99 - 99 - 100
4 回目 : 99 - 99 - 99
一番タイムロックが短い 99 - 99 - 99 のパスのみが有効になります。

例えば、100 - 100 - 99 のようなパスは組めません。T = 100 ロックタイムのトランザクションのアウトプットを T = 99 ロックタイムのトランザクションが参照する ( UTXO を利用する ) ことは出来ないからです。
二分法（非線形方程式の数値解法）

# 二分法とは

- 非線形方程式の数値解法の一つ
- [中間値の定理](https://ja.wikipedia.org/wiki/%E4%B8%AD%E9%96%93%E5%80%A4%E3%81%AE%E5%AE%9A%E7%90%86) : 閉区間$[a,b]$で連続な関数$f(x)$において、$f(a)f(b)<0$ ならば、$f(\alpha)=0$ なる$\alpha$は区間$[a,b]$内に存在する
- $f(a)f(b)<0$となる $a,b$ を見つけ、中点$c=(a+b)/2$を新しい端点として計算を繰り返す。

![qiita-num-4.png](https://qiita-image-store.s3.amazonaws.com/0/299208/e25bd6c3-9007-5038-a53d-d54140522273.png)


# 算法
#### 初期値

$x_{a_0},x_{b_0}$ : 適当な方法で決める。ただし、$f(x_{a_0})f(x_{b_0})<0$
#### 反復手順

$x_{c_n}=(x_{a_n}+x_{b_n})/2$ $,$   $(n=1,2,\cdots)$
$f(x_{c_n})f(x_{a_n})<0$ ならば、$x_{a_{n+1}}=x_{a_n}$ $,$  $x_{b_{n+1}}=x_{c_n}$
$f(x_{c_n})f(x_{a_n})>0$ ならば、$x_{a_{n+1}}=x_{c_n}$ $,$  $x_{b_{n+1}}=x_{b_n}$

#### 停止則

$|x_{a_n}-x_{b_n}|<\varepsilon$ のとき反復停止
ただし、$\varepsilon$ は適当に与える。
# サンプルコード

$f(x)=x^2-1$ 、初期値 $a=0.5,b=2$として二分法を使って解を求めるプログラム。
$f(a)f(b)<0$ の確認とか入れてないガバガバコード

```c:bisection_method.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return x*x-1;
}

double bisection_method (double a, double b) {
  double c;
  while (fabs(a - b) > 1e-10) {
    c = (a + b) / 2;
    if (f(c) == 0) { break; }
    if (f(a) * f(c) < 0) { b = c; }
    if (f(a) * f(c) > 0) { a = c; }
  }
  return c;
}

int main (void) {
  double alpha;
  alpha = bisection_method(0.5, 2);
  printf("%f\n", alpha);
  return 0;
}
```

実行結果

```
1.000000
```
# 特徴
- $f^{\prime}(x)$の計算不要
  - 簡単、直感的 
- 必ず解に収束
  - 連続であれば必ず解に収束
- 誤差は区間幅以下（$|x_b-x_a|$）
- 初期値2つ必要
- [Newton法](https://qiita.com/omu58n/private/dc2368da350b13bcaf30)、[割線法]()に比べ、反復回数が増加
- 収束の速さ：1次
  - 一回の計算で区間が半分になる=誤差が半分になる
AWS無料枠内でWebサーバ(EC2)を起動し、httpとsshで接続する方法

1つのパブリックサブネット内の一つのEC2を起動する。
つまずきポイントを主に記載。

#前提

- クライアントはMac
- AWSのアカウントは作成済
- 無料枠のため、Elastic IPは使わない

#VPC
- VPC
１．VPCの作成
２．名前、IPv4 CIDRブロック決め
３．VPCを選択→アクション→DNS解決の編集→はい
４．VPCを選択→アクション→DNSホスト名の編集→はい

- サブネット
１．サブネットの作成
２．VPCに作成したVPCを指定
３．CIDRブロック決め

- インターネットゲートウェイ
１．インターネットゲートウェイの作成
２．インターネットゲートウェイを選択→アクション→VPCにアタッチ→作成したVPCを指定

- ルートテーブル
１．ルートテーブルの作成
２．作成したVPCを指定
３．ルートテーブルを選択→ルート→編集→
「送信先：0.0.0.0/0」「ターゲット：インターネットゲートウェイ」を追加→保存
４．サブネットの関連付け→編集→作成したサブネットの関連付けにチェック→保存

- ネットワークACL
デフォルトのままとする

- セキュリティグループ
１．セキュリティグループの作成
２．名前、グループ名、説明を記載
３．VPCに作成したVPCを指定
４．作成したセキュリティグループを選択→インバウンドのルール→編集
「タイプ：HTTP80」「プロトコル：TCP」「ソース：0.0.0.0/0」
「タイプ：HTTP22」「プロトコル：TCP」「ソース：0.0.0.0/0」
→保存


#EC2

インスタンス追加

- AMIの選択
![スクリーンショット 2018-10-10 22.07.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/276568/8008aa74-2e46-0b73-7214-fe38d57a573f.jpeg)

- インスタンスタイプ
t2.micro

- インスタンスの詳細の設定
VPC、サブネットは作成した値を設定
自動割当パブリックIPは有効を設定
高度な詳細にて、ユーザーデータ欄に以下の３行を記載

```bash
#!/bin/bash
yum install httpd -y
service httpd start
```

- ストレージの追加
- タグの追加
- セキュリティグループの設定
既存のセキュリティグループを選択するにチェックし、作成したセキュリティグループを指定
- 作成
- キーペアの作成
新しいキーペアの作成を選択→キーペア名を記載→キーペアのダウンロード
- インスタンスの作成

#http接続方法

１．EC2ダッシュボードのインスタンス画面にて、作成したインスタンスを選択
画面下部のパブリックDNS（IPv4）記載欄のDNSアドレスをコピー。
２．WebブラウザのアドレスバーにコピーしたDNSアドレスを貼り付け
３．以下画面が表示されればOK
![スクリーンショット 2018-10-10 22.22.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/276568/4ebaa21d-82a4-061e-7bf2-f8cebd686db4.jpeg)


#SSH接続方法
※mac前提
１．EC2ダッシュボードのインスタンス画面にて、作成したインスタンスを選択
　画面下部のパブリックDNS（IPv4）記載欄のDNSアドレスをコピー。
２．ターミナルを起動
３．ダウンロードしたキーペアのパーミッションを600に変更する
　`chmod 600 (ダウンロードしたキーペアのPａｔｈ)`

４．以下のコマンドを入力
　`ssh -i （ダウンロードしたキーペアのPath） ec2-user@(コピーしたDNSアドレスを貼り付け)`
　※ec2-userはEC2上でデフォルトで作成されているユーザ

５．以下のメッセージでyesを入力
![スクリーンショット 2018-10-10 22.27.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/276568/e6b86841-ac84-a471-443a-e24af2f9ab29.jpeg)

６．以下の画面が出ればssh接続OK
![スクリーンショット 2018-10-10 22.34.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/276568/9eebd256-843f-cd34-13a7-5ce67cd8c75a.jpeg)
sshfs(+docker)を使ってリモートマシン上のコードをGUI系エディタでいじる

#はじめに
AWSやAzureで（お金さえあれば）潤沢なGPU環境を簡単に利用できるようになりましたが、リモートマシンゆえにGUIの利用に制限がかかります。
XForwardingなどがうまく動けばよいですが、重くて使い物にならないことも多いかと思います。

そこで本記事では、リモートマシン上にあるコードをローカルのGUI系エディタ(VSCodeなど)でいじる方法を紹介します。
本番実行はリモートマシン上で行う想定ですが、ローカルでも簡単なデバッグは行いたいので、dockerを使ってリモートとローカルの環境を揃えます（オプションです）。

#代替手段
・XForwading
重い

・Remote VSCode
余計なポートを開ける必要があり、会社で使えない(´・ω・`)

#主な流れ
1. ローカルとリモートの両方でdockerコンテナに入る
2. ローカルでsshfsし、リモートマシンのディレクトリをマウント
3. ローカルでコーディング

#docker
ローカルとリモートの両方でdockerコンテナに入ります。
docker runする際に、--privilegedオプションをつけてください。
これが無いと後述のsshfsでエラーが出ます。
https://github.com/s3fs-fuse/s3fs-fuse/issues/647

なお、dockerコンテナ内でVSCodeを利用する方法については以下の記事を参考にしてください。
https://qiita.com/kanosawa/items/0c83f8d8eaaa4a72e1cd

#sshfs
ローカルでsshfsし、リモートマシンのディレクトリ(src)をローカルマシンのディレクトリ(dst)にマウントします。

```
sshfs [-o IdentityFile=keypath] username@remote_ip:src dst
```

例）

```
sshfs -o IdentityFile=~/key.pem ubuntu@12.345.678.901:/home/ubuntu/work ~/work
```
鍵認証不要なら[]部は不要です。

#おわりに
以上の手順で、リモートマシン上にあるコードをローカルのGUI系エディタでいじることができるようになります。

これでTesla V100 8台を気軽にぶん回すこともできますね（24.5ドル/hなり）
CodeceptJSでオートコンプリートする

# 概要
[CodeceptJS](https://codecept.io/)というテストフレームワークがあります。Puppeteerや
WebdriverIOなどのAPIをラップした```I.amOnPage()```や```I.click()```などのメソッドを使ってテストを書きますが、```I.```まで打ったら利用可能なメソッド一覧が出て欲しいですよね？Auto Completeしたいですよね？できます。

## 公式ドキュメント
公式の[Commands](https://codecept.io/commands/)に書いてあるのですが、あまりにもさらっと書かれていて見逃していました。CHANGELOGを眺めていて初めて気づきました。0.3.5の部分です。公式って大事。

## やり方
1．プロジェクトの中で以下のコマンドを打ちます

```javascript
codeceptjs def
```

2．おもむろにVSCodeを開きます
3．テストファイルの一行目に```/// <reference path="./steps.d.ts" />```と書きます
4．オートコンプリートライフを楽しみます

簡単！！！！！！！

## ちょっとだけ補足
- defコマンドを打つと```steps.d.ts```というファイルが生成され、そこにメソッド定義が羅列されています
- VSCode以外のIDEでもTypeScript対応しているものなら大丈夫らしいですが、個人的にはVSCode一択
- ところで、```codeceptjs gh```コマンドでカスタムヘルパーを作成できます。もしヘルパーメソッドを作ったら、もう一度```codeceptjs def```しましょう。あなたの作ったヘルパーが定義ファイルに追加され、オートコンプリートが効くようになります。感動ものです
- CodeceptJSは良い
HTML5の雛形&ざっくり解説

#コード
```html:sample.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ここがタイトルだよ</title>
<style>
/*ここにCSSを書くよ*/
</style>
<script>
/*ここにJavascriptを書くよ*/
</script>
</head>
<body>

<!-- ここに内容を書くよ -->

</body>
</html>
```
#解説
##<!DOCTYPE html>
```sample.html
<!DOCTYPE html>
```
ドキュメントタイプなるものを宣言しています。ここから書くものは HTML5 のルールに則っているということを示しています。
 

##html

```html:sample.html
<html>
</html>
```
この文書がHTMLで書かれたものですとを言っています。さっきの <!DOCTYPE html> とは似て非なるものです。

##head

```html:sample.html
<head>
</head>
```
ヘッダー情報なるものを書くために必要です。ヘッダー情報にはこの文章を表す際に必要なものが記述されます。
##meta
```html:sample.html
<meta charset="utf-8">
```
メタデータなるものを書くために必要です。大体は文字コードを指定することにしか使っていない気がします。ここでは文字コードを utf-8 に指定しています。

##title
```html:sample.html
<title>ここがタイトルだよ</title>
```

ここに文章のタイトル書きます。
##style
```html:sample.html
<style>
/*ここにCSSを書くよ*/
</style>
```
スタイルシートなるものを書くために必要です。そのまま使えば、CSSが書けます。

##script
```html:sample.html
<script>
/*ここにJavascriptを書くよ*/
</script>
```
スクリプト言語なるもの等を書くために必要です。そのまま使えば、Javascript が書けます。このタグ自体はヘッダー情報以外でも書けます。html タグを閉じる直前に書くことも多いです。
##body
```html:sample.html
<body>

<!-- ここに内容を書くよ -->

</body>
```
文章の本体です。ここに書かれたものがブラウザ上で表示されます。
#おわりに
何か間違いとか、これも追加しとけってのがあれば連絡下さい。
Typescriptまとめ　関数の型定義

## functionの型定義
functionの型定義は以下のように行う
関数の引数、関数の戻り値に対して型を定義すればいい。

```javascript

function name(param: ptype, ...): rtype { ...statements... }

name: 関数名
param: 仮引数
ptype: 仮引数のデータ型
rtype: 戻り値のデータ型
statements: 関数の本体
```

#### 例

引数のbaseとheightにnumber型を指定、戻り値にnumber型を定義している。

```javascript

function triangle(base: number, height: number): number {
  return base * height / 2;
}
console.log(triangle(10, 5)); // 25
```

#### 関数リテラルを利用することで、関数を式として表し、変数にだ代入することもできる。

```javascript
let triangle = function(base: number, height: number): number {
  return base * height / 2;
};
console.log(triangle(10, 5)); // 25
```

let命令では型を明示していないが、型推論によってfunction型と認識される。

関数の型を明示した場合は、以下のように表す。

```javascript

let triangle: (base: number, height: number) => number = function (base: number, height: number): number {
  return base * height / 2;
}
```

単に:functionとなるわけではない。
引数リストと戻り値の区切りはアロー関数で表す。

#### 関数型の宣言

```javascript
(param: ptype, ...) => rtype

param: 仮引数
ptype: 仮引数のデータ型
rtype: 戻り値のデータ型
```

## 最後に
のちのち更新していきますのでいいねお願いします！
[mac] ディスクがほとんど一杯ですというメッセージが出る


## 背景
買って三ヶ月のMacbook Proを使っていると「ディスクがほとんど一杯です」というエラーが出るようになりました。

「このMacについて」 > 「ストレージ」を見てみると以下の画像のようにシステムの容量がかなり多くなってしまっていました。（以下の画像は解決後）

<img width="587" alt="スクリーンショット 2018-10-10 22.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/222453/10ee4f14-3eeb-c317-ab70-38b50142b3a4.png">


色々原因を調べてみるとDockerという単語が見つかったので「ディスクがほとんどいっぱいです　docker」と検索してみるとDockerが原因で同じような症状になっている人を見かけました。

## 解決策
不要なコンテナやイメージが増えてしまっていたのが原因だと思います。

以下のコマンドを実行することで改善されました。

```
$ docker system prune
```

## 参考記事

詳細は以下の記事を参考にしてください

> [Docker for Macを使っていたら50GB位ディスク容量を圧迫していたのでいろんなものを削除する](https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0)
[Laravel, MySQL] JSON 型カラムには配列を insert する

# 環境

- Laravel 5.5
- MySQL 5.7

# 結論

- MySQLはバージョン5.7以降から JSON 型カラムを使用できる
- JSON 型カラムに配列を json_encode() したものを insert しようとするとうまくいかない
- JSON 型カラムには配列を insert する

# 実装

以下のような members テーブルがあるとする。

````
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| data        | json             | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
````

## 正

Laravel で Member モデルがあるとして、以下のようにする。

````
$data = [
    'name' => 'kamikosi',
    'env' => [
        'language' => 'PHP',
        'framework' => 'Laravel',
    ],
];

$member = new Member;
$member->data = $data;
$memver->save();
````

## 誤

最初、 JSON 型だからと json_encode() の返り値を入れようとした。

````
$data = [
    'name' => 'kamikosi',
    'env' => [
        'language' => 'PHP',
        'framework' => 'Laravel',
    ],
];

$member = new Member;
$member->data = json_encode($data, JSON_UNESCAPED_UNICODE)
$member->save();
````

save() 自体はうまくいくが、 data カラムの中身は以下のようになる。

````
"{"name":"kamikosi","env":{"language":"PHP","framework":"Laravel"}}"
````

json_encode() の返り値は String 型なので、両端にダブルクォーテーションが付く。また JSON のキーおよび値にもダブルクォーテーションが付く。結果として最初に2つのダブルクォーテーションで囲まれる文字列は `{` となり、 MySQL は JSON 型カラムを正しく処理できなくなる。
IntelliJ ショートカット集（windows）

| 操作 | コマンド |
|:-:|:-:|
|取り消し|Ctrl + Z|
|やり直し|Ctrl + Shift + Z|
|検索|Ctrl + F|
|置換|Ctrl + R|
|行コピー|Ctrl + D|
|ファイル内検索|Ctrl + F|
|ファイル横断検索|Ctrl + Shift + Z|
|プロジェクトウィンドウ表示切り替え |Alt + 1|
|新規ファイル |Alt + Insert|
|設定画面を表示|Ctrl + Alt + S|
|補完候補の表示|Ctrl + Space|
|コードフォーマット|Ctrl + Alt + L|
|選択範囲の拡大|Ctrl + W|
|選択範囲の縮小|Ctrl + Shift + W|
|変数の抽出|Ctrl + Alt + V|
|インライン化|Ctrl + Alt + N|
|リネームファクタリング|Shift + F6|

##デバッグ関連

| 操作 | コマンド |
|:-:|:-:|
|カーソル位置で実行|Ctrl + Shift + F10|
|実行|Shift + F10|
|ブレークポイントの設定|Ctrl + F8|
|ブレークポイントダイアログ|Ctrl + Shift + F8|
|再開|F9|
|ステップオーバー|F8|
|ステップイントゥ|F7|
|強制ステップイントゥー|Alt + Shift + F7|
|ステップアウト|Shift + F8|
|カーソルまで実行|Alt + F9|
|式評価|Alt + F8|

##テスト関連

| 操作 | コマンド |
|:-:|:-:|
|テストケースに移動|Ctrl + Shift + T|
|カーソル位置のテストケース実行|Ctrl + Shift + F10|
|テストの再実行|Ctrl + R|

##ナビゲーション関連

| 操作 | コマンド |
|:-:|:-:|
|定義箇所へジャンプ|Ctrl + B|
|プロジェクト内の利用箇所一覧|Alt + F7|
|プロジェクト内の利用箇所ポップアップ|Ctrl + Alt + F7|
|利用箇所をポップアップ|定義箇所で Ctrl + B|
|ジャンプ前の位置に復帰|Ctrl + Alt + ←|
|ジャンプ後の位置に復帰|Ctrl + Alt + →|
|子クラスから親クラスへジャンプ|Ctrl + U|
|小クラスの一覧ポップアップ|Ctrl + Alt + B|
|１つ前のファイルを表示|Ctrl + Tab|
|２つ前のファイルを表示|Ctrl + Tab + Tab|
|最近開いたファイル一覧ポップアップ|Ctrl + E|
|最後の編集箇所にジャンプ|Ctrl + Shift + BackSpace|
|アイテム名を指定|Shift 連続２回|
|ファイル名を指定して開く|Ctrl + Shift + N|
|クラス名を指定して開く|Ctrl + N|
|シンボル名を指定して開く|Ctrl + Shift + Alt + N|

##Git関連

| 操作 | コマンド |
|:-:|:-:|
|Add|Ctrl + Alt + A|
|Push|Ctrl + K|
|Pull|Ctrl + Shift + K|
|Commit|Ctrl + T|
MarkdownでUrl引用するときにちょっと簡単にするハック【小ネタ】

小ネタです

# はじめに
Markdownを書いていて、Chromeで開いているサイトをMarkDown表記で書くときにページタイトルとUrlをコピペして（）[]をつけるのがめんどくさかったので、クリック一発でMarkdown表記のページタイトルとUrlがクリップボードにはいる拡張機能を作ろうとしたらすでにあったので導入しました。
こういうものがあるよっていう紹介です。

# 具体的に
こちらの拡張機能を利用しています。
[Copy Title and Url as Markdown Style - Chrome ウェブストア](https://chrome.google.com/webstore/detail/copy-title-and-url-as-mar/fpmbiocnfbjpajgeaicmnjnnokmkehil/related?hl=ja)

# 使い方
挿入したいページに移動し、拡張機能をクリックするとクリップボードにコピーされます。
終わりです。
サイコー！
console.log("このログ、埋もれてない？")

# 前書き
フロント開発する際、さまざまなデバッグ方法がありますが
その一つとして

```javascript
console.log("here")
```
を使う方法があります

しかしフロントエンド開発などにおいては、コンソール表示される情報が多すぎて
ほんとに欲しい情報が埋もれるなんてことも少なくないです


今日はそんな`console.log()`とChrome Developer Toolの使い方について見ていきます

# Console
開発で使うブラウザはChromeの方が多いと思われますが
ChromeにはChrome Developer Toolと呼ばれるものがあります
Macなら`cmd+opt+i`で出てくるあれです

<img width="1440" alt="スクリーンショット 2018-10-10 21.36.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/d63c15de-decb-6460-8d14-10915ff3eaec.png">


そんなCDTの機能の一つに`Console`があり
javascriptを実際に実行できたり
ログ表示などにつかいます

## console.log()
CDTのコンソールにはConsole APIというログ出力のためのメソッドが用意されており、その中の一つに`console.log()`があります

```
const name = 'Takuto Mori'
console.log(name)
```
を実行すると
<img width="494" alt="スクリーンショット 2018-10-10 21.41.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/ac3e37d0-dc8f-d242-2d6f-bc0355b97215.png">

のように表示されます

# console.log()は迷子になる
`console.log()`はデバッグ時などで良く使うのですが、しばしば迷子になります(よね？)
フロントエンド開発ではミドルウェアなどを使ってConsoleにデータを表示したりすることも多かったり、さらにはwarningやerrorの量産など
本来のデバッグ目的の`console.log()`が見つからないなんてことありませんか？
ログの内容を長くしたり、ログを複数行表示したりして目立つようにしてる人もいるはず(筆者も然り)
<img width="495" alt="スクリーンショット 2018-10-10 22.06.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/f84e1878-eeba-ec04-0ec6-74fda1a4a720.png">



そんなログの迷子を解決する手法を紹介します


# log
## レベル
consoleにはログのレベルが4つあります
- **Verbose**
- **Info**
- **Warning**
- **Error**

## メソッド
またconsoleには実は5つメソッドがあります
- **debug()**
- **log()**
- **info()**
- **warn()**
- **error()**


## レベルとメソッドの対応
メソッドはそれぞれ4つのいづれかのレベルでの出力をします
その対応は以下のようになります


|メソッド  |ログレベル  |
|---|---|
|**debug()**  | **Verbose** |
|**log()** |**Info**  |
|**info()** |**Info**  |
|**warn()**  |**Warning**  |
|**error()**  |**Error**  |

# 埋もれないlogを書く方法
普段埋もれてしまってるlogもCDTの使い方１つで救い出せます

CDTのConsoleではlogレベルによって表示をフィルタリングすることができます

<img width="495" alt="スクリーンショット 2018-10-10 22.00.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/f719c2ea-7542-4971-60c0-91b95ffac32f.png">


このフィルタリングを使うと普段埋もれてしまってるlogを救出できます

## console.debug()を使おう
デバッグでログ出力をしても、ログが埋もれてしまう・・・
そんな埋もれを解消するために
ログ表示には`console.debug()`を使いましょう

## なぜdebug()?
なぜ`console.log()`ではなく`console.debug()`であるのか
それは`console.debug()`のログレベルが**Verbose**であるからです

`console.debug()`を使って
Consoleのフィルタリングで**Verbose**のみを表示させればいいのです

<img width="492" alt="スクリーンショット 2018-10-10 22.08.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/2962bb74-428d-c472-fc61-827bd034ac67.png">
<img width="495" alt="スクリーンショット 2018-10-10 22.08.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/192773/96580013-0c69-4353-3f4f-ca7fbe7e7efb.png">


ついに、迷子の`console.log()`を救いだすことができました

# まとめ
- ConsoleAPIには複数のメソッドがある
- それぞれのメソッドにはログレベルがある
- ログレベルによるフィルタリングが可能
- `console.debug()`で迷子救い出せる

# あとがき
今回はReactのmiddlewareであるloggerを使用していたので`debug()`を使いましたが
普段はフィルタリングするだけで、だいぶ改善すると思います
ぜひChrome　Developer Toolを使いこなしましょう！
RailsにてSQLでのワイルドカード文字をエスケープしてくれるsanitize_sql_likeは何をしているのか

### はじめに
Rails４．２１より、Stringクラスのオブジェクト内にある”％”や”＿”といったLIKE句でのワイルドカード文字をエスケープしてくれるsanitize_sql_likeメソッドが使えるようになっています。

検索機能等においてLIKE句はよく使用するものであり、ワイルドカードはきちんとエスケープしないと非常に重いSQLが発行されることになりかねません

今回はソースコードを読むという行為の練習も兼ねて、このsanitize_sql_likeというメソッド内でどのような動作が行われているのかを追っていこうと思います


###まずはソースコード

```ruby
def sanitize_sql_like(string, escape_character = "\\")
  pattern = Regexp.union(escape_character, "%", "_")
  string.gsub(pattern) { |x| [escape_character, x].join }
end
```

このメソッドはstringとエスケープのための文字escape_character（デフォルトでは"\\\")を引数にとります
実行内容としては２つのステップに分かれていて、

1. エスケープ文字とワイルドカードとして認識される文字にマッチする正規表現を生成、patternに代入

2. stringの中にある文字でpatternとマッチする文字をエスケープ文字と連結してエスケープ

この２つの行程を通して引数string をsanitize（消毒）していきます。

####エスケープ文字とワイルドカードとして認識される文字にマッチする正規表現を生成、patternに代入

```ruby
  pattern = Regexp.union(escape_character, "%", "_")
```

SQLのLIKE検索において"%", 及び”＿”はワイルドカード文字として認識されてます。
前者は任意の数の文字、後者は唯一つの文字のワイルドカードとして機能します。
[12.5.1 文字列比較関数
](https://dev.mysql.com/doc/refman/5.6/ja/string-comparison-functions.html)
これらをエスケープするためにはまずこれらの文字を判別する必要があるわけです。

そのためにRegexp.unionというRegexpのクラスメソッドを使用します。
Regexp.unionは引数として与えた文字にそれぞれマッチする正規表現を”｜”で連結し、引数のどれかにマッチする正規表現を返します。
[singleton method Regexp.union
](https://docs.ruby-lang.org/ja/1.8.7/method/Regexp/s/union.html)

このコードではRagexp.union の引数として２つのワイルドカード及びエスケープのための文字\\\（\単体では記述できないため）をとり、判別するための正規表現を生成し変数patternに入れています。

###stringの中にある文字でpatternとマッチする文字をエスケープ文字と連結してエスケープ

```ruby
  string.gsub(pattern) { |x| [escape_character, x].join }
```

gsubはStringクラスのインスタンスメソッドで、文字列の中で正規表現にマッチした部分を指定の文字列に置換します。
[gsub, gsub! (String)](https://ref.xaio.jp/ruby/classes/string/gsub)
このメソッドを使いワイルドカード文字をエスケープされるように置換していきます。
ブロック内のxには先程生成した正規表現patternにマッチする文字が入っていき、このxに対してエスケープ文字として指定した\\\を連結して置き換えることでエスケープが完了となります

わかりやすくするとすれば

```ruby
  string.gsub(pattern) { |matching_character| [escape_character, matching_character].join }
```
という形になりますかね

###まとめ
railsには様々な便利メソッドがありますが、当然それらも何かしらのコードで作られています。今回は正規表現の勉強も兼ねてメソッドのソースコードがどのような動作をしているかを追ってみました。
プログラミングスクールの講師の方からも公式のリファレンスやソースコードを参照する癖をつけようとよく言われていましたがソースコードにもソースコードがあるわけなのでこの追求に終わりはないとも感じます

エンジニアとして転職したい２３歳男性（関東）にご興味あればぜひ連絡ください（懇願）

最後まで読んでいただきありがとうございます！

###参考
[Ruby 1.8.7 リファレンスマニュアル](https://docs.ruby-lang.org/ja/1.8.7/doc/index.html)
[MySQL 5.6 リファレンスマニュアル]
(https://dev.mysql.com/doc/refman/5.6/ja/)
[Rubyリファレンス(お世話になっています）]
(https://ref.xaio.jp/ruby)
[sanitize_sql_like(API dock)](https://apidock.com/rails/v4.2.1/ActiveRecord/Sanitization/ClassMethods/sanitize_sql_like)
特定のバージョンの Yarn をインストールしたい場合の方法（Ubuntu）

# 前提
- 特定バージョンの Yarn を Docker 環境内にインストールしたい場合の方法です。

# 環境
- Docker Community Edition Version 18.06.1-ce-mac73 (26764)

# TL;DR
Dockerfile に以下のように書けばOKです。

```dockerfile:Dockerfile
RUN wget https://github.com/yarnpkg/yarn/releases/download/vX.X.X/yarn_X.X.X_all.deb \
    && dpkg -i yarn_X.X.X_all.deb
```

# 詳細
公式ドキュメント通りにやると、以下のような形になるかと思います。ただこれだと、常の最新の Stable のバージョンをインストールしようとします。つまり、 `docker-compose build` を実行するたびに Yarn のバージョンが変わる可能性があります。

```dockerfile
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update \
    && apt-get install -y yarn
```
https://yarnpkg.com/en/docs/install#debian-stable

大きいプロジェクトとかだと、バージョンが変わることによって既存コードの挙動も変わるのを避けたいところです。そこで、冒頭のように特定のバージョンを直接取得してインストールする方法をとります。GitHub に各バージョンのパッケージが置いてあるので、インストールしたいバージョンのものを参照してください。

https://github.com/yarnpkg/yarn/releases/tag/v1.10.1
https://github.com/yarnpkg/yarn/releases/tag/v1.9.4
https://github.com/yarnpkg/yarn/releases/tag/v1.8.0
https://github.com/yarnpkg/yarn/releases/tag/v1.7.0
etc...

# 参考文献

https://stackoverflow.com/questions/46722817/how-to-install-particular-yarn-version-in-ubuntu
https://yarnpkg.com/en/docs/install#debian-stable
findとgrepでファイルから特定の文字列をリストとして取得する

# 「ファイル名」から特定の文字列を取得
```zsh:指定のディレクトリのみ
ls [検索するディレクトリのパス] | grep "[検索する文字列]"
```

```zsh:指定のディレクトリとその下層まで
find [検索するディレクトリのパス]　-type f -name "*[検索する文字列]*"
```

# 「ファイルの中身」から特定の文字列を取得
```zsh
find [検索するファイルのパス] -type f | xargs grep -n "[検索する文字列]"
```
- xargs 「標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する」コマンド

## 追記
@h084 さんのコメントから。

```zsh
find [検索するパス] -type f -exec grep -n "[検索する文字列]" {} \+
```


## 参考サイト
[xargs コマンド――コマンドラインを作成して実行する](http://www.atmarkit.co.jp/ait/articles/1801/19/news014.html)
[ファイルなどを検索する！findコマンドの詳細まとめ【Linuxコマンド集】](https://eng-entrance.com/linux-command-find)
AdMob play-services-ads:17.0.0リリースとAndroidManifest.xmlの追加対応

play-services-ads:17.0.0がリリースされました。
[Release Notes](https://developers.google.com/android/guides/releases)

AdMobを利用されている方は、AndroidManifest.xmlファイルに以下を必須で追加する必要があります。お忘れなく！

```
<manifest>
    <application>
        <!-- TODO: Replace with your real AdMob app ID -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-################~##########"/>
    </application>
</manifest>
```

<h2>参考文献</h2>
* [Announcing v17.0.0 of the Android Google Mobile Ads SDK](https://ads-developers.googleblog.com/2018/10/announcing-v1700-of-android-google.html)
* [Google AdMob > Mobile Ads SDK > Android](https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml)
他のサイトの見た目の再現をする際にはbaseタグが便利

# やりたかったこと

Ajaxで**Cross-Origin**が許可されていないサイトに対してアクセスして結果を取得したかった。
ここで、APIが返す結果は普通にブラウザで開いて見たような見た目にする必要があったのでリンク切れを起こさせたく無かった。

# やったこと

最近はAjaxでAPI用に作られていないサイトにアクセスしてもCORSエラーが出て取得できません。
そのため、自分のサーバー側でcurlを実行し、その結果を返すAPIをAjax用に作成し、
Ajaxで作成したAPIにアクセスすることで**Same-Origin**なのでCORSエラーは出ず取得したかったものが取得できました。
作成したAPIではリンクを切らしたくなかったので出力されるものに`baseタグ`を追加しました。


```html
<base href="http://example.com/test/"/>
```

とするだけで

このページ内の相対パスとルートパスを問題なく認識してくれる様です。

```
../css/test.css
```
は

```
http://example.com/css/test.css
```

```
/js/test.js
```

は

```
http://example.com/js/test.js
```

で認識してくれる。

なのでパスの置き換えなしに簡単に他のサイトの見た目を再現できる！
これは便利！

以下のようにcurlで取得してきたものをhead内にbaseタグを追加してやるだけです。


```php
$ch = curl_init($url);// urlは対象のページ
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// exec時に出力させない
$html = curl_exec($ch);

$base_url = (preg_match('/\/$/u', $url) === 1) ? $url : pathinfo($url)['dirname'];

// パスのリンクが切れるのでheadの直後に挿入
echo preg_replace('/<head>/u', '<head><base href="'.$base_url.'"/>', $html);

curl_close($ch);
```

# 結果

**まだローカル環境で作業して確認しただけですが。**

* CORS回避もできた。

* iframeで読み込みできないようにするX-Frame-Optionsも回避できた。

* Ajax用に作成したAPIを直接画面にhtmlとして出力したら対象としたページの見た目と同じ画面が表示できた。

(出来ないサイトもあるかもしれませんが、実装しないで手っ取り早く確認したい場合は対象のページのソースコードをhtmlファイルに保存して`baseタグ`を入れると同じ見た目のページが確認できるかと思います。)
自作ライブラリでリソースを扱う時に躓いたこと

自分で Cocoa Touch Framework を作った時に、実装面で躓いたことについてメモしておこうと思います。ライブラリでリソースを使うことはそんなにないと思いますが参考までに。

# 躓き１：画像が取得できない

Assetsに画像ファイルが存在していてかつ画像名も合っているはずなのに、UIImageがnilになってしまうということがありました。

```swift:ライブラリ内のswiftファイル
// assetにhogeという名前のimageはあるのにnilになる
let image = UIImage(named: "hoge")
```

どうしてだろうかと調べているうちにここらへんのstackoverflowに辿り着きました。
https://stackoverflow.com/questions/26782706/cocoa-touch-framework-assets-not-visible-in-app-project
https://stackoverflow.com/questions/25739762/load-image-from-ios-8-framework

先の呼び出し方だと内部的に main bundle を呼び出しており、framework の bundle を呼び出してくれないとのことなので、 bundle を指定する必要があります。ということで雰囲気こんなかんじのクラスを作りました。

```swift
final class FrameworkImage {
    static func getImage(name: String) -> UIImage? {
        return UIImage(named: name, in: Bundle(for: self), compatibleWith: nil)
    }
}
```

なので呼び出し側はこのようになります。

```swift
let image = FrameworkImage. getImage(name: "hoge")
```

# 躓き２：ローカライズファイルが読み込めない

もう一つの躓きはローカライズファイルです。通常と同じように`Localizable.strings`を作って呼び出してみるものの、ローカライズされてくれません。

```swift:ライブラリ内のswiftファイル
// Localizable.stringsはあるのに翻訳されない
let localizedString = NSLocalizedString("key_string", comment: "")
```

こちらも同様に bundle が原因でした。

https://stackoverflow.com/questions/2335664/localization-of-strings-in-static-lib

ということで雰囲気こんなかんじのクラスを作りました。

```swift
final class LocalizedString {
    static func localizeString(str: String) -> String {
        return NSLocalizedString(str, tableName: nil, bundle: Bundle(for: self), value: str, comment: "")
    }
}
```

呼び出し側はこのようになります。

```swift
let localizedString = LocalizedString.localizeString(str: "key_string")
```
LaunchScreenの表示時間を変更する方法

#LaunchScreenとは
iOSアプリの起動時に表示される画面のこと。（数秒間ロゴが表示されるやつ）
xcodeでiOSアプリを作成する際には、自動でLaunchScreen用のstoryboard（LaunchScreen.storyboard）が作成されており、そこでデザインを決めることができる。

#やりたいこと
初期設定だと、この画面は一瞬表示された後すぐ消えてしまう。（ホントに一瞬！！）
なので、この表示時間を2秒間に変更したい。（世の中のアプリは大体このくらいの時間のイメージ）


#動作環境
- swift 4.2
- xcode 10.0

#行ったこと
AppDelegate.swiftの `func application`に`sleep(2)`を追加。

**変更前**

```swift:AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }
```

**変更後**

```swift:AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        sleep(2)　　　　　　　　　　　// <<<<<<<<<<<< 追加
        return true
    }
```

たったこれだけで、表示時間が変更されます。
EC-CUBE3のローカル環境構築をFlyWheelでやってみた

# EC-CUBEのローカル環境構築で悩んでいた
ローカルにXAMPPとか入れるのやだなー

# 便利そうなツールを発見
https://local.getflywheel.com/

# VirtualBoxが動いてるらしい
![スクリーンショット 2018-10-10 21.31.30.png](https://qiita-image-store.s3.amazonaws.com/0/144288/88a2b3c2-3271-1894-d338-d9de79e6acc5.png)

# セキュリティー権限を聞かれるので許可に(少し怖いけど・・・)
**スクショ撮り忘れたので、許可した後の画像です**
<img width="780" alt="スクリーンショット 2018-10-10 21.33.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/144288/93eb1b62-3196-4d98-b8be-d9e031c7d7a0.png">

# インストール完了
![スクリーンショット 2018-10-10 21.35.38.png](https://qiita-image-store.s3.amazonaws.com/0/144288/f5ef92a4-fad9-2f6f-48bf-66f737bc9ab2.png)

# あとは聞かれるがままに
- サイト名
![スクリーンショット 2018-10-10 21.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/144288/1b8ea0f6-6a27-007e-ab4f-64596dbfcd09.png)
- 環境設定
![スクリーンショット 2018-10-10 21.36.42.png](https://qiita-image-store.s3.amazonaws.com/0/144288/766d1d59-6d9a-231f-7da0-02619138431c.png)

どうやら、wordpressの環境が簡単に作れちゃうらしい
![スクリーンショット 2018-10-10 21.40.04.png](https://qiita-image-store.s3.amazonaws.com/0/144288/4ac70136-2992-3a52-77d4-2d3ba94a81da.png)

ってことは、当然、EC-CUBEも動くって寸法みたい

# PHPとDataBaseが動く状態なので、丸っとEC-CUBEのソースコードを突っ込んで・・・

おしまい
XAMPPより楽に、複数環境できるので良い
Windows環境で端末エミュレータやPythonデバッグ用にLinuxを使う（WSL）

# 背景
- Windows環境でちょっとSSHクライアントやLinuxコマンドを使いたいときがある
 - RaspberryPiにコンソールログインするときとか
 - LAN内のホストの生存確認にping打ったり、ifconfigしたり
- ちょっとPythonなどでスクリプト書いて実行してみたいときもある

- 今までPythonデバッグやネットワークコマンド使うにはWindows Powershellを使っていたが、SSHのクライアントはWindows版だとGUIメインだったり、Linuxのちょっとしたbashコマンドが使えなかったりしてストレスフルだった
- VMWareにDebian入れて使ったりしてたけどいちいち仮想マシンを立ち上げるのはメンドクサイし出先でノートPC使ってたりすると処理速度やストレージ的に微妙だったりする
- Windows側とのファイルのやりとりが面倒だったりする

# Windows Subsystem for Linux
- WSL(Windows Subsystem for Linux)を使うと手軽にbash環境が手に入る
- コマンドラインベースならLinuxのほとんどのプログラムが普通に走るらしい
- Debianもあるよ！

# インストールと有効化
- Windows側の機能を有効にする
 - Windows10の場合、スタートメニュー→Windowsシステムツール→コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化→Windows Subsystem for Linuxにチェック
- ストアからインストール
 - 色々提供されてるので、好きなディストリを。当然ここはDebian。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/262640/ea944da5-77e0-e11f-85a9-a67b646b7c70.png)

# Tips
### アカウント関連

- インストール時にアカウント名とパスワードの設定を求められる。
 - Windows側のユーザ名とは独立。
- sudo時には初期アカウントのユーザ名/パスワードを使えばroot権限使える

### パッケージ関連
- Debianなら普通に```sudo apt install```が可能
- コマンドライン系はほぼ使える。当然PythonやSSHも。

### Windowsのバイナリ関連
- 普通にexeを実行可能。notepadとかcalcとか。Windowsのウインドウが開くから面白い
 - .exeは省略できない。```$ notepad.exe``` 
- PATHを見てみると、Windows側で設定しているPATH環境変数がそのまま引き継がれているようだ

```bash
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Program Files/dotnet:/mnt/c/Program Files/Microsoft SQL Server/130/Tools/Binn:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Users/xxxxx/AppData/Local/Microsoft/WindowsApps
```

### ファイル関連
- Windows側のファイルは```/mnt/c/```で参照可能
- リムーバブルドライブ（SDとか）はWindows側でドライブレターが割当たっていても自動ではマウントされない。ファイルシステムdrvfsでマウント可能。
 - D:がSDカードの場合は、```sudo mkdir /mnt/sd``` → ```sudo mount -t drvfs d: /mnt/sd/```
 - ```/etc/fstab```での設定も当然可能。
- Windows側で作成したファイルはオーナーがroot、パーミッションは777に見える
 - Windows側でReadOnlyにしたファイルは、パーミッション555に見える
 - ![無題.png](https://qiita-image-store.s3.amazonaws.com/0/262640/a79a317d-12ad-090c-babe-9a491d65f563.png)
 
- Windows側から見た時のWSL環境のファイルは```C:\Users\(WindowsUserName)\AppData\Local\Packages\TheDebianProject.DebianGNULinux_(randomString)\LocalState\rootfs```
 - ここのファイルをWindows側から弄るとWSL環境がおかしなことになるらしいので、触ってはいけない 
- 運用としては、Windows側にWSLとの共有用フォルダを作って、WSLからシンボリックリンクを張るのがいいかもしれない
 - ファイルオーナー/パーミッションが固定なのは我慢する
 - ファイル名の大文字小文字が区別されないが、我慢する
ROSのsetup.pyでデータファイルをすべてインストールする

# Overview
- `cakin_make install`時に，pythonモジュールのデータファイルを，ディレクトリ構成を変えずにインストールする

# 前置き
ROSにおいて，pythonモジュールは，以下のようなディレクトリ構成をとることが推奨されています( http://wiki.ros.org/ja/PyStyleGuide )． 

``` 
catkin_ws/
    |- <package_name>
        |- ~~~
        |- setup.py
        |- src/
            |- <package_name>/
                |- __init__.py
                |- a.py
```

このモジュールが参照する，データファイル`data/b.txt`を，`cakin_make install`時にも，適切にインストールされることを目標とします．

``` 
catkin_ws/
    |- <package_name>
        |- ~~~
        |- setup.py
        |- src/
            |- <package_name>/
                |- __init__.py
                |- a.py
                |- data/
                    |- b.txt
```


# ディレクトリ構成
**src**

``` 
catkin_ws/
    |- <package_name>
        |- ~~~
        |- setup.py
        |- src/
            |- <package_name>/
                |- __init__.py
                |- a.py
                |- data/
                    |- b.txt
```

**dst** (`catkin_make install`を実行)

``` 
catkin_ws/install/lib/python2.7/dist-packages/
    |- <package_name>/
        |- __init__.py
        |- a.py
        |- data/
            |- b.txt
```

# 方法
**`setup.py`を編集します．** 
一般に，モジュールのインストールは，`CMakeLists.txt`ではなく，`setup.py`で行われます．
`setup.py`を，次のように編集します．

```python:setup.py
import os
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

__pkgname__ = 'package_name'


def package_datas(dir_list):
    prefix_path = os.path.join('src', __pkgname__)
    data_files = []

    for directory in dir_list:
        # Recursive-Search files
        start_point = os.path.join(prefix_path, directory)
        for root, dirs, files in os.walk(start_point):
            for file_name in files:
                # Append file path that is removed prefix path (e.g. 'src/pkgname/aaa.txt' -> 'aaa.txt')
                data_files.append(os.path.join(root, file_name)[len(prefix_path)+1:])

    return data_files


setup_args = generate_distutils_setup(
    packages=[__pkgname__],
    package_dir={'': 'src'},
    package_data={__pkgname__: package_datas(['data'])}
)

setup(**setup_args) 
```

データファイルをインストールするには，インストールしたいファイルのリストを，`package_data`オプションに追加します．
`package_datas()`メソッドは，引数に渡されたディレクトリのリストを探索範囲とし，サブディレクトリを含む全てのファイルのリストを返します． 

ここで注意しないといけない点は， **ファイルのパス**です．
ファイルのパスは，**`src/package_name/`からの相対パスでなければなりません**．
今回のケースであれば，`package_data{'package_name': ['data/b.txt']}`となります(`package_data{'package_name': ['src/package_name/data/b.txt']}`ではありません)．
「超入門コード10選！」【Processing】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
個人的に考える超基本的で必要だと考えるProcessingのコードです。
（scratchのブロックもいくつかあわせて掲載しています。）

## 1. `void setup(){}`
はじまった時に、{}の中身を**一度実行する**。
![スクリーンショット 2018-10-10 21.40.25.png](https://qiita-image-store.s3.amazonaws.com/0/240280/216ca079-c781-e88f-e62c-bce4fbc28024.png)

## 2. `void draw(){}`
{}の中身を**ずっと実行する**。
![スクリーンショット 2018-10-10 21.40.36.png](https://qiita-image-store.s3.amazonaws.com/0/240280/b0bb922e-e3bf-1c28-f832-a4fadce0c29d.png)

## 3. `size(500,500);`
**画面の横と縦の大きさ**をそれぞれ500pxにする。

## 4. `random(0,255);`
0から255までの**ランダムな値**（乱数）。
![スクリーンショット 2018-10-10 21.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/240280/7897681a-6ef0-5844-af3b-2c633026f038.png)

## 5. `background(255,255,255,100);`
**背景の色**をRGB(255, 255, 255)（真っ白）にする。（透明度は100/255）

## 6. `frameRate(10);`
1秒間に画面を10回更新する。
（`draw(){}`は1回の更新につき、1度実行されるため、結果的に1秒間に10回線を描くかという）。

## 7. `ellipse(100,100,50,50);`
中心(100, 100)の位置に、横直径50で、縦直径50の**楕円(ellipse)**を描く。（この場合、直径50の円）

## 8. `line(0,0,10,20);`
(x,y)=(0,0)の点から、(x,y)=(10,20)の点までの**線(line)**を引く。

## 9. `strokeWeight(3);`
**線の太さ**を、3pxに設定する。

## 10. `stroke(255,255,255,100);`
**線の色**をRGB(255,255,255)（真っ白）にする。（透明度は100/255）

# Tips
## 作品例（短めスクリプト）
これらのコードを使って、次のような短めスクリプトのプロダクトを創ることができます。
- [ランダム・サークル](https://qiita.com/umi_mori/items/b99792858eb6be78739f)
- [ランダム・ライン](https://qiita.com/umi_mori/items/c7efa92710a3fed71494)
- [画像フィルター](https://qiita.com/umi_mori/items/5b5d0123e2ea533d49eb)
- [グラデーション・デザイン](https://qiita.com/umi_mori/items/bbe39a1396d19484836c)
- [チカチカ画面](https://qiita.com/umi_mori/items/fcd04d0df0fc8dee445f)

## Processing-3D
3D用の入門コードは、以下の記事に書いてあリます。

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
非線形方程式の数値解法

# 概要
### 非線形方程式とは
変数が1次の方程式を線形方程式、それ以外を非線形方程式という。
例えば、
$$x^2+3x+2=0　　x+\sqrt{x}+4=0$$$$\sin(x)-x=0　　exp(x)+x=0$$
みたいな。

### 非線形方程式を解く
非線形方程式 $f(x)=0$ の解 $x=\alpha$ を求めたい。
解 $\alpha$ は、一般的には解析的に求めるのは困難。
なので数値計算を使う。![qiita-num-1.png](https://qiita-image-store.s3.amazonaws.com/0/299208/5bb13b01-46ba-364b-2848-94b61b8fe2c3.png)

### 注意
1. 誤差は0にならない
2. 解が複数個ある場合でも、一度に見つかる解は一つ

# 代表的な解法
[二分法](https://qiita.com/omu58n/private/f00efa797055dc436d33)
[Newton法](https://qiita.com/omu58n/private/dc2368da350b13bcaf30)
[割線法](https://qiita.com/omu58n/items/7ad90a2a7a9cdbc82e41)
[はさみうち法](https://qiita.com/omu58n/items/98886614ff92c00e5f05)
jQuery.validationEngineのエラーメッセージを変更する

## jQuery.validationEngineとは

クロスブラウザに対応したjQueryでフォームのバリデーションを実行するためのライブラリ

エラーメッセージ変更方法を調べていましたが、```data-errormessage-value-missing```くらいしか出てこないので、その他の項目も調べてみました。

公式サイト（GitHub)
https://github.com/posabsolute/jQuery-Validation-Engine

## エラーメッセージの変更

公式GitHubに記載あります
https://github.com/posabsolute/jQuery-Validation-Engine

> data-errormessage and data-errormessage-*というHTMLの属性でメッセージを指定することができます

### サンプル

公式より

```
<input type="email" name="email" id="email" data-validation-engine="validate[required,custom[email]]"
data-errormessage-value-missing="Email is required!" 
data-errormessage-custom-error="Let me give you a hint: someone@nowhere.com" 
data-errormessage="This is the fall-back error message."/>
```
以下の属性がそれぞれのエラーチェックに対応しています

### data-errormessage-value-missing
* required
* groupRequired
* condRequired

### data-errormessage-type-mismatch
* past
* future
* dateRange
* dateTimeRange

### data-errormessage-pattern-mismatch
* creditCard
* equals

### data-errormessage-range-underflow
* minSize
* min
* minCheckbox

### data-errormessage-range-overflow
* maxSize
* max
* maxCheckbox

### data-errormessage-custom-error
* custom
* ajax
* funcCall

### data-errormessage
a generic fall-back error message
パソコンクラッカー

## 概要

HDDとSSDを入れ替えるために、以下のコマンドを実行した。

- `sudo mount /dev/sda3 /home` 
- `sudo mv data/mypage home/` 
- `sudo mv home/* data/`

３つ目のコマンドで次のエラーを吐いて止まった。

```ruby:エラー内容
mv: 'home/boot' を削除できません: デバイスもしくはリソースがビジー状態です
mv: 'home/data' を削除できません: デバイスもしくはリソースがビジー状態です
mv: 'home/dev' を削除できません: デバイスもしくはリソースがビジー状態です
mv: 'home/home' を削除できません: デバイスもしくはリソースがビジー状態です
```
その後、何も見れなくなった。
## 原因

SSDである /dev/sda3 を /home の下にmountしたことで本来の場所から外れ、PCの起動時に参照されなくなり、通常起動ができなくなった。
 /dev/sda3 の下にブートセクタがあったことが原因と思われる。

## 結論

- SSDとHDDの入れ替えをするときは、周りによく相談してからする。
- それでもする時はHDD上のデータをすべて消してから行う。

## 解決策
翌日USB使ってOSを入れ直した。
Websocketで簡単に音声のストリーミングをしてみる

[前回Rustで作ったpipeをwebsocketにつなぐコマンド](https://qiita.com/tetsu_koba/items/199d4bada44b0a5031fc)を使って、音声のストリーミングをしてみます。

# 準備

前回作ったものは[github](https://github.com/tetsu-koba/wspipe-rs)にソースを置いてあります。
Rustはデバッグビルドとリリースビルドでは実行速度にかなり差があるということなので、必ずリリースビルドしたものを使用してください。

```
cargo build --release
```

それ以外のコマンドはUbuntu 18.04 では以下で揃います。

```
sudo apt install alsa-utils opus-tools
```
# 事前の確認

以下のようにすると私の環境ではUSBのWebcamの内蔵マイクの音声をイヤホンから出すことができます。(量子化16bit、サンプリングレート 48kHz, モノラル)

```
arecord -D plughw:2 -f S16_LE -r 48000 -c 1 -t raw \
| aplay -f S16_LE -r 48000 -c 1 
```
aplay, arecordの引数は環境によって調整してください。

遅延を減らすために`-B` オプションでバッファリングする時間指定します。マイクロ秒単位です。あまり減らしすぎるとbuffer underrun のエラーが発生しやすくなるので、いい感じに調整します。

```
arecord -D plughw:2 -f S16_LE -r 48000 -c 1 -B 10000 -t raw \
| aplay -f S16_LE -r 48000 -c 1 -B 20000
```
これでほぼリアルタイムになりました。
これをネットワークにまたがって行えばストリーミングになります。


# 非圧縮の音声データのストリーミング

### 受信側

こちらのマシンのIPアドレスは192.168.10.210です。ポートは8001を使用します。

```
./ws2stdout 0.0.0.0:8001 \
| aplay -f S16_LE -r 48000 -c 1 -B 20000
```

### 送信側

```
arecord -D plughw:2 -f S16_LE -r 48000 -c 1 -B 10000 -t raw \
| ./stdin2ws ws://192.168.10.210:8001
```

この方法だとわりと遅延が少ない状態でストリーミングすることができます。しかし非圧縮の音声データなので、100kB/s くらいネットワークの帯域を食います。


# opusで圧縮した音声データのストリーミング

opusでのエンコード、デコードをはさんでみます。

### 受信側

```
./ws2stdout 0.0.0.0:8001 \
| opusdec - - \
| aplay -f S16_LE -r 48000 -c 1 -B 20000
```

### 送信側

```
arecord -D plughw:2 -f S16_LE -r 48000 -c 1 -B 10000 -t wav \
| opusenc --max-delay 10 --bitrate 32 - - \
| ./stdin2ws ws://192.168.10.210:8001
```

この方法だとネットワークの帯域はぐっと下がって4KB/s くらいです。
しかし遅延は1秒くらいになります。
opusdec コマンドに遅延に関する設定がないので、ここでバッファリングしているのでしょうか。

# 参考

昔私が書いた記事。
[PCMのデータを自分でいじってデジタルオーディオを理解する](http://d.hatena.ne.jp/embedded/20151004/p1)