OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】Arukas アプリ作成時にハマったこと（EXPOSE 宣言は必須編）

#はじめに

さくらインターネットの Docker ホスティングサービスである [Arukas](https://arukas.io/) でアプリを作成しているときにハマったのでメモ。

#顛末

まず、Arukas で アプリ（＝ Docker コンテナ）を起動するためには、Docker Hub に登録されているイメージを利用する必要がある。

今回使おうとしたのは Ubuntu18.04 の公式イメージ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/eef69ebf-2627-a9f5-3494-8763a564cd80.png)

Arukas のアプリ追加コンソールを開いて、イメージとして Docker Hub で公式提供されている`ubuntu:18.04`を指定してアプリ作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/0c15f33f-efea-05a0-8a8d-2ca9cc2afbfe.png)

[OK]でアプリ起動。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/4e5ed519-b663-a33b-5ae1-a92eee1dd5bf.png)

アプリのステータスが「アプリはデプロイ中です」となったまましばらく待つ[^1]と...「アプリの起動に失敗しました」となり起動できない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/90b6c1c2-bf18-fcdc-1d8f-b88697cf9b9e.png)

イメージ名を`_/ubuntu:18.04`と指定して再試行したが同様に起動に失敗する。

調べてみると Arukas のFAQに以下のような記載があった。

https://support.arukas.io/hc/ja/articles/210357188
>対象ポートはDockerfile内においてEXPOSE宣言で開放されておりますでしょうか。 EXPOSEで開放されているポートが入力されていない場合、サーバとして起動しないことがございます。

とのこと。
これ、特にポート開放を必要とするサービスは入れない場合に、適当なポートを`EXPOSE`宣言しておくだけで良いのだろうか？例えば SSH デーモンを動かさずとも取り敢えず`EXPOSE 22`を設定しておくだけで正常起動の要件は満たされるのだろうか？

検証してみる。
以下のような、素の Ubuntu にポート22を開放するだけの Dockerfile を用意。

```docker
FROM ubuntu:18.04

EXPOSE 22

CMD echo 'Hello docker world!'
```

上記 Dockerfile からイメージをビルドして、自身の管理する Docker Hub に登録。（実際の試行ではxxxxxxを実在の Docker Hub アカウント名としています）

```shell
docker build . -t xxxxxx/ubuntu:18.04
docker push xxxxxx/ubuntu:18.04
```

Arukas のアプリ作成画面に戻り、先程登録したイメージ`xxxxxx/ubuntu:18.04`を指定し、アプリを作成し、起動。（この時、Arukas 側のポート設定は不要です。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/69eb2458-3786-cdc5-152e-468f7d918a7a.png)

アプリが正常に起動した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/8affdca3-fb0c-2fb6-3eb2-d3c86c7b6ac6.png)

#結論

Arukas のアプリで利用するイメージは何らかの一つ以上のポートが`EXPOSE`宣言されている必要がある。
しかし、コンテナ内でそのポートを利用するサービスを動かしたり、 Arukas 側のポート設定で同じ番号のポートを開放する必要はない。

#おまけ

因みに、SSH デーモンがちゃんと設定されたイメージを使用し、以下のように Arukas 側でもポート22を設定してあげれば、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/67aff73d-5595-0da4-8ca0-88f5659f7ac7.png)

作成後のアプリのポート22に対して動的なハイポート（`~arukascloud.io:31XXX`の`31XXX`部分）が自動的にマッピングされるので、例えば以下のようなマッピングが行われた場合は`ssh root@seaof-163-43-82-XXX.jp-tokyo-02.arukascloud.io -p 31XXX`とすればアプリに SSH 接続できます。（アプリを再起動するたびに URI やハイポートの値は動的に変わるので注意。）
![スクリーンショット 2019-03-23 21.43.12.png](https://qiita-image-store.s3.amazonaws.com/0/258416/769626f6-f244-9485-3905-e14879b40fed.png)

[^1]: https://support.arukas.io/hc/ja/articles/210357188 によると、アプリケーションの設定内容に誤りがある場合は起動試行中のアプリケーションは15分以内に強制停止されるとのこと。
Macでnpm installした際にUnhandled rejection Error: EISDIR: illegal operation on a directoryというエラーが出た

# はじめに
`npm install`した際にUnhandled rejection Error: EISDIR: illegal operation on a directoryというエラーが出た際の対処方法の備忘録です。

## 事象
```bash

$ npm --version
6.9.0

$ sudo npm install -g vue
Unhandled rejection Error: EISDIR: illegal operation on a directory, open '/Users/suzuki_naoto/.npm/_cacache/content-v2/sha512/17/75'

npm ERR! cb() never called!

npm ERR! This is an error with npm itself. Please report this error at:
npm ERR!     <https://npm.community>

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/suzuki_naoto/.npm/_logs/2019-03-23T13_51_14_940Z-debug.log
```

`Unhandled rejection Error: EISDIR: illegal operation on a directory`というエラーが出てnpm installが失敗しました。

ログファイルは次のように出ていました。
/Users/suzuki_naoto/.npm/_logs/2019-03-23T13_51_14_940Z-debug.log

```
0 info it worked if it ends with ok
1 verbose cli [ '/Users/suzuki_naoto/.nvm/versions/node/v9.3.0/bin/node',
1 verbose cli   '/Users/suzuki_naoto/.nvm/versions/node/v9.3.0/bin/npm',
1 verbose cli   'install',
1 verbose cli   '-g',
1 verbose cli   'vue' ]
2 info using npm@6.9.0
3 info using node@v9.3.0
4 verbose npm-session d36baac66da9840e
5 silly install loadCurrentTree
6 silly install readGlobalPackageData
7 timing npm Completed in 548ms
8 error cb() never called!
9 error This is an error with npm itself. Please report this error at:
10 error <https://npm.community>
```

## 対応方法
次の記事をみると、npmのバーションを下げると解決できたとのこと。
https://npm.community/t/global-installs-sudo-npm-i-g-fail-on-mac-after-6-5-upgrade-works-fine-after-6-4-1-downgrade/4082

ただ、`$ npm install -g npm@6.4.1`を実行してもエラーとなるため、直接フォルダの差し替えを行いました。

1. npmの公式からソースコードをダウンロード
https://github.com/npm/cli/releases/tag/v6.4.1

2. npmのフォルダを差し替え
npmのある場所は下記コマンドから確認できます。
まるごとファイルを上書きしました。

```bash
$ npm root -g
/Users/suzuki_naoto/.nvm/versions/node/v9.3.0/lib/node_modules
```
## 結果
```bash

$ npm -v
6.4.1
```

## 参考URL
[npm]npm install やったらエラー出てできんかったっていう話
https://blog.anzfactory.xyz/articles/20181231/misc-npm-install-error/
react-dndがステージ環境でレンダリングされなかった。

# TL;DR
結果としてバージョン下げたらなおった。

# 起こったこと
react-dndを用いて、ドラッグ&ドロップを使ったreactのspaを作っていた
開発環境ではちゃんとレンダリングされる。ドラッグ&ドロップもちゃんとできる。
でも、ステージ環境にあげると画面が真っ白になり、何も表示されない。
verは当時(2019 3/22)での最新のものを使っていた。

- react 16.8.4
- react-dnd 7.3.2
- react-dnd-html5-backend 7.2.0

環境としては開発環境はwebpack-dev-server、ステージ環境はwebpackでバンドルしたファイルをs3にあげてcloudFrontでキャッシュしているよくある構成。

# react-dndの仕様
react-dndではドラッグする対象[DragSource](http://react-dnd.github.io/react-dnd/docs/api/drag-source)とドロップする対象[DropTarget](http://react-dnd.github.io/react-dnd/docs/api/drop-target)のコンポーネントを定義し、そのコンポーネントよりも`上位のコンポーネント`に[DragDropContext](http://react-dnd.github.io/react-dnd/docs/api/drag-drop-context)か、[DragDropContextProvider](http://react-dnd.github.io/react-dnd/docs/api/drag-drop-context-provider)のどちらかを差し込まないといけない。（DragDropContext、DragDropContextProviderの両方使うと`Cannot have two HTML5 backends at the same time`というエラーがでる）

この`上位のコンポーネント`というのは上位であればどこでもいいが、アプリケーションのルートのコンポーネントに差し込んでいる例が多かった。

一応、readt-dndで画面のレンダリングがされないというissueは存在するが、DragDropContext、DragDropContextProviderをそもそも利用していないことが原因でレンダリングされていなかったというオチ。
https://github.com/react-dnd/react-dnd/issues/1132

今回の事象はDragDropContext、DragDropContextProviderは利用しているにも関わらず、画面がレンダリングされないという事象だったので、あまりissueは役に立たなかった。（そもそも開発環境だと表示されている）

# 遭遇したエラー
ローカルの開発環境だとDragDropContext、DragDropContextProviderのどちらを使ってもちゃんと画面表示される。
でもステージ環境だとDragDropContextProviderを使っているときは`Uncaught Invariant Violation: Hooks can only be called inside the body of a function component.`というエラーが出て画面が真っ白。
↓最新のDragDropContextProviderはhooksを使っているみたいで、ここで死んでた
<img width="735" alt="スクリーンショット 2019-03-22 15.40.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/ce5a6f53-9333-83b5-5b4a-a927f6a8d440.png">


DragDropContextを使うと、そもそもエラーも何もでず、画面が真っ白。

# 対処
react-dnd、react-dnd-html5-backendのverをちょっとずつ下げていってつど確認していった。
v4まで下げたら、ちゃんとステージ環境でもちゃんと動くようになった。

    "react-dnd": "^4.0.0",
    "react-dnd-html5-backend": "^4.0.0",

react-dndは直近でガンガンverが上がっているので、v4とかでも2018年のもの
https://github.com/react-dnd/react-dnd/releases

# 最後に
なんで治ったのかよくわからずじまいですが、結構ハマったので誰かの役に立てば、、
[Nuxt.js] Mismatching childNodes vs. VNodes


# 状況

- Consoleに以下エラーが出た。

![vue.js-20190315-20190324-104100.png](https://qiita-image-store.s3.amazonaws.com/0/275337/1ba98200-d30f-f822-886a-8a7d15124329.png)


```
Mismatching childNodes vs. VNodes:  
:
[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.
```

# 原因、対策

- p の中に div とかネスト構造がHTML規約に準じていない時に発生するようだが、今回の場合、HTMLのコメント表記が悪さしてたようだ。


- エラーになる例

```
<template>
    ：
    <!-- comment -->
    xxx
    ：
</template>
```

- エラーにならない例
    - pタグで囲っただけ


```
<template>
    ：
    <!-- comment -->
    <p>xxx</p>
    ：
</template>
```
【JavaScript】反復処理① while/do...while【自己学習】

##while/do...whileでできること
whileやdo...whileは与えた条件式の真偽値がtrueである間、処理を繰り返し実行させることができるため、同じような処理を何回も繰り返し記述する手間が省ける。

##while/do...whileの書き方
####while

```while-1.js
let i = 1;
while (i <= 3) {
  console.log(`${i}回目の反復です`);
  i++;
}

//コンソール
//1回目の反復です
//2回目の反復です
//3回目の反復です
```
まずwhile()内に条件式を入れ、trueである場合の処理をその後に記述する。
####do...while

```do-while-1.js
let i = 1;
do {
  console.log(`${i}回目の反復です`);
  i++;
} while (i <= 3);

//コンソール
//1回目の反復です
//2回目の反復です
//3回目の反復です
```
まずdo{}内にtrueである場合の処理を記述し、その後while()内に条件式を入れる。whileとは記述の順番が逆になっていることに注意する。

####前置判定と後置判定
条件式を記述する順番がwhileとdo...whileでは逆になっていることから、whileは処理を実行する前に条件式の判定が行われる（前置判定）のに対して、do...whileは処理を実行した後に条件式の判定が行われる（後置判定）。

あまり違いがないようにもみえるが、条件式が最初からfalseだった場合に処理が異なってくるので注意が必要。

```while-2.js
let i = 10;
while (i <= 3) {
  console.log(`${i}回目の反復です`);
  i++;
}

//コンソール

```

```do-while-2.js
let i = 10;
do {
  console.log(`${i}回目の反復です`);
  i++;
} while (i <= 3);

//コンソール
//10回目の反復です
```
whileは処理を行う前に条件式が偽となるため、処理は実行されずコンソール上には何も表示されないが、do...whileは条件式の真偽に関わらず必ず一度処理が実行されるため、コンソール上には「10回目の反復です」と表示される。

##無限ループ
処理が永遠に終了しないことを無限ループと言う。

```while-3.js
let i = 1;
while (i <= 3) {
  console.log(`${i}回目の反復です`);
 //i++;
}

//コンソール
//1回目の反復です
//1回目の反復です
//(「1回目の反復です」が永遠に繰り返し処理される)
```
上記のコードの場合、i++がコメントアウトされており変数iの値は1のままとなる。そのため条件式はfalseにならず、永遠に処理が繰り返されることとなる。

無限ループはブラウザに与える負荷が大きく、フリーズの原因に原因になることから、while、do...whileを記述する場合は最初に処理が正しく終了するかを前もって確認する必要がある。
数値リテラルの拡張メソッド呼び出しでハマった

数値に対する拡張メソッドを書いていて、リテラルに対して実行したときにハマったのでメモ。

例えば、以下のような拡張メソッドがあったとして、

```csharp
public static class NumEx
{
  public static double Ceiling(this double num) => Math.Ceiling(num);
}
```

次のように負数の数値リテラルに対して実行すると期待した値とは異なる値が返ってくる。

```csharp
Console.log(-1.5.Ceiling()); // --> -1.0を期待
> -2 // しかし実行すると-2.0が返る
```

これは演算子の優先順位の問題で、マイナスの単項演算子の優先順位が拡張メソッドの
呼び出しよりも弱いために、拡張メソッドの呼び出し結果に対してマイナスの単項演算子
が評価されているためこうなってしまう。

```csharp
Console.log(-1.5.Ceiling());   // <- この記述は
Console.log(-(1.5.Ceiling())); // <- このように解釈される
```

回避するには、リテラルに対して直接拡張メソッドを実行するのではなく、いったん変数に
格納してやるか、()で括って優先順位を明示的に示してやればよい。

```csharp
var n = -1.5;
Console.log(n.Ceiling());
> -1
Console.log((-1.5).Ceiling());
> -1
```

リテラルに対して拡張メソッドを実行するときは意識しておかないと、忘れたころにまたハマりそう。
クラスメソッドとインスタンスメソッド

# クラスメソッドとインスタンスメソッド
前回の続きで今回はこちらのテーマで書いていきたいと思います。
クラスとインスタンスについてわからない場合は
[こちら](https://qiita.com/yuichir43705457/items/1c7d396ea07170f2a377)を参考にしてみてください。

## クラスメソッド
クラスメソッドは定義したクラス自身が使えるものであり、クラスで**共通の情報**を持った処理に使います。

では、共通の情報とは何か？
前回と引き続き学校のクラスを例にとって考えてみましょう。
クラスには生徒がいて、**生徒の総数**がありますね、これはクラスがクラス内共通の値です。他にも、机の数や、受ける授業などもクラス内共通だと思います。

### クラスメソッドの定義
それでは上記に書いた生徒の総数をコード内に定義していきます。

```school.rb
class Student

   def self.students_count
　　　puts "生徒の総数は30人です。"
   end

end

student = Student.new
```

これで定義できました。クラスメソッドを定義するときはメソッド名の前に**self**をつけます。
この後、メソッド内に処理を記述することにより実行する事ができます。

##インスタンスメソッド
インスタンスメソッドはインスタンスが使用するものであり、**個別の情報**を使った処理に使います。
学校を例にとるのであれば、生徒一人一人に対する情報に対した処理という事です。
例えば生徒の身長という個々の情報を例にとると、
その身長を「測る」や「書く」、「見る」のような処理が浮かぶと思います。

### インスタンスメソッドの定義
それでは身長という情報を「見る」というメソッドを定義していきたいと思います。

```school.rb
class Student

   def self.students_count
　　　puts "生徒の総数は30人です。"
   end

   def show_student_height
     puts "私の身長は１７０cmです。"
   end

end

student = Student.new
```

これでインスタンスメソッドの定義ができました。
インスタンスメソッドの場合はクラスメソッドのようにメソッド名の前にselfなどをつける必要はありません。

ちなみに上に書いた「puts」は実行した際に表示をするというメソッドです。
上のshow_student_heightを実行すれば、puts以降の「私の身長は170cmです。」が出力されます。

## 最後に
今回はクラスメソッドとインスタンスメソッドについて説明していきました。
**クラスメソッドはクラス内共通の処理**
**インスタンスメソッドは個別の情報に対する処理**
ということを覚えておきましょう。
次回はクラス変数、インスタンス変数について説明していきたいと思います。

最後まで読んでいただきありがとうございました。
隠しファイルも含めフォルダ内のファイル全コピー Mac

隠しファイルまでGUIでコピペ出来なかったので。bash_profileにエイリアスとして書いてしまいます。

## bash_profileを開く

```
vi ~/.bash_profile
```

## bash_profile内に実装する

```
function cp_all(){ 
             
cp -a $1/. $2

}
```
## bash_profileを更新する

```
source ~/.bash_profile
```

## 引数1と2に、それぞれコピー元と、コピー先のパスを指定すればok

```
$ cp_all /Users/god/Desktop/aa /Users/god/Desktop/bb
```

これで `.env` のような隠しファイルも全部一緒にコピーされる。

## ps

ちなみに、下記のようにしておく `mk` とか `md` とかできるので便利。

```
function mk(){
vi ~/.bash_profile
}

function md(){
source ~/.bash_profile
}
```
VSCodeでの`GitLens: Open Changes (with difftool)`実行時のエラーへの対処

# Issue
`GitLens: Open Changes (with difftool)` 実行時に以下のエラーが出て、diff画面が開けない。

```
Unable to open changes in diff tool. No Git diff tool is configured
```

<img width="554" alt="0_Screen Shot 2019-03-24 at 10.24.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/7902/a19f9c7e-5947-30cc-eab7-7304e3121e41.png">

`View Git Docs`のリンクは以下。
https://git-scm.com/docs/git-config#git-config-difftool

# Soltuion

以下を `~/.gitconfig` に追加

```
[diff]
    tool = default-difftool
[difftool "default-difftool"]
    cmd = code --wait --diff $LOCAL $REMOTE
```

ref) https://code.visualstudio.com/docs/editor/versioncontrol#_vs-code-as-git-diff-tool

# Result
↓ `GitLens: Open Changes (with difftool)` を実行
<img width="1302" alt="1_Screen Shot 2019-03-24 at 10.21.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/7902/25d68040-82cd-be17-0be6-bbbffca6d94f.png">

↓ diff画面が正しく表示される
<img width="938" alt="2_Screen Shot 2019-03-24 at 10.22.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/7902/636af96a-41f4-389d-2c15-85efe8e0b198.png">

# PS
`git-difftool` について以下が参考になった。

https://girigiribauer.com/archives/20161227/

```
[diff]
  tool = vimdiff
[difftool]
  prompt = false
```

> これらの設定は git-diff 用ではなく git-difftool 用です。 それぞれお間違えなく。
NeovimをWindowsでビルド

NeovimをWindowsでビルドする方法です。
Neovimのクライアントを開発中に、Neovimをデバッガーでアタッチしたいことが多々出てきたので、Neovimをビルドしてみました。

## 環境

- Windows 10
- Visual Studio 2017 Community
- CMake 3.13.4
- git 2.20.1

執筆時点のCMakeの最新安定板は3.14だったが、CMakeでVisual Studio 2017のソリューションを生成するときにエラーが出たので、ひとつ前の安定板を使用。

## 参考サイト
https://gist.github.com/equalsraf/3bd1da169de03c50ff0fe296191572af

## ビルド

64bit **Debug版** をVisual Studio 2017でビルドする手順です。今回はデバッグ目的なので、**'Debug構成でビルドする'**ということが重要です。
[参考サイト](https://gist.github.com/equalsraf/3bd1da169de03c50ff0fe296191572af)ではpower shellを使用していますが、特にpower shellの機能は必要ないので、コマンドプロンプトを使用しています。

### 準備

- CMakeとgitにパスを通しておく。
- neovimをクローン

```
> git clone https://github.com/neovim/neovim
```

執筆時点の最新リビジョンはv0.3.4の近辺。

### 依存ライブラリのビルド

```
> cd (クローンしたneovimのディレクトリ)
> mkdir .deps
> cd .deps
> cmake -G "Visual Studio 15 2017 Win64" ..\third-party -DCMAKE_BUILD_TYPE=Debug
> cmake --build .
```

[参考サイト](https://gist.github.com/equalsraf/3bd1da169de03c50ff0fe296191572af)によると、unibiliumとかでエラーが出るらしいのですが、現時点では修正済みなのかエラーは出ませんでした。

Debug版を作成するときは、**-DCMAKE_BUILD_TYPE=Debug** を指定することが重要。これがないと、Debug構成でビルドしたneovim本体とランタイムが食い違い、起動しません。

### neovimのビルド

```
> cd (クローンしたneovimのディレクトリ)
> mkdir build
> cd build
> cmake -G "Visual Studio 15 2017 Win64" ..\ -DCMAKE_BUILD_TYPE=Debug
```

デバッグ作業はVisual Studio上で行うので、ビルドはコマンドプロンプトからはなく、Visual Studioから実行します。

```
> "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe" nvim.sln
```

あとは、Visual Studioでアクティブな構成をx64 Debugとなっていることを確認してビルドします。


### その他

- Releaseでビルドするときは、-DCMAKE_BUILD_TYPE=Debugを省略するか、DebugをReleaseに変更します。

- 32bitでビルドするときは、CMakeのコマンドのWin64を省略します。
AnsibleでUbuntu 16.04にPython2を導入するplaybook例。冪等性やchanged ハンドリング対応


#概要

以下のplayにPython導入ずみ環境対応やchangedハンドリングを追加してみました
- [Ubuntu 16.04 で ansible を使う](
https://qiita.com/seizans/items/26f45d5fbf8796cdd049)

- Ansible rawモジュールを使用してUbuntu 16.04にPython2を導入
    - とりあえずapt決め打ち
- rawモジュールを使用する為、gather_facts: false
- Pythonが既に使用可能ならば、which pythonの結果より
    - failed_when:, changed_when: の除外対象とする
- Pythonの導入を行なった場合、rcを特定の値(ここでは100)とし
    - failed_when: の除外対象とする

    

#play例
```yaml

- hosts: all
  gather_facts: false
  tasks:
  - name: install python2 for Ubuntu 16.04
    raw: which python || ( apt update && apt --yes install python && exit 100 )
    register: result
    failed_when: result.rc not in [0,100]
    changed_when: result.rc != 0
```

#参考
- [Ubuntu 16.04 で ansible を使う](
https://qiita.com/seizans/items/26f45d5fbf8796cdd049)
- [Ansible: shellモジュールに冪等性および正しいchanged結果を持たせる為のロジック例](https://qiita.com/hiroyuki_onodera/items/e2cf26d02f5bda85cd4d)
数検１級 (4) テイラー展開

# 問題

次の問いに答えなさい。

① $\cos^2 x$ をマクローリン展開し、$x^4$ の項まで求めなさい。
② $\tan x$ をマクローリン展開し、$x^5$ の項まで求めなさい。


<details><summary></summary><div>

# 知識

## テイラー展開・マクローリン展開

$x = a$ での**テイラー展開**：

$$
f(x) = f(a) + f'(a) (x-a) + \frac{f''(a)}{2!} (x-a)^2 + \frac{f'''(a)}{3!} (x-a)^3 + \cdots
$$

特に、$x=0$ でのテイラー展開を**マクローリン展開**という。問題で出てくるのはこちらが多い。

$$
f(x) = f(0) + f'(0) x + \frac{f''(0)}{2!} x^2 + \frac{f'''(0)}{3!} x^3 + \cdots
$$

## 倍角・３倍角・ｎ倍角の公式

倍角・３倍角くらいまでは覚えておく。それ以上は導出方法を覚えておく。

## 倍角の公式

* $\sin 2\theta = 2\sin\theta\cdot\cos\theta$
* $\cos 2\theta = 2\cos^2\theta-1$

## ３倍角の公式

* $\sin 3\theta = 3\sin\theta - 4\sin^3\theta$
* $\cos 3\theta = 4\cos^3\theta-3\cos\theta$

## ｎ倍角の公式

$(\cos \theta+i\sin\theta)^n$ を展開すると、その実部が $\cos(n\theta)$, 虚部が $\sin(n\theta)$ になる（ド・モアブルの定理）。

## 偶関数・奇関数

* 原点について左右対称な関数を**偶関数**という：$f(x) = f(-x)$.
* 原点について点対称な関数を**奇関数**という：$f(x) = -f(-x)$.

* 微分可能なら、偶関数を微分すると奇関数に、奇関数を微分すると偶関数になる
* 奇関数は原点を通る：$f(0) = 0$.

## 一般化ライプニッツ法則（←NEW）

積の微分の一般化。
$f, g$ が $n$ 回微分可能の時、

$$
(fg)^{(n)} = \sum_{k=0}^{n} {n \choose k} f^{(k)}g^{(n-k)}.
$$

ここで、$f^{(j)}$ は $f$ の $j$ 回微分のこと。

# 解答

## ① 

$y = \cos^2x$ とする。これを微分すると、

$$y' = - 2 \cos x \cdot \sin x = - \sin(2x)$$

よって、これ以降は簡単で
$y'' = -2\cos(2x)$, $y''' = 4\sin(2x)$, $y^{(4)} = 8\cos(2x)$.

$\cos x$ は偶関数なので、$x=0$ のとき、$y' = y''' = 0$.
その他の項については、$y=1$, $y''=-2$, $y^{(4)}=8$.

したがって、 

```math
\begin{align}
\cos^2x
&\sim 1 - \frac{2}{2!}x^2 + \frac{8}{4!}x^4 \\
&= 1 - x^2 + \frac{1}{3}x^4.
\end{align}
```

## ②

$y = \tan x$ とする。
$\tan x$ は奇関数なので、偶数次の導関数はゼロ。よって奇数次だけを考える。
ただし、直接微分すると商の微分がたくさん出てきて大変なので、次の工夫を考える。

$$
y \cos x = \sin x.
$$

両辺を微分すると、特に左辺は積の微分となって、
$$
y' \cos x - y\sin x = \cos x
$$
$x=0$ を代入して、$y' = 1$ を得る。

３次導関数については、左辺に一般化ライプニッツ法則を用いて、

$$
y''' \cos x - 3y''\sin x -3y'\cos x + y \sin x = -\cos x
$$
$x=0$ を代入して、$y''' - 3 = -1$ より、$y'''=2$.

５次導関数についても同様に、

$$
y^{(5)} \cos x - 5y^{(4)}\sin x - 10y'''\cos x + 10 y'' \sin x +5\cos x - y\sin x = \cos x
$$
$x=0$ を代入して、$y^{(5)} -20 + 5 = -1$ より、$y^{(5)}=16$.

したがって、

```math
\begin{align}
\tan x
&\sim x + \frac{2}{3!}x^3 + \frac{16}{5!}x^5 \\
&= x - \frac{1}{3}x^3 + \frac{2}{15}x^5.
\end{align}
```

</div></details>
LINE@ちょっと調べてみた

ちょっとLINE@使ってみたくて、ちょっと調べてみた。

#■LINE＠とは
たくさん(不特定多数)のアカウントに一斉にメッセージを送信できる(MLみたいな感じ)。
プランが多く簡単に始めることができる(個人でも無料で始めることができる)。
メッセージのやり取り以外にも様々な機能も利用できる。

#■公式とLINE＠の違い
料金が大きく異なる。
公式は大企業向け、LINE＠は個人向け。
※公式はプロモーション機能などが充実している(その分、料金が高い)。

#■LINE＠でできること
- メッセージの配信
    - 一括送信(無料プランだと1ヶ月1000人まで)
- ホーム投稿
- チャット(1対1でのトーク)
- 自動応答メッセージ
- アカウントページ
- クーポン配信
    - 全員配信と抽選配信ができる
- ショップカード
- 友達数など統計確認
- PRページ
- リサーチページ

#■LINE＠の始め方
1. LINEのアカウントが必須
1. LINE＠アカウントの設定
1. 料金プランの設定<br>
※公式サイトで最新の情報確認

#■配信の仕方
頻度は週1〜2程度。
配信内容はユーザにとって有益な内容にする。
Ruby on Rails - ①開発環境

今日からRuby on Railsを勉強したいと思ってまた投稿開始しました。

#開発環境設定
https://www.jetbrains.com/ruby/
30日Trialでやって見ます。

使い方も丁寧に書いているので助かります。
https://pleiades.io/help/ruby/meet-rubymine.html

Ruby on RailsのApplicationプロジェクトを作ってそのまま実行すると以下のエラーが出ました。
]![スクリーンショット 2019-03-24 10.10.03.png](https://qiita-image-store.s3.amazonaws.com/0/108475/aa8e16a9-6dc6-0d16-7905-7e1670d7dd1f.png)


エラーメッセージの通り、GemFileを開いて以下のようにバージョン設定をすれば問題なく実行できました。
<img width="399" alt="スクリーンショット 2019-03-24 10.12.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/7e3b9d0c-02a7-7f17-d921-f692b6789e73.png">


#Ruby基本文法整理
これだけで基本文法は完了ー２〜３分だけの動画が26回分あるので、2時間程度で楽に文法がわかりました。
https://dotinstall.com/lessons/basic_ruby_v3
上記の動画の内容が整理されているQiitaはこちら
https://qiita.com/Fendo181/items/eb2cb17f32d99aa01f59
アルデバラン製線形代数ライブラリ「almath」を使ってみる

アルデバランが提供する線形代数ライブラリであるalmathというのが存在するらしい。[こちら](https://github.com/aldebaran/libalmath)のレポジトリで提供されています。

## インストール
pythonで使用する場合は以下でインストール可能。

```
$ pip install almath
```

公式からnaoqi SDK落としてきてパスを通している人はalmathも入ってるっぽいので何もせず使えます。3系で使いたい場合は一応用意されているので同様にインストール可能ですが、naoqi SDKのパスが通ってるとimport時にエラーが起きるっぽいです。(~~naoqiは早く3系に移行してくれ~~)。パス通ってない状態だとpipコマンドでいれれば多分問題なく使えると思います。

## 使い方
```python
import almath

# (x, y, θ)
vector2d = almath.Pose2D(3.0, 0, 0)
# (x, y, z, roll, pitch, yaw)
vector6d = almath.Position6D(2.0, 1.0, 0, 0, 0, 0)

# convert to simultaneous transform matrix from vector
t_vector2d = almath.transformFromPose2D(vector2d)
t_vector6d = almath.transformFromPosition6D(vector6d)

t_result = t_vector2d * t_vector6d
# convert to vector from simultaneous transform matrix
result = almath.position6DFromTransform(t_result)
# get element of vector
print("[{},{},{},{},{},{}]".format(result.x,result.y,result.z,result.wx,result.wy,result.wz))
```

各ベクトル初期化時は引数を入れないとすべて0で初期化されます。Eigenとかと同様、各要素はa.xとかで取ることが可能です。リストとして扱いたい場合は以下のようにするとリスト型へ変換が可能です。

```python
list(almath.Position6D().toVector())
# almath.Position6D().toVector()自体はタプル型として扱われる
```

### その他使い方
```python
# calculate norm
almath.Position6D().norm()

# calculate normalize
almath.Position6D().normalize()

# calculate distance between two vectors
a = almath.Position6D(2,0,0,0,0,0)
b = almath.Position6D(2,5,0,0,0,0)
almath.distance(a,b)

# get rotate matrix
ax = almath.Position3D(1,0,0)
ay = almath.Position3D(0,0,0)
az = almath.Position3D(0,0,0)
rotation = almath.rotationFromAxesXYZ(ax, ay, az)

# get quaternion
rotation3D = almath.rotation3DFromRotation(rotation)
almath.quaternionFromRotation3D(rotation3D)

# generate Quaternion
almath.Quaternion(1,0,0,0)
# Quaternion(w, x, y, z)
```

その他いろいろできますが全体のAPIを追い切れていないのでまた後日追記しようと思います。
(API見てると占有格子地図で使いそうな名前のAPIとかもあったんでALNavigationとかで使ってるのかな)

## 結論
以外と便利かも？？？？
Sigfox MonarchによるIoTグローバルローミング

#Monarchとは?
Monarchは、LPWAの特長（低消費電力、低コスト、シンプルオペレーション）を維持しながら、海外を移動するIoTデバイス向けにSigfox社が開発したシームレスグローバルローミング技術です。
![monarch01.png](https://qiita-image-store.s3.amazonaws.com/0/172313/a27298e0-e81b-bffe-2c7d-aa740757bd83.png)

Monarch技術を活用したユースケースは既に、[ルイ・ヴィトンのカバン追跡デバイス"ECHO"](https://jp.louisvuitton.com/jpn-jp/products/louis-vuitton-echo-nvprod780041v)や、[ミシュランの物流コンテナトラッキング](https://dcross.impress.co.jp/docs/usecase/000551.html)として実現されています。

#Monarchってどう動くの？
Sigfoxネットワークは、各国の技術基準に応じ[複数のRC（Radio Configuration）](https://qiita.com/ghibi/items/ac9a1642b2feca8f9eb7)に分けて運用されています。
各国のSigfoxベースステーションは、定期的にMonarchビーコンを送信しています。Monarch対応デバイスは、このMonarchビーコンを受信することにより、どの国にいるのかを把握し、その国の技術基準にあった通信を開始します。
![Monarch原理.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b70422de-0760-5555-6213-476f1fb27a92.png)

#Monarch対応デバイス
Monarch対応デバイスを作るためには

- 各RCに対応したアンテナ及び受信回路
- Monarchビーコンを受信するためのOOK復調可能なサブGHzトランシーバ
- Monarch対応SigfoxライブラリをポーティングするMCU
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/918721eb-1012-ed43-b2cb-2045197c9a29.png)
が必要となりますが、[ST社](http://investors.st.com/news-releases/news-release-details/stmicroelectronics-launches-ultra-low-power-sigfox-monarch-ready)や[LITE-ON社](http://www.lite-on.co.jp/)等のSigfoxチップセットメーカ、モジュールメーカがMonarch対応のソリューションが提供されています。

#Monarch対応Sens'itで日本-シンガポール物流
Monarch対応デバイスは、ルイ・ヴィトンのECHOを開発した[Axible社](https://axible.io/tracker/)が提供していますが、Sens'itでもPoCレベルのMonarchトラッカとしては使えるとのこととで、早速、日本-シンガポールで海上輸送してみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/01f97792-5718-1f14-c9ff-0f032a3da65c.png)
Sens'it V2を5台の輸出開始です。
3月5日に出荷し、しばらくは大井ふ頭近くで待機。3月11日にようやく横浜港は出港したSens'itの行方は。。。
<img width="473" alt="Monarch日本-シンガポール.png" src="https://qiita-image-store.s3.amazonaws.com/0/172313/5fc41620-290a-c852-7909-716284a6a424.png">
無事にシンガポールに到着していました。
さらに、うち1台の履歴を見てみると、香港も寄っていることがわかりました。RC3（日本）からRC4（Hong Kong、Singapore）へのローミングの旅でした。
![monarch.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b95c06af-eb82-3054-1f9d-3ffc5b0b3259.png)

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
#python で #Twitter API を叩いてツイートを削除するスクリプト例 (複数ツイート対応)

# config.py を用意しておく

```
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''
```

# ツイートのIDを改行区切りで、標準出力で渡す


```
echo "[TweetID]\n[TweetID]" | python3 example.py 
```

# Script

```py
# https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-destroy-id.html

import json, config, re, sys, os
from requests_oauthlib import OAuth1Session
 
CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)

for line in sys.stdin:
  id = line.strip()
  api_url = 'https://api.twitter.com/1.1/statuses/destroy/{id}.json'.format(**{ "id" : id })

  res = twitter.post(api_url)
  print(json.dumps(res.json()))
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/903








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CentOS7 ユーザーを追加する

CentOS7へのユーザーの追加方法を説明します。基本的なコマンドですが、よく忘れるのでメモしておきます。ユーザーを追加するには`useradd`コマンドを使用します。
# useraddコマンド
オプション（よく使うものだけ）
`-c コメント`コメントです。下の例では、"Guest User"と指定しています。
`-d ホームディレクトリのパス`ホームディレクトリを指定します。一般的には/homeディレクトリの下にユーザー名と同じディレクトリを指定します。
`-s シェルのパス`ログインシェルです。ほとんどの場合/bin/bashなので、わざわざ指定する必要はありません。デフォルト値になっています。
`[ユーザー名]`最後にユーザー名を指定します。下の例ではguestになっています。

```console
[user@host ~]$ sudo useradd -c "Guest User" -d /home/guest -s /bin/bash guest
```
### /etc/passwdファイルで登録内容を確認
登録された内容は`/etc/passwd`ファイルで確認できます。下の例ではguestユーザーしか表示していませんが、このファイルにはすべてのユーザーが登録されています。

```console
[user@host ~]$ cat /etc/passwd

guest:x:1001:1001:Guest User:/home/guest:/bin/bash
```

ユーザーは追加できましたが、パスワードも設定しておく必要があります。
### ユーザーのパスワード設定
パスワードの指定には`passwd`コマンドを使用します。コマンドの後ろにユーザー名を指定します。この例のようにオプションを指定しなかった場合、対話形式でパスワードの設定が行われます。

```console
[user@host ~]$ sudo passwd guest
```

ついでに参考としてユーザーの削除も載せておきます。
### ユーザーの削除
ユーザーを削除するには`userdel`コマンドを使用します。
オプションに`-r`を使用します。このオプションを指定しておくと、ユーザーのホームディレクトリーも削除されます。

```console
[user@host ~]$ sudo userdel -r guest
```
WayBack でジオシティーズのバックアップを閲覧

Yahoo!ジオシティーズは2019年3月31日をもちましてサービスの提供が終了します。
終了後もコンテンツを閲覧する方法です。
Archive.org の WayBack というサービスを使います。
例として、次を使います。
>http://www.geocities.jp/akvoju/vel/
エスペラント国の旅

1) https://archive.org/web/web.php にアクセス
![wayback01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/8946a9b0-1896-c42d-012e-9d05f13359c4.png)

2) URL を入れる
![wayback02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/ec40f89b-8dae-f1ec-e351-76da0903510f.png)


3) 日付をクリック
![wayback03.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1b8144e6-fcd2-5b99-9549-9b7ae932354b.png)

4) バックアップが表示されます。
![wayback04.png](https://qiita-image-store.s3.amazonaws.com/0/179446/3a082c18-f6a8-feb4-c226-1b123132e887.png)

5) 2018-3-24 の http://www.geocities.jp/akvoju/vel/
![wayback06.png](https://qiita-image-store.s3.amazonaws.com/0/179446/3658e0d9-1816-ed93-26c0-5c3bdf8670dd.png)
MacでGitツールSourceTreeによるローカルリポジトリの作成

#はじめに
Gitの概念を学ぶために、svnではTortoiseSVNのようにツールを用いて簡単に動作確認するものがないか探したていたところ、@nnahitoさんの[記事](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)でSourceTreeというツールがあることを知りました。
今回はローカルリポジトリの作成を試してみたので、SourceTreeを用いてローカルリポジトリの作成方法をまとめます。

gitを学習するために以下の記事も参考にさせていただきました。
https://naichilab.blogspot.com/2014/01/gitsourcetreegit.html?m=1

#環境
macOS Mojave(バージョン10.14.1)
Sourcetree(バージョン3.1.1_213)

##ローカルリポジトリ作成
###1. SourceTreeを起動して新規をクリック。
![スクリーンショット 2019-03-21 22.51.39.png](https://qiita-image-store.s3.amazonaws.com/0/377612/eac1f8a9-deca-0c8e-af9f-34f4fe5faa74.png)

###2. ローカルリポジトリを作成をクリック
![スクリーンショット 2019-03-21 23.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/377612/f7c0a961-3d85-9c43-c3ad-9355a9f57d2f.png)

###3. 保存先のパスを指定して作成をクリック
![スクリーンショット 2019-03-24 6.25.32.png](https://qiita-image-store.s3.amazonaws.com/0/377612/b7c153a2-3682-05c9-acbe-7bcea7868d15.png)

###4. .gitフォルダが作成されたら完了です。
![スクリーンショット 2019-03-24 6.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/377612/1f41479a-886a-cd0f-15e6-f121ce8e9e3c.png)
MySQLにおける文字コードutf8mb4の設定


[MySQLの文字コード事情](https://www.slideshare.net/tmtm/mysql-62004569)
の27ページの表が出るようにmy.cfを調整してみる

```
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```


# 準備

```
$ ls
docker-compose.yml  my.cnf
```

## my.cf

```
$ cat my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
log-bin=/var/log/mysql/bin-log
server-id=1

[client]
default-character-set = utf8mb4
```

### character-set-serverパラメータ

[MySQL :: MySQL 5\.6 リファレンスマニュアル :: 5\.1\.4 サーバーシステム変数](https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html)

他にオプションファイルで指定可能なcharacter_set*といえば`character-set-filesystem`があるが、こちらはデフォルトのままが良いようだ。

`default-character-set`については
[MySQL 5\.5ではdefault\-character\-setが廃止されてた… \| イガラシ研](https://indigo-design.org/2012/01/mysql-5-5-default-character-set/)
の通り、`[mysqld]`セクションからは削除されている。ただし、mysqlコマンドは`[client]`セクションを読んでいるので設定

### collation-serverパラメータ

[MySQLの文字コードとCollation \- Qiita](https://qiita.com/tfunato/items/e48ad0a37b8244a788f6)
より、

utf8mb4_bin
A ≠ a 区別する
:sushi: ≠ :beer: 区別する
は≠ぱ≠ば 区別する

を選択

## docker-compose.yml

```
$ cat docker-compose.yml
version: '2'
services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      TZ: "Asia/Tokyo"
```


## 接続

```
$ docker-compose up -d
$ docker-compose exec mysql bash

# mysql -u root
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```
nodebrewでインストールしたpm2をRasbperry Piで自動起動させる


[ラズパイ起動と共にpm2でスクリプト起動](https://qiita.com/ikemura23/items/68fb61b16c6752daa7e8)の記事をnodebrewでインストールした環境でやってみました。

流れ

* 永続化させるプロセスをpm2で起動
* `pm2 startup`を実行
	* ヒントっぽいのがでる
	* 無視して↓の`sudo env~`を実行
* pm2 saveで保存

## まずは永続化

```bash
pm2 start app.js
```

ここで永続化したプロセスが↓の手順で記憶される模様です。

## pm2 startup

```bash
$ pm2 startup
```

色々でるけどスルーして↓の行を実行。
**ここの行が全てな気がした。**

```bash
sudo env PATH=$PATH:/home/pi/.nodebrew/current/bin /home/pi/.nodebrew/current/bin/pm2 startup systemd -u pi --hp /home/pi
```

> ちなみにpm2 startupすると出てくる`sudo env PATH=$PATH:/home/pi/.nodebrew/node/v11.6.0/bin /home/pi/.nodebrew/node/v11.6.0/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi`などのコマンドはバージョンがv11.6.0みたいに固定で書いてあるので、これをコピペしてしまうとNode.jsのバージョンが変わってしまったら対応できなくなってしまいそう

↓こんな感じのログが出ます。利用しているcurrentバージョン(↓v11.6.0)のパスを自動的に設定してくれてますね。

```bash
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/home/pi/.nodebrew/node/v11.6.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid

ExecStart=/home/pi/.nodebrew/node/v11.6.0/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/home/pi/.nodebrew/node/v11.6.0/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/home/pi/.nodebrew/node/v11.6.0/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
```

## 保存

```bash
$ pm2 save
```

## 再起動して確認

* 再起動

```bash
$ sudo reboot
```

* 再起動後に確認するとappのプロセスが立ち上がってます。

```bash
$pm2 list

┌──────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬──────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu  │ mem       │ user │ watching │
├──────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼──────┼───────────┼──────┼──────────┤
│ app      │ 0  │ N/A     │ fork │ 878 │ online │ 1       │ 67s    │ 0.2% │ 37.5 MB   │ pi   │ disabled │
└──────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴──────┴───────────┴──────┴──────────┘
```


## 自動起動を解除する

自動起動に設定したスクリプトが悪さしてるみたいで、一旦解除したくなりました。

```bash
pm2 unstartup systemd
```

さっきとほぼ一緒ですが、`~~ unstartup sytemd ~~`という形で **unstartupになってるので注意**しましょう。

```bash
sudo env PATH=$PATH:/home/pi/.nodebrew/current/bin /home/pi/.nodebrew/current/bin/pm2 unstartup systemd -u pi --hp /home/pi
```

> ここもstartupの箇所がunstartupに

## 所感

Pythonのスクリプトは`/etc/rc.local`とかでやってたので新鮮。
CLIでOSXのBluetooth接続を改善する WIP

# 症状

MBP（会社用および私用）を2,3日電源落とさず使うと、Bluetoothのデバイス検知ができなくなる & 登録済みデバイスの再接続ができなくなる

またGUI（環境設定）からのオン・オフも効きが悪くなる

どちらも再起動すると直る

Sierra（購入時）からHigh Sierra, Mojaveと継続して発症

# やりたいこと

（再起動したくない時が多いので）再起動せずに

- [ ] 検知・再接続できるようにする
- [x] オン・オフを操作する

# 試したこと

Mojave以降で試したことを解決まで随時更新予定

## CLIでbluetoothd再起動

https://github.com/rgcr/m-cli/blob/master/plugins/bluetooth#L26-L33 を参考に、Appleの公開APIを利用[^1]

```sh
# Bluetooth off
$sudo defaults write /Library/Preferences/com.apple.Bluetooth ControllerPowerState -int 0
$sudo killall -HUP bluetoothd
# Bluetooth on
$sudo defaults write /Library/Preferences/com.apple.Bluetooth ControllerPowerState -int 1
$sudo killall -HUP bluetoothd
```

オン・オフはできた[^2]が、検知などは解決せず

## Bluetoothモジュールをリセット

メニューバーのBluetoothボタンをshift+option押下したままクリックすると隠しメニューのデバッグを利用できる

1. 現在の設定値をバックアップ
  - `$sudo cp /Library/Preferences/com.apple.Bluetooth.plist ~/Desktop/`
1. デバッグ->すべてのデバイスを削除
1. デバッグ->Bluetoothモジュールをリセット

......解決せず

## com.apple.Bluetoothの設定値をいじる

```sh
$defaults read /Library/Preferences/com.apple.Bluetooth
```

これで`/Library/Preferences/com.apple.Bluetooth.plist`の中身をjsonでみれる（？）が、この中の値をいじれば解決するかも？

[^1]: deamonに対してhang upで再起動させてるが`launchctl stop[start] com.apple.bluetoothd`でも可能
[^2]: `sudo launchctl list|grep com.apple.bluetoothd`でStatusという項目がみれるが、これはそのサービスの最後の終了コード。ex, -15ならSIGTERM。
Rで複数のcsvファイルを読み込む

フォルダ内の連番になっているcsvファイルをRで一気に読み込み、それぞれ別のデータフレームに入れたい。（例えば年代別とか都道府県別とか）

`001_01.csv`~`001_10.csv`

この10個のファイルをまとめて読み込む

```r
setwd("C:/データがある場所")
files <- list.files(path = "C:/データがある場所",full.names = T)

for(i in 1:length(files)){
  i <- formatC(i, width = 2, flag = "0") #iを01~10にする
  df <- paste("001_", i, ".csv", sep = "") #dfが001_01.csv~001_10.csvと変化するようにする
  eval(parse(text=paste("data", i, "<-read.csv('", df, "')", sep=""))) #evalで文字列を実行する
}
```
実行すると`data01`に`001_01.csv`のデータ、`data02`に`001_02.csv`のデータって感じになる。
もっとスマートな方法あるかも
laradock で『laradock_mysql_1　docker-entrypoint.sh mysqld　Exit 2』となる問題を解決

# 環境
OS：macOS Mojave 10.14.3
Docker：18.09.2
docker-compose：1.23.2
docker-machine：0.16.1
php：7.1.23
Laravel Framework：5.8.7
mysql：Ver 14.14 Distrib 5.7.25, for Linux (x86_64) using  EditLine wrapper


# 事象
laradockで構築したmysqlを起動すると

```
$ docker-compose up -d php-fpm nginx mysql
Recreating laradock_mysql_1          ... done
Starting laradock_docker-in-docker_1 ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done


$ docker-compose ps
           Name                          Command              State                      Ports                   
-----------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up       2375/tcp                                  
laradock_mysql_1              docker-entrypoint.sh mysqld     Exit 2                                             
laradock_nginx_1              /bin/bash /opt/startup.sh       Up       0.0.0.0:443->443/tcp, 0.0.0.0:8080->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up       9000/tcp                                  
laradock_workspace_1          /sbin/my_init                   Up       0.0.0.0:2222->22/tcp
```

となり起動にコケてしまう事象が発生しました。


# 解決方法
一旦dockerを止めます。

```
docker-compose stop
```

以下のファイルを変更します。

```:.env
### MYSQL #################################################

MYSQL_VERSION=latest #latestのまま
- MYSQL_DATABASE=default
+ MYSQL_DATABASE=laradock
- MYSQL_USER=root
+ MYSQL_USER=laradock
- MYSQL_PASSWORD=root
+ MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

さらに、以下のディレクトリ配下のファイルをすべて削除します。
**/Users/{USER NAME}/.laradock/data/mysql/**

# 終わり
以上、対応後にdockerを起動すると

```
$ docker-compose up -d php-fpm nginx mysql
Starting laradock_docker-in-docker_1 ... done
Recreating laradock_mysql_1          ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done


$ docker-compose ps
           Name                          Command              State                     Ports                   
----------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp                                  
laradock_mysql_1              docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp, 33060/tcp         
laradock_nginx_1              /bin/bash /opt/startup.sh       Up      0.0.0.0:443->443/tcp, 0.0.0.0:8080->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp                                  
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp  
```

mysqlのプロセスが確認できれば完了です。お疲れ様でした＾＾
ペアプログラミングのやり方

僕がペアプロを試す上で考えたことや、実際に試した結果からの反省点などを踏まえた上で、良さげなペアプロの方法をまとめた。今後の試行錯誤の結果も随時反映させていくかも。

まずは、一つ目。1-2時間おきに5-10分の休憩を挟む。ペアプロに集中していると、休憩を忘れがち。疲れを感じた時に休むのでは、休む時には既に疲れが溜まりすぎている場合が多い。

休憩中には、

- 遠くを見たりして目の疲れを取る
- 伸びをしたり歩き回ったりして体をほぐす
- 近くの人と会話する

などをすると良い。ただし、

- うたた寝する
- 水を飲む
- 軽食を取る
- 音楽を聴く
- SNSを見る

などは、再開した時に集中できなくなるので、避けた方が良い。

休憩を入れないと集中力が持たないし、時間を浪費しがちになる。だらだらと何時間も画面に向き合うよりは、1時間しっかりと集中するほうが幸せになれる。

# 前提

- ペアプログラミングは二人で行う
- 各自に一つのPC
- TDD指向で開発する

# Live Share
ペアプロをする上でとても役に立ったので、紹介しておく。Live Shareというのは、Microsoftが提供するサービスで、Visual StudioやVisual Studio Codeで使用できる。一言でいうと、同じファイルを複数人で編集できるようにするサービス。

無料で使用できるので、おすすめ。僕は、VSCode to VSCodeの組み合わせで使った。
<img width="1440" alt="vs-code-ls-session.png" src="https://qiita-image-store.s3.amazonaws.com/0/126131/aa66037c-9051-0ea4-f022-1d582c7d6413.png">
(引用元: https://code.visualstudio.com/blogs/2017/11/15/live-share)

参考: https://docs.microsoft.com/en-us/visualstudio/liveshare/

# 相手とレベルが同じ時

ナビゲータとドライバに役割分担する。30分から1時間を目安に、区切りの良いところで役割を交代していく。こうすることで、ペア内に平等感を醸し出すことができる。さらに、スキルセットの偏りを防ぐこともできる。

## 前提

以下で説明する方式でペアプロを行う上で、ペアへの信頼は欠かせない。

## 説明

ナビゲータはドライバのサポートを行う。例えば、ドライバが実装中に調べたいことが出てきたら、ナビゲータに投げる。ナビゲータが調べている間、ドライバは他の作業をする。

ナビゲータはドライバが書いたコードをレビューする。レビューは(余裕があれば)実装と並行して行う。そうすることで、レビューで判明した改善点を早い段階でコードに反映できる。

## 役割

### ナビゲータ

- プログラムの大局的な構成を考える
- テストを書く
- ドキュメントを書く
- ドライバの疑問をググる
- ドライバが書いたプログラムをレビューする

### ドライバ

- 実装する
- 実装する
- 実装する

## タイムテーブル

|かける時間|ナビゲータ|ドライバ|
|:--|:--|:--|
|5-10分|プログラムの構成を考える|プログラムの構成を考える<br>実装の準備(コードを読む等)|
|20-40分|テストを書く<br>ドキュメントを書く<br>ドライバの疑問をググる<br>コードレビュー|実装<br>実装<br>実装|

## 意思決定(ie. 責任の所在)

ナビゲータは、

- サブルーチンの名前
- サブルーチンの機能
- サブルーチンのインターフェース(シグネチャ)

等に関する決定権を持つ。

ドライバは、

- サブルーチン内で使うアルゴリズム
- サブルーチン内の変数名

等に関する決定権を持つ。

ナビゲータとドライバで合意形成ができないときは、決定権を持つ側の意見が優先される。このようにすることで、議論が平行線を辿るのを防ぐ。

# 相手が初心者の場合

プログラミングを学ぶ最も良い方法は、実際に手を動かすことだと思う。ペアプロを教育として用いると、相手は指導者付きの環境で手を動かして学べるので、上達が早いかもしれない。

役割の交代は行わない。1時間を目安に、区切りの良いところで休憩を挟む。

## 前提

以下で説明する方式でペアプロを行う上で、ペアへの信頼は欠かせない。また、教師と生徒という関係を受け入れてもらう必要がある。

## 説明

自分(教える側)がナビゲータ、相手(教わる側)がドライバをする。相手に手を動かしてプログラムを作ってもらうことで、単に見せるよりも、高い教育的効果があるかも。

無駄な時間をなくすために、相手には事前に文法書を一通り読んできてもらうことを勧める。文法から教えていては、全然実装が進まない(実体験)。

もしくは、文法を教えてからコーディングに入ると良い。その際、適当な入門書をテキストとして、それに従って教えていけば、順序立てて説明することができる。すでに他の言語を習得している人に教える時は、その言語と対比させながら教える。初めて見るであろう文法事項については重点的に教え、そうでない類推できるであろう事項については軽く流すといったように、緩急をつけて教える。そうすると、時間の短縮になる。また、教わる側も疲れにくいし、飽きにくい。さらに、文法を教える時には、自分の経験談やtipsを交えて教えると良い。

文法の学習は単調なものになりやすいので、一人で進めるには根気がいる。そこで、人に教わる機会を設けることで、短期間で効率よく知識を身につけることができる。そして、そのあとにペアプロを行うと、学んだ知識の定着を図れる。

## 役割

### ナビゲータ

- プログラムの大局的な構成を考える
- テストを書く
- ドキュメントを書く
- ドライバの疑問をググる
- ドライバが書いたプログラムをレビューする

(以上に加えて)

- プログラムの局所的なアルゴリズムを考える
- レビューを積極的に行う(付きっぱなしでも良い)
- 関連するtipsを教える
- (一緒にプログラムを書く)

### ドライバ

- ナビゲータの指示通りに実装する(文法の復習を兼ねて)


## タイムテーブル

|かける時間|ナビゲータ|ドライバ|
|:--|:--|:--|
|5-10分|プログラムの構成を考える<br>テストを書く|見て学ぶ|
|40-60分|ドキュメントを書く<br>ドライバの疑問をググる<br>積極的なコードレビュー<br>アルゴリズムの指示<br>経験や知識の共有|指示通りに実装<br>経験を積む|

## 意思決定(ie. 責任の所在)

あらゆることについて、ナビゲータの意見を優先する。

## 注意

- 簡単なサブルーチンの実装にもかなりの時間がかかるので時間と忍耐と覚悟が必要
- 相手を置いきぼりにしてしまうことがよくあるので、付いてきてるかこまめに確認する
- 自分よりも相手の方が疲れる(当然!!)ことを理解して、休憩を多めに取る
Unityのコライダー勉強２

[前回](https://qiita.com/E-CAT/items/7442dcb4535e85729a40)、Unityのコライダーを勉強しました。

そして今回は [こちら](https://qiita.com/OKsaiyowa/items/2c5bdecc1edb5eea6eb0) の記事を参考に、オブジェクトの位置を入れ替える挙動を、コライダーの判定を使って実装したいと思います。

以下を用意しました。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/285370/4b99a238-1cfc-1c52-318b-c896c82eaeaa.jpeg)
灰色のCubeの上下左右に白いCubeを配置したものです。
白いCubeには、BoxCollider と Rigidbodyをアタッチしています。

本当は灰色CubeそのもののGameObjectに直接BoxColliderを4つ付けたかったのですが、どのコライダーが当たっているか判定することが難しそうでしたので白Cubeを4つ作ります。

↓ColJudge.csの中身です。

```
using UnityEngine;

public class ColJudge : MonoBehaviour
{
    private GameObject parentObj;
    private GameObject colObj;
    private bool colFlg = false;

    private void Start()
    {
        parentObj = gameObject.transform.parent.gameObject;
    }

    private void Update()
    {
        if (colFlg)
        {
            if (Input.GetKeyDown(KeyCode.UpArrow) && gameObject.name == "Up") swap();
            if (Input.GetKeyDown(KeyCode.DownArrow) && gameObject.name == "Down") swap();
            if (Input.GetKeyDown(KeyCode.RightArrow) && gameObject.name == "Right") swap();
            if (Input.GetKeyDown(KeyCode.LeftArrow) && gameObject.name == "Left") swap();
        }
    }

    private void OnTriggerStay(Collider other)
    {
        colObj = other.gameObject;
        colFlg = true;
    }

    private void OnTriggerExit(Collider other)
    {
        colFlg = false;
    }

    private void swap()
    {
        Vector3 tmpPos = parentObj.transform.position;
        parentObj.transform.position = colObj.transform.position;
        colObj.gameObject.transform.position = tmpPos;
    }
}
```
（オブジェクトの名前を分岐条件に使用しているのがイケていない気がします。。。）


後は、灰色Cubeの周りにBoxcolliderがついているCubeを配置してUnityエディターで実行ボタンを押して動作確認します。
![20190324_01.gif](https://qiita-image-store.s3.amazonaws.com/0/285370/d43a05f7-e09a-e70f-3b3b-19bbb132f326.gif)
今回はここまでです。
技術書 読んだ順番を振り返ってみた

必要に迫られてSQLを勉強し始めて以来、購入した技術書も気づけば10冊を超えていました。本棚を晒すようで若干恥ずかしさもあるのですが、自身の振り返りも兼ねて記事にしてみました。
プログラミング初心者が、ちょっとしたデータベース構築と入力画面の作成ができるようになるまでに読んだ本の一覧として、参考になれば幸いです。

## 読んだ順番

1. [SQL Server 2016の教科書](http://www.socym.co.jp/book/1062)
1. [SQLパズル 第2版](https://www.shoeisha.co.jp/book/detail/9784798114132)
1. [SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/)
1. [プログラマのためのSQL 第4版](https://www.seshop.com/product/detail/15685)
1. [独習C#　新版](https://www.shoeisha.co.jp/book/detail/9784798153827)
1. [もっとプログラマ脳を鍛える数学パズル](https://www.seshop.com/product/detail/21336)
1. [やってはいけないデザイン](https://www.seshop.com/product/detail/19836)
1. [リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)
1. [実戦で役立つＣ＃プログラミングのイディオム／定石＆パターン](http://gihyo.jp/book/2017/978-4-7741-8758-7)
1. [Effective C# 6.0/7.0](https://www.seshop.com/product/detail/21691)
1. [プリンシプル オブ プログラミング](https://www.shuwasystem.co.jp/book/9784798046143.html)

## この順番で読んだほうが良かったかも順

1. プリンシプル オブ プログラミング
1. リーダブルコード
1. プログラマのためのSQL 第4版
1. SQLアンチパターン
1. SQLパズル 第2版
1. SQL Server 2016の教科書
1. 独習C#　新版
1. 実戦で役立つＣ＃プログラミングのイディオム／定石＆パターン
1. Effective C# 6.0/7.0
1. もっとプログラマ脳を鍛える数学パズル
1. やってはいけないデザイン

発売順を考慮していないため、実際にできたかは別として、その分野の原理原則的なことを記している書籍を先に読んでおいたほうが、後続の本の理解もしやすかっただろうと思いました（とはいえ、その時の気分や勢いがあるからこそ一気に読めるというのもあるので難しいですね）。
例外について

プログラミング初学者です。
今回は例外処理を学んだのでアウトプットさせていただきます。
間違っている点等ありましたら、恐れ入りますがコメントからよろしくお願いします。
#Q1: 例外とは？
プログラム実行時に検知されるエラーのこと
#Q2: プログラム実行時とは？
javaの実行までの仕組みは以下のようになっています。
![fullsizeoutput_1b.jpeg](https://qiita-image-store.s3.amazonaws.com/0/305584/00a83711-4575-db6c-7430-8e23378572db.jpeg)

上記の図の(実行)で出るエラーが**例外**
#Q3: 例外が出たらどうなるの？
コンソールにエラー文が出て処理が**中断**されます。
#Q4例外が出た時、処理が中断されない方法はあるの？
あります。
その方法が**例外処理**です。
※例外処理についてはQiitaの別の記事で書きます。
今回は**例外**についてだけです。

##[参考にしたサイトはこちらをクリック](http://memories.zal.jp/WP/blog/20100126_1693.html)
Java_1から100までの総和

```
public class Main {


    public static void main(String[] args) {


        int[] a = java.util.stream.IntStream.rangeClosed(1, 100).toArray();
        int sum = java.util.Arrays.stream(a).sum();


        System.out.println(sum); 
    }


}
//5050
```

# 参考

- [Java - java １から１００まで足す｜teratail]
(https://teratail.com/questions/180348)

# 次にやること

Java8の参考書を読む。

# あとがき
ストリームに詳しくなりたい。
php-master-changes 2019-03-23

# 2019-03-23
## krakjoe: For consistency with Windows, and because ZTS is not experimental or a "maintainer" feature, this commits renames --enable-maintainer-zts to --enable-zts in the autotools build, and related documentation
- https://github.com/php/php-src/commit/161adfff3f437bf9370e037a9e2bf593c784ccff
- --enable-maintainer-zts を --enable-zts にする修正
- マルチスレッドで速くしたいがために ZTS 版ビルドする時 maintainer って何だよ、とつい最近に俺も思ってた
- 「PHP でマルチスレッド？一体何の話だい？」と思う向きもあるかもしれないが、なんなら今のところ 1.3 〜 1.5 倍くらいにしか性能上がらない JIT より効くケースがあるというのを[マリオで試した](https://www.youtube.com/watch?v=Vn-ih5MREsY)俺は知っている
- でもこれ 7.4 で deprecation にしつつエイリアスで入れるとかないと、PHP をビルドする系のツールとかが困るんじゃないかな、確かに期間はあるけど急に 8 で変わる感じになっちゃうし
- [PR:3974](https://github.com/php/php-src/pull/3974)

## alekitto: fix bug [#76801](https://bugs.php.net/bug.php?id=76801): phpdbg too many open files error
- https://github.com/php/php-src/commit/b8b880932e95ff1e575a04a6988bc0cf00b89842
- [7.2~]
- sapi/phpdbg で、Windows 環境だと include / require の際にファイルハンドルが解放されず too many open files とか言われていた問題の修正
Mackerelでcrontabの失敗を検知する

# 概要
バッチをスケジュールしたいとき、`crontab`を使うことがあるかと思います。
自分もよく使っているのですが、バッチの実行そのものに失敗したときに、検知できないのがネックだと感じています。

対策として、`Rundeck`や`Jenkins`を導入したりしますが、ちょっとしたバッチの実行で立てるのは、煩わしいと思っていました。
そんなときに、`Mackerel`の`mkr`コマンドで監視できることを知ったので、試していこうと思います。

# 実践
やることはシンプルで、`crontab`でバッチを設定するときに、`mkr wrap` を設定するだけです。
`-n`で名前をつけると、確認しやすいと思います。

今回は`/usr/bin/php /home/vagrant/twitter-search/Execute.php TwitterSearch` というバッチを監視するため、`crontab`は下記の設定にします。

```conf:crontab
* * * * * mkr wrap -n 名前 /path/
ex). 10 * * * * mkr wrap -n 名前 /usr/bin/php /home/vagrant/twitter-search/Execute.php TwitterSearch
```

これだけで失敗を検知する準備が整いました。
実際にバッチが失敗するとき、下記の画像のようにMackerelでアラートが発生します。
<img width="1186" alt="スクリーンショット 2019-03-21 17.40.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/39671/85e18e06-166d-37af-a0d8-8256036762a1.png">

この画面ではなぜ失敗したかわからないので、運用する際は`-d`のオプションを付けてあげると良さそうです。

# まとめ
バッチをスケジュール実行する際に、`crontab` + `Mackerel`で管理すれば、バッチの失敗も検知できて良さそうでした。

# 参考資料
* [mkr wrapでcronなどのバッチジョブを監視する - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/howto/mkr/wrap)
storyboardをうっかり削除したとき復活させる方法

##こんなときに使える
・xcode内でstoryboardの部品を消そうとしたら、うっかりファイルごと消してしまったとき
・うっかりGitにもあげてなかったとき

##順序
・xcode左側のアプリ名の上で右クリック
・上から８番目のAdd Files to ”ファイル名”・・・をクリック
・Base.Iprojフォルダを開き、Main.storyboardを選び、Add

##参考
https://teratail.com/questions/62934