OmniAICreator/Qiita-1.07M huggingface dataset:
GITコマンド

サーバー上で、修正を反映する時に使うgitコマンドメモです。

###ブランチ確認

```
git branch
```

全部ブランチ一覧

```
git branch -a
```


###状況確認

```
git status
```

###スタッシュ
```
git stash save "your comment"
```

###プル
```
git pull origin master
```


###ブランチ切り替え

```
 git checkout [ブランチ名]
```

※単体ファイルのみ戻す

```
git checkout [ファイルパス]
```


###フェッチ
リモートにあるブランチを最新のものに更新します

```
git fetch
```

### ログ確認
git履歴から対象の文字列(-S メッセージから)を探します

```
git log -S"hogehoge"
```

※対象ファイルを絞る場合

```
git log -S"hogehoge" ./test.java
```

### クローン 
対象のリポジトリを自分の環境（ローカル）にもってきます

```
git clone [クローンしたいリポジトリ] [クローン先のディレクトリ(省略可)]

```

### 削除

マージ済みのブランチのみ削除

```

どちらも同じ
$ git branch --delete [ブランチ名]
$ git branch -d [ブランチ名]

```

マージ済みのブランチのみ削除ができる
マージされていないブランチを削除しようとすると下記のようなエラーがでます
（error: Cannot delete the branch 'ブランチ名' which you are currently on）
マージされていないブランチを削除したいときは削除コマンド2を

強制削除

```
$ git branch -D [ブランチ名]
```

どんなローカルブランチも削除できる

### その他
###### Git で現在のコミット分調べる
https://gotohayato.com/content/85

```
git rev-parse HEAD
```

###### Git 現地点まで差分とるコマンド
```
git archive --format=zip --prefix=archive/ HEAD `git diff --name-only [コミットナンバー] HEAD --diff-filter=ACMR` -o archive.zip
```


https://gotohayato.com/content/85/
Rust言語（install~hello_world!)

#はじめに
はじめてのRustプログラムでの開発環境構築（Windows）についての記事です。
Rustではない言語、コマンドライン（コマンドプロンプト）の操作がある程度なれている人に対してです。

#Rustのインストール
Rustのページそのままの操作です。簡単です。
https://www.rust-lang.org/learn/get-started
上記にアクセスし、__RUSTUP-INIT.EXE__のダウンロードを行ってください。

その後、そのファイルを実行し、

```Rust is installed now. Great!```

と表示されれば、インストールの完了です。

#「Hello World!」の表示(vscode)
Visual Studio Code上での操作になりますので、vecodeのインストールがまだな人は別の投稿、記事を参照してください。

コマンドライン(cmd)を開きます。
rustup-init.exeの存在する同フォルダで、

```
mkdir ~/sample
cd sample
mkdir hello_world
cd hello_world
```

上の2行分に関しては、先にフォルダを自分で作成してもらっても大丈夫です。

次にvscodeを開いて、
__Extensionsマーク__または__Ctrl+Shift+X__を押して、EXTENSIONS:MARKETPLACEを開きます。
そこで、"__rust(rls)__"を検索
上記のものをインストールし以下のことを行ってください。

①__Ctrl＋N__
を押してソースコードの新規を作成。
②__Ctrl＋S__
で先に保存しましょう。

保存名は、__sample.rs__としておきます。
③また、保存した後に、中身を入力します。プログラムの基本的な環境構築ができてるか確認するための操作として、「Hello Wolrd!」の表示をします。

```
fn main(){
    print("hello world!");
}
```

または

```
fn main(){
    println!("hello world!");
}
```
と書いてください。文法的には今回はどちらでも実行されると思います。
④プログラムを打ったら、右上の__Run Codeボタン__（三角形のマーク）を押すか、__Ctrl+Alt+N__を同時に押すと、実行されます。
その他にも、task runなどもありますが一番簡単でしょう。


今回は、プログラム初心者でなければすぐできるであろうものだと思いますが一応まとめておきます。
Streamの生成処理

Java8から導入されたStreamAPI
Collectionの操作に便利な処理がたくさんある
（いまさらになるが）メモ的な感じで列挙していこうと思う。

StreamAPIとは
Stream自体はListやMapなどのCollection要素ではなく、配列やリストなどの要素に対して生成処理、中間処理、終端処理を加えて新しい要素に置き換えるためのパイプラインのようなものという認識

## Stream#of

```java
Stream<String> stream = Stream.of("a","b","c");
```

## Collection#stream

Listからの生成

```java
List<String> list = Arrays.asList("a","b","c");
Stream<String> stream = list.stream();
```

Mapからの生成

```java
Map<String,String> map = new HashMap<>();
Stream<Entry<String,String>> stream = map.entrySet().stream();
```

## Arrays#Stream

```java
String[] array = {"a","b","c"};
Stream<String> stream = Arrays.stream(array);
```

## BufferedReader#lines

```java
BufferedReader reader = new BufferedReader(newInputStreamReader(System.in, directory));
Stream<String> reader.lines();   
```
Windowsで異なるバージョンのRubyを使う方法(uru)

※この記事は https://kunosu.qrunch.io/entries/JPto4xqEhbOYGRgj に移動しました。

---

普段は最新のRubyを使っているけど、Ruby on Railsなど環境によっては古いバージョンを使い分けたいときに。

- 環境
	- windows10
	- Ruby 2.5.5, 2.4.6
	- uru 0.8.5
- uru公式サイト: https://bitbucket.org/jonforums/uru/wiki/Home

## uruを導入する

### uru の準備

1. 使い分けたいバージョンのRubyをインストール
	- メインで使う方のバージョン(ここでは2.5)のみパスを通すと便利
	- 先に2.4のパスを通していた場合は環境変数を編集
		- 参考: [Qiita - Windows10で実行ファイルへのパスを通す手順](https://qiita.com/shuhey/items/7ee0d25f14a997c9e285)
1. [uru](https://bitbucket.org/jonforums/uru/wiki/Home) をダウンロードページからDL
	- DLリンク: [https://bitbucket.org/jonforums/uru/wiki/Downloads](https://bitbucket.org/jonforums/uru/wiki/Downloads)
	- `uru-0.x.x-windows-x86` をクリック
1. DLされた `uru-0.x.x-windows-x86.7z` を解凍
1. uru_rt.exeを適当なフォルダに移動
  - ここでは `C:\Tools\uru` に移動
1. コマンドラインで uru を使うため、移動した先へのパスを通す
1. コマンドラインで下記を実行

	```
$ uru_rt admin install
---> Installing uru into C:\Tools\uru
	```
1. 同じフォルダに uru.bat, uru.ps1 が生成されていることを確認

### Rubyへのパスをuruに登録

1. コマンドラインで下記を実行(Ruby2.4のパスを登録)

	```
# C:\Ruby24-x64\bin はRubyのDL先に合わせて変更
$ uru admin add C:\Ruby24-x64\bin
---> Registered ruby at `C:\Ruby24-x64\bin` as `246p354`
	```

1. Ruby2.5も同様に登録
1. 登録されたか確認

```
$ uru ls
246p354     : ruby 2.4.6p354 (2019-04-01 revision 67394) [x64-mingw32]
255p157     : ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
```

## uruを使ってみる

1. 現在はパスを通してある Ruby2.5 が使える状態

	```
$ ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
	```

1. uru で Ruby2.4 に切り替え

	```
# "246p354" は "uru ls" で出てきた文字列
$ uru 246p354
---> now using ruby 2.4.6-p354 tagged as `246p354`
	```

1. 以降はコマンドライン実行中なら Ruby2.4 になります

```
$ ruby -v
ruby 2.4.6p354 (2019-04-01 revision 67394) [x64-mingw32]
```

### バッチファイルに記載

uru自体がバッチファイルのため、`call` を先につける必要があります

```temp.bat
call uru 246p354

rem Ruby2.4で実行する
ruby temp.rb
```

### \.ruby-version ファイルでバージョン指定

1. \.ruby-version ファイルを作成
	- 普通にエクスプローラーで新規テキストファイルをリネームしようとすると「ファイル名を入力してください」と出てしまいます
	- これはテキストエディタで新規保存時に名前を指定すると回避できます
1. \.ruby-version ファイルには使いたいRubyバージョンのみを記載(Ruby2.4を使いたいとき)

	```..ruby-version
2.4
	```

1. `auto` オプションを使うと \.ruby-version に記載したバージョンに変更されます

```
$ uru auto
---> now using ruby 2.4.6-p354 tagged as `246p354`
```
ディレクトリ移動をするbashシェルスクリプト関数

よく使うディレクトリへの移動を簡単にするために
シェルスクリプトの関数を作ります。

# 作り方

1. シェルスクリプトの関数を作る
2. 起動時に関数を読み込むように、bashrcに記載する
3. bashrcを再読込する

## 1. シェルスクリプトの関数を作る
移動先のディレクトリを、仮に`home/myname/Documents/mywork`とします。  
以下のように、ディレクトリ移動をする関数を作成します。

```bash:mywork.sh
#!/bin/bash

function mywork() {
    cd /home/myname/Documents/mywork
}

```

## 2. 起動時に関数を読み込むように、bashrcに記載する

`~/.bashrc`に以下を追記します。

```bash:~/.bashrc
source スクリプト/への/パス/mywork.sh
```

## 3. bashrcを再読込する

```shell-session
$ source ~/.bashrc
```

# 使い方
作った`mywork`関数が叩けるようになっているので、ターミナルで叩けばOK。

```shell-session
$ mywork # /home/myname/Documents/mywork へ移動することができる
```


# 少し機能拡張
## 複数ディレクトリから選択する方法
よく使うするディレクトリが複数あるときは、
以下のように書くことで実現することができます。

```bash:mywork.sh
#!/bin/bash

function mywork() {
    # 移動したいディレクトリのリスト
    local WORKDIRS="
        /home/myname/Documents/myworkA
        /home/myname/Documents/myworkB
    "

    # 配列に格納する
    local WORKINGDIR_ARRAY=(`echo ${WORKDIRS}`)
    local DIRNUM=${#WORKINGDIR_ARRAY[@]}

    # ディレクトリ一覧を表示する
    local dir
    local i=0
    for dir in "${WORKINGDIR_ARRAY[@]}"
    do
        echo "${i}: ${dir}"
        i=$((i + 1))
    done

    # ディレクトリの選択を促す
    local n
    read -p "Select directory number: " n

    # 入力された値をチェックし、cdコマンドで移動する
    if [ ${n} -ge 0 -a ${n} -lt ${DIRNUM} ]; then
        cd "${WORKINGDIR_ARRAY[${n}]}"
    else
        echo "Invalid Number"
    fi
}

```

### 実行結果

```shell-session
$ mywork 
0: /home/takumi/Documents/myworkA
1: /home/takumi/Documents/myworkB
Select directory number: 0　　　　　# 0を入力する

$ pwd
/home/takumi/Documents/myworkA
```
0番を入力したので、`myworkA`ディレクトリに移動しています。

# 参考にした記事
- [shell scriptで現在のディレクトリを変更して移動する] (https://qiita.com/mattak/items/bd159863be10b0ae81d8)　(aliasを使う方法)
- [配列を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス](https://shellscript.sunone.me/array.html)
- [bash のビルトインコマンド “local” について](http://blog.tekito.org/2010/11/23/bash-%E3%81%AE%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-local-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
Terminalizerのススメ

なにげなく :military_medal:[JavaScript Open Source Award 2019](https://osawards.com/javascript/) を眺めてたら、[Terminalizer](https://terminalizer.com/)というターミナルの画面キャプチャツールが紹介されてて使いやすそうでした！

![hello_black_render.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90678/09c65d84-af8c-e9df-e054-de4a46f0709c.gif)

- :rocket: Node.jsが入ってれば `npx terminalizer` ですぐ記録・再生・公開できる
- :pick: 記録した後から内容を変更できる
- :art: デザインが変更しやすい
- :lifter: GIFに変換する時は若干重い(?)

## キャプチャの仕方

実際にTerminalizer自身でインストールから実行するまでをキャプチャしてみます。

```sh
# インストール
npm install terminalizer --global
# hogeという名前で操作の記録開始(Ctrl-Dで記録終了)
terminalizer record hoge
# hoge.ymlで保存された操作を実行
terminalizer play hoge
```

![test_black_render.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90678/b5fb4a13-7d0c-b457-a560-ceee83345d56.gif)

> 記録した時に**残したくない情報(プロンプトやディレクトリ、コマンドの結果とか)**はYAMLを直接編集して消せます!(逆に打ち間違えは残したり)

```diff:hoge.yml
records:
  - delay: 100
-    content: "\e]0;howking@pc:~/Downloads\a~/Downloads$" # 記録されているプロンプト
+    content: "~/$" # 簡潔なものに変更
```

## アニメーションGIFへの変換

保存されたYAMLファイルを指定して、下記のコマンドでGIFにします（ちょっと時間がかかる）。

```sh
terminalizer render hoge -o out.gif
```

このままだとファイルサイズが大きいので、[Gifsicle](https://www.lcdf.org/gifsicle/)を使って最適化をかけてます。

```sh
gifsicle -O3 --colors 32 out.gif > ani.gif # 3.9MB -> 391KB
```

## デザインの変更

右下に画像を配置できる(watermark)のと、僕は背景色は白派なので、YAMLファイルを下記のように修正して出力(render)してみると、、、

```yml:hoge.yml
# ウィンドウ枠の装飾を消して背景色を白とする
frameBox:
  type: null
  title: null
  style:
    backgroundColor: white
    border: 5px white solid

# 右下に画像を配置
watermark:
  imagePath: /home/howking/img/my_favorite_logo.svg

# フォントの種類や大きさを調整
fontFamily: "Inconsolata, MeiryoKe_Console"
fontSize: 14

# フォントの色は黒っぽく
theme:
  foreground: "#111111"
```

出力結果:
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90678/8bdd77a4-7744-aa2d-4f7f-63ed34b4085b.gif)

個人的にすっきりした表示にあとからでも変更できる(設定を保存もしておける)のが気にいりました! :clap_tone1::clap_tone1::clap_tone1:

[:christmas_tree: FORK Advent Calendar 2019](/advent-calendar/2019/fork)
:arrow_right: 02日目 @nag244 さんよろしくです。
[CSSハック]ブラウザによってレイアウトが崩れる対処法まとめ

#はじめに
先日私が、ホームページ作成中にぶつかった問題です。
ホームページが「できた！」と思い、他のブラウザで確認するとレイアウトがかなり崩れているという出来事がありました。
調べてみるとCSSハックというものが原因でした。
サイトを作成する上で必ず考慮しなければいけない項目となっているので初心者の方は必見です！


#CSSハックってなに？
サイトをCSSでデザインする時に出てくる問題というのが、ブラウザごとでCSSにズレが起きてしまうということです。特にmargin・padding関係はブラウザごとにサイトを確認してみると位置がズレでいることが結構あります。画像が消えてしまったりすることもあります。その中でも特に顕著なのがIE(Internet Explorer)でサイトを表示した時にレイアウトが崩れてしまっていることが多いです。
そんな時に使える各ブラウザ・OSに対応するためのCSSハックをご紹介します。

#各ブラウザに対応するCSSハック
以下の例では、bodyタグに背景色を指定するという命令を記述しています。

##IE11

```sample.css
_:-ms-lang(x)::-ms-backdrop, body {
    background-color: #aaa;
}
```

##IE10

```sample.css
@media all and (-ms-high-contrast:none) {
    body {
        background-color: #000;
    }
}
```

##Edgeのみ

```sample.css
@supports (-ms-ime-align:auto) {
    body {
        background-color: #bbb;
    }
}
```

##Chromeのみ
```sample.css
@media screen and (-webkit-min-device-pixel-ratio:0){
    body {
        background-color: #ccc;
    }
}
```

##Firefoxのみ

```sample.css
@-moz-document url-prefix(){
    body {
        background-color: #ddd;
    }
}
```

##Safariのみ

```sample.css
@media screen and (-webkit-min-device-pixel-ratio:0) {
    _::-webkit-full-page-media, _:future, :root body {
        background-color: #eee;
    }
}
```

#それでもレイアウトにズレが生じる場合
以上のようにCSSを記述してもCSSハックが生じる場合、次の対処法を適用することで直る可能性があります。

・IE11において 問題の出る要素の`display:flex`の記述をなくす
・問題の出る要素を囲っている `div` に `line-height` を指定する。
・問題の出る要素に `width` または `height` を指定する。
・問題の出る要素の中の要素に `position:relative` を指定する。
・`clear`で`float`を解除する

#さいごに
完璧だと思っていたレイアウトが崩れていた時は、イラッとしますが、根気強く1つ1つ対処していきましょう。
他にもCSSハックの対処法がありましたら教えてもらえると嬉しいです。
Donkey Carのプロポ対応その１（ハードウェア編）



Donkey Car操作を従来のジョイスティックに加えて、RCカーのプロポでの操作をするための手順を、「その１　ハードウェア編」、「その２　ソフトウェア編」、そして「その３　Donkey Car設定編」に分けて説明します。

その１　本ドキュメント
その２　https://qiita.com/arigadget/items/51bf75e19cd395ac9b2f
その３　https://qiita.com/arigadget/items/9396451d6837bbbed79d

### はじめに

プロポからの信号(1ms-2ms)をDonkey Carでのジョイスティックに変換するためにArduinoを使って、プロポーArduinoーRaspberry Piの構成で、データ変換をする一種のProxyを作ります。

### Arduinoの選定

HID(Human Interface Device)機能を持つ以下の３つが候補。

- Arduino Leonard（フォームファクターがArduino Unoに近い)
- Arduino Micro
- Beetle(形状がカブトムシのように見えるからか)

### プロポチャンネルとArduinoピンの割り当て

プロポからの信号を解析するのに、Arduinoライブラリの「pulseIn」と「Pin Change Interrupt」の２つの方法があるが、後者の方法を使います。使用できるピンは下の通り。

Arduino Leonardo/Micro: 8, 9, 10, 11, 14(MISO), 15(SCK), 16(MOSI)
Beetle: 9, 10, 11, 14(MI), 15(SCK), 16(MO)

https://github.com/NicoHood/PinChangeInterrupt

### 基板の作成例
上記のそれぞれのピン、５Ⅴ、GNDの順番で、必要なチャンネル分ピンを出しておき、RC受信機とはメスーメスのジャンパー線で結線します。

#### Arduino Micro

以下の写真のように、いろんなプロポとつなげやすくするために３ピンをならべておき、Raspberry Piとは、USBケーブルで接続します。



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/e12b9143-39c1-8df5-0229-415b11cea53a.jpeg" style="zoom:50%;" />


#### Beetle

Raspberry Piとは、USBコネクタに直接挿します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/f469322d-a526-136f-3e68-1f8af68c24ba.jpeg" style="zoom: 50%;" />

### 続き

次に、Arduinoのスケッチ開発について書きます。
Mac から Ubuntuへリモートデスクトップ接続する


Mac から Ubuntuへリモートデスクトップ接続した際の備忘録です。

## 環境
- Mac High Sierra
- Ubuntu 18.04 LTS
- プライベートネットワーク

## Ubuntuの設定
「設定」→「共有」→「画面共有」を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70558/bb04cc4a-6f88-57a8-5842-b2fc0706974a.png)


暗号化を解除

```
$ gsettings set org.gnome.Vino require-encryption false
```

IPアドレスの確認

```
ip a
```
ポートが開いているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70558/6f8fe37e-a8ea-b6d5-a714-8ec5a96daf83.png)


## Macから接続
 1. finderを開く
 1. `⌘+k` で開いたウインドウにipアドレスとポート番号を入力
 1. 接続



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70558/3c1fedeb-4658-0da1-fb8a-60c76031060e.png)


以上です。

## 参考
デスクトップUbuntuにVNC接続。ついでにSSHローカルポートフォワードの復習。https://blog.mosuke.tech/entry/2015/08/13/000440/
別のMacを操作する方法 - 画面共有 https://pc-karuma.net/mac-screen-sharing/
Windows10もしくはMacOSからUbuntu 18.04 LTSにリモート接続（リモートデスクトップ）してみたhttp://imamachi-n.hatenablog.com/entry/2018/04/28/211147
【初心者向け】Linux PCのIPアドレスを確認する方法まとめ https://linuxfan.info/ip-address
Macの画面共有(Screen sharing)とGNOME VinoでVNC接続する https://leico.github.io/TechnicalNote/Linux/screen-share
カゴヤVPSでnginxしようとしたら詰まった話

# TL;DR
カゴヤVPSを契約して、Webサーバ(nginx)を立てて、ページを公開しようとしたら詰まったのでメモ。
原因はfirewalldで、アンインストールして解決した。
# 環境
カゴヤVPS KVMインスタンス(2core, 2GB mem)
デフォルトのDebian7 → Debian9にアップグレード済み
nginx がインストール済み
# 実際の操作
### nginxのセットアップ
```shell:shell
service nginx start  // nginxの起動

systemctl status nginx  // nginxの起動確認、activeならok
```
### ufwでポート制限
```shell:shell
// rootで実行
apt install ufw  // ufwのインストール

systemctl start ufw  // ufwの起動

ufw default deny  // 全てのポートを閉じる

ufw allow (ssh用のポート)  // ssh用のポート確保

ufw allow http  // 80/tcpを許可

ufw allow https  // 443/tcpを許可

ufw reload  // 設定の再読み込み
```
### 問題発生
ブラウザでページが開けない。

```shell:shell
ufw status  // ufwの設定を再確認
```
設定を確認してみたが、問題は見つからない。
そこで、クライアント側からnmapを実行

```shell:shell(クライアント)
nmap (vpsのipアドレス)  // サーバの空いているポートを確認
22/tcp   open   ssh
80/tcp   closed http
110/tcp  closed pop3
143/tcp  closed imap
443/tcp  closed https
465/tcp  closed smtps
587/tcp  closed submission
993/tcp  closed imaps
995/tcp  closed pop3s
1688/tcp closed nsjtp-data
```
ここで、ssh用の22番ポートしか空いていないことが判明。
原因を色々探してみる。

```shell:shell
iptables -L

~
Chain IN_public_allow (1 references)  <- 怪しい
ほにゃらら
~
```
iptables を見たら、見覚えのない設定がある。
何か他のfwが動いているのでは？となったので、適当に覚えている名前をwhichしていると、firewalldがヒット。
そこで、

```shell:shell
apt purge firewalld  // firewalldをアンインストール
```
したら解決した。
# まとめ
公式のDebian serverにはデフォルトでfirewalldは入ってなかった？気がするので、カゴヤのデフォルトのDebianイメージは何かしらのカスタマイズがされていたのかもしれない。カゴヤは料金が日割りなのでいろんなVPSが試せてよさみがよさみ。
Linuxで圧縮するし、解凍もしよう

Windowsだったら圧縮も解凍も適当にポチポチしてたら出来るのにLinuxはちょっと経てばすぐコマンド忘れちゃうんだから。

じゃけんまとめて置いときますね。
#<font color="red">ファイルの</font>圧縮&&展開コマンド
|拡張子|圧縮コマンド|展開コマンド|
|-----|----------|----------|
|.zip|zip|unzip|
|.gz|gzip|gunzip|
|.bz2|bzip2|bunzip2|
.zip以外の圧縮ファイルは、展開すると自動的に圧縮ファイルが削除されます。便利便利。

解凍はファイルにあったコマンドを選べばいいだけですが、圧縮するときに3つもコマンドあったら優柔不断な僕らは困っちゃいますよね。
でも大丈夫、迷わずいつでも`bzip2`を使おう。

圧縮率ランキングは

```bash
(高い) bzip2 > gzip > zip (低い)
```

みたいな感じになってるのでよしなに^~

#<font color="red">ディレクトリの</font>圧縮&&展開コマンド
ディレクトリの圧縮では、まずはディレクトリを1つのファイルにまとめることから始めます。このディレクトリがまとまってできたファイルを**アーカイブ**といいます。

ちなみにこのアーカイブ、書庫って意味があるんだとか。この書庫のイメージあるとhelpが読みやすいよ。多分ね。
以下のコマンドで`hogedir`で`archive.tar`を作ります。

```bash
$ tar cvf archive.tar hogedir
```
見ての通り`tar`コマンドにはオプションに`-`が必要ありません。

オプション解説
* c -> アーカイブを作成する
* v -> アーカイブの内容を表示
* f -> アーカイブファイルを使用
今回使ったのはこれだけだけど、`tar`コマンドにはディレクトリやファイルをアーカイブに追加したり除外したり、リストにしたりなんか色々あるから気になったらhelp読もう!きっと楽しいよ(真顔)

ちなみにアーカイブ≠圧縮です。圧縮するときは`tar`コマンドに`z`または`j`オプションをつけます。
`z`でgzip圧縮、`j`でbzip2圧縮です。

```bash
tar cvfz hogedir.tar.gz hogedir
```
three.meshlineを使うときにaddAttributeが更新されていなかった

# 困ったこと
yarnを使って`three.meshline`をインポートしたときに、下記エラーがでてきて困った。
three.js内でつかわれている`addAttribute()`が`.setAttribute()`に変更されたが,[meshline](https://github.com/spite/THREE.MeshLine)の方で更新されていなかったため起こったようだ。

## 使っているライブラリのバージョンメモ

```
"three": "^0.110.0",
"three.meshline": "^1.2.0"
```

## エラー内容

```
.addAttribute() has been renamed to .setAttribute()
```

# 対策
すでにPRは立てられているが、これがマージされるまでは
https://github.com/spite/THREE.MeshLine/pull/92/files

`node_modules/three.meshline/src/THREE.MeshLine.js`のなかで下記のように書き直せば使える。

```js
this.geometry.setAttribute( 'position', this.attributes.position );
this.geometry.setAttribute( 'previous', this.attributes.previous );
this.geometry.setAttribute( 'next', this.attributes.next );
this.geometry.setAttribute( 'side', this.attributes.side );
this.geometry.setAttribute( 'width', this.attributes.width );
this.geometry.setAttribute( 'uv', this.attributes.uv );
this.geometry.setAttribute( 'counters', this.attributes.counters );
```
基本情報で必要な数学(2進数その2)

#2進数で補数の計算
その2では補数の計算について紹介します。ちなみに、どうしても苦手なら飛ばしてもいいかもしれません。基本情報の場合、午前試験では毎回数問、午後試験ではほとんど使わないと思います。
##補数ってなに?
ちなみに補数を最初に考えた人ってすごいと思いました。補数を使えば、引き算を足し算で行うことが出来ます。このテクニックで、コンピュータに足し算の機能のほかに引き算の機能を追加せずに済んだわけです。引き算の答えを足し算ではじき出すのですからね。反対のことをして答えを出すってすごいと思いました。では補数を紹介していきましょう。
###10進数の補数
では、まずは10進数で補数を考えましょう。普通に引き算を考えます。
$$
618 - 271 = 347
$$
なんてことない引き算です。ではこれを補数のテクニックを使ってやってみましょう。
$$
618 - 271 = 618 - 271 +1000 -1000
$$
これを計算します。
ちなみに。$1000-1000$は結局$0$ですから、足し算をしても結果は変わらないです。
まず、真ん中の2つです。
$$
-271 + 1000 = -271 + 999 + 1 = 728 + 1 = 729
$$
**なぜ、ここで$1000=999+1$にしたかというと、桁の繰り下がりとかを気にしなくてよくなるからです。
筆算をしなくてよくなります。これは暗算テクニックです。ただし、2進数でも同様のことをやるので要注意です。**
ではつぎの計算です。
$$
618 + 729 -1000 = 1347 -1000 = 347
$$
となります。まあ、当然同じ結果になるわけですが。。。
それでは、このとき,
$$
1000-271 = 729
$$
が補数です。この補数を足して、一番うえの桁に出てくる$1$を無視すると同じ計算になるのです。
10進数ではそんなに効果はないです。では、2進数ほ考えてみましょう。実は2進数では補数が威力を発揮します。
###2進数での補数
簡単な例題から考えましょう。ここからは、**数字は2進数です。**
$$
111 - 10 = 101
$$
ですが、補数を考えましょう。
ちなみに、計算では最大3桁なので3桁での補数を考えます。

```math
\begin{eqnarray}  
111 - 10 &=& 111 - 10 + 1000 - 1000\\
 &=& 1000 -10 + 111 -1000 \\
 &=& 111 + 1 - 10 + 111 - 1000 \\
 &=& 101 + 1 + 111 - 1000\\
 &=& 110 + 111 - 1000 \\
 &=& 110 + 111 - 1000 \\
 &=& 1101 - 1000 \\
 &=& 101
\end{eqnarray}
```
ここで$10$(ここでは3桁であることをはっきりさせるために$010$と書きましょう)の補数は
$110$です。このとき実は$010$補数$110$はつぎの2ステップで求めることが出来ます。
>1. 各桁の0と1をひっくり返す。
2. それから、1を足す。(**2進数なので、各桁には1か0しかないです。**)

じつはこれだけです。計算を丁寧にやれば何行もかかりましたが、2進数の場合はこんなに簡単に求めることが出来ます。じつは、上で協調した計算テクニックが効いてるのです。「**2進数なので、各桁には1か0しかないです。**」という特徴のため、0と1をひっくり返すだけになるんです。
![qiita 1(2進数の補数).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531515/1e90f94a-30b8-d75b-7ae9-e0c1be8db3a2.png)
もちろん、最後に$+1$は忘れないでください。
ちなみに、参考書的な言葉で言うと
> $+1$する前を1の補数
$+1$した後を2の補数といいます。

ちなみにコンピュータ的にいうと一番上の桁を$+$や$-$に使ったりします。
$1$が$-$で$0$が$+$です。
なので、$+$の数を一番上以外の桁で考えて$-$をその1の補数や2の補数で考えます
4桁の場合が次の表になります。

|10進数|$+$の2進数|1の補数|2の補数|
|----|----|----|----|
|0|0000|1111|(1)0000(5桁目は無視)|
|1|0001|1110|1111|
|2|0010|1101|1101|
|3|0011|1100|1101|
|4|0100|1011|1100|
|5|0101|1010|1011|
|6|0110|1001|1010|
|7|0111|1000|1001|
|8|1000|0111|1000|
ちなみに、8を見てください。4桁目が$+$では$1$、$1$の補数では$0$となっており、逆転してしまいました。なので、$1$の補数は実は8では使えません。しかし、$2$の補数では使えます。
これが、ややこしいところです。
フィボナッチってどーなってる？(私は分かりません）

AIACADEMYから


n = 100
a, b = 0, 1
while a < n:
    print(a, end=" ") # endはオプションでスペースを1ついれている処理をしていますが、空白を入れて見やすくしています。
    a, b = b , a + b



この答えを見ると


あーー
横同士を計算して答えを書いて
次は
その答えと横を計算して
答えを書いての繰り返しか。

てゆーのはわかるけど

どのタイミングで
計算されたのがさっぱり分かりません。

n = 100
a, b = 0, 1
while a < n:
    print(a, end=" ") 
    a, b = b , a + b

printの下にいてるときは今aはなになのか
bは何なのか。

上のwhileにいる時点ではaとbは何なのか。
分からん。

本当に困っています。
Rails開発する前にやっておくべきこと＆便利なこと【備忘録】

# 背景
新しいアプリを開発する際、毎回忘れるので備忘録として

# rails new オプション
##### ※以下sample_appsというアプリを作成する場合

```
$ rails _5.2.2_ new sample_apps
railsバージョン5.2.2で作成する
```
```
$ rails new sample_apps --database=使用するSQL名
SQLを指定し作成する
```
```
$ rails new sample_apps --skip-test
自動テスト機能を使用せず作成する
```
```
$ rails new sample_apps --skip-bundle
bundle install を初回実行せず作成する
```

# Git
git initをしておきコミットしておく。

```
$ git init
$ git add .
$ git commit -m "init Rails Project"
```

# データベース作成
```
rails db:create
```

# ジェネレータの設定
ModelやControllerなどを作成する際、不要なものを自動生成しないため、下記のように設定する。

```:config/initializers/generators.rb
Rails.application.config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.skip_routes true
end
```
# ページネーション
###### ※ページネーションを利用する場合

```:Gemfile
gem 'kaminari'
```

```
$ bundle install

$ rails g kaminari:views bootstrap4
ページネーションのデザイン調整
```

bootstrap4以外のデザインは、下記に多彩にありますのでお試しください。
https://github.com/amatsuda/kaminari_themes
  
  
  
以上
cronを使ってバッチ処理を実行

# バッチ処理とは
どこかのタイミングで処理をまとめて行う

# cronとは
> ジョブを自動実行するためのデーモンプロセス（バックグラウンドプロセス）

cronを設定するのが`cronコマンド`

>[初心者向けcronの使い方](https://qiita.com/tossh/items/e135bd063a50087c3d6a)

# 【実例】ある時間に定期的にメールを送る

`mb_send_mail`関数
日本語などのマルチバイト文字を扱ってメールの送信が可能
>mb_send_mail(string $受信者, string $タイトル, string $本文[, string $追加ヘッダ[, string $追加パラメータ ]])

```cron.php
<?php
mb_language("Japanese");//日本語のメールを送る場合に必要
mb_internal_encoding("UTF-8");//日本語のメールを送る場合に必要

$to      = 'example@hello.com';//宛先
$subject = 'はじめてのcron';//件名
$message = 'ある時間になると定期的にメールを送るよ';//本文
$headers = 'From: example@world.com' . "\r\n";//追加ヘッダー

mb_send_mail($to, $subject, $message, $headers);
```

**cronコマンド**

```
0 10 * * * /usr/bin/php home/www/cron/cron.php
```

実行する時間を指定して、実行するPHPファイルを絶対パスで指定
PHPファイルを実行するには`/usr/bin/php`もしくは`/usr/local/bin/php`をファイル名の前に記載する。
【AWS EC2】mysqlにログインできない時最後に見る記事　for mac【凡ミス系】

#コトの顛末
パスワードが間違っている地獄に陥り、探っている中でOSの罠のような事案が発生。
パスワード設定の仕方のプロセスに罠があり、ハマってました。

#こんな注意文言が出ました。
まずはじめに、mysqlのパスワードを設定した時に

```console
$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'xxxx'
Warning: Using a password on the command line interface can be insecure.
```
Google翻訳するとこんな感じの返答がきました。

**警告：コマンドラインインターフェイスでパスワードを使用することは安全ではありません。**

私はこれを「直打ちするとミスるからやめようね」って意味だと思って、
メモ帳でパスワードをシングルクォーテーション内に入れたコマンドをあらかじめ作ってペーストするコトで**安全**なんだって思ってました。

本来の意味は**「直に書いていることがセキュアじゃない！！というWarningで、パスワードの部分をconfファイルに書き出すといいよ」**とのメタファーらしいです。

参考記事：[スクリプトでmysqlコマンドを実行すると「Warning: Using a password on the command line interface can be insecure」](https://beyondjapan.com/blog/2016/08/mysql56-warning/)

##後ほどパスワード変更しようと思った
いろんなサービスログインによく使う**私パスワード**みたいなものがあると思うのですが、
それをパスワードに設定してしまい、
「これってチーム学習の時とか使い回しされるのかな？怖いな。」と思い、途中で変更を行いました。

そう、**メモ帳にまずパスワード入りのコマンドをこさえて、それをペーストしたのです。**
そして、その後急にpasswordが通らなくなりました。

こんなエラーが出たんです。

```console
[ec2-user@ip-XXX-XX-XX-XXX ~]$ mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

おかしいな？aとe間違ったかな？-(ハイフン)入れたかな？など候補を打ち込んでみても、
突っ返されるだけ。どうして？
こんなことに何時間も時間を割いてしまいました。

インスタンス作成から３回やり直しました。

##原因はアレ
お気付きのかたもいるかと思いますが、原因はmacのメモ帳（風評被害）。
パスワードを設定するコマンドですが下記のコマンドですよね。

```console
$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'xxxx'
```

**password 'xxxx'**ここの部分なんですが、メモ帳でこさえると、

```sh
sudo /usr/libexec/mysql56/mysqladmin -u root password ‘xxxx’
```

**password ‘xxxx’**こんな感じで、シングルクォーテーションがアポストロフィーに変換されてしまっているんです。

ログを見返していて、

**password ‘xxxx’**

ん？これはなんですのん？

って思い、ログインパスワード入力を「‘xxxx’」で入力したら**無事にログイン**

遠くを見つめたくなるバグがよく起こるので、意外と視力は落ちてないんですよ。
遠くを見るって大切なことなんだと思います。（遠い目）

##結局こうなった。
パスワード変更のコマンドを打ってアポストロフィで括られた「‘xxxx’」を入力しようとするとエラー。
なんだかペーストがうまく行ってないよう。
入力されている状態も表示されないので困りました。
なので４度目のインスタンス生成をしましたとさ。

第４（死）ラウンド...成嶋...うっ頭が！

#終わりに
タイトルにもあるように「mysqlにログインできない時最後に見る記事」として、
エラーの理由ヒエラルキーの中でも底辺だと思ってます。
こんなのばっかりなのでもう恥ずかしさは痙攣麻痺です。

**めげずにお互い頑張りましょう！！！**

#参考記事
EC2でMYSQLに問題があるようでサーバーが起動しない
https://qiita.com/tanakayo/items/785b93e5c3c075aec7b6
vue.config.jsの活用例

## 前提
フロントエンド側をSPAフレームワークを活用して、ウェブサービス・ウェブアプリケーションを開発する際、昨今はRuby on RailsやLaravelなど流行りのバックエンド言語・バックエンドフレームワークと掛け合わせて制作すると思います。
初期開発時にプラグインとしてバックエンド環境に予めVueやReactを実装し、導入しやすくなってきている為です。

今回のプロジェクトでは、Javaを使用しまたディレクトリも分けた状態で開発をした為そういったプロジェクト向けの記事として呼んでいただけますと幸いです。

## ログイン機能
おおよそのウェブサービスにあるように今回開発したプロジェクトでもログイン機能がありました。
ログイン画面とログイン処理の責務はJava側で持たせています。
ViewはJavaのテンプレートエンジンのThymeleafを使用しています。

ログイン後、所定のtokenやcookieをブラウザ側に保持させダッシュボードへと繊維します。
ダッシュボードから先の画面および処理はSPA側の責務です。

## 開発環境での課題
今回のプロジェクトでは前述した通り、Java側とディレクトリが分かれた状態でスタートしています。
つまり、それぞれの開発環境を立ち上げるコマンドもホストも分離した以下の状態になっていました。
**Java**
- Project起動
- localhost:8080にアクセス
**Vue.js**
- `$ yarn serve`起動
- localhost:8888にアクセス

この為、APIの結合の確認もログイン画面からの繊維およびログイン評価が否定だったときのリダイレクト処理などあらゆる結合関係がローカルで確認することが容易にはできませんでした。

## 解決策
vue.config.jsのproxyに記載することで解決できました。

```javascript
module.exports = {
  devServer: {
    port: 8888,
    disableHostCheck: true,
    host: 'localhost',
    proxy: {
      '/api': {
        target: 'http://localhost:8080'
      },
      '/top': {
        target: 'http://localhost:8080'
      },
      '/login': {
        target: 'http://localhost:8080'
      }
    }
  },
}
```

## まとめ
今回のようなシーンはあまり、ないかもしれませんがもし似たようなシーンがあれば参考にしてみてください。
もし、他に良い解決策をご存知の方はコメントでご教示いただけますと幸いです。
Hyperledger Fabric 開発メモ

#はじめに
Hyperledger Fabricを用いた開発をしていて、気になった点をメモしていく。
執筆中。

#インストール
[Install Samples, Binaries and Docker Images](https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html)の以下のコマンドが何をやっているか

```
curl -sSL http://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
```

- [hyperledger/fabric-samples](https://github.com/hyperledger/fabric-samples)のレポジトリをclone
- バージョンを指定した場合はそのバージョンのbranchにチェックアウト
- Fabric固有のツールのバイナリファイルと設定ファイルをそれぞれ``/bin``、``/config``ディレクトリにインストールする
- docker imageがインストールされる

``/bin``には以下のバイナリファイルが入る

- configtxgen
- configtxlator
- cryptogen
- discover
- idemixgen
- orderer
- peer
- fabric-ca-client

以下のdocker imageがインストールされる

- fabric-tools
- fabric-ca
- fabric-ccenv
- fabric-orderer
- fabric-peer
- fabric-javaenv
- fabric-zookeeper
- fabric-kafka
- fabric-couchdb
- fabric-baseos

#証明書
`` fabric-samples/first-network``の``crypto-config.yaml``を変更するとどのordererやpeerの証明書を作成するかを指定できる。

#configtxgen
 ``configtxgen``ツールを用いて、configtx(トランザクションの設定）の作成を行う。

#チャネルの作成
``peer channel create``コマンドを用いてチャネルの作成を行う。
configtxを読み込んで、指定された管理者ユーザーとして署名し、注文者に送信する。

#参考文献リスト
- ネットワーク起動
    - https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html
    
- fabric-samples
    - https://github.com/hyperledger/fabric-samples
- fabcar
    - https://hyperledger-fabric.readthedocs.io/en/release-1.4/write_first_app.html
    - https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-6/index.html?ca=drs-
- チェーンコード周り
    - https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-5/index.html?ca=drs-
    - https://hyperledger-fabric.readthedocs.io/en/release-1.3/chaincode4noah.html#installing-chaincode

- API周り
    - https://openblockchain.readthedocs.io/en/latest/API/CoreAPI/
ゼロから作るDeep Learningで素人がつまずいたことメモ:2章

# はじめに
ふと思い立って勉強を始めた[「ゼロから作るDeep LearningーーPythonで学ぶディープラーニングの理論と実装」](https://www.oreilly.co.jp/books/9784873117584/)の2章で私がつまずいたことのメモです。

実行環境はmacOS Mojave + Anaconda 2019.10です。詳細は[このメモの1章](https://qiita.com/segavvy/items/1945aa1a0f91a1473555)をご参照ください。

（このメモの他の章へ：[1章](https://qiita.com/segavvy/items/1945aa1a0f91a1473555) / 2章 / [3章](https://qiita.com/segavvy/items/6d79d0c3b4367869f4ea) / [4章](https://qiita.com/segavvy/items/bdad9fcda2f0da918e7c) / [5章](https://qiita.com/segavvy/items/8707e4e65aa7fa357d8a) / [6章](https://qiita.com/segavvy/items/ca4ac4c9ee1a126bff41) / [7章](https://qiita.com/segavvy/items/8541c6ae1868d9b2b805) / [8章](https://qiita.com/segavvy/items/3eb6ea0ea2af68c96fcf) / [まとめ](https://qiita.com/segavvy/items/4e8c36cac9c6f3543ffd)）

:::note info
この記事は個人で作成したものであり、内容や意見は所属企業・部門見解を代表するものではありません。
:::

# 2章 パーセプトロン
この章はパーセプトロンの説明です。

# 2.1 パーセプトロンとは
特につまずくところはなかったのですが、なぜニューロンと呼ぶのか？などの背景がもう少しあった方が丸暗記するより面白いかと思いましたので、わかる範囲で少し補足してみます。

1943年に神経生理学者・外科医のマカロックさんと論理学者・数学者のピッツさんがタッグを組み、脳の神経細胞をコンピューターで実現するモデルを考えました[^1]。脳の仕組みを調べてコンピューターでマネすれば、ヒトと同じように思考できるAIが完成するはず！そんな奇想天外なアプローチです。

ヒトの脳は、複数の神経細胞が複雑に結びついてネットワークを形成していることが分かっています。この個々の神経細胞のことを英語でneuron（ニューロン）と呼び、この神経細胞をコンピューター上で実現しようとしたモデルの1つがパーセプトロン（人工ニューロン、単純パーセプトロン）です。パーセプトロンの説明でニューロンという言葉が出てくるのはそのためです。

神経細胞は他の神経細胞から電気信号を受けて、それが一定量を越えると一瞬だけ発火状態（興奮状態）になり、別の神経細胞にそれを伝えます。パーセプトロンの仕組みはまさにそれを表現しています。入力信号$ x_1 $や$ x_2 $は他の神経細胞からの入力を示し、重み$ w_1 $と$ w_2 $は他の神経細胞からの発火状態の伝わりやすさを示し、閾値$ \theta $は自身の神経細胞がどれくらいの信号を受けると発火するのかを示しているわけです。

また、ヒトの脳を実現すべく複数の神経細胞（ニューロン）によるネットワークをコンピューター上で実現しようとしたのが、次の章に出てくるニューラルネットワークです。

ヒトの脳をマネしようというアプローチが面白いですよね。なお、ヒトの脳の仕組みはまだ解明されていないので、世の中のアルゴリズムもヒトの仕組みを忠実に再現しているわけではありませんし、AIの研究者の方々もヒトの脳を忠実に再現することにはこだわっていないみたいです。

# 2.2 単純な論理回路
ニューロン1つだけでは大したことはできませんが、ロジックは変えずにパラメーターの$ w_1 $と$ w_2 $と$ \theta $を変えるだけで、AND、OR、NANDという3種類の計算が実現できるのは面白いです。

# 2.3 パーセプトロンの実装
バイアス$ b $の登場が少し混乱しますが、自身の発火しやすさを示すという意味では$ \theta $と変わらないので、式の表現が違うだけということであまり深く考えずに進みましょう。

# 2.4 パーセプトロンの限界
本にあるように、XORの◯と△は、どうがんばっても直線では実現できません。ニューロン1つのパーセプトロンではここが限界です。

なお、線形と非線形という言葉は、本にあるように直線で分けられる／分けられないくらいの理解で先に進めば良さそうです。

# 2.5 多層パーセプトロン
多層になるとXORが実現できたように、できることが増えることが分かりました。

# 2.6 NANDからコンピュータへ
NANDだけでコンピューターも作れるという話はイマイチ分からなかったのですが、紹介されている「NANDからテトリスへ」の本が解決してくれそうです。今はとても手を出す余裕がないのですが、機会があれば読んでみたいと思います。

# 2.7 まとめ
2章も大きくつまずくことはありませんでした。

この章は以上です。誤りなどありましたら、ご指摘いただけますとうれしいです。
（このメモの他の章へ：[1章](https://qiita.com/segavvy/items/1945aa1a0f91a1473555) / 2章 / [3章](https://qiita.com/segavvy/items/6d79d0c3b4367869f4ea) / [4章](https://qiita.com/segavvy/items/bdad9fcda2f0da918e7c) / [5章](https://qiita.com/segavvy/items/8707e4e65aa7fa357d8a) / [6章](https://qiita.com/segavvy/items/ca4ac4c9ee1a126bff41) / [7章](https://qiita.com/segavvy/items/8541c6ae1868d9b2b805) / [8章](https://qiita.com/segavvy/items/3eb6ea0ea2af68c96fcf) / [まとめ](https://qiita.com/segavvy/items/4e8c36cac9c6f3543ffd)）

[^1]: [ウィキペディア：形式ニューロン](https://ja.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%AD%E3%83%B3)より
Pycharmをインストールした後、Pleiadesでの日本語化に失敗してPycharmが起動しない時の対処法（Mac)

djangoを勉強するのに、Pycharmがいいと聞いたので、早速インストールしてみました。
起動してみると英語だらけで拒否反応が出たため、日本語化できると聞いて、以下のサイトから
Eclipse2019−9のPleiades Full EditionをDL、インストールしました。
これでいいのか？とよく理解しないままとりあえず進める。
http://mergedoc.osdn.jp/


そして、Pycharmの「Configure」　→　「Edit Custom VM Optionｓ..」の順にクリック。
以下、画面末尾にPycharmのインストールフォルダのパスを入力すると記事に書いてあったけど、Macのフルパスって、どうやって取得するんだろう・・・？最近までゴリゴリのWindowsユーザーだったため、よくわからず。

<img width="470" alt="スクリーンショット 2019-11-17 19.56.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473245/2a57e9b9-dbbd-d712-6a84-d60db1981222.png">

後で調べよーっと思い、とりあえず、適当に「アプリパス」って入力して、一旦Pycharmを終了。

その後、起動しようとしたところ、Pycharm画面が表示されず・・・？

ん？

え？

色々調べてみたところ、先ほどの画面で２バイト文字を入力すると起動不可になるという記事を発見。
まじかー。（後日談：２バイト文字以外の適当なアルファベット入れても起動しなくなりました）
素人考えで、とりあえず再インストールすりゃなおるだろうと思って再インストール。
でも起動せず。エラーメッセージも表示されずに無反応を決め込むPycharm。
セットアップファイルも再DLして再インストール。これでなおるだろう。

それでも起動せず・・・

あれ、これはまじでヤバいやつ？早くdjangoの作業進めないといけないのに・・・
日本語化失敗で記事を探しましたが、Windows版の記事しかなく、Macは？Macはどうしたらいいの？と
調べていたらどうやらユーザーフォルダの隠しフォルダの「ライブラリ」の中にPycharmの何かが残っているじゃないですか。

/user/library/Preferences/PycharmCE2019.2/pycharm.vmoptions

アプリを削除したらその関連ファイルも全部消えると思っていたのですが、違うんですね。
「pycharm.vmoptions」を削除します。

※ターミナルからも削除できますが、Finder内でショートカットキー「Shift」＋「Command」＋「.(ドット）」でも表示できますよ。

<img width="828" alt="スクリーンショット 2019-11-17 19.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473245/a46def64-bcc9-de2c-c30f-111a5cde8704.png">


「pycharm.vmoptions」を削除したところ、Pycharm起動しました:sunny:

よかったーーー！何時間かかったんだろう。同じ罠にかかった方の参考になればと思い、勢いで記事を書きました。

さて、日本語化は・・・

諦めない！

もう一度、正しいパスを指定すればいいはず。

改めて実行前に色々調べてみると・・・

①Pleiadesページの少し下にスクロールした所に、Mac用プラグインがあって・・・

<img width="590" alt="スクリーンショット 2019-11-17 20.53.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473245/feef413f-f56e-3aef-1807-0140e9755b41.png">


②DLしてからSeup.exeを叩いて・・・

③起動したメニューから「日本語化したいアプリ」からPycharmを選ぶと・・・

<img width="834" alt="スクリーンショット 2019-11-17 20.50.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473245/bef1aee5-b169-6f03-6e8c-86353b301efd.png">

④日本語になってる！！
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473245/2be5c7d8-8c7e-0f86-e92f-28c492ff9ba9.png)


そもそもDLするファイルも設定方法も何もかも違ったんですね。
恥ずかしい・・・恥ずかしいからこの記事あげるのも躊躇われるんですが、
もし、MacユーザーでWindows用の記事をみて、なんとなく適当に操作して、日本語化に失敗して、Pycharmが起動不可になったという、私以外にはいなさそうな方の参考になればと思います。

やる前にちゃんと読む、調べる、大事だと思いました。
CircleCIの導入でやったことと学んだこと（と、おまけ）

## CircleCIをGitHubのリポジトリに導入したい😾
前にいた現場で使っていて便利だったので、自分のポートフォリオのリポジトリにも導入したい！
という訳でやってみました。（自動化っていい響き…）
またセットアップするときに忘れていそうだったので備忘録として書いておきます。

## 実現したいこと
- GitHubのリポジトリにプッシュしたときにSCSSが自動でyarn Lintされる

## 試したこと
### 1. CircleCIに登録
まずCircleCIのサイトに訪れてサインアップ。日本語化もされていてありがたいです🙏
しかしダッシュボードの使い方がわからず撃沈。

### 2. CircleCIのドキュメントを読む
公式ドキュメントを読まないのは本当に自分の悪い癖なので、気を取り直してドキュメントを読みます。
[イントロダクション](https://circleci.com/docs/ja/2.0/getting-started/#section=getting-started)の通りに新しくテスト用のリポジトリを作ってすすめてみます。

【ここでやってしまったミス☟】

- `yaml`ファイルの拡張子を間違える → ○: `*.yml` ×: `*.yaml`
- `yaml`ファイルの**インデントのミス** (FAILEDの理由はほぼこれ)

`yaml`ファイルには気を付けたいです…ともかくテストが通るようになったのでOK！

![Screen Shot 2019-11-17 at 20.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349231/61f8a7a5-0fa5-1880-0bad-df5fbfdd341a.png)
（数々のBuild Error…悲しみ）

### 3. ポートフォリオのリポジトリにCircleCIを実装する！
おまちかねの実装タイム！とりあえずリポジトリに``.circleci/config.yml``を作成。
中身は[イントロダクション](https://circleci.com/docs/ja/2.0/getting-started/#section=getting-started)ページで紹介されている、
「Workspaces 機能を使ってみる」のコードを仮で入れてプッシュ。
（一回``.circleci/.config.yml``にしてBuild Errorを食らいましたが）
無事通ったので``yarn lint:SCSS``をするように書き換えてみます。

しかし「そもそもどうやってCircleCIに``yarn``してもらうん？」レベルだったので
こちらの記事にお世話になりました🙏
→ [CircleCI 2.0 で Node.js のテストを試す](https://qiita.com/pinemz/items/9ddea9ca89a1b51fcba8)

```yaml
version: 2
jobs:
  lint_scss:
    docker:
      - image: node:12.13.0
    steps:
      - checkout
      - restore_cache:
          key: projectname-{{ .Branch }}-{{ checksum "yarn.lock" }}
      - run:
          name: System information
          command: |
            echo "Node $(node -v)"
            echo "Yarn v$(yarn --version)"
      - run:
          name: Install dependencies
          command: yarn
      - run:
          name: Lint
          command: yarn lint:scss
      - save_cache:
          key: projectname-{{ .Branch }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/workspace/node_modules
            - ~/.cache/yarn/
workflows:
  version: 2
  lint_scss:
    jobs:
      - lint_scss
```

``docker image``のnodeのバージョンが参考記事のままだとうまくいかなかったので
``12.13.0``に変更しています。

この``config.yml``でプッシュした結果が…
![Screen Shot 2019-11-17 at 20.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349231/ffe254f1-0b6f-757f-e372-884ce3483633.png)
Lintで怒られている…！CircleCIが動いているようです🎉🎉🎉うれしいError！

## 学んだこと

- CircleCIに関しては[イントロダクション](https://circleci.com/docs/ja/2.0/getting-started/#section=getting-started)ページを参考にすることである程度動かせるようになる（あまり怖がらなくて大丈夫）
- ``yarn``系の指示を出すには``node``のイメージが必要
- ``yaml``ファイルの書き方に注意（特にインデント）

## おまけ
### GitHubのリポジトリにPRなど動きがあったらSlackに通知が行くようにしたい！
1. [ワークスペースにツールを連携](https://slack.com/intl/ja-jp/help/articles/232289568-github-for-slack)のページに従って[https://slack.github.com/](https://slack.github.com/)にアクセス🤗

2. SlackとGitHubの接続が済んだら、GitHubのPersonal settingsのApplicationsメニューを選んでSlackのConfigureをクリック。
ここでRepository accessなどを設定できます！（uninstallもここから）

3. Slackに戻って通知を受け取りたいチャンネルのメッセージに ``/github subscribe [ownerの名前]/[repository名]``を書き込んで送信
4. 繋がりました！通知が来るようになります！
「Windows の準備をしています。コンピューターの電源を切らないでください」は90分程度放置して待つ

# はじめに
現在、サーバーリプレース作業(Windows Server 2008R2 -> Windows Server 2016)をしています。
これまで4拠点について実施してきました。
今回5拠点目でいつもはスムーズに進んでいた「役割と機能の追加」である機能のインストールのステータスバーが全然進まない状態になりました。再度やり直すために閉じるボタンを押してみましたが、どうも画面は閉じるだけでバックグラウンドではインストールは進行中といった感じです。
この時点でこの作業は放置して、別作業を進めておりました。

5時間後に別作業も一通り終わるもインストールは進行中のまま、同僚と相談して再起動してからある機能のインストールをやり直すことになりました。

Windows Server 2016 を再起動

「Windows の準備をしています。コンピューターの電源を切らないでください」の画面が表示されたままになりました。

※会社に出社してメール時刻を見たら記憶と5分違っていたので修正しました。

# どうするか
再起動したのが 16:20 です。作業完了予定は 18：00 となっており、お客さんの検証作業がまだ残っています。

[20分くらいしたら復旧](https://ameblo.jp/wireless-party/entry-12321656078.html)してきたというネット情報もありましたので、とりあえず30分放置して様子見

## 30分経過
まだ変化はありません。約50分で復旧してきたという情報もあり、もうしばらく放置して様子見することに。

[「Windows の準備をしています。コンピューターの電源を切らないでください」が進まないとき何分待ったら電源を切るか問題](https://did2memo.net/2017/09/04/windows-getting-windows-ready-do-not-turn-off-your-computer/)

## 50分経過
まだ変化はありません。上長に連絡すると約90分後の 18：00 までは待ってみようという判断になりました。

次の日の休日出勤も頭によぎりますし、最悪は旧サーバーに戻すなどの事態も想定しなければなりません。

## 60分経過
まだ変化はありません。まだ我慢です。

>「Windowsの準備をしています」が表示されてフリーズしてしまい「Windowsの準備をしています」が終わらない場合、強制終了させるまでどれだけ待機すればよいのでしょうか？大抵の場合、長くても1時間程度です。
[「Windowsの準備をしています」が終わらない原因](https://appli-world.jp/posts/6102)

## 70分経過
17：30分「ピロリロリーン」と音が鳴りました。スタートアップするとメール通知が届く仕組みにしてあり、ついについに起動してきました。

ようやっと、お客さんの検証作業に入ることが出来ました。残業は確定ですが、とりあえず起動してホッとしました。

「役割と機能の追加」によるインストールは☓マークで中止状態になっており、再度ある機能のインストールをしてみると今回はスムーズにステータスバーが進み機能がインストールされました。

# 今後の対応
Windowsアップデート以外で「役割と機能の追加」でも「Windows の準備をしています。コンピューターの電源を切らないでください」という状態になってしまうわけですね。

再起動前に、最低限でもお客さんの作業は終わらせてしまうのがいいようです。それでもサーバーリプレース作業が完了するわけではないですけどね。

事前にサーバーのOSのインストールや必須なアプリケーションのインストールは某社に外注しています。次の拠点でも当日に同じようなことにならないように「役割と機能の追加」のある機能のインストールを含めてしまうのがいいでしょうね。

# 最後に
仕事での長時間の再起動待ちは正直辛いです。しかも、お客さんが立ち会っているわけですし。
90分(1時間30分)しても駄目だった場合、待てるならあと30分の2時間まで我慢するか、もう待てないなら電源長押しの強制終了ですね。

個人のWindows PCのWindowsアップデートによるものなら、ひたすら放置していれば翌朝には起動していることでしょう。
Haskellで再帰関数のprintデバッグをする

Haskellで再帰関数のprintデバッグをしようとした時に、つまづいたのでメモとして残しておきたいと思います。

# まず普通の再帰関数を書きます
```haskell:Haskell
sum' :: Num p => [p] -> p
sum' [] = 0
sum' (x:xs) = x + sum' xs
```

よく考えたらsumってモノイド上なら定義できそうだから、もっと一般的には次のように書けそうです!

```haskell:Haskell
msum :: Monoid p => [p] -> p
msum [] = mempty
msum (x:xs) = x <> msum xs
```

野生のプログラマがsumをInt->Int->Intみたいな型で書いてたら怒りましょう。

# 再帰関数でprintデバッグがしたい!
do構文を知らなかった頃は、sumの途中の値を知りたいと思い次のように書いていました。

```haskell:Haskell
debug_sum [] = return 0
debug_sum (x:xs) = debug_sum xs >>= \x' -> print x' >> return (x+x')

main = debug_sum [1..5] >>= \x -> print x-- 0 5 9 12 14 15
```

「うわっ・・・**私の再帰、分かりづらすぎ・・・**?」

## do構文
do構文を手にし、次のように書き直しました。

```haskell:Haskell
debug_sum [] = return 0
debug_sum (x:xs) = do
    x' <- debug_sum xs
    print x'
    return (x+x')

main = do
    x <- debug_sum [1..5]
    print x -- 0 5 9 12 14 15
```

「複数行に展開されてマシになったけど、読みやすいのかこれは...?」

# 結論

再帰のprintデバッグをわかりやすくしようと試行錯誤していたのですが、上記のコード以上に改良する方法がわからなくて困っています...

こっちのがわかりやすいよ!という書き方をご存知の有識者がいましたら教えてもらえれば幸いです。
ここまで読んでいただきありがとうございました!
SQLその2 データベース検索


今度は一番肝心であるデータベースの検索を書こうと思います。

# 基本検索構文

```bash
使用例
　SELECT name
  FROM users
```

## FROM句 
  テーブル指定

  ```bash
  FROM テーブル名
  ```

## SELECT句
  カラムを指定

```bash
SELECT カラム名
```

# 基本検索条件

```bash:使用例
SELECT *
FROM users
WHERE kenmei IN ("東京都", "神奈川県") 
```

## WHERE句
検索条件を指定

```bash
WHERE 条件

例
WHERE a==1
```

## AND演算子
AND演算子は複数の条件を指定して式を作り、その条件が全て正であるとき、式が正となります

要は両方成立したら返すわけです。

```bash
WHERE a AND b
```

## OR演算子
OR演算子は複数の条件を指定して式を作り、その条件のうちどれか1つ以上が正となれば、式は正となります。

要はどちらかが成立すれば返すわけです。

```bash
WHERE a OR b
```

## NOT演算子
NOT演算子は1つの条件を指定して式を作り、式の正誤はその条件と逆のものになります。

要は含まれないレコードを返すわけです。

```bash
WHERE NOT a
```

## BETWEEN演算子
BETWEEN演算子は1つのカラムに対し上限と下限を指定して式を作り、カラムの値がその範囲に含まれるとき、その式は正になるという演算子です。

要はカラムに下限以上かつ上限以下の値が入ったレコードを返すコードです。

```bash
WHERE カラム名 BETWEEN 下限 AND 上限
```

## IN演算子
IN演算子は1つのカラムに対しリストを指定して、カラムの値がそのリストに含まれるとき、その式は正になるという演算子です。

要は指定したカラムに指定した値が入ってるレコードを返すコードです。

```bash
WHERE カラム名 IN (値1, 値2, ……)

(値1, 値2, ……)の部分がリストとなります
```

# 検索データ形成

使用例

```bash
SELECT
    user_id,
    COUNT(*) "行数"
FROM reidai
WHERE date = "2000-01-01"
GROUP BY user_id
```

## CONCAT関数
複数の文字列を連結させることが出来る関数です。

```bash
CONCAT(文字列1, 文字列2, ……)
```

## AS句
SELECT句でデータを取得するとき、AS句を併用すると、そのカラムに別名を付けることが出来ます。

要は検索結果の絡む名を変更するわけです。

```bash
SELECT 取得するデータ AS 別名
```

## DISTINCTキーワード
DISTINCTキーワードを使用すると、指定したカラムの値が重複する行を除外してデータを取得することが出来ます。

要は同じ値があった場合、一番最初のデータだけ残し後のは除外する。

```bash
SELECT DISTINCT カラム名
```

## GROUP BY句
GROUP BY句を使用すると、指定したカラムが同じ値を持つデータを1つのグループとしてまとめることが出来ます。

DISTINCTと違うのはデータが残りレコードとしては
重複しなかった値は複数行として登録される。

```bash
GROUP BY カラム名
```

## COUNT関数(group byに注意)
COUNT関数はカラムを指定して使用することで、そのカラムの値がNULLでないデータの行数を取得することが出来ます。

```bash
SELECT COUNT(カラム名)
```

ワイルドカードを使用し以下のように記述すると、行の値が全てNULLであるレコードも含め、その行数を取得します。

```bash
SELECT COUNT(*)
```

そしてGROUP BY句を併用している場合は、各グループが何行のレコードを持っているかというデータを取得することが出来ます。

# 複雑なデータの検索

## JOIN句
JOINを使用すると、指定したそれぞれのテーブルの、カラムの値が一致するデータを結合することが出来ます。

```bash
FROM テーブル名1
JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2
```

ONの後にそのままテーブル名を再度書くのは冗長です。
そこで各テーブルに別名を付け、その名前で扱うのが良いです。

aceの場合     => a  
badmanの場合　=> b など

そのため、SQL文は以下のように書きなおすことが出来ます。

```bash
FROM seidai s
JOIN users u ON a.user_id = b.id
```

# サブクエリ
要は二重検索のことSQL文の中にさらに文を書いて出力する方法です。
例としてWHERE id NOT INの中に書くことで、それを検索した結果
から更に検索する方法です。

```bash
SELECT *
FROM users
WHERE id NOT IN (
    SELECT DISTINCT user_id
    FROM reidai
    WHERE date = "2000-01-01"
)
```
# ワイルドカード

ワイルドカードとは、文字の代わりとして使うことが出来る記号のことです。

SELECT句においては、アスタリスクが"全てのカラムを取得する"という意味のワイルドカードとして定義がされているため、このように指定することで全てのカラムの取得が出来ます。
時系列データと過学習について

最近LGBMの過学習をどう防ぐかが自分の中のホットトピックスです。

時系列データをどうtrainデータとvalidデータを分けるかについて気付きがありました。

これまで、時系列データであっても、random splitの方が良いんじゃないかと思ってました。
理由は分かりやすくいうと、ある日時を閾値にして分けると、春夏秋のtrainデータは冬の情報を持たずに学習するから不完全なモデルになるのではないかと。

ただ、random splitにも問題があることが分かった。
datetimeの粒度にもよりますが、例えばvalidデータの直前1分のデータがtrainデータにあるっていうことになるので、めちゃくちゃ過学習しやすい。

今の自分なりのベストプラクティスは、年の場合は春夏秋冬の四分割し、validをどれにするかで4パターンのmodelを作る。四つのモデルが出した予測値の平均を取る。

＝＝＝＝

というメモを二週間ほど前に書いてたのですが、
以下の記事に自分の考えと全く同じことがまとまってたので、共有です！！

http://tmitani-tky.hatenablog.com/entry/2018/12/19/001304

scikit-learnにも私の希望のようにvalidationするものがあるみたいです

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html
新人エンジニアが1年目、2年目に感じる3大不安要素

## 3大不安要素
###1.今の自分の実力
<img width="600px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479436/5fa3bf85-50a9-cb4a-72c9-4eb88eab4831.png">
エンジニアが最初に感じ不安は自分の実力がエンジニアとしてどこまで通用するかである。
学生時代に趣味でバリバリにコードを書いていて実力に自身がある人は別だが、
私自身IT企業に就職して社員研修を受け、仕事をこなしていくと自分の無知さに直面する。
例えば優秀なエンジニアであれば1時間で終わる開発が新人エンジニアだと1日、下手すれば1週間かかる人だっている。
そこで実力格差、エンジニアに向いていないのではないか、そういった不安を感じてしまう。

###2.開発工数の見積もり
<img width="600px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479436/6e87d6d1-a936-bba0-940f-9bb8875bec18.png">

これは新人エンジニアに限った話ではないが、
エンジニアにおいて開発工数を見積もることはものすごく難しい。
なぜなら不確定要素が多すぎることだ。
前述で述べたとおり、優秀なエンジニアであれば1日かかる作業が1時間で終わることができるだろう。
しかし、優秀なエンジニアであっても自分の作業時間が1時間で終わるかどうかはわからない。
当然人間なのでコードを書く中で行き詰まったり、想定通り動かないといったことはエンジニアにとっては日常茶飯事だ。
こと新人においては会社に期待に応えようとギリギリの開発工数を見積もってしまうが、これは間違いである。
結局、期間内に終わらず残業をして自分が見積もった工数以上の時間をかけてしまう

###3.残業について
<img width="600px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479436/554d7dff-cca5-c659-c9ee-44a190feb11a.png">

エンジニアの残業というは非常に不明確である。
果たして残業時間に見合った仕事をしているかと言われたらクエスチョンである。
よって会社の中でエンジニアの残業時間の扱いが非常難しくなっている現実がある。
そこで問題になってくるのが新人エンジニアの残業についてだ。
会社からしてみれば新人エンジニアは研修期間であり、残業をさせるほどの仕事を与えていないと主張する会社もある。
しかしそれはエンジニアのことを何もわかっていない人の主張であり、間違った認識である。
結局、新人エンジニアはサービス残業をしているのが現実である。

##じゃあどうすればいいのか？

###知らないことを知る
<img width="600px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479436/ddcfb203-8f2d-dda8-6c75-7c87b6e2f236.png">
一番簡単な方法はインターネットの記事を見ること。
qiitaのトレンド、twitterのトレンドなど
今流行っている言語が何なのか？また、知っていて当然の知識が何なのか？など
中身全てを知る必要はなく、自分が何を知らないかをまずは理解すること。
人間は無知であればあるほど不安になってくる生き物である。
コーディング技術は二の次である。

###モチベーションのセット
<img width="600px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479436/a5fd8532-b3a5-c7d8-5d76-6f5cfc0ac537.png">
仕事においてモチベーションをどうセットするかは考え方次第である。
私の場合、別の会社に転職したい際に前職で培った知識は無駄ではなかったことを実感した。
そこで経験したインフラ構築やプロジェクト開発、サービスのリリースを通じて今の自分があるのは事実である。しかしその会社に一生いる必要はなく、
そこで培った知識を使ってアフィリエイト広告で働かずに暮らしていきていくことだって可能だ。
会社に属さなくてもフリーランスのエンジニアになることだって可能だ。

そう考え始めてから私は現職場で培った知識は将来の自分への投資だと気づき今に至る。
皆様の不安が少しでも解消できたら幸いです。
【※CentOS6.10になります】CentOS 6.5（VirtualBox）でIUS Community Project リポジトリ追加ができなかったときの対処方法


※　**この記事の方法だと、CentOSが6.5　→　6.10になってしまいます。
　　CentOS6.5のまま解決する方法は[こちらの記事](https://qiita.com/usyuuu/items/a7dc01d23ea2d47b1f37)を参照ください。**
#仮想環境のCentOS6.xに、IUSリポジトリがインスコできない？

VirtualBoxで動くCentOS6.5に、Python3をインスコしたいと思い、以下コマンドを打った。

`` # yum install -y https://centos6.iuscommunity.org/ius-release.rpm`` 

しかし、``cannot open:https://centos python`` というエラーが端末に表示され、処理は実行されなかった。

## IUSリポジトリを追加できなかった時の環境
-  CentOS6.5（VirtualBox）
    - インストール直後の状態
    - ネットワーク設定はひと通り完了済み
- 打ちたかったコマンド=`# yum install -y https://centos6.iuscommunity.org/ius-release.rpm
`

#原因

CentOSをVirtualBoxにインストールした後、アップデートコマンドを打っていなかった

`` yum update``

上記コマンドを打った後、再度IUS Community Project リポジトリ追加を試みた結果、成功した。


#統括

何かうまくいかなかった場合、`` yum update``等のアップデートを一度行ってみよう。

#追伸
この後、`` # yum install -y python36*``を打つと、「トランザクションの確認エラー」が表示された。しかし、`` # yum install -y python34*``を打った場合だと、インストールが成功した。
これの原因がわからない…知っている人いればコメント欲しいです…

#追伸2
これCentOS6.10になってるじゃん…

#参考（Python3系のアップデートについて）
<https://qiita.com/f-akazawa/items/5ec741f8a5cca999d7b3>
Rails 5 Bootstrap でフォームを作るときのhidden_field_tagの書き方

1時間近くハマったので，メモしておきます．

#環境
Ruby version: RUBY VERSION: 2.6.3
Rails version: Rails 5.0.7.2

#書き方
```
  <%= form_for(current_user.watch_relations.build) do |f| %>
    <div class="form-group">
      <%= hidden_field_tag :film_id, film.id %>
    </div>

    <div class="form-group">
      <%= f.label :rate, 'rate' %>
      <%= f.number_field :rate, class: 'form-control' %>
    </div>
    <div class="form-group">
      <%= f.label :comment, 'comment' %>
      <%= f.text_field :comment, class: 'form-control' %>
    </div>
    <%= f.submit 'watched', class: 'btn btn-primary btn-block' %>
  <% end %>
```

ポイントは hidden_field_tagもclass=form-groupのdivで囲むことです．
初心者向け入門書2冊を比較してみた

#オススメの入門書はこの2冊
以前、Twitterで以下のような投稿を見つけた。

[プログラミング初心者にオススメの2冊](https://twitter.com/harry01program/status/1168848146698366976?s=21)

1.『[改訂3版 これからはじめるプログラミング 基礎の基礎](https://www.amazon.co.jp/%E6%94%B9%E8%A8%823%E7%89%88-%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%9F%BA%E7%A4%8E%E3%81%AE%E5%9F%BA%E7%A4%8E-%E8%B0%B7%E5%B0%BB-%E3%81%8B%E3%81%8A%E3%82%8A/dp/4297101181)』 （ツイート画像右）

2.『[基礎からのプログラミングリテラシー](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%86%E3%83%A9%E3%82%B7%E3%83%BC-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%8B%E3%82%89%E6%8A%80%E8%A1%93%E6%9B%B8%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9%E3%81%BE%E3%81%A7%E5%8E%B3%E9%81%B8%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E3%81%8F%E3%82%89%E3%81%B9%E3%81%A6%E5%AD%A6%E3%81%B6-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/4297105144/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%86%E3%83%A9%E3%82%B7%E3%83%BC&qid=1573986725&s=books&sr=1-1)』（ツイート画像左）


#オススメはどっち？
どちらも購入し、どちらも読了。

**結論から言うと、どちらもオススメ！**

ただし、読む順番に気をつけたほうがいい。
個人的には、１→２の順番をオススメする。


#１→２の順番をオススメする理由は？
１がコンピューターの仕組みからプログラミングに必要な考え方まで網羅した、土台となる入門書なのに対して、２は初心者向けの**用語集**のため。
ちなみに、私は２→１の順番で読んで「つまり、どういうこと？？」とちんぷんかんぷんになって失敗した。
そもそもプログラミングは何のためにやるのかという、全体像を把握してからのほうが理解が深まると思う。


#まとめ
つまり、１で全体像をつかみ、２でよく分からんなと思った用語を復習するのが、オススメの読み方です。
それぞれについての要約や感想のまとめは、以下のとおりです。

[初心者向け入門書を読んでみた 第1弾](https://qiita.com/Haruka_mm_0950/items/2c9307784c772cf81ab4)（1の記事）
[初心者向け入門書を読んでみた 第2弾](https://qiita.com/Haruka_mm_0950/items/f36281fffea2ba233b31)（2の記事）