OmniAICreator/Qiita-1.07M huggingface dataset:
FessでAmazon S3を高速に横断検索する

この記事では、[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してAmazon S3内のファイルを横断検索する方法を紹介します。

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/f12b64da-a99e-7b1e-1037-f0f13e495929.png)

# 導入手順

FessでAmazon S3を横断検索するための手順を説明します。

導入の流れは次のようになります。

1. Fessの起動
2. プラグイン追加
3. 認証設定
4. Fessの設定・クローラ実行

## 1. Fessの起動

「[起動および停止方法](https://fess.codelibs.org/ja/13.3/install/run.html)」を参考にFessを起動します。

## 2. プラグイン追加

「[プラグイン](https://fess.codelibs.org/ja/13.3/admin/plugin-guide.html)」を参考に**fess-ds-s3-xx.x.x**をインストールします。

## 3. 認証設定

データを取得するためには、認証情報をパラメータとして与える必要があるので、そのための設定をします。

[IMA Manager](https://console.aws.amazon.com/iam/home?#/users)にて、Fessがリソースにアクセスするためのユーザーの追加を行います。

プログラムによるアクセスをONにします。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/a61752ac-dc55-c37a-b6e6-f04bb37172fd.png)

アクセス許可の設定は、`AmazonS3ReadOnlyAccess`を与えます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/8f4b747d-f420-bad8-1505-db51061116dc.png)

ユーザー作成後に表示される、アクセスキーID(`access_key_id`)とシークレットアクセスキー(`secret_key`)は、後で認証に必要になります。

## 4. Fessの設定・クローラ実行

Amazon S3をクロールするための設定をします。
公式ドキュメントの「[データストアクロール](https://fess.codelibs.org/ja/13.3/admin/dataconfig-guide.html)」も参考にしてください。

### 4-1. クローラの設定

Fessの管理画面を開き、`[クローラ] > [データストア]`と移動し、新規作成をします。
新規作成画面では、

* 名前
* ハンドラ
* パラメータ
* スクリプト

の4項目を設定して、作成を完了します。
「名前」には好きな文字列を入力してください。
「ハンドラ」は`AmazonS3`を選択してください。
「パラメータ」は次のようなフォーマットで入力してください。

```properties
region=ap-northeast-1
access_key_id=AK***
secret_key=32***
```

`region`は、S3バケットのリージョン、
`access_key_id`と`secret_key`は、3.で取得したものです。

「スクリプト」は次のようなフォーマットで入力してください。

```properties
url=object.url
title=object.key
content=object.contents
mimetype=object.mimetype
filetype=object.filetype
filename=object.filename
content_length=object.size
last_modified=object.last_modified
```

取得出来る値のキーと値の説明は次のようになります。

| キー                      | 値                    |
| ------------------------- | --------------------- |
| object.url                | オブジェクトURL       |
| object.management_url     | オブジェクトの管理URL |
| object.key                | キー                  |
| object.e_tag              | Etag                  |
| object.contents           | 中身（テキスト）      |
| object.mimetype           | MIMEタイプ            |
| object.filetype           | ファイル形式          |
| object.filename           | ファイル名            |
| object.size               | サイズ                |
| object.last_modified      | 最終編集日時          |
| object.owner_id           | 所有者（ID）          |
| object.owner_display_name | 所有者（表示名）      |
| object.bucket_name        | バケットの名前        |
| object.creation_date      | バケットの作成日      |

### 4-2. ジョブスケジューラの作成

4-1. で作成したクロールをクリックすると、クロール設定が開き、そこから「新しいジョブの作成」をします。

後からでも変更はできるので、とりあえず試す場合はそのままの設定で大丈夫です。
詳しい設定については、「[スケジューラ](https://fess.codelibs.org/ja/13.3/admin/scheduler-guide.html)」を参考にしてください。

### 4-3. クローラの実行

`[システム] > [スケジューラ]`と移動し、4-2で作成したジョブを開きます。
その画面から、「今すぐ開始」をします。

状態が「実行中」から「有効」になるまで待ちます。

### 4-4. 検索のテスト

検索フォームから適当に検索してみます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/f12b64da-a99e-7b1e-1037-f0f13e495929.png)
Javaで拗らせた感じのスターリンソートを書いた

# Javaで拗らせた感じのスターリンソートを書いた
最近流行りの[スターリンソート](https://qiita.com/tags/スターリンソート)ですが、
公開されているjavaの実装が、拡張ですらないforループを使っていたり、
Comparatorを渡せなかったりしてなんか前時代的だなぁと思ったので自分でも書き始めてみたんですが、
途中で悪乗りしてどうせならforだけじゃなくifも使わない縛りにしようとか考えだしたら変なコードになってしまいました。

とりあえず供養も兼ねて

## できたもの
``` java
	public static <T extends Comparable<? super T>> List<T> stalinSort(List<T> origin) {
		return stalinSort(origin, Comparator.naturalOrder());
	}

	public static <T> List<T> stalinSort(List<T> origin, Comparator<? super T> comparator) {
		return origin.stream().reduce(new LinkedList<T>(),
				(prev, current) -> Comparator.nullsFirst(comparator).compare(prev.peekLast(), current) <= 0
						&& prev.add(current) ? prev : prev,
				(a, b) -> {
					throw new UnsupportedOperationException();
				});
	}


```
多分動くはず。
新人研修で質問スタミナ制を導入してみた


はじめまして！２年目の駆け出しSEです。
先日まで新人研修に関わって、~~2年目のくせに~~新入社員たちに偉そうに教えていた@takkii1010です。

私が関わっていた研修では、**先輩社員1人で新人複数人を運営するチーム開発**が行われました。
教わる側から教える側（！）に立った時に、どうやって自分の実力不足を補いつつ新人にも成長してもらえるか、どうチームを運営していくか悩んだのでここに簡単に残します。

# この記事のメインターゲット

* 新人教育に携わる人
* 「ふふっ」と少しだけ笑顔になれるような研修にしたい人

# 研修概要

* 新人7名＋リーダー1名（自分）
* チームでWebアプリケーションの開発を行う
* 新人それぞれが異なる機能を実装する
 * つまり、**質問内容がバラバラになる可能性大**

# チーム開発への課題
* 「画面遷移しないんですが！助けて！」という質問はしてほしくない（もう一歩進んでほしい）
* せめてスタックトレースみてほしい
* 質問してほしくないわけじゃないんです！
* 質問対応だけでなく、リーダーとして進捗管理や開発方針の策定などの時間もほしいんです！
* なんだったら質問前にその子が躓きそうなポイントの整理をする時間もほしい！（知識不足ゆえに）
* 質問内容を事前にまとめるって大事（自分の経験談）


## 悩んだ末、こちらを導入することに
[新卒からの質問をソシャゲっぽい仕組みにしたら捗った話](https://qiita.com/ysktsuna/items/fced3a9515c8f585ca50)

## 新たな課題
質問スタミナ制は良さそうだけど、初対面の子の適切な質問回数なんて予想できるような特殊能力ないなぁ（　＾ω＾）・・・

OJTのような1対1でなくても、多対1でも有効なのかなぁ（　＾ω＾）・・・

## ルールを決めました

　①スタミナの限界は、各自設定してください。
　②１日１回復とします。　前日：💛💛♡　次の日：💛💛💛
　③**質問するなというわけではありません！**
　　　　何を質問すべきか、内容を重視して選択してください。
　④臨時ボーナスがつく場合があります！

※物理的にスタミナの受け渡しができるように、@ysktsunaさんと同様「しつもんチケット」を作成しました。
　「しつもんチケット」1枚＝💛です。

<img width="400" alt="image.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439602/25bae5b9-31f7-0ec8-8c91-e64a5fac4e2a.jpeg">


## アイデア元サイトからの変更点
@ysktsunaさんが運用してみて気になった点をピックアップして、複数人用に運用を変えてみました。

> * チケット枚数の適正値が不明
 
* 初対面の子たちが多いが、自分の実力は自分が一番わかっているはず…！
 * スタミナは**各自で上限を設定**　※10とか言われたら困るので、**Max値は5**

> * 本当に些細な質問の場合のルールを明確にすべきだった

* 勤怠入力方法など開発以外のことはチケット消費なし

> * 座席が近くないと運用し辛い
 * 物理的なチケットを伴う関係で、隣同士くらいの距離感じゃないと難しそう
 
* 今回は複数人運用により回答者と質問者に距離ができてしまうため、以下で対応しました
 * 質問はチャットツールで行ってもらい、リアルタイムではなく、回答者の**タイミング**で、調べたり同時多発質問を調整できるよう変更
 * 質問対応は直接なので、チケットはそのときに回収

### その他の変更点

* そもそもうまくいくかわからない ➡ **２週間導入して続けるかアンケート**（サービス終了のアンケート）
* 出社に前向きになってほしい ➡ **１０日間連続ログインボーナス発動**（スタミナ全回復）
* ユーザが未ログインの場合は回復しない ➡ リーダーの出社タイミングじゃなくて、その子がログイン（出社）したら１回復

# やってみると


新人１:frowning2: ＞ あ～、わかんない！
新人２:relaxed: ＞ スタミナ使ってしまえ！（にやにや）
新人１:frowning2: ＞ ぐぬぬ。ちょっと内容まとめるわ…
私:neutral_face: ＞ :ear:（あの子詰まってるな、ここらへんか…？ごそごそ）

～少し経って～

新人１からチャットツールでヘルプ要請

～自分の他作業との兼ね合いを見て～

私:angel_tone2: ＞新人１さん、 チャットで質問あった件だけど…
新人１:frowning2: ＞ 〇〇さん！ここが…XXXで…
私:angel_tone2: ＞ （聞きたいことがまとまってる！感動！）うんうん、ここはね…XXXだから…こう考えて、それはこのサイトのここがヒントに…（偉そう）
新人１:relaxed: ＞ なるほど！ありがとうございます！少しやってみます！

# 結果として

### 新人

* 詰まっている点を**再度考え直すいい機会**になった
* 何を質問すべきか自分の中で**明確に線引き**できた
* どうやったら**1回の質問で自分が望む回答を相手から聞き出せるか**を考えることができた
* おもしろい


### リーダー

* 新人の**質問内容もわかりやすくなってバンザイ**
* 説明に必要そうなサイトを事前に調査する**時間が作れた**
* チケットの受け渡しの時にお互い「クスッ」となる
 * つまり、ちょっとだけ仲良くなれる

新人研修で質問スタミナ制を取り入れた結果、WinWinで終えることができました！！！

OJTのような1対1でなくても、多対1でも有効でしたね。

# ちなみに
研修終盤では質問回数も若干減っていったので、頃合いを見てスタミナの上限を再設定させるのもありだったかも。

# 最後に
@ysktsunaさん、ありがとうございました！
[新卒からの質問をソシャゲっぽい仕組みにしたら捗った話](https://qiita.com/ysktsuna/items/fced3a9515c8f585ca50)

また、質問の仕方については以下サイトで学んでもらっています。
[質問は恥ではないし役に立つ](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)
最初に試験(test)プログラムを書く理由5つ。仮説（135）

試験プログラムから書き始めた経緯を記録する。

一番最初に書いたプログラムは、CASIOのプログラム電卓。

# 1 保存のための通信プログラムの試験
最初にプログラムを書いたPCは、TRS-80
記録媒体が300ボーのシリアル通信で磁気テープに記録するもの。

通信プログラムの試験をして、通信プログラムが正常に動作しないと、
せっかく作ったプログラムが消えてしまう。

そのため、通信プログラムの試験プログラムを書き、
通信プログラムを書いて、通信プログラムが機能することを確認してから、
動かしたいソフトウェアを書く。

他にも方法はあったかもしれない。
TRS-80のユーザ会を発端とする、名古屋のマイコン友の会に参加するようになったのは、
もう少し後からで、TRS-80の使い方をそんなに詳しく知らなかった。

# 2 どういうふうに機能するかの試験
BIOS(basic input output system)がどのように動作するのか、
プログラムにinterfaceだけではわからない。

そこで、まず、interfaceを試験するプログラムを書く。

# 3 どういう試験が最終的に必要か

納品時に、そういう試験が必要か、最終試験プログラムをまず書き始める。
納品する機能以外に、試験のための機能が必要かもしれない。

同じ構造で実現できるなら、一緒に設計したい。

# 4 対戦組み合わせプログラム
囲碁の対戦を決めるためのプログラムを書いた。
制約条件がいろいろあるため、最初に制約条件を満たしているかどうかを確かめるプログラムを先に書いた。

# 5 構造設計が楽に
最初に試験プログラムを書いておいて、設計を考えると、どういう設計がよいかが見通しやすい。
下記に試験プログラムから書き始めなかった際の失敗例を記した。

試験プログラムを書いておらず、いきあたりばったりにプログラムを書いて、迷路に入っていった。

# 失敗例
試験プログラムを先に書かなかったために失敗した例

## ホストコンピュータのソースの端末での印刷試験プログラム

通信端末のエミュレータをPC-8801用をPC-9801用に書き換えた。
大学で電気系、情報系、化学系、金属系の研究室に十数箇所に配布し、
百人以上の教員、学生に利用してもらった。

１点不具合が残っていた。

ソースコードを端末で出力する際に、時々、１行おきに印刷する状態になってしまう。
改行コードのCRとLFがどちらも改行の機能を果たすだろうということは推測できた。
いつ、どこで、そういう状態になるかを調べきれなかった。
というか、自分の卒業研究のプログラム（Pade近似による連立微分方程式の解法）の
最適化で手一杯で、そっちを調べる時間がなかった。

最初から、印刷試験プログラムを書いておけばよかった。

## 連立微分方程式の解法の精度試験プログラム
倍精度で計算していた連立微分方程式の解法プログラムを四倍精度で、
すべての値の誤差評価をしようとした。計算をはじめて数日経っても終わらない。
そこで、どこまで計算したかを連絡できる機能を追加して走らせた。

計算終了まで３年かかることがわかった。
最初から、誤差評価プログラムを書いて、プログラムを書けばよかった。

## 連立微分方程式の解法の最適化試験プログラム

自分でプログラムの空間と時間の最適化を図ると、
コンパイラの最適化を適用すると、計算結果が適切なものにならなくなった。

最初に、最適化の仕方が妥当かどうかを確認できる試験プログラムを書いておけばよかった。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Vivado SDKでELFファイルからバイナリファイルを出力する方法

#環境
* ボード
    * Arty Z7(zynq評価ボード)
* ツール
    * Vivado2018.3(Windows10)

#やりたいこと
ELFファイルから、バイナリファイルを作成したい。

#方法
Vivado SDK プロジェクトのProperties - C/C++ Build - Settings - Build Stepsを選択します。

Post-build stepsに
「arm-none-eabi-objcopy XXX.elf -O binary XXX.bin」XXX:ファイル名
を設定する。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/8cf0b7df-2eff-3198-d6e7-374005f79765.png)

ビルドされる度にelfファイルと同じ場所にbinファイルが生成されます。
RaspberryPiにOpenCVをインストールする件について

※Qiita初投稿です。よろしくお願いします

#背景
なぜこんなことをしようと思ったのかと言いますと、知人から頼まれて、カラートラッキングのプログラムを書いていて、実行させようとしたら・・・
**openCVが入っていませんでした**

#本題
以下の記事を参照に書かせていただきます
[PythonでOpenCVを呼び出して、Raspiカメラに写る顔を認識してみた](http://asukiaaa.blogspot.com/2018/07/pythonopencvraspi.html)
まず記事にもあるように以下のコマンドでパケージをインストールします

```bash
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
```
これは、動画や、画像の入出力、行列演算の際に用いるモジュールだそうです
次にpipを使って本体をインストールします

```bash
sudo pip3 install opencv-python
```

これで本体をインストールします
僕の場合は、ここで一回タイムアウトしたのかエラーが出ましたが、二回目でしっかりインストールできました

最後にOpenCVの実行時に必要なプログラムをインストールします

```bash
sudo apt install libcblas-dev libatlas3-base libilmbase12 libopenexr22 libgstreamer1.0-0 libqtgui4 libqttest4-perl
```

これでインストールは終了です。最後にコマンドラインで`python3`と打ち込んで対話モードで入っているかを確認するだけです。
ただし、これではpython3でしかOpenCVを使えないようですので、今後pipでインストールできるのか、ためしていきたいと思っている所存です
#最後に
これは僕のQiita初投稿です。
色々、読み苦しいところあったと思いますが、最後まで読んでいただきありがとうございます。
また、参考にさせていただいた@takahiro_itazuriさま、[試行錯誤な日々](http://asukiaaa.blogspot.com/)の方々、ありがとうございました。
これからも何卒、よろしくお願いいたします
Python 文字列の表示（日本語）


アクセスありがとうございます(*'ω'*)

今回は今勉強中のPythonで
文字列を表示させるコードを書いてみました。
（すみません、内容から分かる通り プログラミング超×100初心者です… ^^;）

```python:sample.py

# coding: utf-8

# 英数記号表示の書き方 2パターン
print("fruits")
text1 = "fruits"
print(text1)

# 日本語文字列表示の書き方 3パターン
text2 = u'りんご'
print text2
print(u'みかん')
print u'いちご'

#リスト内の文字表示の書き方
list = ["apple","orange","strawberry"]
for elements in list:
	print(elements)

```
結果がこちらです。
改行した方が見やすかったなあ…（改行コードが分からなかった奴）

```python:result.py
fruits
fruits
りんご
みかん
いちご
apple
orange
strawberry
```

ちなみに日本語しか出力しないよ－って場合「u」を使わない書き方があるそうです。
それが こちら…

```python:sample2.py
# coding: utf-8
from __future__ import unicode_literals

print("fruits")

text2 = 'りんご'
print text2
print('みかん')
print 'いちご'
```

```python:result2.py
fruits
りんご
みかん
いちご
```

この一文 "from__future__import unicode_literals"
を書くことによって 「u」無しで日本語を出力できました！

---

【自分用メモ】
文字コード：utf-8 の場合
・txtファイルの方をutf-8で保存する
・プログラム内に# coding: utf-8 と記載する
　→両方をやらないと文字コードのエラーが出る

---
ITIL v3とv4どっち受けようか迷ってる人へ（初心者向け）

#1. ITILとは
ITサービスマネジメントのお手本。

#2. ITサービスマネジメントとは
ビジネスニーズを満たす、良質なITサービスの実施及び管理すること。
エンジニア側の視点ではなく、ビジネス側（顧客）にとっての価値を最優先としている。

#3. ITILの歴史
##V1(1989年)
止まることのないITサービスを提供。
- DISC PD0005

##V2(1996年)
ビジネス要件も満たすITサービスを供給。
 - BS15000

##V3(2007年)
ビジネスに対して価値を提供するITサービスを提供。
 - ISO/IEC20000:2005
 - ISO/IEC20000:2011

##V4(2019年)
ビジネスとITの融合による新たな価値創造。
 - ISO/IEC20000:2018

#4. ITIL v4とは
ITサービスマネジメントのお手本とされているITILが、v3からアップグレードされたものがv4。

#5. ITIL v3とv4の違い
##ライフサイクルからモジュールへ
v3ではライフサイクルとしていたが、その場合、1つの変更が後続プロセスに影響を与えるため、
ビジネスの環境変化に対応できない。したがってモジュール化。

##全体論的なアプローチ
単なるITサービスではなく、ビジネス目線で顧客・利用者にとって有益なサービスとすること。

##プロセスからプラクティスへ
v3ではプロセスについて多くの記載があったが、v4ではプロセスの記載はなく、プラクティスについて記載されている。
プロセスについてはv3でおおむね完了した前提とし、役割・責任・リソースを含めたプラクティスへの昇華がv4ではされている。

##他プラクティスとの融合
Agile,DevOps,leanなどなどの要素を追加。

#6. ITIL v4今後の予定
 - Foundation（書籍）2/18リリース
 - Foundation認定資格（英語版）2/28リリース
 - Foundation認定資格（日本語版）は2019年9月までにリリース予定
 - 現行資格認定試験（v3 Foundation等）は少なくとも2020年6月までは継続予定

#7. v3とv4、どっち受けるべき？？
ITIL、プロセスへの理解がなければv3 Foundationから。
理解あるのであればv4から。

結局現場でもプロセスの概念は重要視されている。
今回のv4アップデートはv3からのステップアップのイメージが濃厚。

#8. 所感
エンジニア目線のサービスではなく、顧客目線・ビジネス目線のサービスという意味では、
アジャイルの概念とも似通ってくるのかなと。

ビジネス価値最大化ってやっぱ大事なんですね、再認識。

#9. 参照
https://www.bspsol.com/column/itil4%E3%81%A7%E4%BD%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B%EF%BC%9F/

https://www.itpreneurs.co.jp/itil-4/
DataTablesにおけるTD要素のellipsisについて

## これは何？
これを
![ss01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13109/e69acedb-48ba-c24f-95e0-457bf9e8410c.png)
こんな風にしたいんですよ。
![ss02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13109/c7777908-1b23-be8d-a4ee-2dc457effce1.png)

## やり方ググる
本家的にはコレっぽい。でもコレだと文字数依存になるので今回は違う。
https://datatables.net/blog/2016-02-26 

こっちはヒントになりそうだなぁ。
https://codeday.me/jp/qa/20190101/101577.html

## やってみよう
まずは必要な列にclass属性付けて…

```javascript:JavaScript
$('table').DataTable({
  columnDefs: [
    { targets: [6, 7, 8], className: 'ellipsis' }
  ]
});
```

そのclassにCSSを設定すれば…

```css:CSS
td.ellipsis {
  overflow-x: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  max-width: 10rem;
}
```

できた。
![ss02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13109/c7777908-1b23-be8d-a4ee-2dc457effce1.png)
もうググりたくない。
LaravelでAWS SQSのfifoを利用する

# 使用バージョン

- CentOS Linux release 7.6.1810 (Core)
- PHP5.5

# パッケージインストール

- Laravelはデフォルトではfifoを利用できない．スタンダードキューのみ．
- [このパッケージ](https://packagist.org/packages/shiftonelabs/laravel-sqs-fifo-queue)をインストールして適切に設定をするとfifoが利用可能になる．

# ついでにsupervisor

## インストール

- EPELリポジトリからダウンロードする場合

```
yum install supervisor
```

- Pythoパッケージマネージャーでインストール

```
sudo easy_install supervisor

または

sudo pip install supervisor
```

## 設定

※今回はeasy_installでインストールしたため，その場合の手順を記載．
※上のコマンドでインストールすると4.0.4のsupervisorがインストールされた．

- デフォルトコンフィグファイル生成

```
sudo echo_supervisord_conf > /etc/supervisord.conf
```

- 設定ファイル保存用ディレクトリ作成

```
sudo mkdir /etc/supervisord.d
```

- 各種設定

```
sudo vi /etc/supervisord.conf
----------------
[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
chmod=777
# ※700だとうまく動かなかったため変更した．開発環境なので適当だが，本番稼働はセキュリティ注意．

[supervisord]
# ログディレクトリ
;logfile=/tmp/supervisord.log
logfile=/var/log/supervisor/supervisord.log

# ※ログディレクトリは作成しておくこと．

[include]
;files = relative/directory/*.ini
files = supervisord.d/*.conf
```

- Laravelのキューワーカーを動かすための設定．

```
sudo vi /etc/supervisord.d/laravel.conf
-------------------------------
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs-fifo --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
```

## 起動

- 以下の作業を実施．
- 正確にどの作業が必要かが最終的に分からなかった．詳しい方教えて下さい．

```
# 必要かどうか良くわからない．
sudo vi /etc/systemd/system/supervisord.service
--------------------
[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target
```

```
sudo service supervisor start
```

```
sudo systemctl enable supervisord.service
```

```
sudo supervisord -c /etc/supervisor/supervisord.conf
```

※Laravelのドキュメントには以下の記載があるけど，結局失敗したり色々でうまく動くのかどうか分からなかった．

```
sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*
```


# 参考

- [Supervisorの使用方法](https://www.task-notes.com/entry/20170311/1489224418)
【プレゼン】講義・セミナーで発表すると気を付けていること

# はじめに
前職で講師のお仕事をさせていただいたのですが、
説明がうまく出来ずリハーサルで上司にいつも指摘されてました。
その時に渡されたメモをこちらに公開することにしました。
小さな会議の場での話、相手に説明するときなどにもいつも見返しているものです。
何かの発表や準備にお役に立てると幸いです。

# 資料作りの注意
## 「なぜ」この話をするかを相手に伝えろ。
  1. 「なぜ」この開発言語を使うのか。
  2. 「なぜ」この技術が必要なのか。
  3. 「なぜ」この仕組みを使うのか。
  4. 「なぜ」このツールを使うのか。

## 「問題意識の共有」とその解決方法を提示しろ。
  * 講義の流れは以下の２つ。 
    * 問題意識を受講者と共有
    * 解決方法の提示 
        * 例)以下のストーリでつくれ  
        * 今日話すこと → 問題意識の共有 → その解決方法 → まとめ

## スライドを使う場合見せ方を考えろ
  * 文字の大きさ 30px以上必須
  * 文字の分量多すぎはだめ。何もないもの意味不明。
  * 紙を渡すのは極力しない。絶対スライド見ないし。受講者自身が書かないと覚えない。
    * もし紙も渡してほしい等の要望があるときは、穴埋め式で講義を受けて初めて完成するような教科書になるような工夫するといいかも。
     * 例)みのもんたやアッコにおまかせ等でよく使われている重要な文字を隠して後で出すことでインパクトを出すようなやりかた(ちょっと古いなｗ...) 

##  話をするときの注意
  * 自分が満足するな。(重要)
    *  満足するのは受講者。話す人ではない。
  * すべてを話すな。
    * 講義はきっかけ作り。
    * 自分で調べられるための手助けをすること。
    * ただし正式名称は略せず正確に話せ(技術名/英文字スペル)
  * 自身もって話せ 
    * 話すときは大きくはっきり話せ。聞こえないから。
    * 俺が神だくらいの勢いで話すとよい(ふんぞり返って話すのはNG)
  * 質問は絶対答えろ。なにがなんでも答えろ。 
    * 万が一即座に答えられない場合は、いつ返答するか約束しその約束を守れ。
  * 最初の入りを十分に考えろ。 
    * 最初の入りで後の流れが決まる。最初の入りを十分に考えろ
    * ポイントは「この講義で結果的にどうなるか」を考えろ
  * 相手に伝わりやすいものに言いかえろ。 
    * 講義する対象の人の知識はすべて同じではない。無いことを前提に話せ。
    * 正確な内容を話すよりも、伝わりやすいようなものに言い換える方が理解しやすい。
  * 明日続きの話をする場合は振り返りをしろ。
  * 初めに講義のゴールを受講者に明示しろ。
  * 今日講義した内容を最後に振り返れ。最後のまとめを必ず言え
  * 大事なところは何度も繰り返し話をしろ
  * 話すスピードは自分が思っているよりもほんの少しだけ遅く
     * 他人から見ると意外と自分の話すスピードはかなり早い。
         
## 会場準備の注意
 * 事前準備をを怠るな。
   * 規模の大小関わらず講義やプレゼンでも会場準備を怠るな。
 * 会場の形はどんな感か？四角い？扇形？広い？会議室みたいな狭いところ？
 * 参加人数は何人か(10?40?100?)
 * スライドはどんな感じか(光が入るか？スライドの機械は大きい？ちいさい？スライドがないときもある)
 * リハーサルを２回以上やれ、最低でも１回やれ。
    * 作った内容でちゃんと伝わるか、
    * 進め方におかしなところがないかを必ずチェックする。
    * 時間配分チェックを怠るな(時間にバッファーを持つ)
    * 場合によっては短縮ルートもできるように考えておく
    * たくさん練習すると緊張しなくなる。自分自身に余裕を作るためにも。
    * 録画して確認したり、誰かに見てもらうほうが良い。

## 板書(ばんしょ)の注意
 * 大きく、丁寧に書け(字がきれい・汚いの話ではない)
 * 図を書け。図は文字より何十倍も理解しやすい。
 * 正確に丁寧に書け(そのままノートに写すので)
 * 色の使い分けをし、それを受講者に示せ
    * 自分は黒をメイン、赤はポイント、緑は補足。とか。
 * 自分の板書の書き方テンプレートを決めろ。そしてそれを受講者に説明しろ
    * ホワイトボードの左半分はノートに書き写す大事なもの/右半分はノートに書かなくてよい説明の補足。とか。

# まとめ
頭では理解しているのですが、実際やってみるとかなり難しいことがわかると思います。すべてを完ぺきにこなすのではなく、場数を踏んでなれてきたら取り入れてみるのが良いと思いますので試してみてください。
Vlc.DotNet.Wpfつかいかたメモ

最近ちょっと調査してたのでメモ

Vlc.DotNet.Wpfは.netに付属するMediaElementに次いで簡単に映像を扱えるような気がします。
ただMediaElementはWindowsMediaPlayerと同じコアを使っているようで、WMPが対応していない（WMPが認識出来るコーデックがインストールされていない）場合はMediaElementでの再生も出来ないので、なんも考えずに色々再生させたいなって場合はこっちのほうが便利かもしれません。

## インストール

Vlc.DotNet.Wpf自体はNuGetで入手できます。
依存関係のある以下のものも必要となります。
Vlc.DotNet.Core
Vlc.DotNet.Core.Interops
上記はラッパーライブラリなのでVLCライブラリ本体も必要です。
VideoLAN.LibVLC.Windows

この4つをNugetで探して入れます。

入れたら使えるようになってます。

## 使い方

Vlc.DotNet.Wpfをはじめとしたエクステンション群を開発しているZeBobo5氏のGithubにエクステンションのソースとサンプルコードがあります。

https://github.com/ZeBobo5/Vlc.DotNet
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples
最低限のコードに抑えており分かりやすいです（逆にこういうときどうすんの？みたいなのがないのでフィーリングになりがち）。
またWpfだけじゃなくWinFormsもあるのでそっちを使う方も役に立つかも。

### ライブラリパス設定
VideoLAN.LibVLC.Windowsを入れるとビルド時に出力フォルダへVLCのDLLをまるっとコピーしてくれます。
で、CraterPlayerの起動時にライブラリのパスをそこに設定して起動するようなカタチ。上記の作者のサンプルはそれを前提に書いてます。
https://github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Samples/Samples.Wpf.Advanced/MainWindow.xaml.cs

### スレッドについて
ボタンなどのUI（メイン）スレッドとライブラリが動作しているスレッドが違うので、ライブラリからのイベントでUI操作をする場合はDispatcher.BeginInvoke()なりでUIスレッドに戻して書く必要があります。
VlcControl.SourceProvider.MediaPlayerの操作も少なくともawait Task.Run()などで非同期にしておかないとすぐにデッドロックします。

### 基本のコントロール
基本的な操作はVlcControl.SourceProvider.MediaPlayerから操作出来ます。SetMedia()で再生したいファイルを選択、Play()やPause()などで再生コントロール。SpeedRatio()で再生速度をコントロールしたり。

### 映像・音声情報など
フォーマットやトラック内容など
VlcControl.SourceProvider.MediaPlayer.Audio
VlcControl.SourceProvider.MediaPlayer.Video
VlcControl.SourceProvider.MediaPlayer.Track
などに色々入っているので適宜参照

### 早送り、早戻し、位置指定

VlcControl.SourceProvider.MediaPlayer.Timeにmsec単位で入っているので、適宜+したり-したり直で入れたり。

### 現在再生位置、ファイルの再生時間長
msecで入っているので、適宜変換します。
v3.0.0現在、msecの更新が遅く1秒単位での表示が無難だと思います💦

```c#
        private void UpdateDurationTime()
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                var media = VlcControl.SourceProvider.MediaPlayer; // 操作したいコントロールね
                var duration = TimeSpan.FromMilliseconds(media.Length);
                var time = TimeSpan.FromMilliseconds(media.Time);
                // ここでtime/durationを表示するなど
            }));
        }
```

### スナップショット

VlcControl.SourceProvider.MediaPlayer.TakeSnapshot()で画像を保存出来ます。
ただ、指定したパスにファイル保存するインターフェースしかないので、加工を前提とする場合
VlcControl.SourceProvider.VideoSourceを使うと良いと思います。ImageSourceオブジェクトなので、lockしてあげればキレイに画像取得出来ます。

### シークバーなど

syu5s氏のユーザーコントロールが簡潔で参考になるかと思います。
http://blog.firefly-vj.net/2015/12/11/uwpmovieplayback_and_seek.html
【動いた報告】「キズナアイとねこますの声を入れ替える機械学習」をWindows 10で動かしてみた

#概要
@KSRG_Miyabi氏の、「[キズナアイとねこますの声を入れ替える機械学習をした](https://qiita.com/KSRG_Miyabi/items/2a3b5bdca464ec1154d7)」を、Windows 10のコンピュータで動かしてみました。
（注：私は人工知能プログラミングについて、マトモな知識を持っていません。場当たり的操作で何とか動かしただけです。手順に不適切な点があるかもしれません。）


#環境
##ハードウェア
|種類|説明|
|:------------------:|:------------------:|
|CPU|Core i7 8700K|
|メモリ|16GB|
|GPU|NVIDIA GTX 1080 8GB|

##ソフトウェア
|種類|バージョン|
|:------------------:|:------------------:|
|OS|Windows 10 Pro 64bit 10.0.18362|
|Python3|3.7.2|
|Chainer|6.2.0|
|cupy-cuda101|6.2.0|
|numpy|1.17.0+mkl|
|scipy|1.3.0|
|CUDA|10.1.105_418.96|

#環境構築
##Pythonを入れる
Microsoft StoreでPython3.7をインストールした。
https://www.microsoft.com/store/productId/9NJ46SX7X90P

##numpyが動かなかったのでインストールし直す
`import numpy`したときに怒られました。
`OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。`
「[Python3.5 + NumPy + SciPy をWindows10にインストールして動かす](https://qiita.com/r-ngtm/items/15caf43648acbccd37d2)」を参考にして、`numpy‑1.17.0+mkl‑cp37‑cp37m‑win_amd64.whl`をダウンロードして`pip install`しました。

##scipyを入れる…はずだが
インストールし直さなくても、`import scipy`できました。

##Cupyを入れる
[Cupyのdoc](https://docs-cupy.chainer.org/en/stable/install.html)を参考にして

- CUDA 10.1を入れる
- `pip uninstall cupy`で最初から入ってるやつを削除
- `pip install cupy-cuda101`でCUDA10.1用のcupyを入れる

##Chainerを入れる…はずだが
インストールし直さなくても、`import chainer`できました。

以上で、環境構築が完了しました。

#動かす
##コードをダウンロード
[Deep_VoiceChanger](https://github.com/pstuvwx/Deep_VoiceChanger)から、@KSRG_Miyabi氏のコードを落としてきます。

##音声を準備
適当に2種類用意します。私は「VOICEROID 東北きりたん」と、私の声を準備しました。
サンプリング周波数16kHzで書き出すのには、Audacityを使いました。「プロジェクトのサンプリング周波数」を16000にして書き出せばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187799/791ff4c9-3646-6986-a697-726d3211db70.png)

きりたんを1_16.wav、私を2_16.wavとして、コードと同じディレクトリに保存しました。

##プログラムに食わせて実行
一見すると、

```console
python trainer.py -v 1_16.wav -w 2_16.wav
```

で動きそうですが、怒られます。

```console
FileNotFoundError: [Errno 2] No such file or directory: '../src/KizunaAI_short.wav'
```
テスト用ファイル名のオプションを設定しないと、デフォルトでは`../src/KizunaAI_short.wav`が使われるようです。-s -uオプションも使って、

```console
python trainer.py -v 1_16.wav -w 2_16.wav -s 1_16.wav -u 2_16.wav
```
とすると、うまく動きます。

##ひたすら待つ
1.6 iters/secくらいの速度？が出ました。終了までの予想時間は16時間。学習データが5分と3分程度と、非常に少ないのが原因ですかね…

##実行結果
1回の「epoch」が完了する毎に、resuitsフォルダに色々と出力されます。
previewに入っているのが、テスト用の音声を変換したものです。
imageの中身はFFTした画像かと思います。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187799/17398ea0-f72e-fc66-44c3-fd3fe92faeae.png)

#追記
##音声の変換
320epochほど回した後、音声の変換を試してみました。

テスト用の音声「test.wav」を、トレーニング用の音声と同じく、16kHzのモノラルで作成します。
その後、convertor.pyを実行します。

```console
> python convertor.py
enter gpu number(if you have no gpu, enter -1)...0
enter netA path...results\generator_ab.npz
enter netB path...results\generator_ba.npz
enter wave path...test.wav
enter batch size...20
```
これで、3つのwavファイルが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187799/52a7dfaf-5aab-b4b5-43ea-d93ca2bb2692.png)

##途中から再開
ある時点での結果を引き継いで学習を再開するには、

```console
python trainer.py -i 200000 -r results\snapshot.npz -v k.wav -w t.wav -s k.wav -u t.wav
```
などと実行すればOKです。
【備忘録。】CTF（capture the flag）練習サイト

#CTFとは？

デフコンやセクコンをはじめとする、コンピューターのハッキング技術を競うコンテストなどで採用される競技。コンピューターセキュリティーに関する攻撃・防御の両方の立場から、暗号、ネットワーク技術、プログラミングなど、さまざまな問題を解くことで技量や知識を競う。（コトバンクから引用）

DEFCON
・　https://www.defcon.org/
世界規模のセキュリティハッキング大会主催


SECCON 2019
・　https://www.seccon.jp/2019/
日本で開催されるセキュリティハッキング大会主催


#練習サイト
ksnctf
・　https://ksnctf.sweetduet.info/
CTFで検索をかけてはじめにたどり着いた練習サイト


LSE CTF
・　https://ctf.lse.epita.fr/ex/
英語ですが、こういうサイトもあるらしい。
Cloud9を使ってLaravelをインストールしてみる

久々の投稿になります@fumi_042です。
今回はCloud9を使ってLaravelのプロジェクト作成までをやってみました。

#Cloud9とは
Cloud9（クラウド9）とはアプリケーションの開発やデータベースなどをクラウド環境で利用できるサービスです。

ブラウザ上で動くため、PCに依存することなく開発環境を準備することができるのが利点です。また、無料で使うことができるのも良さのひとつです。

###コンソールにサインインする。
コンソールにサインインするボタンからログインして下さい。
アカウントの作成方法はここでは割愛します。
![2019-08-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/b30bc520-587f-2466-65c6-8ed83559c7f8.png)


###AWS マネジメントコンソール
cloud9と検索して出てきたものをクリックする。
![2019-08-02 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/7c1046d6-8131-2099-e33f-708d7b3c611a.png)

### AWS Cloud9
下記の画面が表示されたらCleate environmentボタンをクリックします。
![2019-08-02 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/c9de5262-4b96-f992-819b-8ddeb596d1fe.png)


入力項目に適当な文字を入力してNext Stepボタンをクリックします。
![2019-08-02 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/d68623c7-288d-bf5e-54b3-609f78ded252.png)


### Environment settings
設定については今回はこのままでいいです。Next stepボタンを押して次へ進んでください。
![2019-08-02 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/ea8bbebf-48d5-f789-3b62-733a9447e7f3.png)


確認画面で問題なければCreate environmentボタンをクリックします。
![2019-08-02 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/151315b5-926a-8805-c152-3b2e0254b4c1.png)


### Cloud9画面
しばらくするとエディタのような画面が表示されます。
![2019-08-02 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/c205cfe5-00ea-ceee-0c1d-bc783bfd2d3c.png)


# Laravelのインストール
ここからLaravelをインストールしていきます。


# PHPのバージョンの確認
``` bash
php -v
PHP 5.6.40 (cli) (built: Mar  8 2019 18:17:39) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
```
Laravelはphp5系では動かないので、バージョンを上げます。

### PHPを現時点で最新の7.3にアップデートする
``` bash
sudo yum -y install php73 php73-mbstring php73-pdo
sudo unlink /usr/bin/php
sudo ln -s /etc/alternatives/php7 /usr/bin/php
```

#再度バージョンの確認
``` bash
php -v
PHP 7.3.6 (cli) (built: Jun 12 2019 20:51:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies
```
バージョンがphp7系に更新されました。

#Composerをインストール
``` bash
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

#Laravelをインストール
```bash
composer create-project laravel/laravel --prefer-dist SampleProject
```

#Server起動
```bash
cd SampleProject
php artisan serve --port=8080
```

PreviewからPreview Running Applicationを選択する。
![2019-08-02 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/6b3ac25a-02b1-707d-cb91-82b0433c5d27.png)


#起動結果
![2019-08-02 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11200/512c75c0-10e4-2df0-473b-c2cfdf4ba71b.png)


起動することができました！٩(ˊᗜˋ*)و
Git revertとresetについて

#はじめに
Gitのコマンド、reset、revertの内容や使用ケース、違いについてまとめます。


# `reset`
現在のHEADを指定された状態にリセットすることです。
付与するオプションによってインデックス、ワーキングツリーの内容も変更することができ、
取り消したことはコミットログとして残りません。

**【イメージ図】**
![reset イメージ図.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387837/231479e8-be78-0df7-d532-e900042ed468.jpeg)



#使用ケース
**(1)直前のコミットを取り消したい**

```
$ git reset --hard HEAD^
```

**(2)n個前のコミットまで戻したい**

```
git reset ---hard HEAD~n
```

**(※)誤ってresetをしてしまった場合**

```
$ git reset --hard ORIG_HEAD
```

#オプションその他
- `HEAD^`：直前のコミットを表す
- `HEAD~{n}` ：{n}個前のコミットを表す

`reset`には`--mixed`、`--soft`、`--hard`の3つのオプションが存在し、それぞれリセットされる内容が異なります。

|オプション名  | HEAD位置  |インデックス  |ワーキングツリー  |
|---|---|---|---|
|--mixed(デフォルト) |リセット|リセット  |リセットされない |
|--soft  |リセット  |リセットされない  |リセットされない  |
|--hard  |リセット  |リセット  |リセット  |

# `revert`
指定したコミットハッシュを打ち消すコミットを新たに行うことです。
(オプション`-n`を指定しない限り、自動的にコミットされます)
「逆向きのコミット」と言われており、打ち消したこともコミットログとして残ります。

**【イメージ図】**
![revert イメージ図.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387837/a649f1ca-6b3f-e06a-91cf-bc50d92514c8.jpeg)


上記のイメージ画像の例だと、最新の状態Cに対して、コミットBの処理内容のみを打ち消すコミットB'を作成しています。


#使用ケース
**(1)直前のコミットを打ち消したい**

```
git revert <対象のコミットID>
```

**(※)コミットメッセージの編集**


- 編集したい

```bash
$ git revert <対象のコミットID> -e

または

git revert <対象のコミットID> --edit
```
- 編集したくない

```bash
git revert <対象のコミットID> --no-edit
```

**(2)まとめて複数のコミットを打ち消したい**

```bash
git revert -n <対象のコミットID>
git revert -n <対象のコミットID>
　　　　　　・
　　　　　　・
　　　　　　・
git commit
```

- `nオプション(no edit)`：自動コミットせずにrevertする

**(3)範囲を指定して打ち消したい**

```
git revert <対象のコミットID A>..<対象のコミットID B>
```

「..」を使用して、打ち消したい対象範囲のコミットの先頭、末尾を時系列で指定します。
revertされるのは先頭(A)の直後のコミットとなり、先頭(A)自体は含みません。

**(4)マージコミットを取り消したい**

```bash
$ git revert -m 1 <対象のマージコミットID>
```
revertしようとしたコミットがマージコミットだった場合には、`m(mainlineオプション)`をつける必要があります。
また、マージコミットを取り消す場合には、マージした2つのコミット(親)のうちどちらに戻すのかを指定する必要があり、1が**「マージされた側のブランチ」**、2が**「マージする側のブランチ」**という意味合いになります。

- `mオプション(mainline)`：マージコミットを打ち消す場合に使用

**(※)revertのやり直し**

```bash
git revert --abort
```

#オプションその他
- `HEAD^`：直前のコミットを表す
- `HEAD~{n}` ：{n}個前のコミットを表す

| オプション名 | 内容  |
|---|---|
| --no-edit |コミットメッセージを編集しない|
|-e<br>--edit  |コミットメッセージを編集する（※デフォルト）  |
|-m<br>--mainline  |マージコミットを打消す<br>打ち消す際にはどちらのブランチに戻すかを指定する |
|-n<br>--no-commit |自動コミットせずにrevertする  |
|--abort  | revertを取り消す |
|--help  |コマンドのヘルプを表示  |


#まとめ


* **resetとrevertのメリット、デメリット**

    * `reset`
     * メリット<br>
      ・誤ったコミット自体を削除出来るのでコミットログが見やすい<br>・HEADの位置を大幅に移動することができる<br><br>
     * デメリット<br>・チームで開発にて他の人が同じブランチで作業していた場合に、コンフリクトがおきたり、エラー発生の原因となる可能性がある<br>・コミット自体を削除してしまうため、復元作業に少し手間がかかる<br><br>



    * `revert`
     * メリット<br>
・コミット自体を削除するわけではないので、安全にコミットを元に戻すことができる<br>
・誤った履歴が残ることでrevert事態の取り消しも容易に行うことができる<br><br>
     * デメリット<br>
・誤った履歴が残ってしまうので、コミットログが見づらくなる
<br>
* **resetとrevertの使い分け**
前述のメリット、デメリットを踏まえると・・・
    * `reset`<br>
個人開発に向いている<br><br>
    * `revert`<br>
チーム開発に向いている<br>



#参考ページ
[mainlineオプションについて](https://blog.toshimaru.net/git-revert-mainline/)
[git reset についてのまとめ](https://murank.hatenadiary.org/entry/20110327/1301224770)
[git revertについて](https://www.sejuku.net/blog/71634)
[git revert で複数コミットを打ち消す](https://miau.hatenablog.com/entry/20100709/1278699637)
[Ruby] require使用時にLoadError。フォルダ名に要注意。

# はじめに
**Minitest**実行時に**require**を使用してファイルを分割するという超基本的な部分で**LoadError**が出てしまい先に進めないという状況が続きました。

原因解明に無駄な時間を要してしまったので共有しておきます。
LoadErrorの文面は以下の通りです。

```
[Running] ruby "/Users/username/Documents/Practice/ test/fizz_buzz_test.rb"
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- ../lib/fizz_buzz (LoadError)
	from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Users/username/Documents/Practice/ test/fizz_buzz_test.rb:3:in `<main>'
```

# 仕様

RGB変換プログラム作成しました。
ファイルの階層と作成したファイルは以下のとおりです。

>Practice/
　├ lib/
　│　└ rgb.rb　　
　└ test/
　 　└ rgb_test.rb　　　

```ruby:rgb.rb
def to_hex(r,g,b)
  [r,g,b].inject('#')do|hex,n|
    hex + n.to_s(16).rjust(2,"0")
  end
end
```

```ruby:rgb_test.rb
require 'minitest/autorun'
require './lib/rgb'

class RgbTest < Minitest::Test
  def test_to_hex
    assert_equal '#000000',to_hex(0,0,0)
    assert_equal '#ffffff',to_hex(255,255,255)
  end
end
```

こちらのrgb_test.rbを実行したところLoadErrorとなりました。
ちなみにファイルを分割せずにMinitestを行なうと正常に作動します。
作成したFileには問題はなさそうです。

#原因はフォルダ名にあり
何度も確認しましたが、パスが間違っている感じではない。
Ruby最新版をインストールしてみるも変化無し。。

それでもエラー文を細かく凝視し、見てみると最初の1行に気になる点が、、

```
ruby "/Users/jibiki/Documents/Practice/ test/fizz_buzz_test.rb"
```
フォルダ名「/ test/」の部分に謎の空白！
![alt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/5e166de8-7126-a678-dcc9-aec6691c46d0.png)
確認してみると、わかりづらいですが確かにフォルダ名の先頭にスペースがありました。
修正したところ無事解決しました。
#まとめ
大したことではないただのミスではあるが、こういった個人的なミスは検索しても同じ体験をしている人が出て来にくいため解明に時間を割いてしまいました。

以前に別のファイルでMinitestを実行したところ、LoadErrorで上手く読み込めていなかったことがあったので、そちらのフォルダ名も確認したところ先頭に空白が入っていました。

Macの仕様か、VisualStadioCodeの仕様が原因か分かりませんが、慣れていないとフォルダ作成時に空白が開いてしまう事があるみたいなので注意が必要です。
【備忘録】pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): The given session or object reference is invalid.が出たとき

# 環境
+ Windows 10
+ Python 3.7.3
+ PyVISA 1.9.1

# 現象

```python
>>> import visa
>>> rm = visa.ResourceManager()
>>> rm.list_resources()
```

とかやってると、

```python
pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): The given session or object reference is invalid.
```

というエラーが出てくる。

# 対処法
`$ pyvisa-info`
で状態を確認。

```terminal
$ pyvisa-info
Machine Details:
   Platform ID:    ~略~
   Processor:      Intel64 Family 6 Model 142 Stepping 9, GenuineIntel

Python:
   Implementation: CPython
   Executable:     ~略~
   Version:        3.7.3
   Compiler:       MSC v.1915 64 bit (AMD64)
   Bits:           64bit
   Build:          Apr 24 2019 15:29:51 (#default)
   Unicode:        UCS4

PyVISA Version: 1.9.1

Backends:
   ni:
      Version: 1.9.1 (bundled with PyVISA)
      #1: C:\WINDOWS\system32\visa32.dll:
         found by: auto
         bitness: 64
         Could not get more info:
            VI_ERROR_NSUP_ATTR (-1073807331): The specified attribute is not defined or supported by the referenced object.
      #2: C:\WINDOWS\system32\visa64.dll:
         found by: auto
         bitness: 64
         Could not get more info:
            VI_ERROR_NSUP_ATTR (-1073807331): The specified attribute is not defined or supported by the referenced object.
   py:
      Version: 0.3.1
      ASRL INSTR: Available via PySerial (3.4)
      USB INSTR: Available via PyUSB (1.0.2). Backend: N/A
      USB RAW: Available via PyUSB (1.0.2). Backend: N/A
      TCPIP INSTR: Available
      TCPIP SOCKET: Available
      GPIB INSTR:
         Please install linux-gpib to use this resource type.
         No module named 'gpib'

```

Backendsのniに注目します。
「C:\WINDOWS\system32\」ディレクトリにあるvisa32.dllとvisa64.dllというファイルを参照していますが、「VI_ERROR_NSUP_ATTR (-1073807331): The specified attribute is not defined or supported by the referenced object.」というエラーが出ています。属性がサポートされていない的なことを言っているようです。

解決するために[ここ](https://www.ni.com/ja-jp/support/downloads/drivers/download.ni-visa.html#305862)からNI-VISAをダウンロードします。

改めて、pyvisa-infoを打って確認すると、うまくNI-VISAが読み込めているようです。

```terminal

Backends:
   ni:
      Version: 1.9.1 (bundled with PyVISA)
      #1: C:\WINDOWS\system32\visa32.dll:
         found by: auto
         bitness: 64
         Vendor: National Instruments
         Impl. Version: 19922944
         Spec. Version: 5244928
      #2: C:\WINDOWS\system32\visa64.dll:
         found by: auto
         bitness: 64
         Vendor: National Instruments
         Impl. Version: 19922944
         Spec. Version: 5244928
```

NI-VISAダウンロード後は、「pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): The given session or object reference is invalid.」が出なくなりました。

# 参考URL
+ https://github.com/pyvisa/pyvisa/issues/401
全くのゼロから始めるボードゲームのプログラミングと機械学習 [6日目]

# 前回の振り返り
[全くのゼロから始めるボードゲームのプログラミングと機械学習 \[5日目\] \- Qiita](https://qiita.com/Coshian23/items/601bee2ecdbd4ccf8ef4)

- ここまでのあらすじ
- 一旦参考書から脱却
- PythonのIDE(統合開発環境)PyCharmを導入

9ヶ月ぶりにプロジェクトを再開いたしました。果たしてどこまで到達できるやら…

# PyCharmとGithubの連携
本格的にプログラムを書いて行くということでIDEはPyCharmを導入致しました。
あとはバージョン管理のためにGithubと連携させてみました。ソースをクラウド管理するとどの環境からでもアクセスできてほんと便利ですね。

[PyCharmからGitHubへの連携 \- Qiita](https://qiita.com/kph7mgb/items/3c2a000d1ddb2b1aa3e7)

操作は特に問題なく直感的に可能ですね。ただはじめはGitがメニューに見当たらず往生いたしました。VCSメニューから有効化するとともにGit自体をローカルにインストールしないと駄目みたいです。当たり前といえば当たり前か。。

# とりあえず画面にタイルを表示してみる
ではでは、いざボードゲームの実装に取り掛かってみます。再現するゲームは「カルカソンヌ」と呼ばれるタイルと駒を使った名作です。タイルを表示しないことには始まらないというわけで、まずはスタートタイル1枚をウィンドウ内に表示してみます。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308584/f55c3dd3-a750-d1b1-eea6-4c4582f4cc8a.png)

なんてことはないプログラムですがこれだけでもゲームっぽい感じがありちょっと感動します。ボードを管理しやすいようグリッドを引いており、それぞれ四角形の図形描画を行ってます。

```python
	(x,y) = (2,2)  #タイル座標
	start_tile = pygame.image.load("tile.png").convert_alpha() # タイル画像読み込み
	rect_start_tile = start_tile.get_rect() # 画像領域取得
	rect_start_tile.center = (100*x+50, 100*y+50) # 座標からタイル位置補正
	screen.blit(start_tile, rect_start_tile) # 画像の描画
```
左上のグリッドを(0,0)座標としてボードの管理を行ってます。スタートタイルは(2,2)としてウィンドウ内の座標に補正して表示させています。特に難しいことはなし。タイルの回転などをどう管理していくかは今後の課題ですね。

# タイルのクリック判定
続いて肝となるタイルのクリック判定も作ってみました。

```python
	if (event.type == pygame.MOUSEBUTTONDOWN) and (event.button == 1) : #クリックイベント取得
	    if rect_start_tile.collidepoint(event.pos): # タイルの領域をクリック
	        print("hit")
	    else:
	        print("out") # タイル外をクリック
```
タイルをクリックするとhitが表示され、タイル外だとoutが表示されます。実際のところゲームの中で配置されているタイルをクリックすることはないと思いますが、ゲームの操作として類似の処理は必要となるはずなので試してみた感じです。下記を参考にさせて頂きました。

[Python \- pygame 画像範囲のクリック｜teratail](https://teratail.com/questions/162295)

#今後の予定
1. ボードゲームをプログラミング
    2. Pythonの基礎勉強
    3. Pygameの基礎勉強
    4. ボードゲームの実装　👈
2. ボードゲームのAI作成
3. 機械学習によるAI強化

ゲームに必要となる要素をコツコツ実装していきます。

#今回の振り返り
- やったこと
    - Githubを初めて使ってみた
    - ボードゲームの実装を始めた
    - 画像を表示してみた
- わかったこと
    - クラウドでのソース管理は便利
    - GitをインストールしないとGithubへ連携できない
    - クリックイベントの取得は結構簡単
- つぎにやること
    - タイルクラスの実装
    - タイルを回転させてみる
pythonでローカルのファイルを操作するときによく使う関数メモ

ファイル、ディレクトリ操作でよく使う機能を自分用にメモしておきます。
適宜書き足してく予定です。

# 確認環境
Windows10
python == 3.6.3
jupyter notebook

## ファイル一覧を出す

```python:python
import os
os.listdir('../') # 引数に文字列でPATHを渡す
```
os.listdir() は返り値がlistなのでforで回したりできて便利

## ファイル/フォルダがあるか確認
```python:python
os.path.exists('../test.csv') # ファイルまたはフォルダが存在したらTrue
os.path.isfile('../test.csv') # ファイルが存在したらTrue、対象が存在しないかフォルダならFalse
os.path.isdir('../test') # フォルダが存在したらTrue、対象が存在しないかファイルならFalse
```

## フォルダを作る

```python:python
os.makedirs('../test') # 指定のPATHにフォルダを作る (すでにフォルダがあるとエラーになっちゃうので注意)
```

## コピーする

#### ファイルをコピーする

```python:python
import shutil
shutil.copy2('../test.csv', '../test/test.csv') # コピー元、コピー先の順で引数を与える（コピー先はフォルダでも可）
```
上書きされるかrenameされるかはちょっとややこしいようなのでドキュメントを参照
https://docs.python.org/ja/3/library/shutil.html

#### フォルダをコピーする

```python:python
shutil.copytree('../test/', '../test2/') # コピー元フォルダ、コピー先フォルダの順で引数を与える
```
指定コピー元フォルダ内のすべてのフォルダとファイルをコピーしてくれてとても便利。でもコピー先フォルダが存在するとエラーが出ちゃうので注意。

## 移動する

#### ファイルを移動する

```python:python
shutil.move('../test.csv', '../test/test.csv') # コピー元、コピー先の順で引数を与える（コピー先はフォルダでも可）
```
#### フォルダを移動する

```python:python
shutil.copytree('../test/', '../test2/') # コピー元フォルダ、コピー先フォルダの順で引数を与える
shutil.rmtree('../test/')
```

## 削除する

#### ファイルを削除する

```python:python
os.remove('../test/test.csv')
```

#### フォルダを削除する

```python:python
shutil.rmtree('../test/')
```
フォルダ内のフォルダ、ファイルすべてを消去してくれて便利だけど、使うのちょっと怖い

## ファイル/フォルダをrenameする

```python:python
os.rename('../test.csv', '../test2.csv') # 元のファイルPATH、変更後のファイルPATHの順で引数で与える
```
renameというよりPATHの書き換えなので、2番めの引数にファイル名だけ書くと '. /' に移動しちゃうので注意
paramikoのインストールで詰まったメモ

はじめまして。
Sparkと申します。

今回から自分が普段業務、趣味で利用したノウハウを備忘録として残して生きたいと思います。

##本題:
業務にてparamikoをインストールしようとして詰まった

##結果:
pip3のバージョンが古かったことが問題でした。

##調べたこと、実行したこと
pythonのparamikoを使用して自動でファイルをSCPしたかったので、下記コマンドを実行

`pip3 install paramiko`

しかしながらエラーを吐かれてうまくインストールできない・・・
エラー内容
`Command "python setup.py egg_info" failed with error code1 in -snip-`

色々と調べたところ、pip3のバージョンが古いことが問題のようでした
参考: 本家 stackoverflow
https://stackoverflow.com/questions/35991403/pip-install-unroll-python-setup-py-egg-info-failed-with-error-code-1

スレッド内にあった下記コマンドを実行

`pip install --upgrade setuptools`

続けて別のコマンドを入力しようとしたところ下記エラーが発生

`Traceback (most recent call last):
  File "/usr/bin/pip3", line 9 in <module>
    from pip import main
ImportError: cannot import name 'main'`

見慣れたような、見慣れないようなエラーでとりあえずまた調べてみる。

すると "/usr//bin/pip3" のソースコードをいじるとよいよといった下記の記事を参考にソースコードを変更してみる。
https://yasunaya.wordpress.com/2018/09/02/piperror/

変更前:
`from pip import main`

変更後:
`from pip._internal import main`

変更した後、paramikoのインストールコマンドを実行。

無事、インストールできました！

##終わってみて:
今回はまっていた部分に関してですが、どうやら両方ともメジャーな問題？だったようで、知ってる人からしたら "いや常識ジャン？" といった反応されるかもしれませんが、なにぶん初心者にはなかなかしんどかった・・・
結果paramikoのインストールで2時間くらいかかってしまいました。

自分と同じような環境ではまっている人がどれくらいいるかわかりませんが、参考になればと思います。
また、今後とも自分用のメモレベルにはなるかと思いますが、生暖かい目で成長を見守っていただければと思います。
Controller Specでcookiesの値を指定して処理する。

#環境
macOS High Sierra 10.13.6
Docker Version: 18.09.2
rails 5.2.1

#問題
RspecのController Specでcookiesの値を指定して処理をしたい。

#解決法
cookies.signed[:key] = 'value' として、その後リクエストを送ります。

```_spec.rb
describe "#index" do
  let(:guest_token) { 'abcde' }
  let!(:order) do
    create(
      :order_with_line_items,
      guest_token: guest_token
    )
  end

  before do
    cookies.signed[:guest_token] = guest_token
    get :index
  end

  it "assigns the guest's current order to @order" do
    expect(assigns(:order)).to eq order
  end
end
```
これでうまくいきました！
mapメソッドについて　自分用メモ　javascript

#この記事について
プログラミング学習中に悩んだmapメソッドについて
自分なりに納得したので、忘れないようにメモを残して置こうと思う。
なので具体的なmapメソッドの使いかたは書いていません。
あくまで自分用のメモです。

##悩んだ問題
javascriptの複数検索ができるようにする問題で
mapの引数で呼び出している関数の書き方について

~~~javascript
var list = $("#list");

  function appendList(word) {
    var item = $('<li class="list">').append(word);
    list.append(item);
  }

　//↓ここ
  function editElement(element) {
    var result = "^" + element;
    return result;
  }

  $("#submit").on("click", function() {
    var input = $("#keyword").val();
    var inputs = input.split(" ");
    var newInputs = inputs.map(editElement);//←ここ
    var reg = RegExp(newInputs.join("|"));

    $(".list").remove();

    $.each(fruits, function(i, fruit) {
      if (fruit.match(reg)) {
        appendList(fruit);
      }
    });

    if ($(".list").length === 0) {
      appendList("一致する果物はありませんでした");
    }
  });


~~~

##悩んだ理由
関数のeditElementは引数として(element)を持っているので、呼び出し元のmapの引数でもeditElementに引数を持たせる必要がある。なのにmapの引数ではeditElementに引数を持たせていない。
そう考えていたため、上記の書き方がなぜ正しいのか分からなかった。

##解決
そこでmapメソッドについて調べたところ
mapの構文は以下のようになる。

~~~javascript
var array = [ 配列データ ];
 
array.map( コールバック関数(function( value )) );
~~~

つまり今回の問題でいうと
function editElement(element)がコールバック関数
に該当し、elementはvalueを指すことになる。
そのためelementはinputs配列のひとつずつの要素にあたり
その要素、ひとつずつに"^"を連結していることになる。


よって今回の問題で行うべき、複数の入力された値に対して
前方一致の条件を追加していることになることが分かった。
pandocコンテナに色々入れてみた

# pandocコンテナに色々入れてみた

設計書をMarkdownで書いていたのだけど、提出できる（≒ Word的な）形にする必要があったので、調べていたら、[素晴らしい記事](https://qiita.com/Kumassy/items/ffa752da5f7193c4929c)にたどり着きました。

あとは[PlantUML](http://plantuml.com/ja/index)に対応すればいい感じになりそうなので、コンテナに突っ込んでみました、という記事です。

## 元ネタ

いろいろ~~パクリ~~参考にしました。感謝。

### 参考記事
- [まだまだ Word で消耗してるの？ 大学のレポートを Markdown で書こう （Docker 編）](https://qiita.com/Kumassy/items/ffa752da5f7193c4929c)
- [PandocインストールとPlantUMLフィルター](https://qiita.com/yasuo_utsunomiya/items/660e1e2cb343190cedff)
- [Java 11 リリース後のオススメ Docker イメージを考える](https://k11i.biz/blog/2018/10/29/base-docker-images-for-java11/)

### 参考ソース

- https://github.com/Kumassy/docker-alpine-pandoc-ja
- https://github.com/jgm/pandocfilters

### リソース

- [Dockerfile](https://github.com/ysogabe/docker-alpine-pandoc-ja)
- [DockerImage](https://hub.docker.com/r/ysogabe/alpine-pandoc-ja)

## 使い方

Markdown → PDFは[元ネタ](https://qiita.com/Kumassy/items/ffa752da5f7193c4929c)を参考にしてください。基本、「--filter /usr/share/plantuml/plantuml.py」オプションをつけるだけです。

```bash
PDFの出力例
$ docker run -it --rm -v `pwd`:/workspace ysogabe/alpine-pandoc-ja pandoc input.md -f markdown -o output.pdf -V documentclass=ltjarticle --pdf-engine=lualatex --filter /usr/share/plantuml/plantuml.py
```

## やったこと
[元のDockerfile](https://github.com/Kumassy/docker-alpine-pandoc-ja)を以下の通りいじりました。

1. Dockerのベースイメージを「adoptopenjdk/openjdk12:alpine」に変更
2. ビルドが通らなかったので、修正ついでにTeXのバージョンを上げた
3. plantuml、pandocfiltersをインストールした

大したことしてないので、詳しくは[ソース](https://github.com/ysogabe/docker-alpine-pandoc-ja)をみてください。

## PlantUMLの記載方法
[pandocfilters](https://github.com/jgm/pandocfilters)の「examples/plantuml-sample.md」を参考にしてください。

PlantUMLの書き方はいろいろありますが、

```markdown

```plantuml → OK

```plantuml → NG
@startuml

@import "./uml/01.usecase.puml" → NG

```puml → NG
@startuml
```
です。（大量に文書があればfilterを修正するけど、grepでできる範囲だったので、文書で対応しました）

## 使ってみて

- やっぱり、ドキュメントの差分管理は便利
- [typora](https://typora.io)使うと、図表もコピペでOK（PlantUMLのプレビューができれば完璧なのになぁ）
- 何気にWord出力が便利




## これから

- CI：誤字、脱字、表記の揺れとかの自動チェック
- CD：最終生成物をどこで管理する？

## 謝辞

[元ネタ](https://qiita.com/Kumassy/items/ffa752da5f7193c4929c)のおかげで、仕事がはかどりました。

## 修正

相互参照に対応できてなかったので、Dockerイメージを修正しました。PDFは相互参照できます。すばらしい。Wordでも相互参照したいなぁ。。。
おすすめATOMパッケージ（フロントエンドエンジニア向け）

フロントエンドエンジニアの僕がオススメするATOMのパッケージです。

# ATOMをオススメする理由
## GitHub Desktopを使いたいから
一番の理由がこれですね。
僕はGitの管理にGitHub Desktopを使用しているのですが、ATOMとの相性がいいんですよね。
具体的にはGitHub Desktopから直接開いたりできるので助かってます。
GitHubを使っていない人でもGitHub Desktopは利用できるので恩恵は受けられると思います。

## 無料
これも大きな理由ですね。
無料でもこれだけ使いやすいので有料に手を出したことはありません。。

## Vimとかは敷居高いし、Visual Studio Codeはなんか嫌だ
これは個人的な感覚なんですが、なんとなくです。
深い理由はないです。


# オススメパッケージ

前置きが長くなりましたが、紹介していきたいと思います。

## 基本

各エンジニア共通でオススメのパッケージです。

### [file-icons](https://atom.io/packages/file-icons)
ファイルが見やすくなって便利です。
よく使う言語だと見慣れているんですが、あまり使わない言語のファイルのアイコンが意外とオシャレだったりします。

### [atom-beautify](https://atom.io/packages/atom-beautify)
HTML等のファイルを綺麗にしてくれるやつです。
言語によっては使えなかったり変な感じになることもありますが、HTMLとかなら綺麗になるのでたまに使います。

### [atom-clock](https://atom.io/packages/atom-clock)
画面の右下に時計を表示させてくれます。
集中しているといつの間にか時間が経っていることも多いので、時間の目安として助かってます。
時間は大事です。

### [atom-clock](https://atom.io/packages/atom-clock)
画面の右下に時計を表示させてくれます。
集中しているといつの間にか時間が経っていることも多いので、時間の目安として助かってます。
時間は大事です。

### [japanese-menu](https://atom.io/packages/japanese-menu)
メニューバーとコンテキストメニューを日本語化してくれます。
英語が苦手な人には必須ですね。

### [pigments](https://atom.io/packages/pigments)
色を表示してくれます。

### [minimap](https://atom.io/packages/minimap)
右端にソースマップを表示してくれます。
長いコードを書いているときには助かります。

### [minimap](https://atom.io/packages/minimap)
右端にソースマップを表示してくれます。
長いコードを書いているときには助かります。

### [minimap-git-diff](https://atom.io/packages/minimap-git-diff)
minimapにgit diffを表示してくれます。
どれくらい修正したのかすぐにわかりますね。

### [minimap-highlight-selected](https://atom.io/packages/minimap-highlight-selected)
選択した箇所をminimapに表示してくれます。

### [minimap-pigments](https://atom.io/packages/minimap-pigments)
pigmentsに関連するパッケージでminimap上に色を表示してくれます。

### [platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)
ATOM上でターミナルを起動することができます。
僕はターミナルは基本これしか使ってません。

### [project-manager](https://atom.io/packages/project-manager)
プロジェクトマネージャーです。

### [show-ideographic-space](https://atom.io/packages/show-ideographic-space)
全角スペースを視覚的に表示してくれます。
意外と便利。

## Git関連

Git関連のオススメです。

### [git-plus](https://atom.io/packages/git-plus)
Gitを使うとき便利。

### [git-log](https://atom.io/packages/git-log)
Gitを視覚的に見ることができる
SourceTreeみたいな感じですね。
Cmd+Shift+P、 `Git Log:Show`です。

## Vue.js関連
フロントエンドエンジニアという職業柄Vue.jsををよく使うので、
Vueを書くときに便利なパッケージを紹介します。

### [language-vue](https://atom.io/packages/language-vue)
Vueの表示をしてくれます。
Nuxt.jsでも大丈夫。

### [Stylus](https://atom.io/packages/Stylus)
StylusというCSSメタ言語が使えます。
以前はSCSSで書いてましたがStylusを知ってから病みつきに。

### [atom-pug](https://atom.io/packages/atom-pug)
pugが使えます。
他にも色々パッケージはあるんですが、
Vue + Stylus + pug　の組みわせだとこれが一番いい気がします。
pandas データの確認あれこれ

# pandas データの確認
## pandas データを指定して抽出・表示させる
参考URL
https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA
[] を使って抽出する中身を指定する

```python
df[0:4] # 0~4 件目を出力
```

## ラベルごとのサンプル数の合計を出力する（列毎の合計値を出力する方法）
参考URL
https://deepage.net/features/pandas-sum.html
.sum（）関数を使うと合計を出力可能

```python
df.sum() 
```

axis の話もあったがここでは使わない。ちなみに axis=1 が行の合計。

## 欠損値の確認方法

参考URL
https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203
isnull() で欠損値の確認が出来る。欠損有はture,欠損無しはfalse。


```python
df.isnull()
```

## 特徴量の平均値と標準偏差、四分位数を出力させる
### 平均値
https://deepage.net/features/pandas-mean.html
.mean() 関数を使用すると平均値が出力。更に、列の平均を取りたい場合.mean(axis=0)と書く


```
df.mean()
```

### 標準偏差、四分位数
、、と、ここまで書いて気付いてしまった。。
参考URL
https://deepage.net/features/pandas-describe.html
.describe() という関数が有り、それがこの問題を一発で解決する技だったようです。

```python
df.describe()
```

#### めでたしめでたし。( ；∀；)
一時間でできる！最強のWordPress環境構築と言われたのでやるだけやってみた忘備録

# 概要
**クラウドサーバーの建て方** :https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4
の記事を読んで、言われるがままにやったほうが当然順調だが、個人的な理由により道をそれてしまった私のための忘備録てきな記事です。
具体的にはこれ以上登録しているサービスを増やしたくなかっただけです。自分で出来る範囲はやっちゃおう。

## [1/5]クラウドサーバーはGoogle Cloud Platformを選択する

1/5は言われるがままやればOK

## [2/5]CDN連携 & DNS設定
以下の記事を参照したものに切り替える。

**ドメイン取得～ネームサーバー移管** :https://qiita.com/teekay/items/135dc67e39f24997019e
言われるがままやってOK。
ただしドメイン購入の時「Forward this domain」を選択する必要はない。どちらも押さずに購入し、あとから設定することが可能。
ドメインの設定・管理以降はネームサーバーをGCP側でやるので「ネームサーバを指定する場合」を参照する。

**ネームサーバー立ち上げ～ドメイン設定**：https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e
GCP内の操作はほぼほかのレジストラ指定と同じ感じなので割愛。
言われるがままやれば完ぺき。

**SSL対応** :https://qiita.com/Yuya_Nishizaki/items/4a2413fc2c07aca5d193
GCPの操作部分だけ参照。
具体的にはHttpsトラフィックを許可するにチェックボタンを押し、SSH接続ボタンを押すところまで。
なぜならサーバー内にgitが入っていない上に、この記事だとapacheサーバー前提になっているのでnginxでは使えない。

**Https対応** :https://docs.bitnami.com/bch/how-to/generate-install-lets-encrypt-ssl/
**公式こそ最強**
bitnamiのHttps設定を調べていくとおそらく大量に
`sudo /opt/bitnami/bncert-tool`
を使えばいい感じにやってくれると書いてあるブログや記事に出会うだろうが、**このツールはapache専用である**。
下のほうに書かれている「Alternative Approach」の記事を参考にStep1からStep5まで行う。
ただしStep5の`/opt/bitnami/letsencrypt/scripts/renew-certificate.sh`に書けと言われている内容はApache専用になってしまっているので、

```
#!/bin/bash

sudo /opt/bitnami/ctlscript.sh stop nginx
sudo /opt/bitnami/letsencrypt/lego --tls --email="EMAIL-ADDRESS" --domains="DOMAIN" --path="/opt/bitnami/letsencrypt" renew --days 90
sudo /opt/bitnami/ctlscript.sh start nginx
```

と変更すれば良い。

ここまで調べる時間含めて三時間かかりました。うん。素直にアプリ登録して使ったほうがいいと思うよ！

## [3/5]～以降

言われるがままでOK。
とりあえず[この記事](https://qiita.com/kusobako/items/ddf04c1222088593a4f4#_reference-4b5f3782edaf1826b973)が参考になるので一緒に見ること。

以上！