OmniAICreator/Qiita-1.07M huggingface dataset:
PlatntUMLを使ってMarkdownでAPIドキュメント作成

# はじめに
PlantUMLを使うと、APIドキュメントを効率的に公開できることが分かりました。今回はPlantUMLを使って、APIドキュメントを記述する流れをメモしておきたいと思います。

# PlantUMLのインストール
brewを使うと簡単にインストールすることができますので、事前にbrewをインストールしておいてください。

```bash
$ brew install graphviz
$ brew install plantuml
```

plantumlで以下のようなチェックサムエラーが発生しました。私の環境の場合はbrew upgradeを行うことで問題が発生しなくなりました。

```bash
$ brew install plantuml
==> Downloading https://downloads.sourceforge.net/project/plantuml/1.2018.1/plantuml.1.2018.1.jar
==> Downloading from https://downloads.sourceforge.net/#!/project/plantuml/1.2018.1/plantuml.1.2018.1.jar
######################################################################## 100.0%
Error: SHA256 mismatch

$ brew upgrade
$ brew install plantuml
==> Downloading https://downloads.sourceforge.net/project/plantuml/1.2018.1/plantuml.1.2018.1.jar
==> Downloading from https://jaist.dl.sourceforge.net/project/plantuml/1.2018.1/plantuml.1.2018.1.jar
######################################################################## 100.0%
🍺  /usr/local/Cellar/plantuml/1.2018.1: 4 files, 6.9MB, built in 8 seconds
```

#Atomのplantumlプラグインのインストール
以下の3つのプラグインをインストールします。

* plantuml
* plantuml-viewer
* markdown-preview-enhanced

1. AtomのPreferenceからInstallを選択
2. plantumlを入力してパッケージ検索
3. plantumlとplantuml-viewerをインストール

![Screen Shot 2018-03-04 at 6.39.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/85182/e1eb0a6d-df92-bc4f-cabb-f0007dbdc2cd.png)

4. markdown-preview-enhancedを入力してパッケージ検索
5. markdown-preview-enhancedをインストール

markdown-preview-enhancedを利用するために、markdown-previewの設定をオフにします。

<img width="879" alt="Screen Shot 2018-03-04 at 9.40.39 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a7fb3802-2034-d38d-f506-c9b21d80c3cb.png">

# APIドキュメントの記述
APIドキュメント風に記述して見ました。以下のようにMarkdownの中にplantumlのメタデータを埋め込むことができるので、図をPNGに落とすなどの手間が省けてとても助かります。

<img width="978" alt="Screen Shot 2018-03-04 at 10.26.06 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/abe4ce58-addd-7f24-e38a-eb994d2b7405.png">
GRUB2で前回終了したOSで再起動する（Ubuntu 16.04 LTS）

Windows10 + Ubuntu 16.04 LTSをGRUB2でデュアルブートした環境で運用していますが、再起動の度にOSのチョイスをするのが面倒でした。
GRUB2では、前回終了したOSを記憶しておく機能があり、再起動時にわざわざ選ばなくても、記憶した前回のOSで起動してくれます。
以下、設定内容を示します。

#設定ファイルを更新
/etc/default/grubを編集します。

```
$ sudo vi /etc/default/grub
```

私の設定では、GRUB_DEFAULTにWindows10のブートマネージャを設定していました。
すなわち、毎回、何もしないと、Windows10が立ち上がる設定です。

```
GRUB_DEFAULT="Windows Boot Manager (on /dev/sdd1)"
```

この部分を以下のように saved に設定・編集します。
また、GRUB_SAVEDEFAULTを true にしておきます。

```
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT="true"
```

編集が終わったら上書き保存して、以下のコマンドでアップデートします。

```
sudo update-grub
```

以上で設定完了です。
次回の起動から、記憶した前回のOSで起動するようになります。
Nested Loopsとインデックス解説



##Nested Loops解説
最初に結合アルゴリズムについて解説していきます。SQLの結合アルゴリズムで中でよく使われるのが**Nested loops**です。
Nested Loopsはプログラムのforの入れ子処理と全く同じです。
↓の図を見ると、テーブル1の最初のレコード(J1)が選択されて、それをテーブル2のレコードの行と一つずつ照らし合わせています。
それがおわったら次のレコード(J2)が選択されて、以下同様の処理がされます。
**Nested Loops**ではテーブル1を**駆動表**又は**外部表**、テーブル2を**内部表**と呼んでいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224195/14222622-b4ab-3ac2-2050-137705ff66dc.png)

ここでパフォーマンスの鍵となるのは**駆動表**です。
次は**駆動表**について詳しく見ていきましょう。

##駆動表とパフォーマンス
一般的に**駆動表はレコード数が少ないテーブルを使ったほうが良い**です。
また結合する際は、**内部表の結合対象のカラムにインデックスが付いている**ことを確認します。
インデックスを付けると駆動表のレコード一行に対して内部表のレコード一行が対応していれば、ループなしでその内部表の一行を特定することができます。図で説明すると↓になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224195/62416b13-f8b2-663d-a1cf-e142b4c94426.png)


青色部分のレコードはスキップされるので、内部表は２回のループだけで済みます。

##インデックスをつけてもパフォーマンスがでないとき
詳しくはインデックスの章で解説しますが、インデックスを有効に活用するには、インデックスをつけるカラムの選択率が低くカーディナリティが高いことです。選択率とは条件で絞り込んだあとのレコード数を指し、カーディナリティとは値のばらつきつまりカーディナリティが高いとは値がよくばらついているということです。

また、例えば店舗のテーブルを考えた時、大規模店舗の商品数と小規模店舗の商品数はかなり違います。そのようなテーブルでは小規模店舗で結合する場合は高速でアクセスできるのに対して、大規模店舗で結合したときはかなり遅くなってしまうということもありえます。そのときはあえて大きな駆動表(商品テーブル)をもってきて、店舗間によって処理スピードのばらつきをなくすという方法もあります。
環境変数設定がよくわかりません

rootで作業してComposerのPATHが通らないので

[root@ssss ~]# echo $PATH | tr ":" "\n"

とすると以下のように出力されます


~/.composer/vendor/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
/root/bin
/root/.composer/vendor/bin/
/root/bin
/root/.composer/vendor/bin/
/root/.composer/vendor/bin/
/root/.composer/vendor/bin/
/root/.composer/vendor/bin/

/root/.composer/vendor/bin/が何度も出てくるのはなぜでしょうか？
Sassで&を使ってネストするなら@at-rootを書かなくてもいい

`@at-root`を使うとこのようにネストを解除できます。

```scss:input.scss
.foo {
  color: red;

  @at-root .bar {
    color: blue;
  }

}
```

```css:output.css
.foo {
  color: red;
}

.bar {
  color: blue;
}
```

しかし、&で名前を持って来たりするときには`@at-root`を書く必要はありません。

```scss:input.scss
.foo {
  color: red;

  &-bar {
    color: blue;

    &-baz {
      color: green;
    }

  }

}
```

```css:output.css
.foo {
  color: red;
}

.foo-bar {
  color: blue;
}

.foo-bar-baz {
  color: green;
}

```

これはBEM記法などでとても役に立ちます(僕はつい先日までいちいち`@at-root`を書いてしまっていました)。

ちなみに、インターポレーション(`#{}`)を使うとネストされるようです。

```scss:input.scss
.foo {
  color: red;

  #{&}-bar {
    color: blue;
  }

}
```

```css:output.css
.foo {
  color: red;
}

.foo .foo-bar {
  color: blue;
}
```
jQueryオブジェクト指定方法まとめ

## はじめに
jQueryオブジェクトを指定する時に、たまに書き方を忘れたり、あーこうゆう書き方もあったなとなることがあるので、まとめておきます。

## cssのセレクタでの指定方法

| 指定対象 |記述方法 |記述例 |
|:-----------------|:------------------|:------------------|
|id       | ``$('#指定するID')`` |  ``$('#target')``    |
|class       | ``$('.指定するクラス')`` |  ``$('.target')``     |
| タグ名             |``$('指定するタグ名')`` |  ``$('div')``     |
|複数のセレクタ | ``$('セレクタ１,セレクタ2')``|  ``$('#target, .target')``|
| 全ての要素             |  ``$('*')``|    ``$('*')``    |
| 親子関係             | ``$('parent > child')`` |  ``$('#target > div')``  |
|前後関係              |  ``$('prev + next')`` |  ``$('.target + div')``      |
|属性              |  ``$('[属性名]')``| ``$('.target[type]')``   |
| 属性値    |  ``$('[属性名="属性値"]')``|  ``$('.target[type="button"]')``|
|利用可能な要素  | ``$(':enabled')`` |  ``$('selected:enable')``      |
|利用不可状態な要素|``$(':disabled')``  |  ``$('selected:disabled')``|
|チェック済みのチェックボックス | ``$(':checked')`` |  ``$('selected:checked')``       |

## jQuery独自の擬似セレクタでの指定方法
| 指定対象 |記述方法 |記述例 |
|:-----------------|:------------------|:------------------|
|最初の要素      | ``$(':first')`` |   ``$('.target:first')``    |
|最後の要素      | ``$(':last')`` | ``$('.target:last')`` |
|偶数番目の要素      | ``$(:even')`` |  ``$(tr:even')`` |
|奇数番目の要素      | ``$(':odd')`` | ``$('tr:odd')``   |
|テキストボックス      | ``$(':text')`` |   ``$('.target:text')``    |
|ラジオボタン     | ``$(':radio')`` |  ``$('.target:radio')``    |
|チェックボックス     | ``$(':checkbox')`` |  ``$('.target:checkbox')`` |
|見えている要素      | ``$(':visible')`` | ``$('div:visible')``  |
|見えていないの要素      | ``$(':hidden')`` |  ``$('div:hidden')``  |
|子供を持つ要素      | ``$(':parent')`` | ``$('div:parent')`` |
|子供を持たない要素      | ``$(':empty')`` |``$('div:empty')``|
|アニメーション中の要素      | ``$(':animated')`` |  ``$('img:animated')``|
Scala版のEnumを調査した

JavaでEnumをよく使うがScala版はよくわからなかったのでメモ

```scala
/*
 * 指定した曜日コードからcodeとnameをタプル形式で取得する
 */
object EnumWeek extends App {
  (1 to 5).toList.foreach(a => println( Week.code(a) ) )
}
```

結果は、英語と日本語で曜日が取れた。

```scala
(monday,月曜日)
(tuesday,火曜日)
(wednesday,水曜日)
(thursday,木曜日)
(friday,金曜日)
```

Enumは以下リンクのサイト参考。

```scala
trait EnumLike {
  type Value
  def value: Value
}
trait Enum[T] extends EnumLike {
  type Value = T
}
trait EnumCompanion[A <: EnumLike] {
  def values: Seq[A]
  def valueOf(value: A#Value): Option[A] = values.find(_.value == value)
}
abstract sealed class WeekType[T](val value: Int) extends Enum[Int]{
  def code: T 
  def name: T 
}
object Week extends EnumCompanion[WeekType[String]]{
  case object MONDAY extends WeekType[String](1){
    override def code = "monday"
    override def name = "月曜日"}
  case object TUESDAY extends WeekType[String](2){
    override def code = "tuesday"
    override def name = "火曜日" }
  case object WEDNESDAY extends WeekType[String](3){
    override def code = "wednesday"
    override def name = "水曜日" }
  case object THURSDAY extends WeekType[String](4){
    override def code = "thursday"
    override def name = "木曜日" }
  case object FRIDAY extends WeekType[String](5){
    override def code = "friday"
    override def name = "金曜日" }
  lazy val values = Seq(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY)
  def code(cd:Int): (String, String) = {
    (valueOf(cd).map(_.code).getOrElse(""), valueOf(cd).map(_.name).getOrElse(""))
  }
}
```


参考：
https://gist.github.com/gakuzzzz/4ad53153e28b3a6e0aa6
nim code style まとめ

* 参考
  * [Nim Enhancement Proposal #1 - Standard Library Style Guide](https://nim-lang.org/docs/nep1.html)
* ゆるい感じで翻訳

# はじめに

Nimはいろんな書式で書くことができるけど、標準ライブラリでは決まったコードスタイルに従う方が良いです。

でもここで書いてることが全てじゃないし今後変わっていきます。
Pythonのスタイルガイドが変わっていくのと一緒で、このスタイルガイドも変わっていくかも。

ここでのルールは公式のライブラリとかで強制されるものです。

# 空白

* 1行は80文字に収めるのがいいです。そうすることでリーダが処理するチャンクを小さくすることができます。
* タブはエディタの設定で幅が変わってしまうので、ブロックのインデントは2スペース統一する。タブは使用しない。
* 下記のコードのように見た目を良くするための空白は文法上は問題ないですが、自動フォーマットされるかはエディタによってかわるのであまり好ましくないです。

```nim
# 新しい行を増やすたびに全行を修正する必要が出てくる
type
  WordBool*    = int16
  CalType*     = int
  ... # 5 lines later
  CalId*       = int
  LongLong*    = int64
  LongLongPtr* = ptr LongLong
```

# 命名

* ここで書かれている命名規則は現時点でのものです
* 以前は基本型をプリフィクス（pointerはP, valueはT, ExceptionはEなど）にしたPascalCaseに従っていたので、その命名が残っているところが多くありますが、それらは今後変更される予定です

* 型の定義はPascalCaseで記述します
* その他はcamelCaseで宣言してください
* 定数はPascalCaseを使うことがあるかもですが必須ではないです。

```nim
# 定数はキャメルケースとパスカルケースの両方が使えます
const aConstant = 42
const FooBar = 4.2

# 変数はキャメルケースで、小文字で始める必要があります
var aVariable = "Meep"

# 型定義はパスカルケースである必要があります
type
  FooBar = object
```

* c++のラッパーでは定数が全て大文字になりますが、読みづらいので好ましくありません

* よく使われる型では通常の名前を使用し、使用頻度の低いものはオブジェクトならObj, ポインタであればRefやPtrをサフィックスにつけます

```nim
type
  Handle = object # 頻繁に使われる型
    fd: int64
  HandleRef = ref Handle # あまり使われない型
```

* ExceptionにはErrorというサフィックスをつけます

```nim
type
  UnluckyError = object of Exception
```

* pureで宣言していない列挙型には型がわかるような省略形などのプリフィクスをつけます

```nim
type
  PathComponent = enum
    pcDir
    pcLinkToDir
    pcFile
    pcLinkToFile
```

* pureで宣言した場合は、パスカルケースにします

```nim
type
  PathComponent {.pure.} = enum
    Dir
    LinkToDir
    File
    LinkToFile
```

* HTTP, URL, TCPなど大文字で扱われることが多い単語も現実で使われるような単語を使用します

```nim

parseURL # Bad
parseUrl # Good

checkHTTPHeader # Bad
checkHttpHeader # Good
```

# コーディング

* プロシージャで戻り値を返す場合は、あらかじめ用意されているresult変数を使います。これにより可読性が上がります

```nim
proc repeat(text: string, x: int): string =
  result = ""
  
  for i in 0 .. x:
    result.add($i)
```

# 複数行になるステートメント

* タプルの宣言が複数行になる場合、上の行の要素とインデントを合わせます

```nim
type
  LongTupleA = tuple[wordyTupleMemberOne: int, wordyTupleMemberTwo: string,
                     wordyTupleMemberThree: float]
```

* プロシージャの宣言も同様です

```nim
type
  EventCallback = proc (timeReceived: Time, errorCode: int, event: Event,
                        output: var string)

proc lotsOfArguments(argOne: string, argTwo: int, argThree: float
                     argFour: proc(), argFive: bool): int
                    {.heyLookALongPragma.} =
```

* 呼び出し時も同様

```nim
startProcess(nimExecutable, currentDirectory, compilerArguments
             environment, processOptions)
```
homebrewでインストールして現在有効なパッケージのインストール場所を取得する


現在インストールして利用しているパッケージのインストール先を取得したい。
雑実装でいかのように確認した

```
#!/bin/sh

function brew_installed_path() {
  FORMULA=$1
  CELLAR_PATH=$(brew --cellar $FORMULA)
  INSTALL_VERSION=$(brew info --json=v1 $FORMULA | jq -r "map(.linked_keg)[0]")
  echo $CELLAR_PATH/$INSTALL_VERSION
}
```

利用例

```
$ brew_installed_path git
/usr/local/Cellar/git/2.16.2
```

### 解説

`brew --cellar $FORMULA`でインストール先はわかるが、homebrewは複数のバージョンがインストールされている。現在linkされているバージョンがわからなければならない。
`brew info --json=v1 $FORMULA`を使うとformulaに関連する情報が得られる。linked_kegにlinkしているバージョンがはいっていたので、それを利用した。
c# 基礎　その4

###コレクション###
オブジェクトの集合を表すためのクラス(List,Dictionaryなど)。C#では標準ライブラリ(System.Collections.Generic)として提供している。

***ジェネリック***
汎用的なクラスやメソッドを特定の型に対応付けするための仕組み。この性質を**型安全**、**タイプセーフ**という。

```C#
var list = new List<string>();
var d = new Dictionary<string, MyClass>(); // <キーの型, 値の型>
```

##リスト##
配列のように要素が順序付けたれたコレクション。
・List
・LinkedList
・Stack
・Queue
・ArrayList // 古く型安全ではないためListのほうが良い

**List**
配列と異なり、サイズを後から変更できる。

**LinkedList(二重リンクリスト)**
要素同士の双方向のリンクで参照する。そのためインデックスを指定して要素を読み書きすることはできないが、要素の追加・削除は高速。

**Stack**
スタックは、後入れ先出し(LIFO : Last In First Out)、または先入れ後出し(FILO : Fisrt In Last Out)と呼ばれる構造。Undo機能などで用いられる。

**Queue**
キューは、先入れ先出し(FIFO)であり、待ち行列と呼ばれることもある。

##ディクショナリ##
一意のキーと値のペアで管理されるデータ構造。他言語でいうマップ、ハッシュ、連想配列。

**Dictionary**
順序を保証しない。

```C#
            var dic = new Dictionary<string, string> { ["a"] = "あ", ["i"] = "い"};

            foreach(var key in dic.Keys){
                Console.WriteLine($"{key} : {dic[key]}");
            }

            foreach(var d in dic){
                Console.WriteLine($"{d.Key} : {d.Value}");
            }
```

**SortedDictionary**
キーをRed-Blackツリー(赤黒木)で管理し、キーの大小で並びを管理できる。

**SortedList**
SoortedDictionaryと同じくキーの順序を管理できるが、内部構造がキーでソート済みの配列になっており、二分探索ができる。
そのため追加や削除はSortedDictionaryより遅いが、キー探索は常に理想的なツリー状態のSortedDictionaryと同等の速度となる。
(偏りのあるツリー状態のSortedDictionaryより高速)

##セット##
**HashSet**
リストと異なり重複を許さず、順序も保証しない。
キーだけを持ち値を持たないディクショナリといえる。
HyperParameter Tuning

cifar100データセットを使用してhyperparameterを調整する

#optimizer
Adamを使用

##共通
epoch = 20
dropout = 0.25

```python
model = Sequential()
model.add(Conv2D(f, 3, 3, input_shape=X_train.shape[1:]))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(dropout))

model.add(Conv2D(f*2, 3, 3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(dropout))

model.add(Conv2D(f*4, 3, 3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(dropout))

model.add(Flatten())
model.add(Dense(1024))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(100))
model.add(Activation('softmax'))
```

#ランダムサーチで調整
Adamでのパラメータをランダムサーチで調整する

今回beta1、beta2は調整せず、learning rate、units、batch sizeの3つを調整する


![image.png](https://qiita-image-store.s3.amazonaws.com/0/239266/3a6e203c-efe7-17ab-681f-36be1c38f1e4.png)


#結果
パターンAのチャート
![download.png](https://qiita-image-store.s3.amazonaws.com/0/239266/57c2d9a6-38a2-78ca-faa5-56565740f54a.png)
(高バイアス、高バリアンスで酷い)

##5パターンの結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239266/f5945252-d831-3a51-064f-5c2d156e63cf.png)

パターンAとCが精度が高く、unitsの数値が共通している

unitsを1024で固定してlearning rateとbatch sizeを細かく調整すれば精度がさらに良くなるかもしれない
Tomcatをいれてみた

# はじめに

Tomcat 9をいれたときのメモ

# 環境

* Windows 10
* Tomcat 9.0.5
* JDK 1.8

# 準備

## Tomcatのダウンロード
* [ここ](https://tomcat.apache.org/download-90.cgi)からTomcat 9をダウンロードする(Binary Distributions>Core>Zipをダウンロード)
<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/107636/d37a210c-dd48-8a47-899f-83e95fa7aaba.png "tomcatダウンロード.PNG">
</div>
* 任意の場所に解凍する(ここではC:\dev\apache-tomcat-9.0.5に解凍したものとする)
<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/107636/0fc731f7-288c-1f82-f80b-b845ec267729.png "tomcat解凍後.PNG">
</div>

# 設定

## CATALINA_BASEを作成する

ここではTomcat上で動作させるインスタンスの置き場所を作成する

* CATALINA_BASEとするディレクトリを任意の場所に作る(ここではC:\dev\tomcat-instance1)
* そこにTomcatを解凍したディレクトリのconf,logs,temp,webapps,workディレクトリを(C:\dev\tomcat-instance1に)コピーする
<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/107636/d5ec202e-c3fe-f635-76a6-74cdcab13323.png "tomcat_base.PNG">
<br/>こんな感じ
</div>

## setenv.batの設定

Tomcatを動かすためにはWindowsの環境変数などを設定する必要がある
しかしsetenv.batというファイルを作成することで、OSの設定を変更せずに設定できるので作成した
（ここではC:\dev\apache-tomcat-9.0.5\bin\setenv.batに作成したものとする）

```bash:setenv.bat
set JAVA_HOME=C:\dev\bin\jdk\jdk1.8.0_65
set CATALINA_HOME=C:\dev\apache-tomcat-9.0.5
set CATALINA_BASE=C:\dev\tomcat-instance1
set CATALINA_OPTS=-Xms256m -Xmx512m -XX:MaxMetaspaceSize=128M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
```

JAVA_HOME … Tomcatの起動に利用するJavaを指定する
CATALINA_HOME … Tomcatを解答した場所を指定する
CATALINA_BASE … Tomcat上で動作させるインスタンスを指定する
CATALINA_OPTS … Tomcatに指定するJVMのオプション

# 動かしてみる

ここまでの設定でとりあえず動くようになっているはずなので起動と停止をしてみる
起動/停止用のbatはTomcat(ここではC:\dev\apache-tomcat-9.0.5\)のbin配下に入っている

## 起動

startup.batを起動する

http://localhost:8080 にアクセスして繋がれば起動成功

## 停止

shutdown.batを起動する
とりあえず Ubuntu で新しい Node.js, npm をインストール

# 1. インストール

```shell
sudo apt update
sudo apt install nodejs
sudo apt install npm
```

# 2. バージョンアップ

## 2.1. Node.js

Node.js をバージョンアップする方法はいくつかありますが、この方法が一番楽だと思います。

```shell
sudo npm cache clean
sudo npm install -g n
sudo n stable
```

コマンドパスのハッシュが残っている場合、この直後に `node -v` や `nodejs -v` のバージョンを見ても更新されていないことがあります。そのときは、ターミナルを再起動するか `hash -r`。

**※自分でコマンドのリンクをする必要はないです。**
`/usr/bin` は自分でいじらない方が良いです。
古い nodejs をアンインストールしなくても新しい方が使えます。

参考「[Ubuntuに最新のNode.jsを難なくインストールする - Qiita](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)」
参考「[パッケージ更新インストール後にコマンドが実行できない場合の対処 - Qiita](https://qiita.com/vmmhypervisor/items/e846338b204061040957)」

## 2.2. npm のバージョンアップ

```shell
sudo npm update -g npm
```

# 3. その他

## 3.1 nodejs はインストールしたのに node コマンドがない

環境によって起きる問題。
**自分でリンクしなくても**、`nodejs-legacy` のインストールで修正できます。

```shell
sudo apt install nodejs-legacy
```

## 3.2. npm でパッケージインストール

他にもありますが、基本的なもの。
`<パッケージ>` は同時に複数指定可。

```shell
# グローバル
sudo npm install --global <パッケージ>
sudo npm i -g <パッケージ>

# ローカル (開発用)
npm install --save-dev <パッケージ>
npm i -D <パッケージ>

# ローカル (リリース用)
npm install --save <パッケージ>
npm i -S <パッケージ>
npm install --save-prod <パッケージ>
npm i -P <パッケージ>
```

(もちろん `sudo npm install -g <パッケージ>` なども OK)
(npm のバージョンによって書き方が違うかも)

参考「[install | npm Documentation](https://docs.npmjs.com/cli/install)」

## 3.3. ローカルインストールしたコマンドを実行

```shell:npm&nbsp;5.1&nbsp;まで&nbsp;(それ以降でも使える)
$(npm bin)/<コマンド>
```

```shell:npm&nbsp;5.2&nbsp;から
npx <コマンド>
```

環境変数 `PATH` にパスを追加してコマンドを使えるようにするのも手ですが、普段自分でコマンドを使わないならこれで良いと思います。

参考「[npm 5.2.0の新機能！ 「npx」でローカルパッケージを手軽に実行しよう - Qiita](https://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d)」

## 3.4. Yarn

npm よりも便利らしいパッケージマネージャ。
ディレクトリ内のファイルに特定文字列を含むか検索をかける

特定文字列パターンに一致する行があるかどうか、ディレクトリ内の全てのファイルについて検索したい時があります。
grepコマンドは今までパイプラインでしか使ってませんでしたが、今回の要件をgrepだけで実現できることを知りましたのでメモしておきます。

```terminal
grep -rnw . -e 'pattern'
```
この実行例はカレントディレクトリのファイルで'pattern'に一致するファイルを検索します。

## 解説
`-r` 再帰的に実行
`-n` 一致した行番号を表示
`-w` 単語まるごとに対して一致するかどうか



---
[reference](https://stackoverflow.com/a/16957078/8776028)
【PosgreSQL】データベース作成/削除/移動


#新規データベースの作成
新規データベースを作成する際は、以下コマンドを実行する。

（create database データベース名）

```sql
create database study;
```
実行後、create databaseが表示されればOK。

<img width="566" alt="スクリーンショット 2018-03-04 20.29.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/b65b3afe-e943-7b4d-dc3a-23a54ab053f5.png">

#データベースの移動

データベースを移動する際は、以下コマンドを実行する。
（¥c データベース名）

```sql
\c study
```
実行後、左側に指定したデータベース名を表示されていればOK。
<img width="512" alt="スクリーンショット 2018-03-04 20.36.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/73329be1-d88d-5ac7-2745-cb5c4b87bbe1.png">

#データベース一覧表示
データベースを一覧表示する際は、以下コマンドを実行する。

```sql
\l
```
<img width="553" alt="スクリーンショット 2018-03-04 20.42.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/1b919731-87b5-ca7d-58bc-66860c209e8e.png">
一覧表示されればOK。コマンド「q」で抜けれる。
<img width="626" alt="スクリーンショット 2018-03-04 20.42.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/301c5bbe-f57a-c446-3fa7-beb287b6aae6.png">

#データベースの削除
データベースを削除する際は、以下コマンドを実行する。
※開いているデータベースの削除はできない。
（drop database データベース名）

```sql
drop database test_database;
```
実行後、drop databaseが表示されればOK。
<img width="475" alt="スクリーンショット 2018-03-04 20.46.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/2ac0780e-9681-d362-ae85-1ba3f7b86915.png">


以上。
React+axiosでLaravel APIからJSON取得

# やりたいこと

- axiosでAPI叩いてJSONを取得してみたい
    - 取得先は[前回記事](https://qiita.com/dyoshikawa/items/94947ab5ff39195a3502)で作ったやつ
- Reactは必須じゃないけど```create-react-app```一発で環境が作れて楽なので併せて使います

# 環境

- node, yarn(npm)導入済
- サーバサイドはNginx+PHP-FPM+Laravel

# 手順

## React+axios

### Reactプロジェクト作成

~~~bash
npx create-react-app react-axios
cd react-axios
yarn start
~~~

- ```npx```によってホスト環境を汚さずに```create-react-app```コマンドが使える

### axios導入

~~~bash
yarn add axios
~~~

### Reactコード

- App.jsを以下のように編集
- axios試すのが目的なのでコンポーネント化とかは全然意識できてない

~~~javascript:src/App.js
import React, { Component, Fragment } from 'react';
import axios from 'axios';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tasks: []
    };
    this.getData = this.getData.bind(this);
  }

  getData() {
    axios
      .get('http://localhost:8000/test')
      .then(results => {
        const data = results.data;
        console.log(data);
        this.setState({
          tasks: [...data]
        });
      });
  }

  render() {
    const tasks = this.state.tasks.map(task => {
      return <li key={task.id}>{task.title}</li>;
    });

    return (
      <Fragment>
        <div className="App">
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <h1 className="App-title">Welcome to React</h1>
          </header>
          <p className="App-intro">
            To get started, edit <code>src/App.js</code> and save to reload.
          </p>
        </div>

        <div>
          <button onClick={this.getData}>getData</button>
          <ul>
            {tasks}
          </ul>
        </div>
      </Fragment>
    );
  }
}

export default App;
~~~

- getDataボタンをクリックするとAPIから取得した値をリスト表示する

## CORS設定

~~~
Failed to load http://localhost:8000/test: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3001' is therefore not allowed access.
createError.js:16 Uncaught (in promise) Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:87)
~~~

- 何も考えずにAPIを叩きに行くとブラウザのコンソールにこんなエラーが出る
- クロスドメイン制約というらしい
- サーバー側で許可設定が必要

### Nginxで設定する場合

- [こちら](https://qiita.com/bmf_san/items/a90255bf645890d96d0b)参考に設定ファイルに以下追記

~~~nginx:/etc/nginx/conf.d/default.conf
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
add_header Access-Control-Allow-Credentials true;
~~~

- 接続元を絞ってないので公開APIとかじゃない限り本番環境では非推奨な設定と思う

### Laravelで設定する場合

- ```php artisan serve```で開発してる場合はLaravel側で設定するしかなさそう
- 僕はやってないですが[こちら](https://qiita.com/bmf_san/items/a90255bf645890d96d0b)参照

## 動作確認

<img width="1279" alt="スクリーンショット 2018-03-04 20.13.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/176237/131a398a-cd0b-7b0c-9ea7-5e61be281bb7.png">

- 無事取得値を表示できた

# 参考

- 『React入門 React・Reduxの導入からサーバーサイドレンダリングによるUXの向上まで』(穴井宏幸他, 翔泳社, 2018)
- https://qiita.com/rysk92/items/e5cf2fab8531f8ea3683
メモ：ESP32のSPIについて混乱していることの整理

## SPIでググるといろんなものがでてくる
SPIでもSPI、VSPI、HSPIの表記があってどれがどれかわからない。

Switch Scienceさんの https://trac.switch-science.com/wiki/esp32_tips#SPI%E9%80%9A%E4%BF%A1 がわかりやすかった。SPI、VSPI、HSPIの３つのモジュールがそれぞれ実装されているとのこと。特に何もしなければVSPIのモジュールが使われるとのこと。

- SPIは内蔵FLASHとの接続に使われている
- HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
- VSPI - SCK,MISO,MOSI,SS = 18,19,23,5

ググると出てくるスケッチや配線図が尽く異なるピンを使ってるのはGPIOマトリックス機能で入れ替えたり、そのスケッチがドサクサに紛れてソフトウェアでSPI通信しているものが混在しているのが混乱の元になっていた。


## VSPIとHSPIとはなんなのか？
Googleでいろんなワードで検索したけどズバリ説明しているドキュメントは見つけられなかった。ググって参考になった記事は少しだけあった。

- [Need more details about HSPI and VSPI](https://www.esp32.com/viewtopic.php?t=804)
- [ESP32 の SPI_MODE が修正。HSPI , VSPI , 複数SPIデバイス制御 , SPI高速化などについて - 2](https://www.mgo-tec.com/blog-entry-esp32-spimode-hspi-vspi-hispeed.html/2) の「VSPI や HSPI とは」の項


## SPIでTFT液晶を動かすことについて
ググって出て来た記事はこの辺り。

- [TFT LCD(ILI9341)+アナログセンサ](http://knaka0209.blogspot.jp/2017/02/esp-wroom-02-43.html)
- [ESP32, TFT ILI9341 DISPLAY テスト編](http://knaka0209.blogspot.jp/2017/05/esp32-16.html)
- [ESP32(ESP-WROOM-32)でLチカ (WindowsでArduino IDE使用)](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3)
- [Demos for ILI9341-based TFT displays using the Espressif ESP32](https://github.com/MartyMacGyver/ESP32_Adafruit_ILI9341)
  - [ESP-WROVER用なのでREADME.mdとgraphicstest_mod.inoでピンアサインが食い違うため斜め読み注意](https://github.com/MartyMacGyver/ESP32_Adafruit_ILI9341/issues/4)

[Demos for ILI9341-based TFT displays using the Espressif ESP32](https://github.com/MartyMacGyver/ESP32_Adafruit_ILI9341) が一番参考になった。[graphicstest_mod.ino](https://github.com/MartyMacGyver/ESP32_Adafruit_ILI9341/blob/c3feb277d9476bdd603834cf9f3b67b1fb7e815f/demos/arduino-esp32/graphicstest_mod/graphicstest_mod.ino#L27-L33)の部分でピンアサインが指定されている。

```cpp
#define TFT_CS   22  // SS(Slave Select)と表記されたり、CS(Chip Select)と表記されたりするやつ
#define TFT_DC   21  // ググラビリティが悪くて何者か調べてもわからなかったやつ
#define TFT_MOSI 23  // SPIのMOSI(Master Out Slave In)
#define TFT_CLK  19  // SPIのSCLKと表記されたり、CLKを表記されるやつ
#define TFT_RST  18  // LCDのリセット用（SPI関係ない）
#define TFT_MISO 25  // SPIのMISO(Master In Slave Out)
#define TFT_LED   5  // バックライトのON/OFF（SPI関係ない）

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
```

これはデフォルトの↓のピン配置から変更されているが、繋ぎ変えてあげることはできる。
- HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
- VSPI - SCK,MISO,MOSI,SS = 18,19,23,5

Adafruit_ILI9341のコンストラクタで**TFT_MOSI, TFT_CLK, TFT_MISO**３つを受け取らないものがあり、そちらに書き換えた場合はVSPIのものに繋ぎ変えてあげると動いた。

## 疲れたこと
VSPIやHSPIの一次情報にたどり着けず、SPIのDCが何の略で何者なのかが結局わからなかった。
DNAのデータ保存形式の扱い方(python)

#NEXUS
NEXUS 
Begin data;
	Dimensions ntax=287 nchar=10650;
	Format datatype=dna…

みたいな感じで始まるデータの保存形式
nexusパッケージ（https://pypi.python.org/pypi/nexus) のNexusReaderを利用する

```:nex.py
from nexus import NexusReader
import sys

n = NexusReader()
nexus_in = sys.argv[1]
n.read_file(nexus_in)

for taxon,characters in n.data:
    print(">",taxon)
    print("".join(characters))

```
#FASTA
一行目に>から始まるヘッダ行
二行目以降に実際の配列
というようなデータの保存形式

```:fas.py
from Bio import SeqIO
import sys

fasta_in = sys.argv[1] #fastaファイルを読みこみ

for record in SeqIO.parse(fasta_in, 'fasta'):
    id_part = record.id
    desc_part = record.description
    seq = record.seq


```

#NCBIのxmlファイル
```:xml.py
from Bio.Blast import NCBIXML

path ="2VJM4KYR014-Alignment.xml"

with open(path, mode = 'r', encoding = 'utf-8') as fh:
    blast_records = NCBIXML.parse(fh)
    for blast_record in blast_records:
        for alignment in blast_record.alignments:
             for hsp in alignment.hsps:
                 he = '>' + alignment.title + '|'
                 he += str(hsp.score) + '|'
                 he += str(hsp.bits) + '|'       
                 he += str(hsp.identities)
                 """
                 ある条件によって抽出したい場合は,ここでif文を追加する
                 
                 [例]
                 scoreによって抽出したい場合は if hsp.score < ("数値"): 
                 生物種によって抽出したい場合は　if hsp.identites.find("Homo sapiens"):
                 
                 """
                 print(he)
                 print(hsp.query[1:80])
                 print(hsp.match[1:80])
                 print(hsp.sbjct[1:80])
```
(ちょっと前にやったのであまり覚えていない）
Virtual Box+Docker+Nginxで共有フォルダのファイルを配信する方法

# 背景
Windowsの上にVirtual BoxでUbuntu Server 16.04を立てて、Docker-composeでNginxのコンテナを動かしていた。Ubuntuで作成したファイルをvolumvesでコンテナと共有して配信するのは何ら問題なくできます。しかし、windowsと共有フォルダで共有したファイルを配信しようとすると403 Forbiddenで配信できませんでした。
Nginxのログを見てみるとpermission deniedでファイルを読み取れていないようでした。Nginxのコンテナの中に入って権限を確認すると、 -rwxrwx---となっていました。rootとgroupには権限があるけれど、その他には権限がないようでした。

# 問題
Virtual Boxの共有フォルダで共有したファイルに対してdocker-composeのvolumeでNginxのコンテナと共有しても、permission deniedでNginxがアクセスできません。

/media/sf_sharedをwindowsとUbuntuの共有フォルダとして設定した場合


```docker-compose.yaml
version: '2'
  services:
     nginx:
       image: nginx
       ports:
         - "80:80"
       volumes:
         - /media/sf_shared:/usr/share/nginx/html
        - ./nginx/conf.d:/etc/nginx/conf.d
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf
```


# 対処法
Nginxの公式イメージではnginx.confの中のuserの設定がnginxになっているので、rootに変えることで、Nginxはワーカーがroot権限で動くので、ファイルを配信することができます。

```nginx.conf
user  root; # デフォルトはnginx
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
```

# あとがき
画像ファイル置き場からユーザが選択した内容に応じて、APサーバでbase64に変換して送るのではなく、静的ファイルとして配信しようとしてはまりました。Nginxのuser設定をrootにする以外でうまくいく方法はないか試しましたが、今のところうまくいく方法を見つけられていません。
もし、ご存知の方いらっしゃったら教えてください。
【初心者必見】IntellJでのコンパイル設定【画像多め】

備考
- 2018/03/03 現在
- IntelliJ IDEA2017.1.2

## IntelliJとは

- チェコに本社を置く「JetBrains」が出しているJava用のIDEA
- 他の言語も書ける

## 始め方

![intel.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/09bfc451-8598-83dd-c4b5-66abbd3a387a.png)

- Create New Priject を選択

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/0f96fe28-b4c4-0694-a28f-31d1c2840934.png)

- Javaを選択してNext(まだProject SDKは気にしない大丈夫です)

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/ac233e4c-c7f1-0dcc-3844-eee657f772fa.png)



- Create project from template > Java Hello Worldを選択(ここでは何も選択しなくてもOK)
- project名を決める

### プラグイン「JB SDK Bintray Downloader」をダウンロード 

※このプラグインがキモになります。

1 file > setting > plugin
2 Restart IntellJ IDEA

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/2d1442b7-b0c8-5261-5e51-dd1f07d48d43.png)

3  ポップアップが出てきて自動で入力されるものをインストール
(今回は「jbsdkBu112b287.2_windows_x64.tar.gz」)

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/0ede1a4e-3701-12e2-ceed-d482d67e556f.png)


### SDKの設定
- file > Project Structure > SDKs
- 「＋」を押してJDKを選択
- jbsdkBu112b287.2_windows_x64.tar.gz　をインポート
- Apply > OK

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/6f82dce3-933f-5b23-d610-63aa31dc4270.png)


#### project

Project SDK > 1.8(java version "1.8.0_112-release")
Project language level > SDK default(8 - Lambdas)

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/e21af2b6-0915-5213-bc8b-f2eb69783525.png)


#### Modules

- Soucess > Language level > Project default
- Paths 特に設定いらない
- Dependencies > Module SDK > 1.8(java version "1.8.0_112-release")

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/86ac3367-a6ac-fdc8-6f8a-6e6cc8e71e90.png)
![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/190e54cf-c87f-ab6b-1022-c8896d056175.png)
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/eabf808b-c95f-3123-d2e8-475d2c252a13.png)


### 実行設定

Run(上部ツールバー) > Edit Configrations > Configrations
JRE をDefault(1.8 - SDK)を選択

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/241699/f6970b68-3a53-767a-3e41-fb607ec614e8.png)


## 完成！！

コンパイル可能になる
Reduxのconnectについて

Reduxのconnectについての備忘録です

## connectについて

```
connect(func1, func2)(Test);
```

 - 第一引数の「func1」はcomponentに渡すpropsを制御する
 - 第二引数の「func2」はreducerを呼び出して、reduxで管理しているstateを更新する
 - Testは取得したデータをpropsとして扱いたいcomponentを指定する


## connectの第一引数について

```
function mapStateToProps(state, props) {
  return {
    data: state.reducer.hoge
  };
}
```

 - func1の第一引数「state」はreduxで管理している全てのstateを持っている
 - func1の第二引数「props」はconnectしたcomponent本来のpropsを取得する
 - connectしたcomponentで「this.props.data」とアクセスすることでreducerで管理している「hoge」の値を取得できる

## connectの第二引数について

```
function mapDispatchToProps(dispatch) {
  return {
    foo: () => dispatch({
      type: Actions.DISPATCH_EVENT,
      hoge: true,
    }),
  }
};
```

 - connectしたcomponentで「this.props.foo」を実行すると、reduxで管理しているstateを更新する

## componentの指定

```
class Test extends React.Component {
  ...
}
export default connect(mapStateToProps, mapDispatchToProps)(Test);
```
Linux環境にWindowsプログラムを移植(2)

# 開発環境の構築
CentOS7.2上での開発環境として統合開発環境をインストールする。
評価対象は以下。

 - Visual Studio Code
 - Eclipse

とりあえずVisual Studio Codeを試して問題があればEclipseを検証する。

## Visual Studio Codeの入手方法
マイクロソフト社のページからrpmファイルをダウンロードする。
https://code.visualstudio.com/download
今回ダウンロードしたファイルは「code-1.20.1-1518536126.el7.x86_64.rpm」。

## Visual Studio Codeのインストール
yumコマンドでインストールする。

```shell-session
yum install code-1.20.1-1518536126.el7.x86_64.rpm
```

libXss.so.1のインストールで失敗する場合は、以下のyumの設定を確認する。

## yumの設定
1.インターネットに繋がっているか？
### proxyの設定

最後の行に以下を追加する。

```text:/etc/yum.conf
proxy=http://proxy.xxx.xxx:pp
```

### リポジトリの設定
RHEL環境で、CentOSのリポジトリを使用する場合は以下のファイルを作成する。

```text:/etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

## Visual Studio Codeの起動
インストールするとアプリケーションメニューに[プログラミング]-[Visual Studio Code」が登録されている。
またはコンソールで「code .」でも起動する。
Rhino の HttpClient の使い方 (Post)

```js:http_post.js
#! /usr/bin/java org.mozilla.javascript.tools.shell.Main
// -----------------------------------------------------------------------
/*
	http_post.js


					Jun/12/2021
*/
// -----------------------------------------------------------------------
importPackage (java.io)
importPackage (java.lang)
importPackage (java.util)
importPackage (java.nio.charset)
importPackage (org.apache.http)
importPackage (org.apache.http.client)
importPackage (org.apache.http.client.methods)
importPackage (org.apache.http.impl.client)
importPackage (org.apache.http.message)
importPackage (org.apache.http.util)
importPackage (org.apache.http.client.entity)

// -----------------------------------------------------------------------
function http_post_proc (url_in,user,password)
{
	const charset = StandardCharsets.UTF_8

	var httpclient = HttpClients.createDefault()
		
	var request = new HttpPost(url_in)	
	var requestParams = new ArrayList()
	requestParams.add(new BasicNameValuePair("user",user))
	requestParams.add(new BasicNameValuePair("password",password))
		
	request.setEntity(new UrlEncodedFormEntity(requestParams))

	var response = httpclient.execute(request)
			
	const status = response.getStatusLine().getStatusCode()

	print("HTTPステータス:" + status)

	if (status == HttpStatus.SC_OK){
		var responseData = EntityUtils.toString(response.getEntity(),charset)
		print(responseData)
		}

	if (response != null)
		{
		response.close()
		}

	if (httpclient != null)
		{
		httpclient.close()
		}
}

// -----------------------------------------------------------------------
System.err.println ("*** 開始 ***")

const url_in = "https://httpbin.org/post"
const user = "jiro"
const password = "123456"

http_post_proc (url_in,user,password)

System.err.println ("*** 終了 ***")

// -----------------------------------------------------------------------
```

実行コマンド

```bash
LIB=/usr/share/java
HTTPCLIENT_JAR=$LIB/httpclient-4.5.13.jar:$LIB/httpcore-4.4.14.jar:$LIB/commons-logging-1.2.jar
JAVA_CLASSPATH="/usr/share/java/js.jar:/usr/share/java/jline.jar"
export CLASSPATH=.:$JAVA_CLASSPATH:$HTTPCLIENT_JAR
#
./http_post.js
```
Rhino の HttpClient の使い方 (Get)

```js:http_get.js
#! /usr/bin/java org.mozilla.javascript.tools.shell.Main
// -------------------------------------------------------------------
//	http_get.js
//
//					Jun/12/2021
//
// -------------------------------------------------------------------
importPackage (java.io)
importPackage (java.lang)
importPackage (java.nio.charset)
importPackage (org.apache.http)
importPackage (org.apache.http.client)
importPackage (org.apache.http.client.methods)
importPackage (org.apache.http.impl.client)
importPackage (org.apache.http.util)

// -------------------------------------------------------------------
function http_get_proc (url_in)
{
	System.err.println ("*** http_get_proc *** start ***")

	const charset = StandardCharsets.UTF_8
		
	var httpclient = HttpClients.createDefault()
	var request = new HttpGet(url_in)

	var response = httpclient.execute(request)
			
	const status = response.getStatusLine().getStatusCode()

	print("HTTPステータス:" + status)
			
	if (status == HttpStatus.SC_OK){				
		const responseData = EntityUtils.toString(response.getEntity(),charset)				
		print(responseData)
		}

	if (response != null) {
		response.close()
		}

	if (httpclient != null) {
		httpclient.close()
		}

	System.err.println ("*** http_get_proc *** end ***")
}

// -------------------------------------------------------------------
System.err.println ("*** 開始 ***")

const url_in = "https://httpbin.org/get"
http_get_proc(url_in)

System.err.println ("*** 終了 ***")

// -------------------------------------------------------------------
```

実行コマンド

```bash
LIB=/usr/share/java
HTTPCLIENT_JAR=$LIB/httpclient-4.5.13.jar:$LIB/httpcore-4.4.14.jar:$LIB/commons-logging-1.2.jar
JAVA_CLASSPATH="/usr/share/java/js.jar:/usr/share/java/jline.jar"
export CLASSPATH=.:$JAVA_CLASSPATH:$HTTPCLIENT_JAR
#
./http_get.js
```
ProcessingとopenFrameworksの違い

Processingで慣れた後openFrameworksで書いてみたとき、この二つは出来る事のコンセプト自体は大きく差がないが、使い方には微妙に違いがあると感じた。
それを記録の意味を込めて書いてみた。
※自分個人が感じた事です。

#Processing
https://processing.org
Processingとは、Ben Fry氏とCasey Reas氏らによって作られた言語。大まかに言えば、Javaを単純化し、可視化部分に特化したもの。
##利点
-Windows、Mac、Linuxと幅広いOSで動く。
-導入が簡単。公式サイトからダウンロードすれば終わり。
-文法もJavaを単純化したものであるため、比較的シンプル。
-面白いライブラリもある。(ex. 物理ライブラリ(Box2D))
-このタイプの言語(可視化特化)の中では日本語の参考元が比較的多め。

つまり、どこでも動く上にとにかく手軽であるため、軽く何かを書きたい時に使用しやすい。
また、出力が数値とかではなく図などの目に見える形で表れる点や文法が簡単な面から初心者にも
勧めやすい。
##欠点
-クラスを作る事が出来るが、全て内部クラス扱いになってしまう。
-変数も全てpublic扱いになってしまう。そのため、厳密にカプセル化とかを学びたい時には
向かない。
-※クラスを作る際「~.java」のように拡張子として「.java」を使用すると外部クラスとして
作成される。privateやprotectedなどアクセス修飾子も動作し、カプセル化もしっかり
行える。(2018/3/10追加。enkatsu様、ありがとうございます。)

-C++とかと比べると遅いので、大規模なものを作るのには向いていない。
-IDEは提供されるが、人によっては使いづらく感じるかもしれない。
#openFrameworks
http://openframeworks.cc/ja/
openFrameworksは、Zach Lieberman氏らによって開発され、MITライセンスで配布されているC++のオープンソースツールキットである。厳密に言えば言語ではなくC++のライブラリの一種に近い。こちらも大まかに言えばProcessingのような事をC++で出来るようにしたものである。
##利点
-Windows、Mac、Linuxと幅広いOSで動く。
-C++ならではの速度の速さ。そのおかげでProcessingと比べると大規模なものを作れる。
-C++のライブラリという位置に近いため、C++の文法をそのまま用いる事が出来る。しっかりとカプセル化などを意識した書き方が出来る。
-アドオンと呼ばれる、openFrameworksの追加機能的なものが豊富にある。例えば物理エンジンやGUIなどがある。
-C++であるため、ハードウェアに近い部分(低レベルの部分)のコーディングも可能である。

幅広く動作する上に、Processingより大規模かつ別の方向性の作品の作成にも使える。
##欠点
-C++をある程度理解しておかないと扱うには厳しい。初心者には敷居が高い。
-IDEは提供されないため、自分で用意する必要がある。(MacならXCode、Windowsならvisual studioなど)
-現時点(2018/3/4)で最新のバージョンが0.9.8となっているが、アドオンの中にはその最新のバージョンに対応してないものが存在する。それを導入してしまうと、場合によっては自分が書いたコードは間違ってなかったとしてもアドオンの部分でエラーが起きてしまって動かない場合がある。
-日本語のリファレンスが少ない。

#向き不向き
簡単に言ってしまえば、
-あまり大きくない規模のものを作りたいときやアイディアを考えるスケッチ→Processing
-大規模な作品を作りたい→openFrameworks
となる。

#まとめ
同じコンセプトを持つ二つの言語の個人が感じた使い方の向き不向きについて書いた。これらを使用して作品を作って投稿する事を定期的に、あわよくば習慣化したいと考え、ここ数ヶ月触れていた。
コーディングを持って自分の考えやアイディアを表現したり、何かを試すというのは非常に面白いと思うし、それが広まったらそれをきっかけにして話題の共有したりや交流の輪が広がるのではないかなとも思う。

#オススメの文献
個人的に参考に最適だと思った本やサイトをここに記載する。
-Nature of Code -Processingではじめる自然現象のシミュレーション
--http://natureofcode.com/book/
--Daniel Shiffman氏が書いた本。情報系に進む上で基本になる幅広い知識やコーディングの基本を学ぶ事が出来る。得られる事は多く、間違いなくオススメできる本。
--本は日本語訳版がある。
--難しめな内容も含まれているため、Processingをある程度書き慣れているのが望ましい。
--また、この本の著者であるDaniel Shiffman氏はYoutubeに大量に動画をアップロードしている。Processingやp5.js(今回紹介しなかったが、Javascript版のProcessingと考えてもらえば良い。Webで動くものを簡単に作れる)を使用して作品を作ったりしている。Nature of Codeの内容も解説している動画もあり、ここから得られる事はとても多い。英語であるが故に聴き取りは難しいが、チャレンジする価値は十分にある。
--https://www.youtube.com/channel/UCvjgXvBlbQiydffZU7m1_aw

-ジェネラティブ・アート―Processingによる実践ガイド
--Generative Artと呼ばれる、コンピュータなのに有機的で不思議な絵を書いたり、他にも様々な表現についても学ぶ事が出来る。Processingの基礎的な書き方についても学べるため、初心者にも向いている。
--専門書の中では比較的値段が安い。
--本は日本語訳版がある。

-Generative Design-Processingで切り拓く、デザインの新たな地平
--http://www.generative-gestaltung.de
--様々な表現方法やデザインについて学ぶ事が出来る。とにかくサンプル数が多い。
--難しい内容が多く含まれている上、本はかなり高価(10000円近い)。そのため、どちらかといえば上級者向け。
--サンプルコードはサイトからダウンロード出来るため、それを使って動かしてみると良いかも。
--本は日本語訳版がある。

-http://yoppa.org
--クリエイティブコーダーの田所淳先生のサイト。ProcessingやopenFrameworksについての参考資料が多い。無料で閲覧出来るため、気軽に利用が出来る。
--他にもTidal CyclesやSonic Piなど音と連携した使用方法なども学ぶ事が出来る。

-P5 Code School
--http://p5codeschool.net/tutorial/
--Processingの基礎について学ぶ事が出来る。

他にもTwitterで#openframeworksや#Processing、#creativeCodingなどで検索すると投稿されている作品を見る事が出来る。それらも参考になる事が多い。
文字間のmargin,paddingを攻略する

# 概要
あるサイトを構築しようとしたら、デザイナーから文字間の余白の戻しがいっぱいきて絶望したので、それに対応しようとした話
特に文字を多く扱うサイトだと参考になるかもです。

## そもそも文字間について

下記のブログに詳しく書かれていますがline-heightを設定してある文字にmarginやpaddingを設定しようとすると大変です。
[marginとline-heightによる"真の余白"について考える](http://simpleism.net/2015/06/true-margin/)


line-heightを1に設定すれば、そこまで話は複雑じゃないのですが、line-heightが１以上に設定されている文字と文字の間に余白を作ろうとすると、line-height分、余分に余白が空いてしまいます。
逆に、line-heightを１にするクラスを付与すると、`<br/>`や改行した時にデザイン崩れちゃう

## 実際はこんな感じになります。
htmlにfont-size:15pxの状態で、
文字サイズ2remにline-heightに1.8を当てた上のh1と
文字サイズ1remにline-heightに1.8を当てたp
h1とpの間にはmargin-bottom:20pxを適用

![普通.png](https://qiita-image-store.s3.amazonaws.com/0/182214/66b672ff-6bcf-fb0a-0e3b-79ec2623e49d.png)
![拡大.png](https://qiita-image-store.s3.amazonaws.com/0/182214/ac406947-dda6-165d-ce83-4c19a0363aac.png)

本来なら緑の縦線が20pxになるといいんだけど、実際は、オレンジの部分が20pxになってるので、line-heightの1.8分、つまり、2rem×1.8と1rem×1.8の合計12px+6pxが余分に空いてる状態。

デザイナー「38pxの余白できてるやんけ！」

これの解決に上記の記事では、calcをうまく使って解決してる
こんな感じ

![cacl.png](https://qiita-image-store.s3.amazonaws.com/0/182214/806be3f9-1bd7-8171-ab25-fd525d5cf7bc.png)

h1のline-heightは計算してくれたけど、下のpは計算してくれてないので、結果26px空いてる図。
pのline-heightに1を設定すれば直るけど、下のpは改行あるからline-height:1にできない・・・・！！

これもうcssだけじゃ解決できないじゃん・・・・


## JSを使って解決した

結果jsを使って解決しました。
こんな感じ

![js.png](https://qiita-image-store.s3.amazonaws.com/0/182214/2b77de49-485a-917b-5908-64a9d2586d68.png)

オレンジの部分に素でmargin-bottom:20pxを当ててます。
文字の上下のline-height分の余白を無理やり消してます。

仕組みは対象のh1やpの高さ、font-size,line-heightを計測し、実際の文字高さを計測。余分なline-height分の余白をmarginで削除するって感じです。

## usage

jqeuryを読み込んだ状態で、moziクラスを付与します。
moziクラスには、以下をcssで設定してください。

```css
.mozi{
  position: relative;
  box-sizing: content-box;
  display: block;
}
```
あとは下記からwww/js/characterHeight.jsをひぱってきてhead内で読み込んでください。
適用したいタグにmoziクラスを付与することで、扱えるようになります。

npmにパッケージ登録しようと思ったけど、大変だったので、また今度やります。。。

[github/character_height](https://github.com/yukiokamura/character_height)
Linux環境にWindowsプログラムを移植(1)

# Linuxのインストール
まずはWindowsのC/C++で作成したプログラムをLinux環境に移植するため、Linux環境を構築する。
まずはLinux上で開発環境を構築することを目標とする。

## インストールするLinux
RHELをインストールしたいが、個人では評価できなかったので、別のものを使用する。
評価対象は以下。

 - CentOS
 - Fedora

説明はOpenStandia参照した。
CentOS(http://openstandia.jp/oss_info/centos/index.html)
Fedora(http://openstandia.jp/oss_info/fedora/index.html)

動作が安定している**CentOS**を採用する。ライセンスはGPLライセンス。

## 入手方法
CentOSのHP(https://www.centos.org/)からダウンロードできる。
ダウンロードするバージョンを選択したい場合は、以下のページから探す。
https://wiki.centos.org/Download
最新は7.4(1708)だが、今回は7.2(1511)をダウンロードする。

ダウンロードファイルとして、DVD、Everything、Live、Minimalとあるが、標準的なDVDのisoファイルをダウンロードする。
今回ダウンロードしたURLは以下。
http://archive.kernel.org/centos-vault/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso

## インストール環境
今回は実機ではなく、Windows10(64bit)上にVMWare Workstation Player 14.1.1をインストールし、その中に構築する。
なお拡張キーボードドライバのインストールは行わない。

## CentOSのインストール
### インストール方法
VMWare Workstationの簡易インストール機能を使用するとgccがインストールされないため、手動でインストールする。
ソフトウェアの選択で、ベース環境に「サーバ(GUI使用)」、選択した環境のアドオンに「開発ツール」にチェックを付ける。

### 時間の設定
「date」コマンドを実行すると「Sat Mar 3 HH:MM:SS PST 2018」など17時間前が表示された。
PSTは太平洋標準時間、PDTは太平洋夏時間、UTCは協定世界時間で、日本時間は**JST**なので、JSTに以下のコマンドで変更する。

```shell-session
 # cp /usr/share/zoneinfo/Japan /etc/localtime
```

### キーボードの設定
イコール(=)を入力しようとしたらアンダーバー(_)が入力された。
イコールは、はっと(^)の場所で入力できた。
修正方法がわからなかったので、再度インストールし直し、インストール後の入力で「日本語」を選択したら解決した。

### 漢字入力
1.左上のアプリケーションメニューから[システムツール]-[設定]を選択する。
2.[地域と言語]を選択する。
3.入力ソースの追加で[日本語]を選択し、「日本語(かな漢字)」を追加する。
4.設定を追加した後は、「Windowsキー」+「スペースキー」または、画面上部の日付の左側から切り替える。
Arduino、Raspberry Piの回路図を作成する

# きれいな回路図を作成したい！
「Fritzing」を使うと、ArduinoやRaspberry Piの回路図をきれいに作成できます。

# インストール
公式サイトから、各OSのインストーラーをダウンロードしてインストールします。
http://fritzing.org/download/

# 起動してみる
Fritzingのアイコンをダブルクリックします。
※Mac版の場合、セキュリティ設定の警告がでますので、システムの環境設定から許可してください。
<img width="532" alt="スクリーンショット 2018-03-04 12.29.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/43330/feaa39d5-a6d2-2bba-fedc-ebbd57fdcd3e.png">
下記のような画面が起動します。同時にParts Libraryのアップデート確認がでるので、アップデートしておきましょう。
<img width="1250" alt="スクリーンショット 2018-03-04 12.37.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/43330/3a26c562-c687-cdab-6cda-ebcff897fa52.png">

# 回路図を作成する
上部の「ブレッドボード」を選択するとブレッドボードの絵が表示されます。
あとは右の「パーツ」欄からパーツをドラッグ＆ドロップで回路図を作成できます。ArduinoやRaspberry Piもパーツ欄に含まれているので、電子部品と同様に配置していきます。
Raspberry PiとLEDを配置したものが以下の図。簡単です。
<img width="1256" alt="スクリーンショット 2018-03-04 18.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/43330/1255ff4d-e9a1-db65-d522-328cba3f8cfe.png">

# パーツ欄にパーツを追加する
パーツ欄に目的のパーツがなかった場合、Fritzingのサイトから追加パーツをダウンロードして追加することができます。
今回は試しに温湿度センサー「DHT11」のパーツを追加してみます。パーツはGithubで配布されています。
https://github.com/adafruit/Fritzing-Library/blob/master/parts/DHT11%20Humitidy%20and%20Temperature%20Sensor.fzpz
※パーツファイルは「.fzpz」という拡張子です。

ダウンロードしたファイルを、Fritzingの[ファイル]-[開く]で開くと、パーツ欄のMINEにパーツが追加されて、使用できるようになります。
<img width="1250" alt="スクリーンショット 2018-03-04 18.18.045.png" src="https://qiita-image-store.s3.amazonaws.com/0/43330/d000e059-4a36-7152-df31-ba400aa49f10.png">
利用しているTrelloのChrome拡張機能（備忘録&事例あり）

# １．概要
現在、個人のタスク管理にTrelloを利用しています。
チームメンバーから、Chromeの拡張機能を利用して、Trelloをカスタマイズが出来ることを教えてもらったので、いろいろと導入しました。ググるとすぐ出てくる情報ですが、自分がどのように利用しているかの事例も併せて紹介したいと思います。
# ２．Colored Hashtag for Trello
URL：[Colored Hashtag for Trello](https://chrome.google.com/webstore/detail/colored-hashtag-for-trell/ppojcfmfpnamjfekgigdplfjhkkccibc?hl=ja)
内容：タイトルのハッシュタグに合わせてカードの背景を変更してくれます。
![screenshot-beniyama.hatenablog.jp-2018.03.04-17-32-47.png](https://qiita-image-store.s3.amazonaws.com/0/67649/718b2afb-086b-d7a2-7d31-699bb97002a8.png)
事例：固定カード（出勤時間、目標ポモドーロ数など）を表現したり、不定期タスクとの仕切りに使っています。
![screenshot-trello.com-2018.03.04-17-35-58.png](https://qiita-image-store.s3.amazonaws.com/0/67649/8fa75962-229a-439d-3a99-ffcc120e8750.png)
補足：作成された方は日本人でした。[べにやまぶろぐ](http://beniyama.hatenablog.jp/entry/2015/01/04/210655)
# ３．Card Color Titles for Trello
URL：[Card Color Titles for Trello](https://chrome.google.com/webstore/detail/card-color-titles-for-tre/hpmobkglehhleflhaefmfajhbdnjmgim?hl=ja)
内容：ラベルに文字列を表示してくれる。
![screenshot-addons.mozilla.org-2018.03.04-17-40-40.png](https://qiita-image-store.s3.amazonaws.com/0/67649/f987e036-3a02-7514-28bf-35a9d0d2b254.png)
事例：特になし。ラベルの色が足りない場合は、複数の役割になった場合に重宝すると思います。
補足：現在は、Trelloのデフォルトの機能としてラベルをクリックすると文字表示があるそうです。
# ４．Projects for Trello
URL：[Projects for Trello](https://chrome.google.com/webstore/detail/projects-for-trello/mholjhodapabhdbchonjjoecmfhobfoa?hl=en-GB)
内容：通常のラベルとは別に、{ } で囲んでカードタイトルに入れるとラベル化する。
![unnamed (1).png](https://qiita-image-store.s3.amazonaws.com/0/67649/b464516f-0da5-0b92-dc64-b0fa0dccc596.png)
![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/67649/dff80b94-7884-4134-bf7d-3edb0cbfb60f.png)
事例：案件単位を表現するの利用しています。チームで利用するなら、BackLogのチケット番号や、issueの番号などを記載するとよいと思います。
![screenshot-trello.com-2018.03.04-17-50-44.png](https://qiita-image-store.s3.amazonaws.com/0/67649/678d0fa5-9e05-ad19-af7b-17f54c1110f8.png)
# ５．その他
URL：[Hide Activity Details for Trello](https://chrome.google.com/webstore/detail/hide-activity-details-for/hcgmjpjodnakphfpegldpbcajlmpfipa?hl=en-GB)
内容：カードのアクティビティログを非表示してコメントのみ表示することが出来ます。

URL：[Next Step for Trello](https://chrome.google.com/webstore/detail/next-step-for-trello/iajhmklhilkjgabejjemfbhmclgnmamf)
内容：チェックリストをカードを開かなくてもチェックすることが出来ます。

URL：[Trellists: Trello Lists Master](https://chrome.google.com/webstore/detail/trellists-trello-lists-ma/dgnlcodfeenegnifnpcabcclldoceeml?hl=ja)
内容：リストの表示、非表示を切り替えることが出来ます。可読性があがります。
#### ＝＝＝＝＝＝　非表示前　＝＝＝＝＝＝＝＝
<img width="893" alt="hege.png" src="https://qiita-image-store.s3.amazonaws.com/0/67649/926cda0e-0e0e-d507-3da7-245b73bf5fd7.png">
#### ＝＝＝＝＝＝　非表示後　＝＝＝＝＝＝＝＝
<img width="754" alt="hege2.png" src="https://qiita-image-store.s3.amazonaws.com/0/67649/34db631d-650c-14e1-68b0-386788764e6e.png">
# ６．最後に
他にも、いろいろと便利なChrome拡張機能があると思いますので、探してみてください。また、Trelloにはパワーアップという拡張（無料だと１個まで）があるのですが、そちらは、今後、触ってみて紹介したいと思います。
yarn <command> と npm <command>

# はじめに

`yarn <command>` と `npm <command>`で分かったことをメモ。

# TL; DR;

- `yarn <command>`
  - `yarn -h`で出てくるサブコマンド一覧にないものなら、`scripts`を`run`無しで呼べる。
- `npm <command>`
  - `start`は`scripts.start`の中身を実行してくれる
  - その他は`npm run`じゃないとダメ。(**多分**)

以下のような`package.json`があったとする。

# ちょっとした実験
```package.json
{
  "name": "hoge",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "echo 'start was called'",
    "build": "echo 'build was called'",
    "hello": "echo 'hello was called'"
  }
}
```

これに対して、各scriptに対して、`yarn`と`npm`で`run`なしで呼んで見る。
○、×はスクリプトが実行されたかどうか。

|script|yarn|npm|
|------|----|---|
|start |○   | ○ |
|build |○   | × |
|hello |○   | × |

# まとめ
yarnのほうが短くて便利だと思った。