OmniAICreator/Qiita-1.07M huggingface dataset:
CentOSでJDK、Tomcatのバージョンを変更する

# はじめに
この間やったので、やり方メモ。参考サイト様とほぼ同じ内容。

# 使用ツール
- Linux環境(今回はCentOS6)
- teraterm
- WinSCP

# 手順
以下の手順でJDK、Tomcatのバージョンを変更します。
1. yumでインストールしたTomcatを削除
2. yumでインストールしたJDKを削除
3. 新しいバージョンのJDKをインストール
4. 新しいバージョンのTomcatをインストール
5. 確認

# 1. yumでインストールしたTomcatを削除

## Tomcatを停止する

```
sudo service tomcat6 stop
sudo /etc/rc.d/init.d/tomcat6 stop
```

## Tomcatを停止する

```
sudo chkconfig tomcat6 off
```

## インストールしたTomcatを確認

```
yum list installed | grep tomcat
```

## Tomcatをアンインストール

```
sudo yum remove -y tomcat6 tomcat6-webapps tomcat6-admin-webapps apache-tomcat-apis.noarch tomcat6-el-2.1-api.noarch tomcat6-jsp-2.1-api.noarch tomcat6-lib.noarch tomcat6-servlet-2.5-api.noarch

```

# 2. yumでインストールしたJDKを削除
## インストールしたJDKを確認

```
yum list installed | grep jdk
```

## JDKをアンインストール

```
sudo yum remove -y java-1.7.0-openjdk.i686 java-1.7.0-openjdk-devel.i686
```

# 3. 新しいバージョンのJDKをインストール
## JDKをダウンロードする
以下のアドレスからJDKのtarファイルをダウンロードして転送

http://www.oracle.com/technetwork/java/javase/downloads/index.html

## 転送したtarファイルを展開

```
tar xvf jdk-8u5-linux-i586.gz
```

## ディレクトリを移動

```
sudo mv jdk1.8.0_05 /usr/local/java/jdk1.8.0_05
```

## 移動したディレクトリにcd

```
cd /usr/local/java/
```

## バージョン名を削除したシンボリックリンクを作成

```
sudo ln -s jdk1.8.0_05 jdk
```

## JAVA_HOMEの環境変数を設定

```
export JAVA_HOME="/usr/local/java/jdk"
```

プリインストールされているjavaとjavacのシンボリックリンクを削除

```
cd /usr/bin
sudo rm java
sudo rm javac
```

シンボリックリンクをダウンロードして設定した場所に指定して作成

```
sudo ln -s $JAVA_HOME/bin/java java
sudo ln -s $JAVA_HOME/bin/javac javac
```

## javaのバージョンを確認
インストールしたバージョンになっていたらOKです。

```
java -version
javac -version
```

# 4. 新しいバージョンのTomcatをインストール
## インストールしたいバージョンのTomcatをダウンロードする
ここではTomcat8をダウンロード。
tomcat8のダウンロードページ
http://tomcat.apache.org/download-80.cgi

バイナリディストリビューションのtarファイルをダウンロード
## ダウンロードしたバイナリディストリビューションを展開

```
tar -xvzf apache-tomcat-8.0.9.tar.gz
```

## 解凍してできたディレクトリを移動

```
sudo mv apache-tomcat-8.0.9 /usr/local/tomcat8
```

## tomcatを起動

```
sudo /usr/local/tomcat8/bin/startup.sh
```

# 5. 確認
## ブラウザでアクセスしてみよう
http://localhost:8080

# 参考
[CentOSにJDK、Tomcatをyumでインストールしてしまったものを最新にするとき](https://qiita.com/yoh-nak/items/a93d2564ccf574065970)
AWS認定試験の話し


最近はアプリやフロントエンドにハマって、久しぶりにインフラやサーバ周りを触ってたら以前より面白い感じがありました。

数年前インフラやネットワーク関連の仕事をして忘れた知識は多い。。
去年知り合いと一緒に[ACP (Alibaba Cloud Professional)](https://www.pearsonvue.co.jp/Clients/Alibaba-Cloud-Certification.aspx)を取得しました。
今年はAWS Solution Architecture Associate(SAA)認定試験。

## どうやって勉強したのか
- 以前関連の仕事経験があり、概念など理解している
- AWSのドキュメントを読む
- 社外の勉強会にて経験や勉強した知識などの共有によりアウトプットする

## どのぐらい勉強したのか
- 試験向け準備するには試験前3日
- ドキュメント読む：まとめて24時間ぐらい
- ほか：アウトプットや実験など時間がまとめられない

## 何を参考したのか
- [AWS Well-Architected](https://aws.amazon.com/jp/architecture/well-architected/)を理解する
- [AWSホワイトペーパー](https://aws.amazon.com/whitepapers/)
- [Amazon EC2](https://aws.amazon.com/ec2/faqs/) || [Amazon S3](https://aws.amazon.com/s3/faqs/) || [Amazon VPC](https://aws.amazon.com/vpc/faqs/) || [Amazon Route 53](https://aws.amazon.com/route53/faqs/) || [Amazon RDS](https://aws.amazon.com/rds/faqs/) || [Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/faqs/) || [Amazon SQS](https://aws.amazon.com/sqs/faqs/)  。。などの [よくある質問](https://aws.amazon.com/faqs/)を参考
- 各カテゴリの[AWS ドキュメント](https://docs.aws.amazon.com/ja_jp/index.html?nc2=h_ql_doc_do)
- [AWSオンラインセミナー](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
- 初心者向け[AWS Tutorial Videos For Beginners | Simplilearn](https://www.youtube.com/playlist?list=PLEiEAq2VkUULlNtIFhEQHo8gacvme35rz)
- 参考になったWeb：
  - http://jayendrapatil.com/
  - https://awsjp.com
  - https://digitalcloud.training/certification-training/
  - 練習問題: http://www.briefmenow.org/amazon
  
  
## 次は
Solution Architecture Professional(SAP) or
AWS Certified Developer Associate

ということで
**生きる・学ぶ**
コピペで使うFirebase【Firestore ページング編】

## 公式ドキュメント
[クエリカーソルを使用したデータのページ設定](https://firebase.google.com/docs/firestore/query-data/query-cursors?hl=ja)

## 概要
### ページングのメモ
Firestoreを使用してページング実装する場合は、クエリーカーソルを使う。
orderByメソッドで指定されたフィールドで始まる新しいクエリを作成して返す。

<table>
<tr>
  <th colspan=3>メソッド一覧</th>
</tr>
<tr>
  <th>メソッド</th>
  <th colspan=2>動作</th>
</tr>
<tr>
  <td>startAt</td>
  <td colspan=2>クエリの開始点(クエリーカーソルを含む)からのデータを返す</td>
</tr>
<tr>
  <td>startAfter</td>
  <td colspan=2>クエリの開始点(クエリーカーソルを含まない)からのデータを返す</td>
</tr>
<tr>
  <td>endAt</td>
  <td colspan=2>クエリの終着点(クエリーカーソルを含む)からのデータを返す</td>
</tr>
<tr>
  <td>endBefore</td>
  <td colspan=2>クエリの終着点(クエリーカーソルを含まない)からのデータを返す</td>
</tr>
</table>

# サンプル
firestoreのコレクションは以下としいidを昇順で並べる

```
コレクション名: member
ドキュメント
{ id: 1, name: "taro" }
{ id: 2, name: "hana" }
{ id: 3, name: "aki" }
{ id: 4, name: "yuto" }
{ id: 5, name: "ryo" }

```

## startAt
```js:startAt
firebase
    .firestore()
    .collection('member')
    .orderBy('id', 'asc')
    .startAt(3)
    .get()
    .then(querySnapshot => {
        let memberList = []; 
        querySnapshot.forEach(doc => memberList.push(doc.data()));
        console.log(memberList);
        // [{ id: 3, name: "aki" }, { id: 4, name: "yuto" }, { id: 5, name: "ryo" }]
    })
```

## startAfter
```js:startAfter
firebase
    .firestore()
    .collection('mamber')
    .orderBy('id', 'asc')
    .startAfter(3)
    .get()
    .then(querySnapshot => {
        let memberList = []; 
        querySnapshot.forEach(doc => memberList.push(doc.data()));
        console.log(memberList);
        // [{ id: 4, name: "yuto" }, { id: 5, name: "ryo" }]
    })
```

## endAt
```js:endAt
firebase
    .firestore()
    .collection('mamber')
    .orderBy('id', 'asc')
    .endAt(3)
    .get()
    .then(querySnapshot => {
        let memberList = []; 
        querySnapshot.forEach(doc => memberList.push(doc.data()));
        console.log(memberList);
        // [{ id: 1, name: "taro" }, { id: 2, name: "hana" }, { id: 3, name: "aki" }]
    })
```

## endBefore
```js:endBefore
firebase
    .firestore()
    .collection('mamber')
    .orderBy('id', 'asc')
    .endBefore(3)
    .get()
    .then(querySnapshot => {
        let memberList = []; 
        querySnapshot.forEach(doc => memberList.push(doc.data()));
        console.log(memberList);
        // [{ id: 1, name: "taro" }, { id: 2, name: "hana" }, { id: 3, name: "aki" }]
    })
```

# ドキュメント スナップショットを使用したサンプル
※　うまく動かない...　ドキュメント見てる感じだと動くはず

```js
firebase
    .firestore()
    .collection('member')
    .where('name', "==",'hana')
    .get()
    .then(documentSnapshot => {
        const cursor = documentSnapshot.docs[0].data();
        firebase
            .firestore()
            .collection('member')
            .orderBy('id', 'asc')
            .startAt(cursor)
            .get()
            .then(snapshot => {
                snapshot.forEach(doc => {
                console.log("doc", doc.data());
            })
        })
    });
```
crontabを安全に編集しよう

# はじめに
　お仕事でcrontabを一時的に修正することがあり、
crontabを直接開いて編集するとミスが出そうで嫌だなと思って安全なやり方を探しました。

# 使用ツール
- Linux環境(今回はCentOS6を使用）
- teraterm

# 手順
1. crontabの設定をファイルに出力
2. 1で出力したファイルを編集
3. 2で編集したファイルを使用してcrontabを登録
4. 不要なファイルを削除

# やってみよう
## 1. crontabの設定をファイルに出力
現在設定されているcrontabの内容を、バックアップと編集用に2つのファイルに出力しましょう。

```
$ crontab -l > /tmp/crontab.org
$ crontab -l > /tmp/crontab.edit
```

`crontab.org`がバックアップ用、`crontab.edit`が編集用です。
## 2. 1で書き出したファイルを編集
編集用の`crontab.edit`を編集します。

```crontab.edit
$ vi /tmp/crontab.edit
```
編集し終わったら、現在のcrontabと編集した`crontab.edit`を比較して、
編集内容が間違っていないか確認しておきましょう。

```
$ crontab -l | diff /tmp/crontab.edit -
```

自分が編集した部分がdiffに出ます。

## 3. 2で編集したファイルを使用してcrontabを登録

編集した`crontab.edit`を使用して、crontabを登録します。

```
$ crontab /tmp/crontab.edit
```

きちんと登録できたか、確認しましょう。

```
$ crontab -l
```

編集したとおりになっていますね。

## 4. 不要なファイルを削除
特に設定を元に戻す必要がなければ、1で出力したファイルを削除してしまいましょう。

```
$ rm /tmp/crontab.org /tmp/crontab.edit
```

元に戻したければ、
バックアップ用にとっておいた`crontab.org`の内容をcrontabに登録しなおしてから削除します。

```
$ crontab /tmp/crontab.org
$ rm /tmp/crontab.org /tmp/crontab.edit
```

直に設定をいじるのは怖いので、
一度ファイルを出力して、そちらを反映するやり方はほかでも応用できそうですね。

# 参考サイト
[crontabを安全に編集する手順](https://qiita.com/nishina555/items/10fd1f1188b43ed8d972)
Quorum "Fatal: Failed to raise file descriptor allowance: invalid argument"のバグ解消

# バグの内容

Quorumの[Create Network From Scrach](https://docs.goquorum.com/en/latest/Getting%20Started/Creating-A-Network-From-Scratch/)のチュートリアル時、以下のコマンドでバグが発生するケースがあります。

これは、QuorumがGoのversion1.11までしかサポートしていないためです。
[Issue](https://github.com/jpmorganchase/quorum/pull/892)

```
geth --datadir new-node-1 init genesis.json
INFO [12-02|16:18:49.325] Maximum peer count                       ETH=25 LES=0 total=25
Fatal: Failed to raise file descriptor allowance: invalid argument
```

# バグの解消方法
1. Goのversion管理ツールでVersionを1.11に変える。Go version管理の定番は[gvm](https://github.com/moovweb/gvm)。

2. `make all`をgo.11でやり直す
## 注意
`make all`によって、現在のGoのVersionとQuorumに対応した`geth`バイナリーが生成されます。そのため、`make all`コマンドを実行する前にGoのVersionを変更してください。

細かい手順は[公式](https://docs.goquorum.com/en/latest/Getting%20Started/Creating-A-Network-From-Scratch/)で。

# チェックポイント
1. Pathの設定がbuild/binに設定されているか(which geth で確認)
2. GoのVersionが 1.11以下か (gvm versionで確認)
3. make all の前にGoのversionを変更したか(geth versionでgoのversion確認)
pdbファイルからラマチャンドランプロットを表示する。

__ラマチャンドランプロットについては以下のサイトを参考にしてください。__
https://ja.wikipedia.org/wiki/ラマチャンドランプロット

__以下のお茶の水女子大学様のサイトでpdbファイルからラマチャンドランプロットを出力してくれる。__
http://cib.cf.ocha.ac.jp/bitool/DIHED/

<img width="1137" alt="スクリーンショット 2019-12-02 16.59.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/146d1844-f7c8-db9d-d28f-f4ced019fb89.png">
忘備録-Swiftでのプログラミング

趣味でIOSアプリ開発をかじっていた自分が、改めてSwiftを勉強し始めた際に、曖昧に理解していたところや知らなかったところをメモしています。

## 参考文献

この記事は以下の書籍の情報を参考にして執筆しました。

- [詳解 Swift 第5版](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3Swift-%E7%AC%AC5%E7%89%88-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/481560407X)

##Swiftでのデータ型
・型の実体全てインスタンスと総称する。
・データの本体とそれを示すポインタという概念はない。
・データの持ち方には「値型」と「参照型」がある。
値型 : 数値データは変数に代入したり関数に渡した後、値の変更や演算をすときにコピーが作成されるため、元の値データに影響を及ぼさない。
参照型 : 代入に対してコピーを作らず、データ自体に対する参照を渡す。(例）クラスのインスタンス
##識別子
Swiftでは識別子に多くのUnicode文字が利用できる。
日本語や絵文字なども使用できる。

```swift
let 😅 = "ごめんなさい"
let 寝坊時間 = 1
let 待ち合わせ = 10
print("\(😅)\(寝坊時間 + 待ち合わせ)時につきます💦")     //ごめんなさい11時につきます💦
```
##SwiftのCase文の特徴
・分岐先の文の実行が終了しても、breakで抜ける必要がない。(何も処理をしない場合はbreak必須です。)
・分岐に用いる型に、文字列や構造を持つ型も使える
・必要に応じて、caseに条件を記述できる。

```swift
let n = Int.random(in: 1...6)

switch n {
case 1:
  print("最小")
case 2,3:
  print("小さい")
case 4,5:
  print("大きい")
case 6:
  print("最大")
default:    //上記のどのcaseにも該当しない場合、ここの処理が実行される。
  break
}
```
ハッシュリストをVTに突っ込んで検知結果をリストで受け取る X-FORCE もあるよ

エモいやつのハッシュ値リストをまとめてVTでチェックするスクリプトです。
APIでまとめて取得します。クエリ量制限(4回/分)があるのでゆっくり待ちましょう

```python
import requests
import json
import pandas as pd 
import time
import csv 


hashlist= [
'c9e17e63de9b882e820c829b415a4e13070453c8',
'dee5ff1d1910e27c2b6aed7ddffce3c3be6356d4']
url = 'https://www.virustotal.com/vtapi/v2/file/report'

apikey ='USE_YOUR_API_KEY'

f = open('vt_output.csv', 'w')
writer = csv.writer(f, lineterminator='\n')

for hash in hashlist:
    print(hash)
    params = {'apikey': apikey, 'resource': hash}
    response = requests.get(url, params=params)
    l = [hash]
    response_code =response.json()['response_code']
    l.append(response_code)
    if response_code == 1:
        df=pd.read_json( json.dumps(response.json()))
        for x in range(df.index.size):
            l.append(df['scans'][x]['result'])
    writer.writerow(l)
	time.sleep(25)
f.close()
```

結果はリストで取得できます。

```
1	Trojan.Downloader.DOC.Gen	Other:Malware-gen [Trj]	W97m.Downloader.IQU	Trojan.MSWord.Generic.4!c	VBA/Downloader.S70	W97m.Downloader.IQU	Other:Malware-gen [Trj]		VBA/Dldr.Agent.zzlmg		W97m.Downloader.IQU			W97M.Emotet.36301		Doc.Dropper.Emotet-7399725-0		W97M/Downldr.HB.gen!Eldorado	W97M.DownLoader.4186	VBA/TrojanDownloader.Agent.QMI		malicious (high confidence)		Malware.VBA/Dldr.Agent.zzlmg	W97m.Downloader.IQU	VBA/Agent.QLT!tr.dldr	Macro.Trojan.Kryptik.NK@susp	Trojan-Downloader.VBA.Emotet				HEUR:Trojan.MSOffice.SAgent.gen		malware (ai score=89)			W97M/Downloader.xx	BehavesLike.Downloader.cg	W97m.Downloader.IQU	TrojanDownloader:O97M/Emotet.GF!MTB	Trojan.Script.Downloader.ghylsa	O97M/Downloader	virus.office.obfuscated.1			DFI - Malicious OLE	Mal/DocDl-K	Trojan.Gen.2	Suspicious/W97M.Obfus.Gen.8	Heur.Macro.Generic.Gen.f		Trojan.W97M.EMOTET.JKBG	Trojan.W97M.EMOTET.JKBG				Trojan.AvsMofer.bSGLro		HEUR:Trojan.MSOffice.SAgent.gen	Probably W97Obfuscated	
```

X-FORCEでIPをチェックしてスコアを取得するやつも作りました

```
import requests
import json
import pandas as pd 
import time
import csv 

iplist =[
'8.8.8.8',
'7.7.7.7'
]


url = 'https://api.xforce.ibmcloud.com/ipr/' 

apikey ='Basic YOURKEY'

f = open('x_output.csv', 'w')
writer = csv.writer(f, lineterminator='\n')


for ip in iplist:
    print(ip)
    headers = {'Authorization': apikey}
    full = url + ip
    response = requests.get(full, headers=headers)
    l = [ip]
    l.append(response.json()["score"])
    l.append(response.json()["cats"])
    l.append(response.json()["categoryDescriptions"])
    writer.writerow(l)
    time.sleep(5)
f.close()
```
StencilJSの日本語翻訳プロジェクトについて

この記事は、Ionic Frameworkアドベントカレンダー2日目の記事です。

StencilJSの日本語翻訳プロジェクトについて説明します。
[StencilJS日本語サイト](https://stenciljs.jp)


## StenilJSとは
Ionicチームが開発したWebコンポーネント作成ライブラリです。StencilJSを使うと、JSX + TypeScript + SASSでWebコンポーネントを開発できます。

StencilJSは次の機能を持ってます。

* Virtual DOM
* 非同期レンダリング(inspired by React Fiber)
* リアクティブデータバインディング
* TypeScript
* JSX

最近では、Ionicに限らず利用され始めてます。アップルがStencilJSの求人をだしていたり(Apple TVのサイトで使ってる)、Amazon AmplifyのドキュメントがStencilJSで構築されていたりします。[URL](https://docs.amplify.aws/)

## StencilJSの日本語翻訳プロジェクト
StencilJSには、日本語翻訳プロジェクトがあります。ただし、この記事を書いている段階ではまだ、トップページしか翻訳されていません。
[StencilJS日本語サイト](https://stenciljs.jp)

2019/8月ごろに勢いでjpドメインを取得しましたが、そもそも翻訳プロジェクトをやったことがない＆技術書典7＆技書博2と執筆活動が重なり、今日まで手を出せずにいました。

というわけで、アドカレ駆動で、コントリビュート手段＆ジポジトリを整備することにしたのです。

## コントリビュートするには
改めて、本ドキュメントにコントリビュートする手段ですが、次のワークフローで行います。

### ワークフロー
 0. 本レポジトリをForkする
 1. 翻訳作業のIssueを作成する
 2. 翻訳する
 3. プルリクエストを作成する

#### 0. 本レポジトリをForkする
まずは、この[StencilJS日本語ドキュメントのリポジトリ](https://github.com/ionic-jp/stencil-docs)をFolkしましょう。

#### 1. 翻訳作業のIssueを作成する
Issueをたてて、自分が翻訳する場所を明確にしましょう。他の人と被らないようにする配慮です。
参考：https://github.com/ionic-jp/stencil-docs/issues/1

#### 2. 翻訳する
翻訳しましょう。翻訳するファイルは「./src/docs_ja」ファルダの中にある.mdファイルが対象になります。
一部、src/componentsフォルダの中にあるlanding-page.tsxとかも対象になりますが、追々考えます。(アイデア求)

#### 3. プルリクエストを作成する
翻訳が完了したら、プルリクエストを送ってください。（たぶん）私が、マージ作業を行うので、マージされると、Netlifyが自動的に動いて、本番環境に反映されます。
参考：https://github.com/ionic-jp/stencil-docs/pull/2


## まとめ
いかがでしたか？
結構、簡単だと思いませんか？
StencilJSは日本ではまだあまりメジャーではありませんが、海外では使われ始めています。今後、StencilJSを使ったUIフレームワークがどんどん登場し、日本でもメジャーな存在になる可能性がありあす。

なので、興味のある方は先行投資と思って、いまのうちに日本語翻訳プロジェクトに強力お願いします。
翻訳作業を通して、StencilJSについて、深く知ることができる良い機会になると思います。

それでは。

## 付録
日本語翻訳プロジェクトを作るに当たって、考慮した点を残しておきます。

### フォルダ構成
StencilJSの公式ドキュメントの変更を取り込むため、docsフォルダとdocs_jaフォルダに分けました。docsフォルダが元の英語ファイルです。

ちなみに、docs_jaにフォルダを変更するに当たって、scriptsファイルを書き換える必要があります。
変更したのは以下のファイル。
[scripts/markdown-to-html.ts](https://github.com/ionic-jp/stencil-docs/blob/0a614fd56a06369ac8a320afa21200ad82a741d4/scripts/markdown-to-html.ts#L18)
[scripts/site-structure.ts](https://github.com/ionic-jp/stencil-docs/blob/0a614fd56a06369ac8a320afa21200ad82a741d4/scripts/site-structure.ts#L12)

### コントリビュート手順について
これは、ionic-docsの日本語翻訳プロジェクトを参考にしました。
こちらは、本家Ionic Blogでも取り上げられたりと、盛り上がっているので是非みてみてください。
[Ionic Framework日本語ドキュメント](https://ionicframework.com/jp/docs/)
[Blog：My Ionic Story](https://ionicframework.com/blog/my-ionic-story/)
MT5でcsv形式のヒストリカルデータをを読み込めなくなった問題

何故か知りませんが、先週までできていたことができなくなっていました。

できなくなったのは、CSVからのヒストリカルデータ取り込み。
FXCMのデータを入れて各社のMT5でテストしていたのですが、急にできなくなって困った次第です。


解決策は、1970年のデータを削除すること。

場所は "[データフォルダ]\bases\Custom\history\USDJPYtest"みたいな場所。

一度csvファイルを読み込むと1970年のデータができるので削除。そのうえでMT5を再起動したら解決しました。

#画像で解説
###問題編
①インポートしてみて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/8460eef9-f536-008c-e2b7-f5831e7e0136.png)

②できてるっぽい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/9ea3d4ce-4a63-1aac-19b1-d8bccf167f03.png)

③でもチャートに反映されない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/964f39fa-4e4d-16f9-2e43-f0fbbf9c1a5a.png)

###解決編
①邪魔な1970.hccを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/765fd9d1-fa3a-b9e9-3252-2e4c17adf5d3.png)

②再起動！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/157965f0-c530-7692-ecf6-8ced523aef97.png)
MarvellのNICでSR-IOVを有効にするまで

##手順
**ファイルを転送するところは省いてます。/tmp/に送って下さい。**

1. まずQLogic_FastLinq_Esxcli_Pluginをインストールする
 `esxcli software vib install -v /tmp/QLG_bootbank_qlogic-fastlinq-esxcli-plugin_3.1.68-01.vib`
2. 最新のファームウェアにする
 `esxcli qlfastlinq  qcc adapter update -i Adapter_0_2_0 -f /tmp/ql_bb_mbi_8.50.76.bin`
3. 最新のドライバにする
 `esxcli software vib update -v /tmp/QLC_bootbank_qedentv_3.11.16.0-1OEM.670.0.0.8169922.vib`
4. ESXiにSSHで入って次のコマンド

```
[root@esxi2:~]esxcli qlfastlinq qcc adapter list
Adapters
-------------
Adapter_0_2_0

[root@esxi2:~]esxcli qlfastlinq qcc adapter sriov setFile -i=Adapter_0_2_0 -o=Enabled
SRIOV Configuration:
   Message: Success
   Mode: Single-Function
   SRIOV: Enabled
   Sriov Config:
         Pf Number: 0
         VFs Per PF: 16

         Pf Number: 1
         VFs Per PF: 16
[root@esxi2:~]esxcli qlfastlinq qcc adapter sriov set -i=Adapter_0_2_0
SRIOV Configuration:
   Message: Success
   Mode: Single-Function
   Reboot Required: true
   SRIOV: Enabled
   Sriov Config:
         Pf Number: 0
         VFs Per PF: 16

         Pf Number: 1
         VFs Per PF: 16
[root@esxi2:~]reboot

再起動をまって再ログインして

[root@esxi2:~]esxcli system module parameters set -m qedentv -p "max_vfs=10,10"
[root@esxi2:~]esxcli system module parameters list -m qedentv | grep vfs
ax_vfs             array of int   10,10  Number of VFs to be enabled for each pci function. Default:0, Valid values: 0:disable, 1 upto 120. Actual number is adapter specific.
```

###ダウンロード
ダウンロードはここから
http://driverdownloads.qlogic.com/QLogicDriverDownloads_UI/Defaultnewsearch.aspx
USCF Chimera使ってpdbファイルからかっこいいタンパク質画像を表示する。

__USCF Chimeraをダウンロードする。__
https://www.cgl.ucsf.edu/chimera/download.html
<img width="124" alt="スクリーンショット 2019-12-02 16.14.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/e74a249f-1672-b04b-3aa6-48b553292ab7.png">


__Chimeraを開き、File→Openからタンパク質pdbファイルを読み込む。__
<img width="812" alt="スクリーンショット 2019-12-02 16.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/eec1e761-e7e7-d08f-84e8-532a3f45f8df.png">

__Favorite→Comannd Lineでコマンドラインを読み込む__
<img width="1020" alt="スクリーンショット 2019-12-02 16.23.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/c351460c-aa8e-92e7-d328-5bacc5774d9f.png">

__下の行にコマンドラインが表示されるのでそこに__

    set bg_color  white
__と入力し背景を白くする。__
<img width="1018" alt="スクリーンショット 2019-12-02 16.25.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/29c0cf3f-f0b6-b9b2-06a0-4e43bfa457e3.png">

__α-helixの部分を赤くする。__

    color red helix

__β-sheetの部分を青くする。__

    color blue strand

<img width="956" alt="スクリーンショット 2019-12-02 16.30.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/c9b2d83b-c50c-a6ab-fe28-969a7075a365.png">

__基質部分を強調する。Select→Residue→all nonstandardで基質を選択。__
<img width="1018" alt="スクリーンショット 2019-12-02 16.32.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/5c91715c-71e6-68e6-7732-a704663f2a7b.png">
__基質原子をボールで表示する。Actions→Atom/Bonds→sphereを選択。__
<img width="1017" alt="スクリーンショット 2019-12-02 16.33.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/9386d6d4-bc41-e95e-494f-b7a78f183f7f.png">
__もしそれでも原子が大きくならない場合 (金属イオンなど、、、) Actions→Inspectを選択し、radius:の数字を大きくする。__
<img width="1005" alt="スクリーンショット 2019-12-02 16.39.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/6120f196-5769-c2eb-abec-9fd3fc67c471.png">
<img width="246" alt="スクリーンショット 2019-12-02 16.39.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/35bc9752-4f49-9fd1-b0e0-99a3d7c27305.png">

__完成図はこのようになる。__
<img width="956" alt="スクリーンショット 2019-12-02 16.46.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/9a91f141-c202-3af6-a517-61feee6bc1e5.png">
Jenkinsでフロントエンドとバックエンドを一つのWARファイルにまとめる

# 概要
Jenkins2系から標準で使えるようになった、パイプラインビルドを使って
フロントエンドとバックエンドのソースを一つのWARファイルとしてビルドする設定を書いたときの内容。

- Jenkins Windows版（2.164.1）
- フロントエンド：Vue.js + webpack（3.8.1）
- バックエンド　：SpringBoot + gradle（5.4.1）


# 詳細
1. Jenkins のジョブで「パイプライン」のジョブを作成。
![Jenkins1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/a79fbebf-7aa6-8f82-5eeb-79b724caabf4.png)

1. パイプラインスクリプトとして以下の内容を記述する。

```
pipeline {
    agent any
    stages {
        // フロントエンドのビルド
        stage('frontend_build') {
            steps {
                node('master') {
                    deleteDir()
                    git branch: 'master', changelog: false, poll: false, url: '【フロントエンドのリポジトリURL】'
                    bat label: '', script: 'npm install'
                    bat label: '', script: 'npm run build_dev'
                    // ビルドしたファイルを stash で退避
                    stash name: 'frontend', includes: 'dist/**'
                    echo 'frontend build success'
                }
            }
        }
        // warファイルのビルド
        stage('backend_build') {
            steps {
                node('master') {
                    deleteDir()
                    git branch: 'master', changelog: false, poll: false, url: '【フロントエンドのリポジトリURL】'
                    // ビルドしたファイルを unstash で取り出す
                    unstash 'frontend'
                    bat label: 'delete_sample', script: 'rd /s /q src\\main\\resources\\static'
                    bat label: 'mkdir_static', script: 'mkdir src\\main\\resources\\static'
                    bat label: 'copy_frontend_build', script: 'xcopy /S dist src\\main\\resources\\static'
                    bat label: 'delete_frontend_build', script: 'rd /s /q dist'
                    withEnv(['JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_201']) {
                        bat label: 'bootWar', script: 'gradlew.bat bootWar'
                    }
                    archiveArtifacts 'build/libs/**'
                    echo 'backend build success'
                }   
            }    
        }    
    }    
}
```

# まとめ
ノード間のビルドしたファイルの受け渡しが「stash」「unstash」で容易にできるので、思ってたより簡単に実現できた。

フロントエンドのビルドに使うノードを別のサーバーで動かしたりしたほうがいいなぁとは当初から考えていたが、
あまり時間も取れなかったため、動かすのを優先して上記のような設定になっている。

動かし始めて大きな問題がないため、現状維持のままずるずるといってしまっているが、
[Rails] CircleCIでRspecを回すと「Please call Stripe() with your publishable key.  You used an empty string.」というエラーが出る

## 問題

注文画面から「決済方法を選択する」をクリックし、決済方法選択画面に各種支払方法（クレカ、PayPal、銀行振込）が
表示されているかを確認するためfeature specを作成しました。

ローカルでパスしたのでCIで確認したところ、このようなエラーがでました。

```
Capybara::Webkit::JavaScriptError:
{:line_number=>1, :message=>"IntegrationError: Please call Stripe() with your publishable key. 
You used an empty string.", :source=>"https://js.stripe.com/v3/"}
```

## エラーをみてみる
`Please call Stripe() with your publishable key. 
You used an empty string."`

どうやらStripe()という関数？をpublishable keyと一緒に呼ばなければならないようです。

そもそもStripe()って何かわからなかったので、
公式ドキュメントをみたところ、発見しました。
https://stripe.com/docs/stripe-js/reference#stripe-function

やっぱり関数ですね。
そして `Use Stripe(publishableKey[, options]) to create an instance of the Stripe object.`
とあるように、publishable keyを引数に渡してインスタンスを作る関数のようです。
となると、このエラー文は
1. Stripe()が呼べていない
2. publishable keyが存在しない
ことを意味しているように思われます。

## しかし
ローカルのENVにはしっかりとpublishable_keyが定義されていて、そちらもcredentialsで参照されています。
だからpublishable keyも存在するはず。そして`StripeMock`を使用しているので、Stripe()も呼ばれているはず。
謎は深まるばかりでした。

## 結論
<b>CircleCIにはCircleCIの環境変数があります。</b>
そこでpublishable keyが定義されていませんでした。

だから、CI上だけテストが落ちていました。


なので、新しく環境変数を定義してかつそれをテストで使用するような場合は
CircleCIの環境変数にも別途追加するようにしましょう、というお話でした。
Emacs で gpg 鍵が古くなったときに使うコマンド

# Emacs のパッケージを更新できなくなった or 初期インストールで `evil` がないよ、と言われる
TLDR;
すること：鍵の更新をしましょう。
どうやってするか？：[gnu-elpa-keyring-update](https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html) をインストールします。
詳細は：次の通り

1. まずここのリンクをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147520/2137f855-fb3c-78ce-f91b-e46b8429e76f.png)

```shell
wget <link>
```

Emacs 上で、 `M-x package-install-from-file RET <cloned-path>`

処理が終わったら、Emacs を再起動してください。鍵情報が更新されます。
(~~尚 Spacemacs では鍵情報が更新されたあとにパッケージが削除されるっぽいです。~~)
ぼくも、Jupyterで、PowerShell

# LC4RIの時間だ

いろいろあって、こーゆーの作って、使ってます。

https://github.com/mnagaku/operation-notebook

ansibleカーネルは、[JANOG44ハッカソン](https://www.janog.gr.jp/meeting/janog44/program/hackwin)で、ビッグローブさんのチームが使ってて、個人的にansibleは、playbookで隠蔽されるのが嫌だったので、良いなーと思ったので入れてみました。まだ、使ってませんが......

[sshカーネル](https://github.com/NII-cloud-operation/sshkernel)は、ぼくの前職のNIIと富士通研究所さんの共同研究の成果物で、興味持つ人が多いので入れてみました。演習とかで使ってます。NIIで作ったwrapperカーネルと繋げれてないので、セル単位の実行ログ保存とかは出来ないのですが、python3を持ち出すと面倒な状況でターミナルっぽく使えるのは良いですね。ただ、僕が踏み抜いてバグ見つけたりしてるので、環境によっては問題あるかも知れません。誰が直すか勝負だ！

# PowerShellカーネル

さて、今日は、PowerShellカーネルの話をしましょう。

NIIクラウド運用チームでは、[LC4RI](https://www.google.com/search?q=LC4RI)と呼ぶ、Jupyterを使った情報システムの構築・運用手法を実践・提唱しています。手法のコンセプトに基づき、Jupyterのプラグインも多数開発しています。

その中に、セルの実行結果に応じて、失敗なら赤に色付けするといった機能があります。Jupyterの内部では、セルの実行結果を「ok」か「error」で返せるようになっているので、それに応じて色を付け、ひと目で状況が理解できるようにしています。

で、PowerShellカーネルなんですが、セルの実行が、成功しても、失敗しても、成功しましたって色になるんですね......

コードを見てみましょう。

https://github.com/vors/jupyter-powershell/blob/0013dda93bc944c3bc81dce67a067c2130bf8061/powershell_kernel/kernel.py#L54

```
    def do_execute(self, code, silent, store_history=True,
                   user_expressions=None, allow_stdin=False):
        try:
            if not code.strip():
                return {'status': 'ok', 'execution_count': self.execution_count,
                        'payload': [], 'user_expressions': {}}

            if not self.proxy:
                self.__createProxy()

            output = self.proxy.run_command(code)

            message = {'name': 'stdout', 'text': output}
            self.send_response(self.iopub_socket, 'stream', message)

            return {'status': 'ok', 'execution_count': self.execution_count,
                    'payload': [], 'user_expressions': {}}

        except Exception:
            excInfo = sys.exc_info()
            message = {
                'ename': str(excInfo[0].__name__),
                'evalue': str(excInfo[1]),
                'traceback': [traceback.format_exc()]
            }
            self.send_response(self.iopub_socket, 'error', message)
            message['status'] = 'error'
            return message
```

例外発生時は「error」を返すんですが、そうでなければ無条件に「ok」を返しています。

そもそも、PowerShellでは、終了コードが環境変数渡しになっているようで、「[PowerShell での終了ステータス($?、$LastExitCode) について確認してみた](https://qiita.com/toshihirock/items/5845edef939f8232a167)」を参考に試してみた結果、「\$ErrorActionPreference = "Stop"」を設定すると、コマンド実行後に「$?」を確認することで、成功失敗が判別できることを確認しました。

とゆーわけで、「\$ErrorActionPreference = "Stop"」はデフォルトじゃないので、ユーザに明示的に設定させるとして、コマンド実行後に「$?」を取ってきて、その内容に応じて「ok」「error」を返しましょうよってことで、

https://github.com/vors/jupyter-powershell/pull/30/files

プルリク上げました。

# まだ終わらんよ

でもね、今、リリースされてる0.1.2だと、ここのコードが違ってるし、取り敢えず、プルリク取り込まれた新しい版が出るまでは、0.1.2にパッチ当てて凌ぐ必要があるわけです。

https://github.com/mnagaku/jupyter-powershell/commit/1f0a42b041f53897d2d3d049e7f440f3eb45173e

なので、

https://github.com/mnagaku/operation-notebook/blob/master/Dockerfile

Dockerfile内でパッチ当ててます。

# さいごに

LC4RIやるにしても、小規模なJupyterHubが欲しい時も、

https://github.com/NII-cloud-operation/OperationHub

が超カンタンなので、みんなも使おうね。
「なぜNEMを採用するのか？」と聞かれたら。

この記事は [nem #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nem-2)の2日目の記事です。
本家 [nem Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nem) の 2日目は @tohoku_fassefoy さん の記事、 [10分で作れるNEMアドレス残高メール通知bot](https://qiita.com/tohoku_fassefoy/items/6a3b5e91b5db6d4e9cf4)です。

#はじめに

時価総額が30位程度のブロックチェーン技術をなぜ採用するのですか？
今、NEMを利用したいと言えば必ず経営層から「どうして？」と質問をうけるでしょう。

私たちは今まで「簡単だから」という言葉を用いてきました。
しかしこれはあまり効率的ではなかったようです。

「簡単」という言葉はどうやら次のような意味に変換されて伝わってしまうようです。
・私たちに難しいことはできない
・NEMはブロックチェーン版のBASICである

少し技術を追いかければNEMが先の時代を見据えた優れた設計思想を持つテクノロジーであることは自ずとわかるのですが、ブロックチェーン技術自体がまだ世間に普及しておらず、さらには膨大な量のプラットフォームすべてを正確に理解することは不可能です。(時価総額の上から順番に検証していったとすればなおさら困難です)


今回は経営層のこころに響きやすいキーワードを考えてみました。

## パブリックチェーンもプライベートチェーンも同時に開発できます

ブロックチェーンの導入や検証を始めるにあたり、経営層に非常に難しい選択を迫られるパブリックとプライベートの選択。採用されるプラットフォームが大きく異なってきます。これを「今決めなくてもよい」と提案することができます。なぜなら同じプロトコルで動くNEMとmijinがあるからです。パブリックチェーンをコピーしてプライベートでテスト環境を構築する事例を見かけますが、動作が安定しないという話をよく聞きます。NEMにおいてはコア開発者がどちらで利用されることも想定しているため、実際に導入を検討している企業から多くの改善フィードバックが届いています。

## サーバサイドの環境構築が不要です
（すこし極端な表現です。ビジネスを始めるのであればノードを立てておいたほうがよいでしょう。ただし、予備系の準備までは不要です）
一般的にブロックチェーンを利用するアプリケーションは、ノードに直接アクセスをせずにサービス提供者やサードパーティが構築したサーバにアクセスし、そこからトランザクションの発行やキャッシュされた最新のブロック情報を取得することになります。意図しない所に単一障害点や改ざんの余地があることがわかるでしょう。NEMの場合はREST APIと呼ばれるブロックチェーンとユーザーが直接対話する仕組みがノードに実装されています。ノード保有者はこの仕組みを最新の状態に保つことを条件にインセンティブ制度（ハーベスティング＝マイニング）に参加する必要があります。そもそも、ノードの安定運用には非常に専門的な知識を必要としたネットワーク設定が必要となります。これはブロックチェーンの本質ではない、とコミュニティや実際にサービスを展開する企業に開発を丸投げしてしまう場合がほとんどです。しかしながら、ブロックチェーンを用いた新しい経済圏を実現していくにあたっては、これは1秒あたりのトランザクション処理数を競うよりももっと大事で本質的なことになり得ます。

## 不具合を許さないワンタイム・スマートコントラクト
パブリックチェーン上でのスマートコントラクトはソースコードが公開されるため、publicアクセスとprivateアクセスの制限を書き間違えただけで流出事件が発生します。このような不具合が発生するのはソースコードを読み解く時間が攻撃者側に与えられてしまうからです。NEMはプログラムで都度署名を実施するのではなく、一度の署名ですべてのトランザクションを実施しきってしまう、ワンタイム（使い捨ての）スマートコントラクトが提供されていると考えることができます。何度も使うパスワードはいずれ流出してしまいますが、都度発行されるパスワードは攻撃の余地が無いのと同じイメージです。次世代NEMで提供されるアグリゲートトランザクションがこの機能の実施を強力にサポートします。


## 譲渡可能なマルチシグ
ブロックチェーンの最大級のスマートコントラクト、ともよばれるマルチシグ。これがネイティブでまともに実装されているブロックチェーンは意外と多くありません。明確に実現可能であるためにコア開発者の知的好奇心が掻き立てられず、またバグの許されないセキュリティの要でもあるためにサードパーティも手出ししにくいことが原因として挙げられると思います。NEMのマルチシグは構成を柔軟に変更することが可能です。この構成を変更させることで「AliceアカウントがBobアカウントを所有したり譲渡する」という概念を持たせることができます。ブロックチェーン技術によりデジタル資産は中央集権的な鍵で閉鎖的に管理される時代からユーザが鍵を所有してオープンに活用させる時代へと転換を遂げていくことになります。そのため秘密鍵は漏れるものとしてシステムを構築しておかなければいけません。マルチシグをサポートしないブロックチェーンはいずれシステムやデジタル資産にかかわる人が入れ替わるタイミングで大きなトラブルに見舞われるリスクがあります。

### 以上です
とりあえず、4点出してみました。ざっと考えたのでまた後程追記修正していくこともあるかと思います。
NEMの導入に経営層から思わぬ待ったが入った方の参考になれば幸いです。

## 追記:CC事件などあったが、大丈夫か？と聞かれたら

以下のようにお答えください
「当時のCC社のセキュリティに対する認識状況から想像すると、ハッカーはおそらく全種類の暗号資産の秘密鍵を盗むことが可能でした。しかしながら、流出事件はちょっとしたケアレスミスで逮捕に繋がる可能性があるため、犯人は一つの暗号資産に集中する必要がありました。そして、もっとも盗む価値のある暗号資産としてNEMを選んだのです。大丈夫です、問題ありません。」
XLPagerTabStrip でページ切り替えイベントを正しく判定する

iOS で UISegmentedControl ライクでリッチな上タブを実現するライブラリはいくつかありますが、Swift 5 にも対応していて最も有名なもののひとつ、XLPagerTabStrip。

このライブラリを使ってページを切り替えたときのイベントを処理する際に困ったので、備忘録として残しておきます。

前提として、`ButtonBarPagerTabStripViewController` のサブクラスで実装するとします。

## 問題: `moveToViewController(at:animated:)` はスワイプ時に呼ばれない

ページを切り替える操作は、以下の2パターンがあると思います。

**1. ページラベルを直接タップする**
**2. スワイプで隣のページに移動する**

上記のうち、**2. スワイプで隣のページに移動する** とき、`moveToViewController(at:animated:)` が呼ばれません。

したがって、このメソッドの中でページ切り替え時の処理を書くと、ラベルを直接タップしてページ切り替えをしたときにした期待した動作をしないと思います。


```swift
import XLPagerTabStrip

class TabPageViewController : ButtonBarPagerTabStripViewController {

    // スワイプ切替の場合には呼ばれないため、ページ切替のイベントハンドラーとしては使用しないべき
    open override func moveToViewController(at index: Int, animated: Bool = true) {
        super.moveToViewController(at: index, animated: animated)
    }
}
```

## 解決策: `updateIndicator(for:fromIndex:toIndex:withProgressPercentage:indexWasChanged:)` を使う

ただし、少し工夫する必要があります。
そもそもこのメソッドは、ページのインジケータの遷移状況を知らせてくれるものなので、ページの移動が開始されてから完了するまで、数十回にわたって発火します。
以下は渡ってくる引数の説明です。

- `viewContoller: PagerTabStripViewController`
    - 親となっている ViewController（このメソッドをオーバーライドしている自分自身）
- `fromIndex: Int`
    - 移動元となるページ番号（過渡状態の値が入ってくるので注意！）
- `toIndex: Int`
    - 移動先となるページ番号
- `progressPercentage: CGFloat`
    - 遷移の進捗率（1.0 = 完了）
- `indexWasChanged`
    - **飛び番指定でページ移動を行うときに true が入ってくる**

このメソッドの特性を踏まえて、前述の2パターンのページ切り替えのイベントを過不足なく拾い上げるための処理を、以下のように実装しました。

```swift
/// ページラベルをタップして切り替える際に飛び番を指定したときに、
/// 過渡状態のイベントをスキップするためのフラグ
///
/// 例）ページ1から4に直接移動するとき、1->2, 2->3, 3->4 が順に呼ばれるが、
///    実質的に処理したいのは 1->4 であるため、途中を省く必要がある
private var skipChangeIndexJumping: Bool = false

/// 上記 skipChangeIndexJumping の説明にあるように、途中のインデックスを省くために
/// 実際の切り替え元のインデックスを憶えておくための一次変数
private var actualFromIndex: Int = 0

open override func updateIndicator(for viewController: PagerTabStripViewController, fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: CGFloat, indexWasChanged: Bool) {
    super.updateIndicator(for: viewController, fromIndex: fromIndex, toIndex: toIndex, withProgressPercentage: progressPercentage, indexWasChanged: indexWasChanged)

    // 遷移中は省く
    guard progressPercentage == 1.0 else { return }

    // 跳び番を指定すると indexWasChanged == true で入ってくるので、これを飛び番移動が起きた判定とする
    if indexWasChanged { 
        skipChangeIndexJumping = true
    }

    // 飛び番移動したとき、最後に from, to, current が揃うので、そのタイミングを遷移完了とする
    if fromIndex == toIndex, toIndex == currentIndex { 
        skipChangeIndexJumping = false
    }

    guard !skipChangeIndexJumping else { return }

    /*
    ** ここにページ切替後に行いたい処理を書く
    */

    actualFromIndex = fromIndex
}
```

---
※ ちなみに、余計なイベントを無視する処理は、RxSwift で sentMessage や methodInvoked を使ってこのメソッドの呼び出しを拾って debounce で間引くという手もあったかもしれませんが、今回はこちらの方法を使いました
Nodistのインストール時PATH not updatedで失敗したとき

# 環境
- Windows10 Home

# 基本
[ダウンロード](https://github.com/nullivex/nodist/releases)
基本的にNodeをそのままインストールしない。Nodistでどうにかする。

# エラー

```bash
PATH not updated, original length 1030 > 1024
```

# 解決法
環境変数に以下を追加する

```
C:\Program Files (x86)\Nodist\bin
```
詳細設計書に書く項目 

詳細設計について

今回は詳細設計について記す。

##詳細設計とは
前工程「基本設計書」で定められた機能に基づいて、どのように実現するかを設計する。
成果物は詳細設計書であり、次工程「実装」において詳細設計書を見ただけで、プログラマが簡単にプログラムを作れるかが品質にかかわってくる。

##記載項目
今回はAndroidアプリを例として記載項目を挙げる。
各項目の書き方については過去の記事のリンクを貼っておくのでそちらを参照して頂きたい。

###クラス図
システムを構成するクラス、クラス間の相互関係を表した図。
https://qiita.com/QiitaD/items/62eab056373cd1de2ebe

###クラス責務
クラスがもつ役割を表す。

###シーケンス図
オブジェクト間の相互作用を時系列で表した図。
https://qiita.com/QiitaD/items/dfd2ad89d1b50d32ccd6

###画面レイアウトの詳細
ボタンやテキストの位置、幅、高さなど細かに記す。
Androidでのレイアウトの指定方法は以下を参照して頂きたい。
https://qiita.com/QiitaD/items/76c20f88a236acf7c4cd
Chiselの文法について（Chisel勉強会２）

## はじめに

間違いなどがありましたら教えてくださいまし
筆者のおベンキョーを兼ねてます

## 変数や定数の定義

bits, 符号なし int, 符号付き int は以下のようにして定義することができる

```scala
// Bits(n.W) n-bits のビットを定義

Bits(8.W)
UInt(8.W)
SInt(8.W)

// 定数の定義

 0.U // 0（符号なし）
-3.S // 3（符号あり）

"hff".U        // 16進数表記の255
"o377".U       // 8進数表記の255
"b1111_1111".U // 2進数表記の255

true.B  // boolean true
false.B // boolean false
```

## 組み合わせ回路の記述や応用

Verilogとあまり変わらないが一応下記に記しておく

軽く読んでもらえればおけ

```scala
// logic oprations

val and = a & b // AND
val or = a | b  // OR
val xor = a ^ b // XOR
val not = ~a    // NOT

// arithmetic operations
// Data type: UInt, SInt

val add = a + b // 加算
val sub = a - b // 減算
val neg = -a    // 負の数   
val mul = a * b // 乗算
val div = a / b // 除算
val mod = a % b // 剰余

// Equal sign, Inequality sign
// Data type: UInt, SInt, return bool

val equ = a === b
val neq = a =/= b
val gt  = a > b
val lt  = a < b
val gte = a >= b
val lte = a <= b
val shift = a << b

// 特定のビットを抽出

val sign = a(31)   // aの32ビット目を抽出
val byte = a(7, 0) // aの0〜7ビット目を抽出
```

Chiselオペレーション一覧

Fill関数だったり、Catだったりがあったりして便利？

やっぱり公式みるのが一番いいよね

https://github.com/freechipsproject/chisel3/wiki/Builtin-Operators

## レジスタの定義と応用

レジスタの宣言と初期化は以下のように記述する

```scala
val reg = RegInit(0.U(8.W)) // 非同期リセット付きの8ビットの D flip-flops

reg := d    // レジスタへの代入は := を用いる
val q = reg // レジスタの出力は = 

val q = reg(0)    // レジスタの0ビット目を抽出
val q = reg(7, 0) // レジスタの0〜7ビット目を抽出

// カウンタをMUXを用いて表現する
// part1 で行っていた処理もこの2行でできる

val cntReg = RegInit(0.U(8.W))
cntReg := Mux(cntReg === 9.U, 0.U, cntReg + 1.U)
```

カウンタの記述が減ってみんなニコニコ

## BundleとVecの構造と定義

Bundleとは、複数の信号をまとめて管理するクラスで(かんたんに言うと構造体みたいなやつ)、Vecは文字通りVectorの構造体を表すクラスで、ベクトル状に値を保持するもので書き方は以下のようになります。

```scala
// Bundleの記述
// 見て覚える

class Channel() extends Bundle{
    val data = UInt(32.W)
    val valid = Bool()
}
    
val ch = Wire(new Chnnel())
ch.data := 123.U
ch.valid := ture.B

val b = ch.valid
val channel = ch

// Vecの記述

// ビット幅4,符号なしInt型の領域を3つ確保

val v = Wire(Vec(3, UInt(4.W)))

// 代入の記述方法

v(0) := 1.U
v(1) := 3.U
v(2) := 5.U

val idx = 1.U(2.W)
val a = v(idx)

// Vecを用いたレジスタの領域確保
// RISCの設計が楽になるのでは？

val resisterFile = Reg(Vec(32, UInt(32.W)))
resisterFile(idx) := dIn
val dOut = resisterFile(idx)

// BundleとVectorを組み合わせた記述

val VecBundle = Wire(Vec(8, new Channel()))

class BundleVec extends Bundle{
    val field = UInt(8.W)
    val vector = Vec(4, UInt(8.W))
}
```

データ構造をでワイヤやレジスタを管理できるのが便利だなあと...
確かにこういった機能があればRISC設計しやすいよね！！と僕はおもいました（小並）

## 参考文献

https://raw.githubusercontent.com/wiki/schoeberl/chisel-book/chisel-book.pdf
Laravel SQLiteからMySQLに変更したら外部キー制約のマイグレーションが失敗してハマった

```shell
>php artisan -V
Laravel Framework 6.1.0
```

以下のusersに対して、user_idを外部キー制約として持つsubscribesテーブルを作りました。

```php
Schema::create('users', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->string('name');
  $table->string('email')->unique();
  $table->timestamp('email_verified_at')->nullable();
  $table->string('password');
  $table->rememberToken();
  $table->timestamps();
});
```

SQLiteで動作していたマイグレーションだったので、そのまま`php artisan migrate`したらエラーになりました。

```php:実行したマイグレーション
Schema::create('subscribes', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->integer('user_id')->unsigned();
  $table->string('channel_id');
  $table->string('channel_title');
  $table->timestamps();

  // userが削除されたとき、それに関連するも一気に削除する制約
  $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
        });
```

```shell
Illuminate\Database\QueryException:
 SQLSTATE[HY000]: General error: 1215 
 Cannot add foreign key constraint
 (SQL: alter table `subscribes` add constraint 
 `subscribes_user_id_foreign` foreign key (`user_id`) 
 references `users` (`id`) on delete cascade) 
```

[PHP \- 【Laravel】外部キー制約があるテーブルのmigrateができません｜teratail](https://teratail.com/questions/187718) という記事をみて、`user_id`カラムを作るときの記述が異なることに気づいてその部分を修正することで、解決しました!

```diff:修正点
-  $table->integer('user_id')->unsigned();
+  $table->unsignedBigInteger('user_id');
```

```php:正しいマイグレーション
Schema::create('subscribes', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->unsignedBigInteger('user_id');
  $table->string('channel_id');
  $table->string('channel_title');
  $table->timestamps();

  // userが削除されたとき、それに関連するも一気に削除する制約
  $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
        });
```

型が違っているからエラーになったっぽいのですが、それじゃあSQLiteはなぜ通った？という疑問が…。
Chiselの環境構築（Chisel勉強会１）

## はじめに

筆者のおべんきょーを兼ねてますので間違いなどがありましたら教えてくださいまし

## そもそもChiselとは

Chiselとは、Scalaで書かれたプログラムをHDLに変換してくれるツール

HDLでは記述が大変な処理を完結に書けることから最近多くの企業が利用を始めつつある？？

Edge TPUもこのChiselで書かれているのだとか？（真相は知らない）

## 環境構築（Ubuntu18.04では確認済み）

まず、sbtと呼ばれるScalaのコンパイラが必要で、以下のコマンドを実行するとインストール可能

```
$ echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
$ sudo apt-get update
$ sudo apt-get install sbt
```

以上を実行するとScalaのコンパイラをインストールできる
他のOSでインストールをしたい場合は以下の資料を確認するとよい（動作確認はしていないけど多分動く）

MacOS

```
$ brew install sbt
```

Windows

ごめんなさい、以下を見てください
https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Windows.html

## サンプルプログラムの実行

ScalaでのHelloWorldは以下のように実行するとよい（以下はScalaのサンプルプログラムであって、Chiselを実際に利用しているわけではない）

```scala:HelloScala.scala
object HelloScala extends App{
    println("Hello Chisel World!")
}
```

実行と結果

```
$ sbt "runMain HelloScala"

[info] running HelloScala 
Hello Chisel World.
```

以上の様にでてきたら成功
最初のsbtの実行の際は、Scalaのライブラリのインストールで結構時間がかかったので気長に待ちましょう
２回めの実行からは大体５秒くらいで実行できるかと

次は実際にChiselを利用してみましょう

Chiselを利用するには、makeやビルドファイルを記述する必要があり非常にめんどくさいが、以下のものを利用すると楽に環境構築が可能である

```
$ git clone https://github.com/schoeberl/chisel-examples.git 
$ cd chisel-examples/hello-world/
```

Scalaのバージョンによっては以下のような記述に変える必要がある

```
scalaVersion := "x.x.x" #自分の使用しているScalaのバージョンを指定

# 以下はScalaのバージョンが2.12以上の人は記述する必要がある
# どうやらScalaの記述方法がバージョンアップすると記述方法が変わってしまうらしく、それを調節している
# Pythonで例えると、print文が何故かかわってしまったあんな感じ

scalacOptions ++= Seq(
  "-Xsource:2.11"
)

// libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"

// libraryDependencies += "edu.berkeley.cs" %% "chisel" % "2.2.38"

resolvers ++= Seq(
  Resolver.sonatypeRepo("snapshots"),
  Resolver.sonatypeRepo("releases")
)

libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.1.3"

// libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "latest.release"
```

```
$ sbt about
```

hello-worldでコンパイルするプログラムが以下のような構成になっている
LEDが0.5秒毎にチカチカしてくれるやつ

```scala:Hello.scala
import chisel3._
import chisel3.Driver

class Hello extends Module {
  val io = IO(new Bundle {
    val led = Output(UInt(1.W))
  })
  val CNT_MAX = (50000000 / 2 - 1).U;

  val cntReg = RegInit(0.U(32.W))
  val blkReg = RegInit(0.U(1.W))

  cntReg := cntReg + 1.U
  when(cntReg === CNT_MAX) {
    cntReg := 0.U
    blkReg := ~blkReg
  }
  io.led := blkReg
}

object Hello extends App {
  chisel3.Driver.execute(Array[String](), () => new Hello())
}
```

コンパイルすると、ビルドしているディレクトリにこんな感じのファイルが出力されるはず

```verilog:Hello.v
module Hello( // @[:@3.2]
  input   clock, // @[:@4.4]
  input   reset, // @[:@5.4]
  output  io_led // @[:@6.4]
);
  reg [31:0] cntReg; // @[Hello.scala 20:23:@8.4]
  reg [31:0] _RAND_0;

...

endmodule
```

あとはトップモジュールを作成すれば動くはず！！！
（実行確認済み、PinPlannerとかはテキトーにググってなんとかしてちょ）
以下トップモジュール

```verilog
module hello_top(input clk, output led);

  wire h_io_led;
  wire res;

  assign led = h_io_led;
  assign res = 0;
  Hello h(.clock(clk), .reset(res), .io_led( h_io_led ));

endmodule
```

## 参考文献

https://raw.githubusercontent.com/wiki/schoeberl/chisel-book/chisel-book.pdf
元バックエンドのコーダーがSassに感動した話

##はじめに

こんにちは。
surimi_panと申します。

昨年までバックエンドエンジニアとして勤めていたのですが、
ある日を境にフロントエンドのコーダーに変身しました。
業務内容が変わったことで新しい用語や技術が次々入ってきて毎日が新発見とカルチャーショックの連続です。

今回はSassについてお話させていただきます。

## 序章

>「CSSは.cssファイルを直接編集したことなら...」

前述の通り↑程度の知識だった当初の私がCSSに抱いていた印象といえば、

- 同じようなプロパティを複数の要素に記入する時は何度も書く
- 色を変えるときは関連箇所全て洗い出して変えないといけない
- ファイルの規模が大きくなるほどCSSファイルが長くなって編集が大変
- どの箇所を編集しているのか、gitで確認しにくい

...といったもので、
バックエンド時代に「変更に強いコードを」「共通箇所はまとめる」「変更箇所は少なく抑える」
と学んでいた私は、CSSに対して「変更に弱い」印象を抱くようになっていました。

そこでSassに出会ったわけですが...。

## Sassとは

Sassとは、CSSの拡張メタ言語(言語を作成するためのの言語)のことです。

スタイルを記述する点においてはCSSと共通していますが、構文に違いがあり、
要素の入れ子や関数などのCSSには備わっていない機能を利用します。
そうして作成されたファイルをコンパイラに通すことによって、CSSファイルが生成されます。

Sassの構文には2種類の記法があり、インデントを利用する「SASS」記法と、
波括弧やセミコロンを利用してCSSに似た書き方ができる「SCSS」記法が利用できます。

```sass:SASS記法
.test
  display: flex
  align-items: center

  a
    color: #2b2b2b
```

```scss:SCSS記法
.test {
  display: flex;
  align-items: center;

  a {
    color: #2b2b2b;
  }
}
```

↓ どちらも同じ内容のCSSが生成されます。

```css:CSS
.test {
  display: flex;
  align-items: center;
}

.test a {
  color: #2b2b2b;
}
```

## 何に感動したか

Sassにはいろんな便利機能があるのですが、特に感動したのは以下の3つです。

1. 変数
2. mixin
3. ファイル分割

### 変数

文字や数値、色などを変数として保存することができます。

```scss
$main-color: #ccc;

.news-list {
  width: 450px;
  background-color: $main-color;
}
.banner-list {
  min-height: 50px;
  background-color: $main-color;
}
```

### mixin

スタイルから使いまわしたい箇所を分離することができる機能で、引数も設定できます。
「外側だけ共通化して内部のコンテンツは個別に記入させる」ということも可能で、
こちらを利用することでメディアクエリを共通化する、といった使い方もできます。

```scss
@mixin smartphone() {
  @media screen and (min-width: 768px) {
    @content;
  }
}

@include smartphone {
  // 内容
}
```

### ファイル分割

複数のSassファイルを結合する`@import`という機能があります。

```scss:_part.scss
.test-contents {
  display: inline-block;
}
```

`@import` による参照時、アンダースコア( _ )と拡張子(.sassまたは.scss)は省略できます。

```scss:main.scss
@import "part"

#container {
  display: block;
}
```

↓ コンパイル

```css:main.css
.test-contents {
  display: inline-block;
}

#container {
  display: block;
}
```

## どこに感動したか

これらのSassの機能を利用することでCSSを変更に強くすることができます。

変数、mixinを利用して共通箇所を一か所にまとめることで、
同じ内容を何度も書くリスク(記入ミス、仕様変更時の修正箇所増大、等々...)を減らすことができ、
ファイルを分けることで、gitで管理した際にどの部分を編集したのかを管理しやすくできます。

その結果、
変更が発生した場合でも修正箇所を見つけやすく、修正時のヒューマンエラーが発生しにくい、
変更に強いCSSができあがります。

## まとめ

CSSを知っていながらSassを知らなかった人は他にもいるはず...と思い記事を作りました。
どうか同じ境遇の方に届いてほしいと願っています。
【Swift】細かいけど忘れたくないものメモ


# 初めに
教えて貰った細かいことや当たり前に覚えたいことをメモしていきます。


## コード
##### 1.変更しないクラスや変数にprivateをつける
表題の通り、変更する予定がないものや変更さたくない変数やクラスにprivateをつけること

##### 2.キーボードを閉じる時は`resignFirstResponder`を使用
↓を画面遷移する時やキーボードのenterを押す時などに実行する

```
textField.resignFirstResponder()
```


## Storyboard
##### 1.Storyboard上からローカライズファイルを作成できる
↓のlocalizationのEnglishタブをチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/185c04fd-31a6-6fc0-f144-c79e6068e75b.png)

## その他
##### 1.



## 終わりに
随時追加予定です。
Pythonによる機械学習の基本的な流れのまとめ

最近，機械学習について勉強したので，Pythonで実装する際にどういった手順で行うかについてまとめておきました
# データの前処理
機械学習ではまずデータを読み込んだり，どういった分布をしているのかといったことを知っておく必要があります．その手順について書いていきます

## データの読み込み
データを実際に読み込むために，先程読み込んだpandasのread_csvというメソッドを使いcsvファイルを読み込みます

```python
#ライブラリの読み込み
import pandas as pd
import numpy as np

#直下にあるhoge.csvを読み込む
df = pd.read_csv("./hoge.csv") 
#上から5行のみを取り出す
df.head() 
```

## 読みこんだデータの確認
機械学習というと，データを突っ込めばなんとかしてくれるというイメージがありますが実際にはデータをしっかり見る必要があります
例えば，欠損値がないかやバラつきが大きすぎないか，相関があるかといったことです

### 基本統計量
以下のコードを入力することで，データの数，平均値，標準偏差，最小値，最大値といったものが一気にわかります

```python
#統計量の算出
df.describe() 
```
こんな感じで基本統計量が一覧でわかります
![基本統計量.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/d2aa05a7-6d88-d3e9-9b1c-de48aa75b4f7.png)


### 分布の確認
といっても標準偏差や平均値といった数字を見るだけではわかりづらいので，グラフにしたほうが人間にとってはわかりやすいです　そのため分布を表します

```python
%matplotlib inline
#seabornというグラフを表示するライブラリの読み込み
import seaborn as sns

#分布の確認
sns.distplot(df["x1"]) #先にデータを確認する（ここでは列x1のデータを確認）
```

これはデータが正規分布に従っていそうなのでいい感じのデータです
![x6の分布.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/50a77033-1f19-db7b-bf45-88007cfceef8.png)

### 相関係数の確認
もし全く相関関係のないデータであれば，学習させたところで意味はないので相関係数を確認します．ちなみに相関係数は-1から+1の間で，高ければ高いほど相関があるということになります

```python
#相関係数の算出 
df.corr()
#相関係数をグラフで確認
sns.pairplot(df)
```
## 入力変数と出力変数の切り分け
実際には$ y = w0x0 + w1x1 + w2x2 +...+$というようなものを作るわけなので，データの中身を出力変数であるyと入力変数であるxに分ける必要があります
その際に使うのがpandasのilocというメソッドです

```python
#df.iloc[行,列]とすることでその行と列のデータを取り出せる
例　example = df.iloc[1,3]
結果　100
#最後の列-1まですべての行を取り出す(入力変数X）
 X = df.iloc[:,:-1]
#こう書いてもいいが汎用性は低い
 X = df.iloc[:,:最後の列番号]

#yを取り出す
 y = df.iloc[:,-1]
```


# 前処理したデータを使って機械学習をする
上の作業をすることで機械学習を実際に行う下準備はできました．次から実際に学習を行っていきます．ここでは機械学習ライブラリのscikit-learnを使います．

## 訓練データと検証データに分ける

機械学習を行う目的はデータを学習させ，未知のデータを入れたときに予測するというものでした　つまり，学習に用いたデータは使わないということです　
当たり前ですが，学習に用いたデータを入れて予測を行えば，そのデータで学習したんだから，正確な答えが出るよね？ってことになります

そのため，学習をさせる前に訓練データ（train）と検証データ（test)に分ける必要があります

```python
from sklearn.model_selection import train_test_split

#訓練データと検証データの分割
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=1)
```

testsizeは訓練データと検証データの割合を指定しており，ここでは学習：訓練＝6:4としています　またrandom_stateは固定にすることで再現性を保っています

## モデル構築・検証
scikit-learnを使えば以下のコードのみでモデルの構築から検証まで行えます
今回学習に使うモデルは重回帰分析です

```python
#ライブラリのインポート
from sklearn.linear_model import  LinearRegression

#モデルの宣言（LinearRegressionは重回帰分析という意味）
model = LinearRegression()

#モデルの学習（パラメータの調整をする）
model.fit(X,y)

#パラメータの確認
model.coef_

#決定係数(予測の精度）0~1の間で高いほどいい
model.score(X,y)

#予測値の計算
x = X.iloc[0,:] #Xの一行目を取り出し
y_pred = model.predict([x])
```
## モデルの保存・読み込み

モデルの保存は以下のコードで出来ます

```python
#インポート
from sklearn.externals import joblib

#モデルの保存（hoge.pklという名前で保存
joblib.dump(model,"hoge.pkl")
```

モデルの読み込みは以下のコードで行います

```python
#hoge.pklの読み込み
model_new = joblib.load("hoge.pkl") 

#読み込んだモデルの予測値を表示
model_new.predict([x])[0]
```

以上が機械学習の基本的な流れになっています　今回はモデルを重回帰分析で行いましたが，例えばロジスティック回帰で行いたいとかSVMで行いたいといった時も基本的な流れは同じです