OmniAICreator/Qiita-1.07M huggingface dataset:
.NET Core3.0でPublishSingleFile

最近出来心でコマンドラインツールを作ろうと思ってgo言語を勉強してました・・・が，go言語はあまりにも構文が貧弱であれもないこれもないとやりながらストレスたまりまくって心が折れました．で，仕方なく色々言語をあさって，古巣のC#はそういえばどうなってるんだろうと見てみたところ，.NET Core3.0のPreview版が出てるとのこと．さらには.NET Core3.0ではPublishSingleFile[^1][^2]がサポートされるとのことでテンションが上がって試して見ることにしました．

[^1]: PublishSingleFileは.NET Coreのプログラムの配布を行うときに，実行ファイルを1つにまとめると言う機能です．C#はJava同様にランタイムの上でコードを動かす関係上，プログラムの実行ファイルの他に実行環境も用意して上げる必要があります．そのため.NET Coreでは，ランタイムをプログラムを実行するマシンにインストールしておくか，実行環境とともにプログラムを配布する必要があります．

[^2]: .NET Core2.2以前では，実行環境とともに書き出してしまうと，標準ライブラリも同一ディレクトリにdllファイルとして書き出されてしまうため，実行ファイルが大量のdllファイルに埋もれてしまうという頭の痛い状況でした．


#環境準備
まずは[こちら](https://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral)からSDKをインストール．開発環境は次の3つから選択することができます（2019/6/14現在，Preview6）

1. 任意のエディタ+コマンドライン
2. VisualStudio2019 リリース版（別途設定が必要）
3. VisualStudio2019 プレビュー版

私はリリース版のVisualStudio2019で試しました．VisualStudio2017は現在サポートされていないようです．リリース版になればサポートされる可能性があるかもしれません．

## VS2019リリース版の追加設定
デフォルトの状態では，対象のフレームワークとしてプレビュー版のフレームワークを指定することができないので，プレビュー版も選択肢に追加する設定が別途必要です．

- ツール > オプション　から，オプション設定画面を開く
- 環境 > プレビュー機能　のページを開く
- .NETコアSDKのプレビューを使用する　にチェックを入れる

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430694/f28ec0d3-a1cb-2cb5-38b5-220ac285191a.png)


# HelloWorldを表示するプログラムを作ってみる
以降，VisualStudio以外ではやり方調べられてないです．

まずは，普通に.NET Coreでコンソールアプリを作成します．コンソールアプリを作成すると，VisualStudioのテンプレートでHelloWorldのプログラムが生成されます．プログラムが生成されたら，ソリューションエクスプローラから作成したプロジェクトを右クリックし，プロジェクトのプロパティを開きます．プロジェクトのプロパティ画面が開けたら，下図のように対象のフレームワークを.NET Core 3.0に変更します．
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430694/f68b3e0d-9291-4a63-a903-e90c45fc667d.png)


メニューバーからプロジェクトファイルの編集をクリックし，下記のようにPublishSingleFileとRuntimeIdentifierを追記します．

```
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
  </PropertyGroup>

</Project>
```

publishの構成を変更します．メニューバーのビルドからプロジェクトの発行をクリックし，プロファイルを作成します．編集から，プロファイルの設定を開き，配置モードを「自己完結」，ターゲットランタイムを実行したい環境に設定し，保存します．

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430694/d342dd9e-ebe7-c802-f8b7-e5e380cb60b6.png)

あとは，同じ画面の発行ボタンをクリックしたらターゲットの場所で指定したフォルダにファイルが出力されています．


# あとがき
とりあえずこれでシングルファイルのアプリケーションが.NET Coreで作成することができました．まだpreview版なので，リリース時にどうなるかわかりませんが，3.0ではUtf8Jsonが追加されたり，LinuxのSerialPortを叩けるようになったり，Windows以外にも勢力を広げようと野心的なアップデートがされるようなので今後が楽しみですね．
vim-goを使ってみた

GoをVimで書こうとした時には、プラグインを入れたくなります。
Vimのプラグインである[vim-go](https://github.com/fatih/vim-go)である程度困らない環境を構築していきます。

# 前提環境
| elements   | version               |
|----------  |-----------            |
| go version | go1.12.6 darwin/amd64 |
| OS         | MacOS Mojave 10.14.5  |
| Vim        | VIM - Vi IMproved 8.1 |

GOPATHなどは通しておいてください。

# とりあえずインストール
vim-goをインストールします。
`NeoBundle`や`Vundle`、vim scriptでインストールしても良いですが、
ここではvim-goのレポジトリに書いてある手順でインストールしていきます。

と言っても、`git clone`するだけです。

```
$ git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go
```

vimを再起動して、`:GoPath`などのコマンドが使えれば完了です。

# エラーの対応

## goplsが見つからない
Vimを再起動し、`.go`のファイルを開くと、次のようなエラーが出ました。

```
vim-go: could not find 'gopls'. Run :GoInstallBinaries to fix it
Errorr detected while processing function <SNR>36_register[5]..go#lsp#DidOpen
```

### 対応
素直に`:GoInstallBinaries`を実行します。
一部のツール（`guru`や`goimports`など）が既にインストールされている場合は`:GoUpdateBinaries`も実行します。

## tools/cmd/goplsがダウンロードできない
どうして。

### 対応
色々と調べてみると、どうやら元々入っていたGoのバージョンが果てしなく古かったためでした。12.6ではダウンロードできました。
最新のバージョンを使いましょう。

## Features that rely on gopls will not work correctly outside of GOPATH or a module

### 対応
~~今だに原因究明できていませんが、`go list`コマンドが失敗するとこのような[エラーが出る場合](https://github.com/fatih/vim-go/issues/2301)があるそうです。~~

エラーの内容通り`$GOPATH`配下でないと正常に動作しません。
対象ファイルを`$GOPATH`配下に移動させた上で再度vimで開いてみると、エラーは消えるはずです。

もし、それでも消えない場合は握りつぶすことも可能です。

```
let g:go_null_module_warning = 0
```
## テンプレートを消したい
なにも設定していないと新しいGoファイルを作成した時にテンプレートが吐き出されるが正直なくていいなと感じました。

```go
package main

import "fmt"

func main() {
	fmt.Println("vim-go")
}
```

### 対応
以下のコマンドで消せます。

```
let g:go_template_autocreate = 0
```

## 保存が遅すぎる

### 対応
`vim-go: initialize gopls`と表示される場合は`gopls`が初期化する時に時間がかかっている場合があります。
 しばらく待ってから一度、`GoUpdateBinaries gopls`で直接アップデートして再度保存を試みてください。

そうでない場合は、`goimports`(パッケージのimportの削除や追加をよしなにやってくれるツール)や`gofmt`(フォーマットしてくれるツール)の影響や`syntastic`（保存時にLintとかやってくれるツール）の影響が大きいことが考えられます。

次のコマンドで、設定を変更します。

```
let g:go_fmt_command = "gofmt"
let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck']
```

## おわりに
快適なGoライフを！！

### 参考
* https://github.com/fatih/vim-go
* https://github.com/hnakamur/vim-go-tutorial-ja
* https://github.com/fatih/vim-go/issues/2301
* https://github.com/fatih/vim-go/issues/2247
* https://github.com/fatih/vim-go/issues/144
* https://github.com/fatih/vim-go/issues/1191
C++20 標準ライブラリのモジュール

# C++20 Standard Library Modules

C++20 のモジュール、標準ライブラリは何を import すれば良いのか、ぱっと見で分からなかったので書き出してた自分用メモ.

## 仕様

2019/06/14 現在の最新はこれかな？

* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0581r1.pdf

お手軽にビルドする分には 

```C++:main.cpp
import std;
```

だけで良さそう？

### std.fundamental

基本部分.

* \<cstddef>
* \<limits>
* \<cfloat>
* \<cstdint>
* \<new>
* \<typeinfo>
* \<exception>
* \<initializer_list>
* \<csignal>
* \<csetjump>
* \<stdexcept>
* \<system_error>
* \<utility>
* \<tuple>
* \<optional>
* \<variant>
* \<any>
* \<bitset> without the IO formatting declarations
* \<type_traits>
* \<ratio>
* \<chrono>
* \<ctime>
* \<atomic>
* \<typeindex>
* std::unique_ptrand associated classes and functionsfrom \<memory>
* std::shared_ptrand associated classes and function from \<memory>

### std.core

基本部分＋コンテナやアルゴリズム.

* Re-export of module std.fundamental
* \<array>
* \<list>
* \<forward_list>
* \<vector>
* \<deque>
* \<queue>
* \<stack>
* \<map>
* \<set>
* \<unordered_map>
* \<unordered_set>
* \<iterator>
* \<algorithm>
* \<execution>
* \<functional>
* \<string_view>
* \<string> without IO declarations
* \<memory> except std::unique_ptrand associated classes and functions, std::shared_ptrand associated classes and functions
* \<memory_resource>
* \<scoped_allocator>
* \<regex>

### std.io

入出力関係.

* \<cctype>
* \<cwctype>
* \<cwchar>
* \<cstdlib>
* \<cuchar>
* \<locale>
* \<codecvt>
* \<clocale>
* \<iosfwd>
* \<iostream>
* \<ios>
* \<streambuf>
* \<istream>
* \<ostream>
* \<iomanip>
* \<sstream>
* \<fstream>
* \<cstdio>
* Declarations for IO formatting from \<complex>
* Declarations for IO formatting from \<string>
* Declarations for IO formatting from \<bitset>

### std.os

OS関係.

* \<filesystem>

### std.concurrency

並列処理関係.

* \<mutex>
* \<thread>
* \<condition_variable>
* \<shared_mutex>
* \<future>

### std.math

数学関係.

* \<complex> without the IO formatting declarations
* \<numeric>
* \<valarray>
* \<random>
* \<cmath>

### std

すべての標準機能.

## 以前の仕様

手元の処理系で、上手くいかなかったら一個前の仕様を確認.
 
* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0581r0.pdf

### 変更点

* std.concurrency は std.threading だった. 
* std.core のメモリ関係は std.memory だった.
* std.os は std.filesystem だった.
* std.core の \<regex> は std.regex だった.
* std.math は std.numeric だった.
* std は無かった.
xmltodictは配下の要素が1つの場合list化しない

# xmltodictは配下の要素が1つの場合list化しない

## TL;DR

* `xmltodict` は配下の要素が`1つの場合list化しない` (`2つ以上の場合list化される`)
* 要素が1つの場合もlist化したい場合は、 `parse時にforce_listオプションを利用する`

## 例

要素が2つの場合 -> foods配下が `list化されている`

```python
import xmltodict

xml = """
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>
  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>
"""

parsed_xml = xmltodict.parse(xml)
print(type(parsed_xml["foods"]["food"]))

# <class 'list'>
```

要素が1つの場合 -> foods配下が `list化されていない`

```python

import xmltodict

xml = """
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>
</foods>
"""

parsed_xml = xmltodict.parse(xml)
print(type(parsed_xml["foods"]["food"]))
  
# <class 'collections.OrderedDict'>
```

## どうするか

`parse` するときに `force_list` オプションを指定する(`対象にする要素名はタプルで指定可能`)

```python

import xmltodict

xml = """
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>
</foods>
"""

parsed_xml = xmltodict.parse(xml, force_list=('food'))
print(type(parsed_xml["foods"]["food"]))
  
# <class 'list'>
```
[JS]オブジェクトや配列をコピーすると、コピー元の編集がコピー先にも反映される件

# 今日のコード
## 問題1 ふつうの値の場合
```javascript:問題1
let a = 1;
let b = a;
a = 100; // 後からaにだけ100を代入し直す。
console.log(b); // さてbには何が入っているでしょう。 1? 100?
```
さて、これで出力される値は、どちらでしょうか？
正解は…

```text:答え1
1
```
正解は、1ですね。これはまぁ、当然かと思います。
bにaが代入された時点で、b=1という、値が代入されているので、その後aに違う値が代入されても、bはそのまま1です。



## 問題2 オブジェクトの場合
```javascript:問題2
let obj1 = {'one':'あ'};
let obj2 = obj1;
obj1.one = 'い'; // 後からobj1にだけ「い」を代入し直す。
console.log(obj2); // さてこれは？ 「あ」？　「い」？
```
これはどうか。

```text:答え2
{one: "い"}
```
こちらでは、なんと再代入していない方（再代入前にコピーされたもう一方）も、値が「い」になってしまいました。

## 問題3 配列の場合
```javascript:問題3
let arr1 = [1,2,3];
let arr2 = arr1;
arr1[0] = 10000; // 後からarr1にだけ10000を代入し直す。
console.log(arr2[0]); // さてこれは？　1? 100?
```
こちらはどうか。

```text:答え3
10000
```
はい。オブジェクトの場合と同様に、再代入していない方（再代入前にコピーされたもう一方）にも、影響がありました。
以下で詳しく説明します。
# どういうことか
これは、JavaScriptのコピー（値を渡す挙動）における仕様によるものです。

JavaScriptでは、配列やオブジェクトがコピーされた場合（値が渡された場合）、**基本的に参照渡しで渡される。**

つまり、新しいarr2やobj2が作られて、新たに値が入れられるわけではない。
実は内部的には、arr2はarr1と同じものを常に参照しているだけ、（obj2はobj1を常に参照しているだけ）という状態になっている。

これにより、コピー元を変更すると、コピー先も影響を受けてしまうので、注意が必要です。
コピーしたい場合は、使い勝手が良いと噂のlodashの「_.deepClone関数」などを使うようにしましょう。
DevOpsが何者なのか噛み砕いて説明してみる

# はじめに

最近流行りのDevOps。これ使うとなんかすごいんでしょ？みたいな漠然としたことは知ってても、いったいどんなものなのか見当もつかない。
さて、困ったときのWikipedia先生。

> DevOpsは、ソフトウェア開発手法の一つ。開発 (Development) と運用 (Operations) を組み合わせたかばん語であり、開発担当者と運用担当者が連携して協力する（さらに両担当者の境目もあいまいにする）開発手法をさす。厳密な定義は存在しておらず、抽象的な概念に留まっている。ソフトウェアのビルド、テスト、そしてリリースの文化と環境を以前よりも迅速に、頻繁に、確実に発生する確立を目指している。

うーん…ますますよくわからない。困ったな。ちょっと噛み砕いて説明してみよう。

# Step1. ユニットテストの自動化

**DevOpsのキモは「自動化」**なのだ。その第1段階として、ユニットテストの自動化を考えよう。JUnitとかそういうやつね。
ボタンを押したらコードで書かれたテストが実行され、赤と緑のグラフでどのぐらいテストが通ったか分かるアレです。
ボタンとかのUI系テストも、最近は自動化できるツールがあるようです。

# Step2. 継続的インテグレーション

さあ、テストを自動化したら、ソースをコミットしようとしたタイミングで、テストを自動的に回したいと思うはず。
ついでにデプロイとかもできるとうれしいな。というわけで、Jenkinsなどを使って一連の流れを自動化する。
ここまでが継続的インテグレーション。「成果物をきれいに保つ」というコンセプトですね。

# Step3. そしてDevOpsへ

クラウドコンピューティング全盛の時代になって、ついに開発と運用が手を取り合う時が来た。
ここでの立役者がIaaC（Infrastructure as a Code）。クラウド上のサーバやらスイッチやらの配線をコードで記述すると、その通りのインフラができちゃうらしい。
使うマシンもクラウド上で管理されているし、運用中の性能情報も、クラウドの管理画面から見れる時代になっています。
これで、運用まで含めた一連の流れが自動化できました。わーい。

# まとめ

一言で言うなら「徹底した自動化でみんなハッピー☆」ということですね。詳しい説明は他に譲ります。
【Atcoder】 DFSとBFS

お久しぶりです、最近は仕事中もAtcoderのあの問題どうやるんだろう・・・と気になってしょうがない日々を過ごしています:relaxed:
今日の話題はDFS(深さ優先探索)とBFS(幅優先探索)の違いと特徴について〜
双方ともある状態からたどり着ける全ての状態を探索する際に使うアルゴリズムですが、それぞれのメリットについてわかっていなかったので蟻本よりメモ:relaxed:

- DFS
    - 再帰関数を使うことで短く書ける
- BFS
    - 最短経路を求めたい時に使える（同じ経路を何度も通るような場合、ただし状態数に比例したメモリが必要）

#DFS
DFSの例は以下のようなフィールドが与えられた場合、何個の水たまり('#')の塊があるか探索する問題。
####入力
```
4 6 //フィールドのサイズ
#..#..
...#..
#..#..
#..#..
```

```c++
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int H, W;
vector<string> s(H + 100);

void dfs(int x, int y){
 //今いるところを'.'にする
 s[x][y] = '.';
 //8方向を探索
 for(int dx = -1; dx <= 1; ++dx){
   for(int dy = -1; dy <= 1; ++dy){
     int nx = x + dx;
     int ny = y + dy;
     if(0 <= nx && nx < H && 0 <= ny && ny < W && s[nx][ny] == '#'){
       dfs(nx, ny);
     }
   }
 }
 return;
}

int main() {
  //入力
  cin >> H >> W;
  for(int i = 0; i< H; ++i) cin >> s[i];
  int ans = 0;
  
  for(int i = 0; i < H; ++i){
    for(int j = 0; j < W; ++j){
      //水たまりがあるところからスタート
      if(s[i][j] == '#'){
        dfs(i, j);
        ++ans;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
```

#BFS
BFSの例は以下のようなフィールドが与えられた場合、スタートからゴールまでの最小値を求める問題。
####入力
```
4 6　//フィールドのサイズ
0 2　//スタート位置
3 5　//ゴール位置
#..#..
......
#..#..
#..#..
```
```c++
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
int H, W;
int sx, sy; //スタートの座標
int gx, gy; //ゴールの座標
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; //移動する方向
vector<string> s(H + 100);

typedef pair<int, int> P;

int bfs(){
  queue<P> que;
  int cnt[H][W]; //スタートからの距離を格納する配列
  //初期化
  for(int i = 0; i < H; ++i){
    for(int j = 0; j < W; ++j){
      cnt[i][j] = -1;
    }
  }
  //スタートをキューに入れ、その地点を0にする
  que.push(P(sx,sy));
  cnt[sx][sy] = 0;
  //キューが0になるまでループ
  while(que.size()){
    //先頭のキューを取ってくる
    P p = que.front();
    que.pop();
    //キューがゴールなら探索終了
    if(p.first == gx && p.second == gy)break;
    //移動方向にループ
    for(int i = 0; i < 4; ++i){
      int nx = p.first + dx[i];
      int ny = p.second + dy[i];
      if(0 <= nx && nx < H && 0 <= ny && ny < W && s[nx][ny] != '#' && cnt[nx][ny] == -1){
        que.push(P(nx, ny));
        cnt[nx][ny] = cnt[p.first][p.second] + 1;
    }
  }
 }
 return cnt[gx][gy];
}

int main() {
  //入力
  cin >> H >> W;
  //スタート位置
  cin >> sx >> sy;
  //ゴール位置
  cin >> gx >> gy;
  for(int i = 0; i< H; ++i) cin >> s[i];

  cout << bfs() << endl;
  return 0;
}
```

ようやく2つを理解・・・。
蟻本見てるだけだと覚えられなくて、やっぱり自分で書くのが大事そうですね〜
Kotlinで多重ループの中でcontinueしたい場合、return@ラベルを使おう

# はじめに

KotlinのforEach文の中で、従来の`continue`みたいにループ処理の中断をしたくて、次のように書きました。

```Kotlin
val studentsScores = arrayOf(arrayOf(62, 89, 73), arrayOf(79, 100, 86), arrayOf(38, 68, 74))
studentsScores.forEach { scores ->
    scores.forEach { score ->
        if (score < 80) {
            continue@forEach
        }
        print("合格!!(${score}点)")
    }
}
```
すると、`continue@forEach`のところで`The label '@forEach' does not denote a loop`とビルドエラーになりました。

# continueの代わりにreturnを使う

少し調べて、`continue@forEach`ではなく`return@forEach`とすべきだとわかり、次のように直しました。

```Kotlin
val studentsScores = arrayOf(arrayOf(62, 89, 73), arrayOf(79, 100, 86), arrayOf(38, 68, 74))
studentsScores.forEach { scores ->
    scores.forEach { score ->
        if (score < 80) {
            return@forEach
        }
        print("合格!!(${score}点)")
    }
}
```
しかし、今度は`return@forEach`のところで`there is more than one label with such a name in this scope`と警告が出るようになりました。
どうやらforEachが二重になってるので、どっちに対するreturnなのか明言されてないよ、ということらしい。
ビルド自体は通って期待通りの結果を得られるので、そのままでも問題はないのですが、どうせなら警告も消したいですね。

# 同じ構文でネストしてる場合はラベルを使う

さらに少し調べて、Kotlinには[ラベル](https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels)という便利な機能があることを知り、再び以下のように直しました。

```Kotlin
val studentsScores = arrayOf(arrayOf(62, 89, 73), arrayOf(79, 100, 86), arrayOf(38, 68, 74))
studentsScores.forEach { scores ->
    scores.forEach scoreLoop@ { score ->
        if (score < 80) {
            return@scoreLoop
        }
        print("合格!!(${score}点)")
    }
}
```

`@scoreLoop`ラベルを付けたことにより、これは内側のforEach文のreturnだよ、と明言することができました。
警告が出なくなった上にコードも読みやすさも上がった気がして、スッキリしました。
ローカルホストで作成したhtmlファイルをウェブサーバーと同期する

＊＊＊　備忘録です。間違い等があればご指摘ください。　＊＊＊

### ディレクトリの同期

ローカルホストのディレクトリをウェブサーバーのディレクトリと同期する。
　同期元ディレクトリ：~/html
　ウェブサーバー：IPアドレスは123.456.78.90、ログイン名はuser
　同期先ディレクトリ：~/www

```
$ rsync -av ~/html/ user@123.456.78.90:www
```
補足：同期元ディレクトリを指定する際、最後に「/」を付けるとそのディレクトリ自体、「/」を付けないとそのディレクトリ下のファイルを指定したことになる。すなわち、「~/html/」とした場合は、同期先ディレクトリwww下のディレクトリhtmlと同期元ディレクトリが同期される。一方、「~/html」とした場合は、同期先ディレクトリwww下のファイルと同期元ディレクトリ下のファイルが同期される。

### ファイルの転送
ローカルホストのファイルをウェブサーバーにコピーする。
　コピー元ファイル：~/html/file.html
　ウェブサーバー：IPアドレスは123.456.78.90、ログイン名はuser
　コピー先ディレクトリ：~/www

```
$ scp -p ~/html/file.html user@123.456.78.90:www
```
Jetson Nanoのカーネル再コンパイル

# はじめに

本記事はJetson Nanoのカーネルを再コンパイルするための方法について記述する。基本的には普通のLinuxのためJetson Nanoだからと言って新しい部分があるわけではない。しかし不要なモジュールはどんどん削除していつかはスリム化したいので書き留めておく。

# 事前準備

最初に`uname`でカーネルのバージョンを把握しておく。

```bash:ターミナル
$ uname -a
Linux jetson-nano 4.9.140-tegra #1 SMP PREEMPT Wed Mar 13 00:32:22 PDT 2019 aarch64 aarch64 aarch64 GNU/Linux
```

`4.9.140-tegra`がカーネルのバージョンであり、バージョン4、パッチレベル9、サブレベル140、フレーバはtegraになる。

またコンパイルに備えて最大パフォーマンスにしておく。

```bash:ターミナル
sudo jetson_clocks
```

# カーネルソースのダウンロード

```bash:ターミナル
wget https://developer.nvidia.com/embedded/dlc/l4t-sources-32-1-jetson-nano -O l4t-sources-32-1-jetson-nano.tar.gz
```

これを展開する。

```bash:ターミナル
tar xvf l4t-sources-32-1-jetson-nano.tar.gz
```

するとpublic_sourcesというディレクトリ配下にソースコードが展開される。

```bash:ターミナル
cd public_sources
ls *.tbz2
```

下記のファイル群が含まれている。

```
FreeRTOSV8.1.2_src.tbz2
gstegl_src.tbz2
gstjpeg_src.tbz2
gst-nvvideo4linux2_src.tbz2
gstomx1_src.tbz2
kernel_src.tbz2
libgstnvvideosinks_src.tbz2
nvgstapps_src.tbz2
nvsample_cudaprocess_src.tbz2
u-boot_src.tbz2
v4l2_libs_src.tbz2
```

`kernel_src.tbz2`がカーネルソースなのでこれを展開する。

```bash:ターミナル
tar xvf kernel_src.tbz2
```

`kernel`と`hardware`というディレクトリが作成される。

```bash:ターミナル
cd kernel/kernel-4.9
```

ソースコードのバージョンを確認

```bash:ターミナル
grep VERSION -m1 -A4 Makefile
```

結果は次の通り。

```
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 140
EXTRAVERSION =
NAME = Roaring Lionus
```

現在のconfigファイルをコピーする。

```bash:ターミナル
zcat /proc/config.gz  > .config
```

コンパイルする。

```bash:ターミナル
make oldconfig
make prepare
make modules_prepare
make -j4 Image
make -j4 modules
```

インストールする。

```bash:ターミナル
sudo make modules_install
sudo cp -p /boot/Image /boot/Image.org
sudo cp arch/arm64/boot/Image /boot/Image
```

あとは再起動。

# おまけ

`make menuconfig`をする人はcursesライブラリが必要。

```bash:ターミナル
apt install -y libncurses5-dev
```
【PHP】$_GETと$_POSTの違い

#$_GETと$_POSTの違いを一言で表現するのなら…
**PHP側に対する情報の渡した後の処理の違い**が、GETとPOSTの違いです。

GETもPOSTも”情報を送る”という共通点があります。
ですが、その情報を送った後の処理に違いがあります。

##$_GETと$_POSTの違いとは？

$_GET…値を受け渡す、その後、URL付きでデータ取得するもの。
$_POST…ただ情報を送信するだけのもの。

#$_GETの主な使われ方

GETは、主にデータベース内のデータを要求された時にそれをURL付きで表示する為のものです。
入力できる文字数に限りがあります。（URLに何千文字とか出たら嫌でしょう。）
・検索結果のページを表示する(YouTubeやGoogleの検索結果など)
・商品紹介ページへ飛ばす(楽天やアマゾンで商品リンクの先のページ)

第三者に共有されても良い手の情報はコチラを用いる。

#$_POSTの主な使われ方

主にデータを送信する為のもの。そしてそのデータへ第三者に公表(介入)されてはならないもの。
・ログインページ
・記事編集・投稿ページ
・コメントの投稿
・画像の送信・編集・削除
・お問い合わせページ

個人用な情報の送信ではこちらを用いる。

#$_REQUESTという変数

これは、$_GETと$_POSTと($_COOKIE)がひとまとめになった関数。
セキュリティ上の観点から使用がオススメできない関数。
[WIP] jQueryを用いた非同期通信の説明（備忘録）

今回プログラミングスクールで非同期通信の実装を体験しました。
備忘録にまとめようと思いますが、まだわからないことだらけなので、わかり次第追記して
綺麗な形にまとめたいと思います。
取り敢えずはメモ



Form_for => message.js => message_controller.rb (createアクション)

Form_for: 通常営業
Message.js: submitのクリック（イベント）によって発火
→HTMLで飛ばそうとするのを止める。
→発火成功時のデータ形式、HTTPメソッド等定義
→_message.html.hamlと全く同じ記述をして、div等要素の間、間にForm
　から取り出したデータが入るように記述
※これは部分更新なので、この記述が非同期通信の結果として出るという
　認識が必要。今回はhtmlのをまず作成し、そこで定義したclassに合わせて
scss等も定義しているのでhtmlと同じでないと崩れる。
※imgに関しては、

```sample.html
<div>こんにちは</div>
ではなく、
<img class="", src="">
```

みたいに中にデータを入れ込むので、img定義の時点で<>の中に全て入った完成形を定義しておく。

```message.js
$(function(){
  function buildHTML(message){
    var content = message.content ?  `${ message.content }` : '';
    var img = message.image ? `<img class = "lower-message__image" src= ${message.image}>` : "";  
```
（↑みたいな感じ）
また

```sample.js
<img class...>
               ではなく
<class=... img>
```

のように記述するとエラーが起きる。これは要素名（div, img等）が最初に来ていないことでシステムが何の種類のコードなのか認識できないために起きる。

・turbolinks: rails4以降よりデータ通信速度の向上を目的として最初はjquery
　が読み込まれない設定がdefultで存在する。これによりSENDボタンを押す
　と１回目はhtmlとしてデータが飛び、２回目でjsonとしてデータが飛ぶ、
　つまり不完全な非同期通信が出来上がる。jsonで送られなければ
　非同期通信は成立しないからだ。そこでmessage.js全体を
　$(document).on('turbolinks:load', function() { })で囲む。すると設定は
　働かず、１回目も２回目もjsonでデータが飛んでくる状態が成立する。
Windowsで香り屋版パッチを当てた最新版Vimをビルドする

# 動機

これまで、香り屋さん提供の Vim / GVim バイナリを利用して Windows 上で快適な Vimライフを送ってきました。プログラミングをたしなむ者として、自分の使うソフトをソースからビルドしてみたいと思い、やってみることにしました。


# 本記事の要約
- Windows 10 上に ビルド環境を整える。
- GVim の最新版に、香り屋版パッチを当てる。
- ビルドする。
- DLL を用意する。 (まだできていません)
- ファイルを配置する。 (まだできていません)

## 前提
- Windows 10 がインストールされている。
	- Windows 7 SP1 以降なら同様の手順で可能であると思われます。
- インターネット環境がある。
	- Git を使ってソースコードを取得したりします。

# 手順


## Windows 10 上に ビルド環境を整える

まず、ビルド環境を整えます。私の環境はWindows 10 Pro ですが、Windows 10 Home や、Windows 8/8.1、Windows 7 でも同様に構築できると思われます。

1. Visual Studio Community 2019 のダウンロード・インストール
1. Git for Windows のダウンロード・インストール
1. Vim 最新版ソースコードのダウンロード
1. 香り屋版パッチのダウンロード

### Visual Studio Community 2019 のダウンロード・インストール

[Visual Studio Community 2019 リリース ノート](https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/release-notes) のページから、Visual Studio Community 2019 のインストーラをダウンロードし、実行します。
「ワークロード」タブで、「C++ によるデスクトップ開発」にチェックを入れると、必要なファイル一式がインストールされます。

### Git for Windows のダウンロード・インストール

Git のウェブサイト (https://git-scm.com/) から、Git for Windowsをダウンロードし、インストールします。

### Vim 最新版ソースコードのダウンロード

Git Bash を起動します。Vim のソースコードを置くディレクトリに移動し、以下のコマンドを実行します。

~~~
$ git clone https://github.com/vim/vim.git
~~~

### 香り屋版パッチのダウンロード

続けて次のコマンドを実行し、香り屋版パッチをダウンロードします。

~~~
$ git clone https://github.com/koron/vim-kaoriya-patches.git
~~~

## Vim の最新版に、香り屋版パッチを当てる

### guilt (Git で動くパッチ管理ツール) が Git Bash で動かない(´・ω・`)

guilt を利用すると、パッチ内容が変わっても同様の手順で処理できるのですが、残念ながら、Git for Windows の Bash では "unsupported" と言われて処理ができません。ならば、手動で……とまでは行きませんが、半自動での処理を目指します。

### Vim のブランチを切る

master ブランチでそのまま直接作業しても構いませんが、ソースコードに変更を加える作業ですので、ブランチを切っておいたほうがいいでしょう。

~~~
$ git checkout -b with-patch
~~~

### パッチファイルを微修正

2520-migemo_feature.diff が、2019/06/14 現在の最新版では、そのままパッチが通らないため、微修正します。
最終行と、その1行前のコメントブロックを、1行コメントのスタイルに変更します。


### git apply を実行

guilt が Git Bash でも使えるようになったら、この手順は変わります。
python2-warn.diff はエラーが出て通りませんので、リネームするなどして、適用除外としておきます。 (ガッツリ修正するのが面倒で、実行に影響が出ないっぽいので……)


~~~
$ git apply ../vim-kaoriya-patches/master/*.diff
~~~

### ex_cmdidxs.h を更新

私もまだ勉強中なのですが、新しい Ex コマンドを追加すると、表題のヘッダファイルを更新する必要があるみたいです。そのための Vim script が用意されています。

……えーと、Vim を作るのに Vim が必要……？どういうことなのか、詳しい方、ご教示ください。でも必要だというのなら、 Git Bash 付属の Vim を使うことにします。

~~~
$ vim -u NONE -i NONE -X -S create_cmdidxs.vim
~~~

## ビルド

vim-jp のサイトの説明 (https://vim-jp.org/docs/build_windows_msvc.html) を参考に、プログラムのコンパイル (ビルド) を行います。

## DLL を用意する

いろいろ調べていて、ここが一番難しいということに気付きました。 migemo.dll は、バイナリが提供されていますので、ダウンロードしてくれば大丈夫なのですが、残る 3つは基本的にソースコードによる提供となっていました。どうすれば、ソースコードをコンパイルして、DLL を用意できるか、勉強してきます。

- iconv.dll
- winpty.dll
- intl.dll
- migemo.dll

現時点では、Vim の香り屋版バイナリをダウンロードして、それに添付されている DLL を用いるのが一番早いかもしれません。

## ファイルを配置する

# 感想
自分でビルドするって、とても大変です……Vimの開発に参加されている皆様、Windows向けバイナリを用意してくださるKoRoN様、ありがとうございます。プロジェクトに貢献できるように、腕を磨きます。
werckerでビルド完了後にSlackに通知する

よく wantedly のものを使った記事が検索にかかるが、 wercker 謹製のものが使える。

```yaml
build:
  steps:
    (略)
  after-steps:
    - slack-notifier:
        url: $SLACK_URL
        channel: deploy
        username: werckerbot
        notify_on: "failed"
```

`notify_on: "failed"` は失敗した時だけ通知したい場合に付ける。
`$SLACK_URL` は wercker の環境変数で Slack の webhook url を指定する。
その他は見たまんま。

## 失敗時
<img width="386" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9104/dec45db3-d2f7-58f1-9f18-451113fc8147.png">

## 成功時
<img width="386" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9104/fc7fdf2f-2610-bd8c-e8cd-254b653767b2.png">


## 参考

- [Slack :: Wercker Documentation](https://devcenter.wercker.com/integrations/notification-systems/slack/)
Servlet Sessionについて

#Session
- セッションはクライアントごとに作成される。
- HttpServletRequestインターフェースで用意されているgetSessionメソッドを用いて生成する。
- getSessionメソッドは、すでにセッションが開始されていればそのセッションを返す。
    - 引数がtrue：セッションが開始されてない場合、新しいセッションを返す。
    - 引数がfalse：セッションが開始されてないばあ、nullを返す。
  
#サンプル
```java:session.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException{

  HttpSession session = request.getSession(true);
  session.setAttribute("hoge", "1");
}
```
Vueで5段階評価をするためのパッケージvue-star-ratingが便利な件

## Vueで5段階評価をするためのパッケージvue-star-ratingが便利な件
レポジトリ がこちらです。README.mdも丁寧に書かれています。
https://github.com/craigh411/vue-star-rating

read-onlyモードなど、様々なプロパティーが用意されているのも魅力です。
Vueで５段階評価を実装する場合はぜひ活用してみてはいかがでしょうか。

公式デモとしてjsfiddleが用意されています。
https://jsfiddle.net/craig_h_411/992o7cq5/

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
RubyMine 設定の エクスポート/インポート 方法 (IntelliJ共通)

# RubyMine 設定の エクスポート/インポート 方法

※インストールしているPluginについてはまだexport/import自動化ができないようです

やりかたは2つ 

- zip に書き出してそれをインポートする
- github に登録し勝手に sync させる

エクスポートしておくことのメリットとして、
キーマップやインデントなど同じ設定をチーム内、会社内で統一しておくことで
モブプロの際などに捗る。

なにか合った際のバックアップとして残しておける。

おすすめとしてはgithub連携です。

どちらでも同じ設定を持つことができるのでチームで同じエディタ使ってるならぜひ

## How To (githubに登録し勝手にsyncさせる)

RubyMineでプロジェクトを開いた状態の説明です。

ファイル > 設定リポジトリ (英語なら Settings Repository ) 

事前に登録してあるGithubのリポジトリURLを入れて `リモートの上書き(英語なら Overwrite Remote)` 

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177207/c16250ea-c40f-0584-aadf-f41618dccd26.png)


そうするとTokenを入れるような画面が現れるので [Creating a personal access token for the command line](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line) を参考に
Tokenを発行してペーストしてください。

以上です。

インポートする際はローカルの上書き(英語なら Overwrite Local )でいけます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177207/064785b4-aed3-1ed6-9410-44343d6597c2.png)



後出しですが、環境設定から設定リポジトリ( Settings Repository ) を開いて
`コミットメッセージにホスト名を含める` のチェックを外せばコミットにホスト名は入らなくなるので
こちらから設定しておくのがオススメです。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177207/eccef43f-cdce-da55-b3fb-ee460cdde2d4.png)

 
## How To (zip に書き出してそれをインポートする)

RubyMineでプロジェクトを開いた状態の説明です。
これは上記のSyncをしてしまうと選択できません。

ファイル > エクスポート設定 (英語なら Export Settings)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177207/c072ec5e-d1e8-a9de-17eb-a54f3b5bbaff.png)


ここで Export したい内容を選択して OK をすると指定したパスにzipで出力されます。

インポートする際は

ファイル > インポート設定 (英語なら Import Settings)で先ほどのzipファイルを選択するだけです。

## Pluginの エクスポート/エクスポート について

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177207/f26bdcda-2100-c1df-d97c-6e86759083aa.png)



この画面を見せてもらってインストールして貰えばよいです。

設定についてはすべてを含んでいるはずなので必要なものを入れれば勝手に設定が反映されるはず。
GitHubのリポジトリの始め方

＊＊＊　備忘録です。間違い等があればご指摘ください。　＊＊＊

### 前提
- GitHubの[Sign up（ユーザー登録）](https://github.com)は終了している。
- [SSH公開鍵の作成とGitHubへの登録](https://qiita.com/tomot3/items/6557a6560c80996e5dfe)は終了している。

### ローカルホストにリポジトリ用のファイルが「まだない」場合
1. [https://github.com/](https://github.com/)にSign inする。
2. 右上の「+」から「New repository」を選択する。
3. 「Repository name」にリポジトリ名を入力する。
4. リポジトリを公開する場合は「Public」、公開しない場合は「Private」をチェックする。
5. 「Initialize this repository with a README」をチェックする。
6. 「Create repository」をクリックする。
7. リモートリポジトリをローカルホストにコピーする。

    ```
$ cd ~/GitHub  <-- 各自のGitHubのリポジトリを保存しておくディレクトリ
$ git clone https://github.com/ユーザー名/リポジトリ名.git
```

8. ローカルホストでファイルの修正や追加を行ったら、リモートリポジトリを更新する。

    ```
$ git add ファイル名
$ git commit -m "コメント"
$ git push
```

### ローカルホストにリポジトリ用のファイルが「既にある」場合
1. [https://github.com/](https://github.com/)にSign inする。
2. 右上の「+」から「New repository」を選択する。
3. 「Repository name」にリポジトリ名を入力する。
4. リポジトリを公開する場合は「Public」、公開しない場合は「Private」をチェックする。
5. 「Initialize this repository with a README」をチェックしない。
6. 「Add .gitignore: None」および「Add a license: None」選択する。
7. 「Create repository」をクリックする。
8. ローカルホストのリポジトリを初期化する。

    ```
$ cd ~/GitHub  <-- 各自のGitHubのリポジトリを保存しておくディレクトリ
$ make リポジトリ名
$ cd リポジトリ名
$ git init
```

9. ローカルホストでREADME.mdファイルを作成し、リモートリポジトリを更新する。

    ```
$ echo "# リポジトリ名" >> README.md
$ git add README.md
$ git commit -m "first commit"
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
$ git push -u origin master
```

0. ローカルホストでファイルの修正や追加を行ったら、リモートリポジトリを更新する。

    ```
$ git add ファイル名
$ git commit -m "コメント"
$ git push
```
APIKitとCombineを使う

　初投稿です。APIKit の `Session` に Combine の `Publisher` を生やそうと思います（`Session` に `Publisher` が生えていると、楽しいので）。

```swift
extension Session {
    struct Send<R>: Publisher where R: Request {
        typealias Output = R.Response
        typealias Failure = SessionTaskError

        let request: R

        func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
            let task = Session.send(request) { result in
                switch result {
                case let .success(response):
                    _ = subscriber.receive(response)
                    subscriber.receive(completion: .finished)

                case let .failure(error):
                    subscriber.receive(completion: .failure(error))
                }
            }

            let subscription = Cancel(task: task)
            subscriber.receive(subscription: subscription)
        }
    }

    struct Cancel: Subscription {
        let combineIdentifier = CombineIdentifier()
        let task: SessionTask?

        func request(_: Subscribers.Demand) {}

        func cancel() {
            task?.cancel()
        }
    }
}
```

リクエストをつくります。

```swift
class GitHubAPI {
    struct SearchRepositories: Request {
        struct Response: Codable {
            struct Item: Codable {
                let fullName: String
            }

            let items: [Item]
        }

        let baseURL = URL(string: "https://api.github.com")!

        let method = HTTPMethod.get

        let path = "/search/repositories"

        var queryParameters: [String: Any]? {
            ["q": query]
        }

        let query: String

        func response(from object: Any, urlResponse _: HTTPURLResponse) throws -> Response {
            guard let data = object as? Data else {
                throw ResponseError.unexpectedObject(object)
            }

            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            return try decoder.decode(Response.self, from: data)
        }
    }
}

// Codable のために APIKit のパースを止める

class PassthroughParser: DataParser {
    let contentType: String? = nil

    func parse(data: Data) throws -> Any {
        return data
    }
}

extension Request {
    var dataParser: DataParser {
        PassthroughParser()
    }
}
```

リクエストを送ります。

```swift
Session.Send(request: GitHubAPI.SearchRepositories(query: "SwiftUI"))
    .map { $0.items }
    .flatMap { Publishers.Sequence(sequence: $0) }
    .sink { print($0.fullName) }
```

すべてが `Publisher` になる。

- [ishkawa/APIKit - GitHub](https://github.com/ishkawa/APIKit/)
- [Combine - Apple Developer Documentation](https://developer.apple.com/documentation/combine/)
- [Search - GitHub Developer Guide](https://developer.github.com/v3/search/)
【コピペで動く】ドラッグアンドドロップで画像を移動し、クリックで画像を回転させる【jQuery】

#はじめに
マウス操作(ドラッグアンドドロップ、クリック)でDOM(HTMLの要素)を移動、回転させるためのコード
サンプルコードでは``imgタグ``を使っているが、``divタグ``でも``pタグ``でも動きます。
動かしたい要素のstyleが``position: absolute;``ではないと動きません。


#デモ
![a6d1706884f1e5cd706f72fc0443db52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/cdd134f5-82ae-ad50-cba9-29516d8726a6.gif)


#サンプルコード
```html:index.html
<!DOCTYPE html>
<html lang="ja" dir="ltr">

<head>
	<meta charset="utf-8">
	<title>DOMを回転</title>
</head>
<body>
	<style media="screen">
		.rotation {
			transform: rotate(0deg);
			position: absolute;
			top: 100px;
			left: 250px;
		}
	</style>
	<img class="rotation" src="https://2.bp.blogspot.com/-54PaAjuNmgE/WwUdT-7717I/AAAAAAABMVc/zzgxyc9F7A8ZfAruS9tWcEUg8QJ3RcFEACLcBGAs/s800/vr_motion_tracking_6dof.png" id="illust" alt="">

  <!-- jqueryとドラッグアンドドロップで移動できるライブラリをインポート -->
  <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  <script src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>

	<script>
		//ドラッグアンドドロップで移動させたい要素をセレクタで指定
		$("#illust").draggable();

		//id回転させたい要素セレクタで指定
		//今回は id="illust" が入っている画像を回転させたいので #illust
    //クリックされるたびに呼び出される
		$('#illust').click(function() {
			console.log('クリックされました！');
			let now_angle = getRotationDegrees($(this));
      //10度ずつ回転させる
			let next_angle = now_angle + 10
			$(this).css('transform', 'rotate(' + next_angle + 'deg)');
		});

		//参考にしたサイト　https://codeday.me/jp/qa/20181219/78103.html
		//要素を指定して、transformのrotateを求める
		function getRotationDegrees(obj) {
			var matrix = obj.css("-webkit-transform") ||
				obj.css("-moz-transform") ||
				obj.css("-ms-transform") ||
				obj.css("-o-transform") ||
				obj.css("transform");
			if (matrix !== 'none') {
				var values = matrix.split('(')[1].split(')')[0].split(',');
				var a = values[0];
				var b = values[1];
				var angle = Math.round(Math.atan2(b, a) * (180 / Math.PI));
			} else {
				var angle = 0;
			}
			return (angle < 0) ? angle + 360 : angle;
		}
	</script>
</body>

</html>

```
python3.7でHTMLからタグをstripする

# 結論
BeautifulSoupの `.get_text()` を使う。

## サンプルプルコード

```python
import requests
from bs4 import BeautifulSoup

target_url = 'https://example.com'
r = requests.get(target_url)

soup = BeautifulSoup(r.text, 'html5lib')

result = soup.find("h1").get_text()

print(result)
```

# メモ
HTMLからタグを削除しようとして検索したがなかなかピンポイントな情報が得られなかったのでメモ。

タグの除却については↓のような古いやり方が結構ひっかかる。

```python
from html.parser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
```

```bash
class MLStripper(HTMLParser):

    def __init__(self):
        self.reset()
        # stripしたテキストを保存するバッファー
        self.fed = []

    def handle_data(self, d):
        # 任意のタグの中身のみを追加していく
        self.fed.append(d)

    def get_data(self):
        # バッファーを連結して返す
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
```
Long tail business is outdated? But it will change your business.

 The word 'Long Tail Business' became well known with the emergence of Amazon in 2006. Because the theory completely renewed how we can do business with IT.
I remember that I was shocked by the possibility of long tail business. However, recently I feel that the market is forgetting the best practice, whereas IT industry focuses on 'High Scalability'. But these two must be considered at the same time, well in my opinion.
So I am here to discuss with you again.



# What is long tail business?
So Anderson  wrote the book [The Long Tail: Why the Future of Business is Selling Less of More](https://www.amazon.co.jp/Long-Tail-Future-Business-Selling/dp/1401302378).
He is explaining that the long tail concept considers less popular goods that are in lower demand. Plus these goods could actually increase in profitability because consumers are navigating away from mainstream markets. This theory is supported by the growing number of online marketplaces that alleviate the competition for shelf space and allow an unmeasurable number of products to be sold, specifically through the internet.

Before amazon came into the market, we often bought books at stores near our houses. So the total revenue can be A in the diagram, then if we want to buy technical books which are not in the stores nearby, we walk somewhere far. However the sum of the demand of those who buy something less popular such as technical books, the B area in the diagram, will be bigger than the one of the market A.

<img width="770" alt="longtail.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296091/9dba8ed9-1a94-e0ca-f364-d7f041c4a599.png">


# Do we need to focus on the most popular market?
It depends. But when we design business with IT, I highly recommend long tail business.

# What should be considered in terms of system
As you can see in the diagram, if the tail is long enough, the revenue of B will be bigger than one of A.
So a lot of end user will use your system. According to the article [How Uber Manages A Million Writes Per Second Using Mesos And Cassandra Across Multiple Datacenters](http://highscalability.com/blog/2016/9/28/how-uber-manages-a-million-writes-per-second-using-mesos-and.html), uber's system have at least 1 billion request per second. Well how big is it?
If you think of internet banking system, the maximum transaction is normally less than 500 transactions per second. You can see how big number the uber's transaction is.

So 'High Scalability' means that system can manage tons of transactions in response to the requests.



# How we can realize high scalable system?
The answer is '[Kubernetes](https://kubernetes.io/)'.
It simply enable your system mange growth of your business and system transactions.

<img width="483" alt="Kuberntes.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296091/48c55e26-bf5c-4667-dd88-38b9a98ec3a2.png">


Thank you for reading my broken english! Appreciate!
Ruby caseの使い方

Rubyの `case` は `if` の条件式が２者択一ではなく複数の選択肢から選択する道を選ぶ。

それに伴って `when` を使用して条件を作る。

```rb
order = "チャーハン"
case order
when "チャーハン"
  puts "750円です"
when "ラーメン"
　puts "600円です"
end
```

このように複数の条件でも選択肢を作ることができるのが `case` である。
AWS APIをコールするコード(Java)のテストコード(Junit & mockit)を書いてみた

# きっかけ
AWSのCloudFormationのスタックステータスをチェックするプログラムを組んでいた。
返却されるステータス毎に処理が異なる為、全てのステータスをテストする必要がある。

# 課題
AWSのCloudFormationのスタックのステータスはこちらでコントロールできない。

# どーやってテストするの？
Junitでテストコードを書いて、
その中でAPIが返却するステータスを指定(モック化)することにしました。

# テストしたい部分
下記がテスト対象のコード部分

```describeStacks.java
/*CloudFormationのAPI実行用のクライアント作成*/
AmazonCloudFormationAsync CFclient = AmazonCloudFormationAsyncClientBuilder.standard()
		.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("hope", "huga")))
		.build();

/* DescribeStacksする対象のスタック名を指定 */
DescribeStacksRequest describeStacksRequest = new DescribeStacksRequest();
describeStacksRequest.withStackName("hogestack");

/* ここでスタックの状態取得するAPI(describeStacks)を実行（モック化したい場所） */
DescribeStacksResult describeStacksResult = CFclient.describeStacks(describeStacksRequest);
```

# モック化
```describeStacksTest.java
@RunWith(MockitoJUnitRunner.class)
public class describeStacksTest {

    /* モック化するクラスを宣言 */
    @Mock AmazonCloudFormationAsync AmazonCloudFormationMock;
    /* モック化するクラスを注入する先のクラスを指定 */
    @InjectMocks describeStacksClass describeStacks = new describeStacksClass();

	@Before
	public void init() {
        /* モックの初期化 */
        MockitoAnnotations.initMocks(this);
	}
	@Test
	public void スタックステータスの制御() {
        /* describeStacks実行時の返り値のクラスを作成 */
		DescribeStacksResult describeStacksResult = new DescribeStacksResult();
		Stack stacks = new Stack();
		stacks.setStackStatus(StackStatus.CREATE_COMPLETE); //StackStatusを設定(今回はCREATE_COMPLETEのステータスを指定)
		describeStacksResult.withStacks(stacks);

        /* テスト対象が実行する引数と同じ引数のクラスを作成 */
		DescribeStacksRequest describeStacksRequest = new DescribeStacksRequest();
		describeStacksRequest.withStackName("hogestack");

        /* モック化されたクラスのdescribeStacks実行時の引数と返り値を指定 */
		when(AmazonCloudFormationMock.describeStacks(DescribeStacksRequest)).thenReturn(describeStacksResult);
```


# 所感
AmazonCloudFormationAsyncのクラスがpublicだった為、あっさりとモック化してくれました。
APIとして提供されているクラスである為、publicなのでモック化も容易でした。
Resule系のクラスにもちゃんとセッターが容易してあるのはさすが(AWSはモック化、スタブ化される事を予想していた？)
他のAPIも同様の方法でテストできるかと思います。
Nagios カスタムプラグインの作り方

株式会社オズビジョンのユッコ (@teera_yucco) です。
社内では監視ツールとして Nagios を利用しており、季節性イベントの監視などもこの仕組みを使っているのですが、社内メンバが

>NRPE: Unable to read output

に苦しんでいたので、備忘録として作り方メモをあげました。
何番煎じかわかりませんがご笑納ください。


# カスタムプラグインの必須ルールは 2 つだけ
## 戻り値

Nagios Core 上で表示したい状況に合わせて以下の値をリターンします。Bash ならこの値で `exit` すればよし。

状況|値
:--|:--
OK|0
WARNING|1
CRITICAL|2
UNKNOWN|3 (厳密には 0-2 以外なら OK)

## 標準出力

いわゆる Uncaught Exception 的な場合は仕方ないですが、自分でハンドリングして終わらせるときには 1 行 **以上** の標準出力が必要です。

## 簡易サンプル

引数チェックは超絶簡易的で、コマンドの引数の最初に `-w <warning> -c <critical>` と指定することを想定しています。
例えばファイルサイズをチェックする場合。
肥大化してはいけないファイルが対象だとします。

```bash:check_file_size
#!/bin/bash -u

if [ $# -lt 4 ]; then
  echo "UNKNOWN MESSAGE"
  exit 3
fi

critical_threshold=${4}
warning_threshold=${2}

# START
# 閾値の値と何かの結果(数値)を比較するものであれば、この間を変更すればいい
size=$( wc -c < /path/to/file )
# END

if [ "${size}" -ge ${critical_threshold} ]; then
  echo "CRITICAL MESSAGE"
  exit 2
elif [ "${size}" -ge ${warning_threshold} ]; then
  echo "WARNING MESSAGE"
  exit 1
fi

echo "OK MESSAGE"
exit 0
```

### 改善するなら

- カスタムプラグインをたくさん作るのであれば、0-3 の終了値は共通定義するべき
- 引数の順番が固定化されているので `getopt` 的なことをした方がいいのかも
- 引数の数値チェックとかもない

# Conclusion

アプリの個別監視を Nagios でやるべきかという話もあるのですが、とりあえず上記のテンプレを使えば最低限の監視はすぐにできるかと思い、メモをまとめました。
windows環境でmiddleman実行時に詰まったことメモ＋解決策

###最初に注意
※ごり押しでの解決策です。あまり推奨できる方法ではありません。どうしても動かさねばならない時に参考にしてください。
##やろうとしたこと
middlemanを使って静的サイトを作ろうとした。
が、エラー吐く。middlemanが動かねぇ。困った。
##最初にやってたこと
```
$gem install middleman
$middleman init プロジェクト名
$cd プロジェクト名
```
コマンドプロプトに以上を打ち込む。ここまでは[middleman公式](https://middlemanapp.com/jp/)と同じ。
##そしてエラーが起こる
```
$middleman

Could not find gem 'middleman-autoprefixer (~> 2.7) x64-mingw32' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

```
$bundle install

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for x64-mingw32 but the dependency is only for x86-mswin32, x86-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mswin32 x86-mingw32 java`.
The dependency wdm (~> 0.1) will be unused by any of the platforms Bundler is installing for. Bundler is installing for x64-mingw32 but the dependency is only for x86-mswin32, x86-mingw32. To add those platforms to the bundle, run `bundle lock --add-platform x86-mswin32 x86-mingw32`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Unable to find a spec satisfying tzinfo-data (>= 0) in the set. Perhaps the
lockfile is corrupted?
```
##うるせー！知らねー！（解決編）
プロジェクトファイルに、Gemfileってのがあると思います。それをエディタで開いて以下のように修正します。

```Gemfile.rb
source 'https://rubygems.org'

gem 'middleman', '~> 4.2'
gem 'middleman-autoprefixer'#, '~> 2.7'
#gem 'tzinfo-data', platforms: [:mswin, :mingw, :jruby]
gem 'wdm'#, '~> 0.1', platforms: [:mswin, :mingw]

```
御覧の通り、バージョン指定部分を消しただけの3分クッキング。

##結果どうなったか
```
$middleman

== The Middleman is loading
(以下略)
```
うまくいった！やったぜ


##参考にしたサイト
https://middlemanapp.com/jp/
MYSQLの裏技集

データベースって自分で触れるようになるとめちゃめちゃ便利ですよね。
最近では、自分一日のスケジュールをわざわざMYSQLで書き込んで、
TODO管理なんかも。すごい非効率を楽しんでます（笑）

最初はSQLに慣れるのが目的だったけど、
データベースってシステムの真髄みたいな気がして楽しいですね。

けど、あれってどうやるんだっけとチョチョイ忘れることが多いので、
このページにSQL文をメモ書きとして記録していこうと思います。

裏技でもなんでもありませんので、悪しからず。(＞人＜;)


# DELETE
DELETEをするときは、慎重にしないといけない。
そもそもデータを削除するという行為自体が宜しくないので、
基本的にフラッグ項目をつけて、
非表示・停止するようなデータにするべきだろう。
消してしまったら、2度と元に戻せない。。。。

```sql
# 行を削除する('m'から始まる行を削除する)
DELETE FROM `table_name` WHERE `column_name` LINK 'm%';
```
# REPLACE INTO
開発途中でデータを2度INSERTしてしまたり、
UPDATEしようにもデータがまだなかったりする。
そんなときに便利なのが、REPLACE INTO 文だ。

```sql
# INSERTとUPDATEを同時にやる
REPLACE INTO `table_name` ( `id`, `column_name`) VALUES ( 10, 'New Name');
```

# データを一括置換する
```sql
UPDATE `table_name` SET `column_name` = REPLACE(`column_name`, '検索したい文字列', '置換したい文字列');
```

# テーブルを丸ごとコピーする
データを操作するときは、操作するテーブルのコピーを作っておくことが懸命でしょう。
うっかり必要なデータを書き換えてしまったら、大変です。

```sql
# 構造が同じテーブルを作成する
CREATE TABEL copy_table_name LIKE table_name;

# データを丸ごとインサートする
INSERT INTO copy_table_name SELECT * FROM table_name;

# データを選別してインサートする(`column_name`が'm'から始まるものを抜き出す)
INSERT INTO copy_table_name SELECT * FROM table_name where `column_name` LIKE 'm%';
```
xamarin.iOSでfirebaseを使おうとしたら、GoogleService-Info.plistが読めなくてつまずいた

XAMARINでアプリを作る勉強をコツコツと進めて、先日ようやくリリースさせることができた。
iOSアプリの計測のためにはfirebaseを組み込む必要があるとのことなので、早速試したところ、
思わぬところでつまずいた。

firebaseの組み込みは以下の記事を参考にした。
[Xamarin.FormsにFirebase Analytics 実装（iOS）](https://qiita.com/HisakoIsaka/items/9a527a5842722731c101)

GoogleService-Info.plistの作成、ダウンロード、ソリューションへのインポートはすんなりできた。
が、ここで問題が！

GoogleService-Info.plistをクリックしても、以下のようなエラーが出て中身が表示されない。
<img width="622" alt="スクリーンショット 2019-06-14 21.45.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435524/22fae8c7-feca-d401-b396-151fa1fc5f89.png">

色々調べてみたが、日本語の有効な情報はなく、
「xamarin GoogleService-Info.plist can't open」でGoogle検索して
xamarinフォーラムのページに同じ症状についてのスレッドが掲載されていた。
[Xamarin forms IOS part - FCM can't open GoogleService-Info.plist](https://forums.xamarin.com/discussion/107318/xamarin-forms-ios-part-fcm-cant-open-googleservice-info-plist)

対処方法は、
> 1 - open "GoogleService-Info.plist" and change any \<true>\</true> or \<false>\</false> to \<true /> and \<false />
> 2 - reopen the xamarin solution
> 3 - it should work now

1 - 「GoogleService-Info.plist」を開き、\<true> \</true>または\<false> \</false>を\<true />および\<false />に変更します。 
2 - ソリューションを開き直る
3 - 内容が表示される

これで表示された。
日本語の情報がほとんどなくて調べるのに苦労したので同じ問題に遭遇した人のために記載しておく。
xamarin、良いんだけどこういう細かいつまずきに対しての日本語の情報が少なすぎて度々詰まってしまう。

地道に調べながら進めるしかないかなあと思う今日この頃です。
phperのための"A Tour of Go" 【Fibonacci closure編】

# 【概要】

この記事では [A Tour of Go](https://go-tour-jp.appspot.com/list) のExercise: [Fibonacci closure](https://go-tour-jp.appspot.com/moretypes/26) の解答例をgolangおよびPHPで提示します。phperの方はこの解答例を参考にしてGopherちゃんと触れ合っていただけると幸いです。

今回取り扱うExerciseの内容は下記の通りです

> 関数を用いた面白い例を見てみましょう。
> 
> fibonacci (フィボナッチ)関数を実装しましょう。この関数は、連続するフィボナッチ数(0, 1, 1, 2, 3, 5, ...)を返す関数(クロージャ)を返します。

# 【golangでの解答例】

## - コード
```go
package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a := 0
    b := 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
```
## - 実行結果
```
1
1
2
3
5
8
13
21
34
55
```
# 【PHPでの解答例】
## - コード
```php
<?php
$fibonacci = function ()
{
    return function() {
        static $a = 0;
        static $b = 1;
        $tmp = $b;
        $b = $a + $b;
        $a = $tmp;
        return $a;
    };
};
$func = $fibonacci();
for ($i = 0; $i < 10; $i++) {
    echo $func() . "\n";
}
```
## - 実行結果
```
1
1
2
3
5
8
13
21
34
55
```

ちなみに２回目以降もちゃんと動きます

```php
<?php
$fibonacci = function ()
{
    return function() {
        static $a = 0;
        static $b = 1;
        $tmp = $b;
        $b = $a + $b;
        $a = $tmp;
        return $a;
    };
};
echo "--- func result ---\n";
$func = $fibonacci();
for ($i = 0; $i < 10; $i++) {
    echo $func() . "\n";
}
echo "--- func2 result ---\n";
$func2 = $fibonacci();
for ($i = 0; $i < 10; $i++) {
    echo $func2() . "\n";
}
```

```
--- func result ---
1
1
2
3
5
8
13
21
34
55
--- func2 result ---
1
1
2
3
5
8
13
21
34
55
```

# 【golangとPHPを比較して】

PHP7.2から戻り値の型を定義できるようにはなりましたが、定義できる型はクラス名/インターフェース名, self, array, callable, bool, float, int, string, iterableのみであるためクロージャーを戻り値の型として定義することができません。
一方でgolangは下記のように戻り値の型としてクロージャーを定義することができ、更にはクロージャーの戻り値の型まで定義することができます。

> func fibonacci() func() int {

PHPにも導入されませんかね？？？
素人が2019年GWに読んだ技術書5冊

#はじめに
　私は法学部の人間で、プログラミングを始めてしばらく経ったものの、Webの仕組みや通信、OSの知識がまるでなかったのでまとめてインプットしてしまいたいと考えていました。2019年のGWは１０連休で、ちょうど良い機会だったのでこれを利用しました。

　また、本の良いところには、まとまった情報が載っていること、情報の正確性がある程度保証されていることがあります。プログラミングの勉強中、エラーが出たり分からないところに出会ったりした時にはその都度ググって対処していましたが、それは応急処置的なものに過ぎず、エラーの本質や自分の理解と向き合えていないこと、その情報が本当に正しいのか保証されていないこと、という危うさがあります。それを克服するためにも、本を読んでまとめてインプットしてしまいたいという思いがありました。

　以下、読んだ本とその感想を簡単にまとめていきます。

##Webを支える技術 -HTTP、URI、HTML、そしてREST
　Webの仕組みを知れます。Railsを勉強し始めの時、GETメソッドとPOSTメソッドの違いを「データベースに変更を加えるのがPOST」とだけ覚えていました。この本を読めば、それらの違いを知り、その他のメソッドも知ることができます。また、ネットで調べ物をしているときにたまに出会う404や502といった数字が何を意味するのかを知ることができます。個人的には「リソース」という概念に触れたことが大きかったです。Webを理解しやすくなりました。

##マスタリングTCP/IP 入門編 第5版
　初めての個人開発をAWSでデプロイしようとしたとき、IPやHTTPが分からずにかなりつまずいたので読みました。通信技術は構造的なので、テキストのあっちこっちを行ったり来たりしながら読むことになり大変でしたが、基礎は身につくと思います。これを読めば、0.0.0.0/0と0.0.0.0/32の違いが分かるようになります。

##GitHub実践入門 ~Pull Requestによる開発の変革
　Gitによるコード管理はしていましたが、その仕組みは詳しく知らないまま使っていました。読んだ今では知らずに使うことと、仕組みを知って使うことの意識の差を実感しています。また、「GitHubなんて使って開発したら開発がぐちゃぐちゃになるだろ」と思っていた自分にとっては、実際の開発フローを知り、その有用性を恥ずかしい思いで知ることになりました。まだGitの詳しい仕組みを知らない方はぜひ読んでみてください。

##ドラゴンクエストXを支える技術 ── 大規模オンラインRPGの舞台裏
　ドラゴンクエストが好きなこと、チームでの開発がどんなものなのか全体感を見たかったことから読みました。ところどころ分からないところもありましたが、大規模で長期的な開発の全体感やゲーム開発に必要な仕組み、実装で苦労するポイントなどを知ることができます。これを読んだ後は、オンラインゲームにおけるどんな悪辣クレーマーでも運営に少しは優しくなれるんじゃないかと思います。

##新しいLinuxの教科書
　コマンドラインはprogateで一通りやったつもりでしたが、実際に使っていたのはlsとかcatコマンドくらいで、初めての個人開発をデプロイするときは他の方の記事を参考にしながら「sudo 〜〜〜〜」などのコマンドをコピペしていました。これを読めばそれらがどういう意味をもったコマンドだったのか知ることができますし、黒い画面をカタカタするので何よりエンジニアっぽくなれます。本の内容は、実際にコマンドを打ち込みながら進める形式なので理解しやすく身につきやすいと思います。
　また、本書はシェルスクリプト（自分でコマンドが作れる！）についても書かれており、これを自分で書いてきちんと動作させることができれば、「コンピュータが俺を動かしてるんじゃない、俺がコンピュータを動かしてるんだ！」というルネサンスが起こります。

#読み終わって変わったこと
　読んでから１ヶ月くらい経ちました。まだ知らない分野の知識はあるものの、他の技術書を読んでいて分からない単語や知識が少なくなりました。これによって技術書を読み進める際の理解が楽になり、途中で詰まることも少なくなるので読むスピードも以前より速くなりました。
　私のように文系出身でプログラミング始めたばかりの人はまとめて技術書を読んでしまうのもアリかもしれません。

#今後読みたい本
　上記の本を読む中でセキュリティへの関心が高まったのでそれ関連の本も読んでいきたいです。また、コンピューターを基礎付けるハードウェアの仕組みやコンピューターサイエンスの分野にも興味が湧きました。技術書は結構な値段がするので財布と相談しながら読んでいきます…

#おわり
　本はいろんな世界を見せて自分の興味を広げてくれます。オススメの本や面白かった本があれば教えてもらえると嬉しいです。