OmniAICreator/Qiita-1.07M huggingface dataset:
CNTLM設定方法

##プロキシ環境下での開発のときに使えるCNTLMの設定方法についてまとめます

##CNTLMのインストール

以下のリンクから最新版をダウンロードする。 https://sourceforge.net/projects/cntlm/files/latest/download

デフォルト設定のままインストールを完了させる。
その後、C:¥Program Files (x86)¥Cntlm¥cntlm.ini を変更。

変更項目は以下の４つです

```
Username username
Domain   jpn
Password password
Proxy	 xx.xx.xx.xx.:8080
```

username, password, xx.xx.xx.xxはご自身の環境に合わせて変更してください。

cntlm.iniファイルの変更後に管理者権限でコマンドプロンプトを起動し、CNTLMがインストールされているディレクトリ「C:¥Program Files (x86)¥Cntlm」まで移動する。

以下のコマンドを実行し、パスワードを入力。

```
cntlm -I -M https://bing.com
```


以下のような警告が表示された場合はスルーしても問題ない。

```
1 [main] cntlm 10656 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer.  Please report this problem to the public mailing list cygwin@cygwin.com
cygwin warning:
  MS-DOS style path detected: C:\Program Files (x86)\Cntlm\cntlm.ini
  Preferred POSIX equivalent is: /Cntlm/cntlm.ini
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
```


コマンドの実行結果で、`LM、NT、NTLMv2のどれかが表示される`ので表示された`２行`をコピーしてcntlm.iniの`末尾`に追記。

```
Auth            LM
PassLM          BDB525A961AB33888E3F111BC000A708
```

```
Auth            NT
PassNT          77B9081511704EE852F94227CF48A793
```

```
Auth            NTLMv2
PassNTLMv2      05B9D5FDA40E3AF3A94EE7F5849EA1C1
```

（CNTLMの不具合で、ファイルの最後の行が読み込まれないケースが過去にあったようなので、念のため２行を末尾に追記した後で改行しておく）

起動コマンドと起動の様子は以下の通り。

```
$ net start cntlm
Cntlm Authentication Proxy サービスを開始します.
Cntlm Authentication Proxy サービスは正常に開始されました。
```

設定が正しくてもエラーが出る場合は、数秒おきに何度か実行すれば正常稼働するケースが多い。（多くても５回程度）

```
$ net start cntlm
Cntlm Authentication Proxy サービスを開始します.
Cntlm Authentication Proxy サービスを開始できませんでした。

システム エラーが発生しました。

システム エラー 1067 が発生しました。

プロセスを途中で強制終了しました。
```

終了コマンドは以下の通り。

```
$ net stop cntlm
```

CNTLMが正しく設定されたかどうかの確認は、 ブラウザのプロキシサーバーの設定をアドレス＝localhost、ポート＝8080 にして外部のウェブページを閲覧してみる。

(IEなら、ウィンドウ右上の歯車アイコン→[インターネットオプション]→[接続]タブ→[LANの設定]から設定可能、

Google Chromeならウィンドウ右上の３点アイコン→[設定]→[詳細設定]→[パソコンのプロキシ設定を開く]から設定可能。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/36fec912-c3fd-63bd-3fe7-75dd1b6d4aa5.png)

以上です。
pandasで東京都感染者数のグラフを書く

#動機
とにかく、暇だ。新しいことにチャレンジすることが大事だとか、何とか誰かが言っていたので遠隔授業が始まる前にPythonのお勉強をしようと思いました。

#環境
OS:macOS Mojave
Pythonバージョン:Python 3.7.5rc1
実行環境:Atom ruuner

#設計
https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068
から配布されているコロナ関連のcsvデータがある。これをベースに感染者数をグラフ化する。
グラフ化には、pandas,matplotlib,japanize_matplotlibを用いた。
感染者数を日毎にカウントすれば折れ線グラフを用いて簡単にグラフ化できるだろう。



japanize_matplotlibをインストールしていないと、グラフに日本語を用いることができない。
該当CSVデータはutf-8でエンコードされているものの、日本語にできないものはできないらしい。

#コード
```python:hello.py
import pandas as pd
import numpy
import requests
import datetime
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import japanize_matplotlib

#ダイレクトリンクで取得するのはサーバに負担を掛けるのでローカルでやろう。
url = "130001_tokyo_covid19_patients.csv"
#CSV読み込み
csv_data = pd.read_csv(url)  

#printによる省略回避なくてもOK
pd.set_option('display.max_columns',100)  
pd.set_option('display.max_rows',10000)  

#患者数No
num_patients = csv_data["No"].count()
#列ごとに数を取得
num_date = csv_data["公表_年月日"].value_counts()
num_age = csv_data["患者_年代"].value_counts()
num_sex = csv_data["患者_性別"].value_counts()
#グラフ処理のためnum_dateを要素頻度→日付順にソート
num_date = num_date.sort_index()

#画面出力部
print("感染者数={0}".format(num_patients))
print("公表日頻度=\n{0} \n{1}".format(num_date,num_age))
print("性別=\n{0}".format(num_sex))
print(type(num_date))

#グラフ出力部
plt.figure()
#日付が入るようにX軸90°回転lengendは、凡例の表示位置
num_date.plot(rot=90,legend='reverse') 
plt.savefig('sample_fig.png')
plt.close("all")


```
printのformatメソッドはあまり気にしすぎなくて良い。
そのまま、変数を用いて、print(num_patients)としてよい。
退院フラグなども追加されたようだが、値としては、Nanか1.0しか取り得ない。死亡も退院に含まれるようだ。

####**図1.出力したグラフ**
![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596630/677a6adc-3190-219f-bb3b-bb147249ab19.png)



#感想
pandasの２次元配列？と一般的な２次元配列の区別がついておらず混乱した。
一般的(default)の２次元配列のメソッドはpandasの2次元配列から呼び出せない。
(メソッドを持っていないから)

Javaでやると100日くらい掛かりそうなことが、pythonでは１日でできてしまって感動している。
実用的なライブラリが多くある一方、どれを使うべきなのかが混乱しやすい。

#今後の展望
天気予報や気温などの相関をだして気温によってコロナウイルスは弱らないということを否定してみたい。
冬から春へのデータしか揃っていないから首都圏の最近の気温の乱高下を利用しようと思うが、
計測するまでもなく、気温に関係なく患者が増えていることから否定できないと思われる。

#参考
pandasについて
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a

matplotlibについて
https://blog.codecamp.jp/python-Matplotlib

japanize_matplotlibについて
https://qiita.com/uehara1414/items/6286590d2e1ffbf68f6c

#お断り
データ等は、執筆当時のものです。最新のデータや政府から指示･要請に従ってください。
本記事は医学的に正しいということを示すものでは有りません。
SSE2/AVX512, ARM NEON での rcpe(逆数近似), rsqrte(逆平方根近似)命令のメモ

## 背景

embree-aarch64 において, ARM NEON だと交差判定で欠けがでる.

https://github.com/lighttransport/embree-aarch64/issues/20

どうも除算 and/or 平方根の精度の問題っぽい.

ARM NEON と x64(SSE2) での 1/x と 1/sqrt(x) の近似命令を使った 1/x と 1/sqrt(x) の計算の精度を合わせたい.

## 基本情報

a/x の計算(除算): 1/x を求め, `a * (1/x)` で実現
sqrt(x) の計算: 1/sqrt(x) を求め, `x * (1/sqrt(x))` で求めることができる. 
 
## 精度について

`e < 2^{-n}` の誤差のとき, n bit の精度と言うことにします.

また, 単精度を扱います.
命令の実装的には, テーブルを引いていると思われます(参照文献 "ディジタル数値演算回路の実用設計" 参照).

倍精度の場合はテーブルを増やすのははたぶん意味がなくて(これも参照文献 "ディジタル数値演算回路の実用設計" 参照), Newton-Raphson iteration で精度を上げての対応になるためと思われますので, 倍精度の場合は少なくとも SSE2 では近似命令は存在しませんので, 単精度の近似命令を使いまします.
(これにより, assembler 上では float <-> double の変換が発生しますが, uOP fusion して実行時には実際には消える... かも?)

Newton-Raphson を何回か適用することで, 実際の除算/逆平方根とおなじ精度がほぼだせます(たぶん).
近似ではない実際の除算, 逆平方根と同じ精度を出すには, 22~23 bit の精度(float32)が必要でしょうか.

近似命令は, SSE では ~12bit, ARM NEON では ~6 or 7bit 程度のようです.


NEONの逆数推定命令の精度 : Accuracy of NEON reciprocal estimation instruction
https://qiita.com/sanmanyannyan/items/62bb5ce6ada975a7106a

ありがとうございます. ARM の場合 CPU にもよるのですね.

したがって NEON ではより Newton-Raphson でのイテレーションを増やす必要があります. 幸いなことに, NEON では Newton-Raphson 用の命令が用意されています.

ARM NEONでの初期逆数推定値の補正 / Correction of reciprocal value w/ ARM NEON
https://qiita.com/sanmanyannyan/items/4d06b00078dd4abc4225

ありがとうございます.

### SSE2

`_mm_rcp_**`, `_mm_rsqrt_**` 命令があります.

### AVX

AVX512VL(AVX512F?)から, 14bit 精度での rsqrt `vrsqrt14ss`, `vrsqrt14ps` があります.

https://www.felixcloutier.com/x86/vrsqrt14ss

### ARM NEON

`vrecipeq_f32`, `vrsqrteq_f32` で近似を求める命令があります.
 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14282.html

NEON の場合は整数用の命令もあるのがいいですね.

ここから, Newton-Raphon 用の計算を行ってくれる命令(SSE/AVX には無い)

`vrecipsq_f32`, `vrsqrtsq_f32`を使って精度をあげることができます.
(命令名称が似ているので注意!)

ARM NEONの使い方 除算編
http://atkg.hatenablog.com/entry/2016/11/26/205019

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CIHDIACI.html

### 考察

ARM NEON では NewtonRaphson iteration を増やさないと精度がでないので, 精度求めるなら命令数は多くなる.

Intel のように, div 命令が別ポートで実行されているなら, 以外と近似で求めなくても性能でる...かも?

もしくは, 自前逆数テーブル引きを実装してみるとか...(NEON だと, テーブルルックアップに使える命令があったような?)

## 参考情報

* https://en.wikipedia.org/wiki/Fast_inverse_square_root
* ディジタル数値演算回路の実用設計―四則演算、初等超越関数、浮動小数点演算の作りかた (Design Wave Advanceシリーズ) https://www.cqpub.co.jp/hanbai/books/36/36171.htm
解决卸载Hyper-V后不能上网问题

@Echo on
pushd\windows\system32\drivers\etc
attrib -h -s -r hosts
echo 127.0.0.1 localhost>HOSTS
attrib +r +h +s hosts
popd
ipconfig /release
ipconfig /renew
ipconfig /flushdns
netsh winsock reset all
netsh int ip reset all
shutdown -r -t 
1del %0
深層学習／GoogLeNet, ResNet

#1.はじめに
　今回は、CNNモデルのGoogLeNetとResnetについて、まとめてみます。


#2.GoogLeNet
![1*_rCyzi7fQzc_Q1gCqSLM1g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/67f98213-a8ff-de52-2d7e-18a3ef37cdd2.png)


　GoodLeNetは、2014年のILSVRCで優勝したモデルで、複雑に見えるモデルですが、初めて「モジュール」を1つ設計して、それを連結させて行く手法が導入されました。これ以降モジュールで考えると言うことが多くなりました。

![スクリーンショット 2020-03-31 11.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/55f2e3af-70b6-f64c-8c58-655bbae19e21.png)

　これが使われている Inception モジュールです。特徴は、1×1の畳み込みを積極的に使って、色々な変換を施してそれを全部連結することです。この1×1の畳み込みは次元削減と同等な効果を持っています。

　小さな畳込みフィルタのグループで近似することで、 モデルの表現力とパラメータ数のトレードオフを改善していると言えます。

![スクリーンショット 2020-03-31 13.31.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/73d58375-38ca-b8f3-49dd-a5dc2b7ea2cd.png)
　パラメータの削減は上図のように直感的に理解することができます。畳み込み層のパラメータ数はbias項を除くと入力チャネル数×出力チャネル数×カーネルサイズ（e.g. 5x5=25）で表現されます．

　通常の畳み込みであれば，左のようにパラメータは全て何かしらの値を持っているためdenseです。一方，Inceptionでは異なるサイズの畳み込みを独立して行っているため，非0のパラメータ数が大きく減ることになります。

![1*uW81y16b-ptBDV8SIT1beQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/8d251aa2-54e4-a886-390b-b5aa87519e8c.png)
　GoogLeNetの学習では，ネットワークの途中から分岐させたサブネットワークにおいてもクラス分類を行い，auxiliary lossを追加することが行われている．これにより，ネットワークの中間層に直接誤差を伝搬させることで，勾配消失を防ぐとともにネットワークの正則化を実現しています。

　また、アンサンブル学習と同様の効果が得られるため、汎化性能の向上が期待できます。また、AuxililaryLossを導入しない場合でもBatchNormalizationを加えることにより、同様に学習がうまく進むことがあります。

#3.ResNet
　ディープラーニングは基本的に多層にするほど良いと考えられていましたが、50層を超えるとような大きなネットワークは勾配喪失の問題からパフォーマンスが低下してしまうことが知られていました。ResNetは、これを解決し超多層のネットワークも学習可能となりました。現在あるCNNは、ほぼこのResNetベースのモデルです。

　![スクリーンショット 2020-03-31 13.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/410a273f-3c21-6e46-23a8-255487a015f0.png)
　ResNet では層をまたがる結合として **Identity mapping** を用います。そうすることでスキップコネクションの内 側の層は ブロックの入出力の残差を学習することになります。

　ResNetが上手く行くのは、ブロックへの入力にこれ以上の変換が必要ない場合は**重みが 0** となり小さな変換が求められる場合は対応する**小さな変動をより見つけやすくなる**こと、バイパスすることによって**入力層に近い層にも誤差が伝わり**勾配消失が起き難いこと、色々なバイパスの組み合わせが存在することになり**アンサンブル効果**があること、などによります。

　このように、多くの利点を持ちながら、やっていることは入力をショートカットして足すだけなので、**計算コストはほとんど増えず**に、実装も容易であることが特徴です。
Discordを使って無料でビデオ会議をする

# はじめに
なんやかんやの事情で在宅勤務が増えている昨今、複数拠点間で打ち合わせしたいという需要は増えていると思います。
お金があれば、ZoomとかG-suiteのmeetを使いましょう！ってなるんですが、予算の問題もありますよね。
今回は無料で使えるDiscordというサービスを使って、ビデオ会議をする手順を調べたので、備忘として書いています。
Discordでは同時参加者の上限が10名までなので、小規模な会議の場として利用できそうです。

# 手順
以下が手順の説明になります。
参加者全員が行う手順（①～③）と主催者のみが実行するもの（④と⑤）があります。

## ①ブラウザでDiscordにアクセス（会議参加者全員が実施）
Discordの[サイトにアクセス](https://discordapp.com/)して、「Discordをブラウザで開く」ボタンを押します。
その後適当なユーザ名を入力します。

Discordの画面が表示されたあと、ユーザ登録の入力フォームが表示されますが必須ではありません。
お試しでやる場合はユーザ登録をスキップしても大丈夫です。

## ②ビデオ会議をしたい相手をフレンドに追加（会議参加者全員が実施）
「フレンドに追加」の画面から、DiscordTag（ユーザIDのようなもの）を入力して会議参加者をフレンド申請します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/99565180-e9e8-c4be-00a7-d4ca50ad7c74.png)

自分自身のDiscordTagはダッシュボードの左下（下の図の赤線部分）に表示されていて、"ユーザ名＋#XXXX（数字4桁）"の形式で書かれています。
こちらを相手から教えてもらうか、自分のDiscordTagを相手に通知して、フレンドを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/d4412fc0-f4fc-1f24-58cb-119a22a0f580.png)


## ③フレンド申請が来たら承認（会議参加者全員が実施）
フレンドの申請が来たら承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/903ffece-9991-5587-0f98-30f0d0d56c56.png)

今回は一人で3台分の設定を入れて手順を検証しているのですが、申請と承認が地味にめんどくさい…
会議をする相手が固定されているミーティングだと初回のセットアップだけで済みますが、メンバーが固定されていない会議だと大変な予感…

## ④ビデオ会議の出席者全員とフレンド追加したら、新規グループDMを作成（主催者のみが実施）
グループDMを作成します。LINEのトークルームみたいなものでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/abe3e0fb-ab94-1df2-0994-cd980c10b288.png)

## ⑤ビデオ通話を開始（主催者のみが実施）
グループの画面から、「ビデオ通話を開始」ボタンを押します。
この操作は会議出席者の誰がやっても大丈夫ですが、主催者がやるのが良いかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/42c9fe74-1c8e-0fbc-9c55-41b080c47c17.png)


## ⑥ビデオ通話に参加（主催者以外が実施）
主催者以外のユーザには着信が来ます。「通話に参加」ボタンを押すと通話を始められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/8666e4a7-0c0d-7349-688a-5082491209b7.png)

通話に参加したあとマイクやウェブカメラを有効にすればビデオ会議が開始できます。会議が終わったら「切断」ボタンを押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223632/e205e10f-cf19-1e7b-5692-0d6e151ff85c.png)

以上で手順は終わりです。お疲れさまでした！
7. エキスパート編

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

7.1 仮想サーバーを他仮想環境へ移転するには？
7.2 他仮想環境VMをSoftLayerへ移転するには？
6.9 グローバル通信を有効にするには？

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

概要
仮想サーバーや物理サーバーは、VLANで区切られたプライベート・ネットワークやパブリック・ネットワークに接続されます。 サーバーが接続されるVLANには、様々な考慮点があり、グローバル・ネットワークを活用するために欠かせないVLANスパニングについてご紹介します。
 

VLANスパニングとは
SoftLayer のグローバル・ネットワークを利用して、プライベートIPで海外のソフトレイヤーのデータセンターのサーバーと連携するためには、「VLAN Spanning」の設定を「ON」にする必要があります。このためには、カスタマーポータルのメニューから「Network」->「IP Management」->「VLANs」に進み「Span」のタブをクリックすると、次の画面が表示されるので「ON」を設定します。

新規にユーザーアカウントを作った初期状態では、この設定は「OFF」になっています。この状態では、同じプライベートVLANの中だけでしか通信することしかできません。 もちろん、SoftLayer の共通基盤のサービスとは通信できますので、OSのアップデート、DNSやNTPを利用できます。

「VLAN Spanning」の設定を「ON」にした場合、同一データセンター内、および、海外のデータセンターと通信ができるようになります。

「VLAN Spanning」に関連して注意点や制約として以下の点があります。
 

SoftLayer の他データセンター上のサーバー間で連携する場合、パブリックIPを利用すると、無料枠を超えた場合は、費用が発生します。
プライベートIPを利用して、他データセンター上のサーバー間で連携する場合、「VLAN Spanning」の設定を「ON」にする必要があります。
同じユーザーに限定され、他のユーザーのプライベートVLANとの相互通信はできません。
同じユーザー内で、VLAN番号ごとに「VLAN Spanning」を指定することはできません。全体で疎通を「許可する」または「許可しない」の選択に限られます。
 

参考資料
    (1) コンフィグレーション・ガイド 1.1 サーバーとネットワークの基礎
    (2) コンフィグレーション・ガイド 4.2 サーバーを替えても同じIPアドレスを継続するには？
    (3) コンフィグレーション・ガイド 6.1 ソフトレイヤーネットワーク入門
    (4) コンフィグレーション・ガイド 6.7 ネットワークのゾーニングを構築するには？
Flutterを始めたいメモ

導入やチュートリアルで参考にしたわかりやすかったところを紹介

【チュートリアル】
[公式 Flutter](https://flutter.dev/docs/get-started/install)
[[Flutter]最初のFlutterアプリを作るpart1-ドキュメント翻訳](https://qiita.com/gkn/items/af98200d7a98c033b597)
[無限スクロールListView](https://flutter.ctrnost.com/tutorial/tutorial06/)

【Flutterの基礎】
[Flutterの基礎](https://qiita.com/nkmk1215/items/7d73b4fd8cb5ec5ac486)
[Flutter はじめの一歩](https://medium.com/flutter-jp/first-step-9b7f2c74fb08)

参考を色々読みながら公式チュートリアルのPart1に
自分なりに噛み砕いた解釈をコメントで入れたソースが以下

```dart

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(MyApp());
//アプリが実行されたらまずmain()が呼ばれる
//runApp()で根元のWidgetを指定

class MyApp extends StatelessWidget {
  //StatelessWidgetはbuildメソッドを持ち、Widgetもしくはテキストを返す
  //buildメソッドでUI構築に必要なWidgetを組み合わせて組んだWidgetツリーをreturnで返す

  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: 'Start up Name Generator', home: RandomWords());
    //MaterialApp…デザインを簡単にしてくれるクラス
    //title…タイトル文字 無くても動いた。
    //home…画面下部のコンテンツ　アプリケーションが表示されたとき最初に表示される
    //MaterialAppはStatefulWidget
  }
}

class RandomWords extends StatefulWidget {
  //スクロールする度ワードが増えるので動的なUI StatefulWidget
  //StatefulWidgetはbuildメソッドを持たず、createStateメソッドを持ち、これがStateクラスを返す
  @override
  RandomWordsState createState() => RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  //StatefulWidgetの実体
  //Stateの役割…状態の保持・更新、buildメソッドでWidgetツリーを返す

  //クラスのフィールド
  final List<WordPair> _suggestions = <WordPair>[];//単語のペアを保存する配列
  final TextStyle _biggerFont = const TextStyle(fontSize: 18);//フォントサイズの指定

  @override
  Widget build(BuildContext context) {
    //Scaffold ページの根元,マテリアルデザインの土台
    return Scaffold(
      appBar: AppBar(
        //上部に表示されるナビゲーションバー
        title: Text('Start up Name Generator'),
      ),
      body: _buildSuggestions(), //ページの中身
    );
  }

  Widget _buildSuggestions() {
    return ListView.builder(
        padding: const EdgeInsets.all(16), //パディング
        //四方それぞれ指定したい時の書き方は
        //EdgeInsets.only(top: 16.0, right: 16.0, bottom: 16.0, left: 16.0)

        itemBuilder: (BuildContext _context, int i) {//iは行番号
          if (i.isOdd) {//リストの奇数行の時
            return Divider();//仕切り線のウィジェット
          }
          //以下偶数の時の処理
          final int index = i ~/ 2;
          //iは仕切り線とワードの数が一緒に数えられている数なので
          //indexにワードの数だけを書き出す
          if (index >= _suggestions.length) {//_suggestions…フィールドで宣言されたリスト
            //リストの最大数まで表示したらリストを10個増やす
            _suggestions.addAll(generateWordPairs().take(10));
          }
          return _buildRow(_suggestions[index]);//
        });
  }

  Widget _buildRow(WordPair pair) {
    return ListTile(//リストの内容の指定
      title: Text(
        pair.asPascalCase,//asPascalCase…単語のペアを文字列として返す
        style: _biggerFont,//フォントサイズの指定
      ),
    );
  }
}

```
自作widgetを作って呼び出す Flutter

# オリジナルの処理を入れたい
widgetを使って静的な描画と動的な処理を書きわけるというのは理解できたので、次のステップとして、こんな処理があったらいいなを実現するにはどうしたらいいかを考えていこうと思いました。

## getTextsウィジェットを作る
練習として、ほげほげを横に描画するRowウィジェットをreturnするgetTextsウィジェットを作成します。

```main.dart
Widget getTexts (List<String> strings) {
  List <Widget> list = List<Widget>();
  for(var i = 0; i < strings.length; i++) {
    list.add(Text(strings[i]));
  }
  return Row(children: list);
}
```

作成したgetTextメソッドは上記のようになります。

そして、このウィジェットで行っている処理は下記になります。

- 引数として、文字列のListを受け取るようになっている
- list変数の中にTextウィジェットをaddするための空のList型ウィジェットを宣言
- ループ処理、引数で渡ってきたListの長さ分だけループする
- listへ文字列のListを順番に代入する
- 返り値として、Rowウィジェットを返す

## 作成したwidgetを呼び出す

```main.dart
class FirstScreen extends StatefulWidget {
  FirstScreen({Key key}) : super(key: key);

  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  List <String> lists = ['ほげほげ', 'ほげほげ', 'ほげほげ'];
  
  @override
  Widget build (BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text('First-Screen'),
      ),
      body: Container(
        child: getTexts(lists),
      ),
    );
  }
}
```

変数のlistsにListに描画させる文字列を代入させ、それを引数とする。
bodyの値にContainerウィジェットを配置して、このウィジェットのchildの値に作成したウィジェットを配置することで呼び出すことができる。

## まとめ
flutter側で用意されているウィジェットの使える値とその値に使えるプロパティを知っておくと、ウィジェットツリーをイメージしやすくなって、実際に書くのがスムーズになる。

## ウィジェットの種類を知るために

公式にウィジェットを紹介したカタログがある
[Widget catalog](https://flutter.dev/docs/development/ui/widgets)

開発に使う基本ウィジェットを紹介してくれている
[Flutter開発する前に知っておきたい35のWidget一覧](https://qiita.com/coka__01/items/dedb569f6357f1b503fd#row)
C#用にC++のDllを作る方法


僕忘れやすいからメモとして残しておきます

VisualStudio2019で空のプロジェクトの作成を行い以下の二つのファイルを追加し、プロパティでdll向けに設定をして，ビルドを行います。

```cpp:Test.cpp
#include "Test.h"

//Test用メソッド
int Test(int a, int b){
	return (a + b);
}
```

```cpp:Test.h
#pragma once
#define DLLEXPORT _declspec (dllexport)

extern "C" {
	DLLEXPORT int Test(int a, int b);
}
```


出力されたdllをC#側で以下のようにして読むと実行できます

```c#:Test.cs
using System.Runtime.InteropServices;

[DllImport("Test.dll")]]
private static extern int Test(int a, int b);

void main(){
     Console.WriteLine(Test(1,2)); 
}
```
flaskによるslackのOAuth認証をやってみる（Slack API V2）

## OAuth認証の必要性

　スラックアプリを作るときに、一つのワークスペースにだけインストールするならば、アプリの**設定ページ**から手動インストールすることができます。
　しかしアプリを個人的にインストールしたり、最終的にSlackディレクトリで**公開**する場合は、OAuth認証でのインストールをする必要があります。

 slackのOAuth認証の仕組みは一般的なものと同じだと思います。

## flaskによる実装

### 必要な情報

- client_id
- client_secret

### コード

```python
import os
import slack
from flask import Flask, request, make_response

client_id = os.environ["SLACK_CLIENT_ID"]
client_secret = os.environ["SLACK_CLIENT_SECRET"]
#ここにアプリが要求するスコープを追加します。
oauth_scope = ",".join([
  "channels:history",
  "groups:history",
  "im:history",
  "mpim:history",
  "chat:write"
  ]) #os.environ["SLACK_BOT_SCOPE"]
uuids = []

app = Flask(__name__)

@app.route("/begin_auth", methods=["GET"])
def pre_install():
    """slackのOAuth認証ページに飛ばすリンクを作成し、表示させます。"""
    from uuid import uuid4
    state_string = str(uuid4())
    uuids.append(state_string)
    return f'<a href="https://slack.com/oauth/v2/authorize?scope={ oauth_scope }&client_id={ client_id }&state={ state_string}">Add to Slack</a>'

@app.route("/finish_auth", methods=["GET", "POST"])
def post_install():
    """認証が終わった後、リダイレクトされたアクセスの処理です"""
    auth_code = request.args['code']
    state_code = request.args['state']

    #state_codeが一致しなければ401
    if not state_code in uuids:
        return make_response("", 401)
    else:
        uuids.remove(state_code)

    #認証をするには空白のトークンでクライアントを作成します。
    client = slack.WebClient(token="")

    #認証トークンを要求します。
    response = client.oauth_v2_access(
        client_id=client_id,
        client_secret=client_secret,
        code=auth_code
    )

    #スラックボットトークンをDBなどに保存します。
    SLACK_BOT_TOKEN = response['access_token']

    #ユーザーに成功を伝えるのを忘れないでください！
    return make_response("認証成功!!", 200)

app.run()
```

### リダイレクトURLの設定

`App > Basic Information > OAuth & Permissions > Redirect URLs`に`http://localhost:5000/finish_auth`を登録。

`Save URLs`で保存

<img width="672" alt="スクリーンショット 2020-03-31 14.17.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150799/1537fdc3-7aac-b7b9-8ea4-5928a625019a.png">

### アクセス

これで準備は完了
flaskを起動して、`http://localhost:5000/begin_auth`にアクセスします。
<img width="329" alt="スクリーンショット 2020-03-31 14.21.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150799/d8fc93b5-77d6-1af0-7057-80ef2a15286a.png">

リンクをクリックするとslackの認証を求められます。

<img width="630" alt="スクリーンショット 2020-03-31 14.24.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150799/85337c61-1e00-2c35-18e2-5e5a1e19999c.png">


Allowを押しますと、次の画面に遷移し、そのときにtokenを生成します。
確認のためのUUID4が一致すれば、リストから消去し、slackClientを使ってアクセストークンを取得します。

<img width="320" alt="スクリーンショット 2020-03-31 14.30.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150799/89d0ea47-d45a-f608-85f2-6ae717b86af8.png">

今回のコードでは書いてませんが、得られたアクセストークンは次に利用するために保存しましょう。


## 参考
[slack API 日本語ドキュメント](https://api.slack.com/lang/ja-jp)
[Installing with OAuth](https://api.slack.com/authentication/oauth-v2#exchanging)
Java Silver SE8 (Oracle Certified Java Programmer, Silver SE 8)に合格した話

# はじめに
4月から入社3年目になるエンジニアです。
Javaに関する知識は業務でJavaのWebアプリをServletで作成したくらいです。ほぼ初心者です。
今回この試験の学習を通してオブジェクト指向言語またはJava特有の言語仕様の知識を深めることができたと感じています。
自分のように会社から何かベンダー資格を取れと言われている方や、エンジニアとしてのスキルアップとして何を取ろうか迷っているという方におすすめできる資格だと思います。

# Oracle Certified Java Programmer, Silver SE 8とは？
公式からの抜粋です。
>Javaアプリケーション開発に必要とされる基本的なプログラミング知識を有し、上級者の指導のもとで開発作業を行うことができる開発初心者向け資格です。日常的なプログラミング・スキルだけでなく、さまざまなプロジェクトで発生する状況への対応能力も評価することを目的としています。

# 学習時間
試験1か月前から平日は1日あたり30分、休日は2～3時間くらいしました。

# 学習方法
[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931)（通称黒本）
1冊のみです。これだけで十分だと思います。
実際、巻末の模擬試験問題から（ほとんど）同じ問題が何問も出題されました。

1～9章までの問題を解いて完璧にしてから、巻末の2回分の模擬試験を解きました。
模擬試験で間違った問題の解説を読み、それでも不安なら1~9章までの該当箇所の問題と解説を読むという流れで当日までに本書を3周しました。

# 受験までの流れ
[この方の記事](https://takakisan.com/java-certification-silver-application/)を参考にしました。他のベンダー資格は受けたことないので比較できませんが、かなりめんどくさかったです。

# 試験当日
自分は13:30開始にしました。それぞれベストなパフォーマンスが発揮できそうな時間に試験予約してください。少し早めに試験会場に入り、受付手続きを済ませてから試験開始です。
テストセンターのPCで77問解き、見直しをしてもなお1時間（試験時間は2時間半）くらい余しましたが、終了して会場を出ました。
会場から駅に向かって歩いている途中にOracleから合否メールが届きました。早すぎ。
結果は正答率78%で合格でした（合格ラインは65%）。

# 感想
満点を取る気で臨んだのですが、黒本とは毛色が違う問題や、拾いきれなかった問題、テストセンターの空気に飲まれてかなり落としてしまいました。

# 個人的に試験勉強していて大切だと思った箇所
- Javaでboolは使用できない(C#等と混同しない)。

- インターフェース内のメソッド式は暗黙的にコンパイラが書き換える。そのため、サブクラスでの対象メソッドの実装のアクセス修飾子はpublicのみ許容。

```java
void test();
// ↑コンパイル前　↓コンパイル後
public abstract void test();
```
- コンストラクタ内の処理は明示しなければ、暗黙的に先頭でスーパークラスのコンストラクタを引数なしで呼び出す。

```java
public class Test extends Sample{
	public Test(){
		System.out.println("test");
	}
}
/* ↑コンパイル前　↓コンパイル後 */
public class Test extends Sample{
	public Test(){
		// Sampleクラスのデフォルトコンストラクタを呼び出す
		super();
		System.out.println("test");
	}
}
```
- コンストラクタで明示的にスーパークラスのコンストラクタを呼び出す場合、必ず先頭で呼び出さなければならない。

```java
public Test(){
	System.out.println("test");
	super("A"); // コンパイルエラー
}
```

- アクセス修飾子は厳しい順に private < なし < protected < public

|アクセス修飾子|アクセス権限|
|---|---|
|private|同じクラス内のみ許容|
|なし|同じパッケージ内のみ許容|
|protected|同じパッケージ内＋サブクラスからのみ許容|
|public|全て許容|

- オーバーライドする際は、シグニチャを変更せずにスーパークラスのメソッド宣言と同じか緩いアクセス修飾子で宣言する必要がある。

```java
public class Sample {
	protected void test(String name) {
		System.out.println(name);
	}
}
```
```java
public class Test extends Sample {
	// protected,publicは許容。修飾子なし,priveteはコンパイルエラー
	public void test(String name) {
		super.test(name);
		System.out.println(name);
	}
}
```

- スーパークラスのコンストラクタ呼び出し後に、オーバーロードしたコンストラクタ呼び出しはできない。

# さいごに
ここまで読んでいただきありがとうございました。
何か間違っている箇所等ございましたら、容赦なく指摘していただけると幸いです。
シェルでtry-catch構文とか例外処理とかを簡潔にワンライナーで書く方法

# 概要

シェルで複雑な条件分岐する時ってどうしたらいいんだろうってなりますよね？
特にtry-catchについては結構思いつくのが面倒だったりするので、メモとしてここに残します。

# やり方

シェルにはこんな機能があります。

```sh:構文
echo "try" && echo "OK" #echo "try"が成功した時、echo "OK"を実行
ech "fail" || echo "catch" #ech "fail"が失敗（この場合typoなので必ず失敗)する時、echo "catch"を実行
```

つまり、`&&`は直前のコマンドが成功したら次のコマンドを実行するというもの
`||`はその逆で、直前のコマンドが失敗したら次のコマンドを実行するというものがあります。

これを組み合わせると、以下のコマンドができます。

```sh:try-catch
wget https://hogehoge/ && echo "try-OK" || echo "catch exception"
```

こうすることで、例外処理を組み込むことができます。
意外に使い勝手がよくて、重宝します。

# 何で失敗したかについて

何で失敗したかというトレースに関してはエラーログを見て欲しいという感じはあるのですが、
例外によって処理を分けたい時とかはありますよね。

その場合は、`$?`を使って条件分岐をするしかなさそうです。
`$?`とは、直前の終了ステータスを記載したもので、これが0以外になるため、何で終了したかの情報はここに載ります。

しかし、具体値に依存している関係もあって、特別なことをやろうとするとかなり面倒なので、ワンライナーで書けなくもないですが
あまりお勧めはしません。

この記事が誰かに役に立ちますように...!
Blender 2.82 のビルドメモ


Blender 2.82 を対象にしますが, 2.83 or later でもいけるかもしれません.

## ビルド情報

https://wiki.blender.org/wiki/Building_Blender

よくまとまっています.

ビルドにつまづいたら, まずは

```
$ make lite
```

で minmal build を試してみるのがよさそうです.

本体自体はビルドは問題ないことが多いですが, 依存ライブラリでいろいろ問題がでます.

## 依存ライブラリ

Linux での prebuilt library を見ると以下になります. 

* alembic : シーンファイルフォーマット. 主に Maya などから static な形状データを交換する用.
* blosc : データ圧縮ライブラリ
* boost : ビルド不都合の要因によくなるもの. 良い子のみんなは Boost 使わないで C++ プログラミングしようね
* embree : レイトレーシングライブラリ
* ffmpeg : 動画生成とか. assembler 使う
* fftw3 : フーリエ変換ライブラリ
* freetype : フォントライブラリ
* glew : OpenGL 用ライブラリ
* jemalloc : メモリ確保を効率化する. これもビルド不都合になりやすいようなので, 使わないでもいいかも
* jpeg : JPEG ライブラリ
* llvm : OpenShadingLanguage で使っている, コンパイラ用ライブラリ
* mesa : OpenGL 実装. Blender では OpenGL の SW backend として使っている(?)
* openal : オーディオライブラリ
* opencollada : Collada シーンファイル. 今となってはあまり使わないかも?
* opencolorio : カラーコレクション用ライブラリ
* openexr : OpenEXR 画像データライブラリ
* openimagedenoise : デノイズライブラリ
* openimageio : 画像 IO ライブラリ(いろいろライブラリに依存していてめんどい)
* openjpeg : JPEG ライブラリ
* opensubdiv : Subdivison surface 形状処理用
* openvdb : ボリュームデータライブラリ. Boost などに依存しておりコンパイルめんどい
* osl : OpenShadingLanguage. Cycles レンダラが使っている
* png : PNG 画像ライブラリ
* python : Python
* sdl : 画面表示用ライブラリ. SDL2 ではない. Blender で使っているのかな?
* sndfile : サウンドライブラリ
* spnav : ツマミのような入力インターフェイスのためのライブラリ? 
* tbb : スレッド処理ライブラリ. openvdb などがこれに依存している
* tiff : TIFF 画像ライブラリ
* usd : USD シーンファイルフォーマット. 今後のシーンファイルフォーマットの主流になるか?
* xml2 : XML ライブラリ
* xr_openxr_sdk : XR(AR, VR, etc)用ライブラリっぽい. リアルタイムエンジン向け?
* zlib : zlib 圧縮ライブラリ


`make deps` でのフルビルドは, システムにインストールされているライブラリが優先して検索されるため, png, openimageio(pthread 関連), openvdb(boost 関連)あたりがこけやすいです.
Unity The referenced project does not exist　が出てた件（メモ）

Qiitaで公開するレベルではない文章だけど、同じエラーにハマってる人へ

現段階（３月３１日）であれば、UnityのVisualCodeEditorのバージョンを１．２．０にすればでなくなった
以下、雑感

#1.経緯
１月末くらいにUnityを開いて２０１９．３.0f6にしたところ、VisualStudioCode側で大量の

>The referenced project does not exist

が出ていた。情報的には、UnityのVsCodeEditorのバージョン1.1.4が悪さをしているように見えた。
1.1.3にダウングレードしたらなおった、というのもあった。
私のほうは治らず、八方塞がり。

別件（GAS）を調べることもあったため、すっかり後回しにしてた。

#2.解決

GASがほぼ片付いたので、そろそろ解決してるだろう、とUnityで新しいデモプロジェクトを開くとプロジェクトのバージョンアップ後、やはり大量のワーニング。

これがでると、コードヘルプに支障がでるので、やはり調査しなきゃ、と検索をかける

どうも、どのバージョンとどのバージョンなら動いた、という情報はあれど、その場限りの解決歩法のようだ

明らかに、２つのアプリで、プロジェクトファイルの扱いに差異があるために発生している問題なので、
VisualCodeEditor側が更新されれば修復するはず

というわけで、最新バージョンである、１．２．０に変更したらワーニングは収まった。
ウィンドウ→PackageManager

<img width="703" alt="VisualStudioCode.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144626/a2dfbf92-b9f3-8c3b-9970-c943ab306a2f.png">


Unity側のバージョン変更に伴う問題なので、プロジェクト進行中はバージョンをなかなか変更しないので、問題は大きくならないけど、新バージョンが出ると、Unityを開くたびにバージョンアップしろ、と言われる

もはやUnityは単体で動くものではないので、使う側も気をつけないと余計な時間をとられちゃうますな。

#3.ついでに

今回は、2D IsoTilemapsのサンプルプロジェクトを開きたかったんだけど、上のエラーのほかに、

```C#:GameObjectBrush.cs
  if (PrefabUtility.GetPrefabType(go) == PrefabType.Prefab)
```
の部分がObsoleteだったので、エラーメッセージの言われるままに以下のように修正。

```C#:GameObjectBrush.cs
  if(PrefabUtility.GetPrefabInstanceStatus(go) != PrefabInstanceStatus.NotAPrefab)
```
プログラマ脳を鍛える数学パズルQ01「10進数で回文」


#Code
```
def kai(i): #回文かどうか判定する
    return str(i)[::-1] == str(i)
    
dec = 11
while not(kai(dec) and kai(bin(dec)[2:]) and kai(oct(dec)[2:])):
    dec += 2 #奇数だけ探せばよい（本文参照）
print(dec)
```

#補足
##n進数
2進数  0bNN
8進数  0oNN
16進数 0xNN

2進数に変換 bin(NN)
8進数に変換 oct(NN)
16進数に変換 hex(NN)

2進数を10進数に変換 int(BIN, 2)
8進数を10進数に変換 int(OCT, 2)
16進数を10進数に変換 int(HEX, 2)

##文字列を逆にする
str[::-1]

参考 https://redcat-prog.hatenadiary.org/entry/20111104/1320395840
AWS Aurora MySQLをLaravelプログラムと連結する方法

###AWS上で展開するLaravelプログラムとAurora MySQLの連結方法について明記します。

設定は簡単です。

Laravelの `.env` ファイルのDB_HOSTをAmazon RDSの画面から作成済みDBのエンドポイント名をコピーして、以下の様に貼り付けるだけです。

```
DB_HOST=xxxxxx.cluster-yyyyy.ap-northeast-1.rds.amazonaws.com
```

具体的なAmazon RDS画面での確認場所は画像の通りです。
③のエンドポイント名をコピーしてください。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/2835d7b9-f42f-76f6-6220-c8a1a9e909f5.png)

これでLaravelからのAurora MySQLへの指定はできました。

DBのユーザーやパスワード設定は.envと合わせておけばIAMロールの設定はなくても大丈夫そうです。（特に設定した覚えないまま利用してます）
Angular から Electron のイベントを呼び出し

[前回](https://qiita.com/koronpo/items/56de9e1fddfa7d4baf65) Angular での Electron 環境構築したので次は Angular から Electron のイベント呼び出し。

# IPC（inter-process communication module of Electron）の追加
Electron の main.js に ```ipcMain``` を追加

```js
const { app, BrowserWindow, ipcMain } = require('electron');
```

IPC は [ここを参照すると](https://dev.to/michaeljota/integrating-an-angular-cli-application-with-electron---the-ipc-4m18) IPC は Electron のプロセス間通信モジュールらしい。

# IPC を利用したイベントの定義

引き続き main.js に以下を追加。

```js
ipcMain.on('testIpc', (event, arg) => {
  console.log('IPC のテスト');
})
```

## Angular component に IPC 用の処理を追加

```/sample1/src/app/app.component.ts``` を以下に。

```ts
import { Component } from '@angular/core';
import { IpcRenderer } from 'electron';

@Component({
  selector: 'app-root',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
  public title = 'sample1';
  private ipc: IpcRenderer;

  constructor() {
    if ((window as any).require) {
      try {
        this.ipc = (window as any).require('electron').ipcRenderer;
      } catch (e) {
        throw e;
      }
    } else {
      console.warn('App not running inside Electron!');
    }
  }

  // ボタンクリックで ipc の指定イベント呼び出し
  public clickIpcTestBtn() {
    this.ipc.send('testIpc');
  }
}
```

## レイアウトにボタン追加

```/sample1/src/app/app.component.html``` をわかりやすく以下のみにに。

```html
<button type="button" name="button" (click)="clickIpcTestBtn()">
  IPC のテスト
</button>
```

# 動作確認

```
npm run start:electron
```

でビルド、ボタンクリックでターミナルのログに

> IPC のテスト

と出るようになる。
[次はローカルファイル呼び出し。](https://qiita.com/koronpo/items/0c2599c203a1ee47f762)
i8080のDAA回路（NEC版との非互換の考察）

i8080のDAA回路について
====
8080のDAAについては、きちんと説明された資料が無い。また、インテルとNECではDAA実行後のAC（Auxiliary Carry またはハーフキャリーとも言う）の挙動に違いがあり、非互換部分と言われている。DAA命令の動作の詳細と共に、この非互換部分について考察する。

DAA
----
DAA命令は、直前のADD、INCなどの加算の結果をPackedBCD補正する。
以下、Accの下位4ビットを下位桁、上位4ビットを上位桁と呼ぶ。

※直前の演算はADD、ADC、INR Aなど、加算であればよいが、加算する数値それぞれがPackedBCDとして適切な内容である必要がある。

### 動作は次の通り

１．DAA命令実行前にACが立っているか、又はAcc（アキュムレータ）の下位4ビット（下位桁）が0xA～0xFの場合Accに0x06を加算する。
２．その後CY（キャリー）が立っているか、又は上位4ビット（上位桁）が0xA～0xFの場合Accに0x60を加算し、CYを立てる。

解説
----
DAAの前にACが立っている時、下位桁同士の加算の結果は10進で16～19（最大で9+9+CY=19、ADCの場合）なので、Accの下位桁は0～3になっているはずである。つまり下位桁同士の加算の結果が16進で0x10～0x13だった事を示している。下位桁から上位桁への桁あふれがあったからACが立っているのである。これをPackedBCDに補正するためにAccに0x06を足す。
ACが立っていない時も、下位桁が0xA～0xF（10進で10～15）なら同様にAccに0x06を足す。

この時にAccが桁あふれしたらCYを立てる。桁あふれが無かったらCYはそのまま変更しない。
下位桁の補正の結果、上位桁が0xA～0xFか、またはCYが立っている場合Accに0x60を足して補正する。
補正をしたらCYを立てる。

※　例えば0x99+0x61の場合、加算結果は0xFA（CY=0）になるが、下位桁のみ補正した場合Accが0x00になってCYが立つ。その後上位桁補正時はCYが立っているから補正されてAccが0x60でCY=1、つまり0x160になる。

DAA実行前にACが落ちていて、かつ下位桁が10進で10～15の時は6を足す事により下位桁を0～5にして、上位桁に桁上がり（Accの補正時の下位桁→上位桁の桁上がりがあったという事）を伝える。そのためにAccに8ビットの0x06を足すのである。これを下位4ビットに0x6を足すように表現している解説もあるが、ACやCYの変化も考えるとAccに0x06を足すのが正解。

※　DAA実行前にACが立っている時は、下位桁の補正によって上位桁への桁上がりが発生する事はない。ACが立っているという事は直前の加算の結果下位桁は0～3になっているはずだから。
　　この時の桁上がりをDAA実行後にACに反映するかどうかがNECとインテルの非互換の部分である。

上位桁の補正が必要かどうかは、下位桁の補正の結果で判定する。補正が必要という事は上位桁が10～15か、16～19（つまり0～3でCYが立っているという事）だという意味なので、どちらにしてもキャリーを立てる必要がある。
補正をしなかった場合はキャリーを保存するが、補正の必要が無かったという事はキャリーは立っていなかったという事なので、補正しなかった場合はキャリーをいじる必要は無い。
直前の加算でCYが立っている場合というのは、例えば0x90+0x90で結果0x20＋CYなどの場合なので、補正した結果0x80+CY、つまり0x180になる。90+90=180なので、これでPackedBCDとして正しい。


回路
----

i8080のDAA命令は、実行が4サイクル。最初の３サイクルは命令フェッチとデコードなので、1サイクルで処理しなくてはいけない。という事は途中経過をラッチするタイミングが無い。これを踏まえると以下のような回路になると思われる。

### DAA部分の回路
入力はAccとAC、CYの10ビット。出力はAccに書き戻す値とCY補正後のAC。この補正後のACはインテル版は書き戻しているが、NEC版は書き戻していないと思われる。

[まごころせいじつ堂「NEC uPD8080AのDAA命令調査　ADD編」](http://blog.livedoor.jp/hardyboy/archives/9308365.html)


上位桁の補正が必要かどうか、下位桁からの桁上がりも含めて、Accからの入力から求めているので、INC部分の遅延が問題にならないようにしてある。

![WSS_20200330_175.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136856/230a9153-96a5-bd6e-3408-5f7b965a863d.jpeg)

### ADD6
6を加算する回路。一般に定数の加算回路は通常の加算回路よりも規模が小さくなる。入力に加算する/しない信号があり、加算しない場合入力をそのまま出力する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136856/fdd35a54-82f1-a623-afff-a2e2780d5f59.jpeg" width=50%>

### INC
下位の補正の結果ビット３→ビット４に桁上がりが発生したときに、上位桁にそれを加えるための回路。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136856/dc4d02d0-c221-cc27-6379-0138650150cb.jpeg" width=50%>

上記LogoSimドキュメントは<a href="https://2908.work/Okiba/DAA.circ">DAA.circ</a>から右クリックで保存してください。
pythonでcgiを使うときに注意すべきこと。

#cgiをpythonでいじる

例の如く備忘録。

・管理者権限はどうか
・ディレクトリの構造は適切か

`
home
|_index.html
|_cgi-bin
|_|_app.py
`
・pythonファイルのはじめにpathの記述があるかどうか
・文字コードは適切か
[Unity]コルーチンの中で他のコルーチンが動作完了するまで待つ

`yield return コルーチン`
コルーチンを動作させ、そのコルーチンが動作完了するまで待つ。

例

```C#:sample
IEnumrator sample() {
   yield return ShowStageTitle();
   yield return CountDown();
   GameStart();
}
```
今日のpssh

```
apps=("hamigaki" "futon" "asagohan")
for app in "${apps[@]}"; do
 echo $app
 ./pssh-2.3.1/bin/pssh -x "-t -t -oStrictHostKeyChecking=no" \
 -H "`cat /etc/hosts | awk \
'{if( $1 != "#" && length($2) > 0 ){print $2 }}'`" \
 -i "sudo sed -i -e s/my-db002/my-db001/g \
 /home/shitaku/app_${app}/config/config.ini"
done
```
#### ポイント
- `-x` で ssh の オプションを渡せます
- `-t -t` すると sudo できます (仮想ターミナルを強く割り当てる設定)
- hostsに書いてある相手全部でconfigをかきかえています

----

```
./pssh-2.3.1/bin/pssh -t 0 -x "-t -t \
 -oStrictHostKeyChecking=no" -H "`seq -f my-web%03g 1 5`" \
 -i "sudo find /data/cache -type d -exec chmod 0777 {} \;"
```

#### ポイント
- `-t 0` にすることで、どんなに長い時間かかる実行コマンドでもタイムアウトしません(デフォルト60秒)
- my-web001からmy-web005でchmodします
- これは 対象ファイルが多いと時間がかかるので、本当に並行でやる意味があります (parallel)
Ubuntuのサービスに関するよく使うコマンドまとめ

# 環境
Ubuntu 16.04.5 LTS

# まとめ
サービスの稼働状況の一覧を表示する

```cmd
service --status-all
```

特定のサービスの稼働状況を、ピンポイントで表示する

```cmd
service --status-all | grep ssh
```

サービスを再起動する

```cmd
service ssh restart
```

サービスを停止する

```cmd
service ssh stop
```

サービスを開始する

```cmd
service ssh start
```
進捗管理を可視化にするツール

#主旨：
　・EVMチャートを使って、実績と心得を書いてみる
　・アジャイル開発にも使用されるバーンダウンチャートの場合、どうなるかも書いてみる

#環境：
　・マイクロソフトProject３６５を利用した
　・WBSからチャートを出力した

#EVMチャート
  ・工数を折れ線グラフにしたものである。
　・左下（0工数）から右上に向かって上がっていくグラフである。
　・工数が以下で構成される：（詳細はググってみてください）
　　PV（計画値）は**計画上**の工数のこと
　　EV（実績値）は**実際上**の工数のこと
　　AC（コスト）は実際にタスクを完了するのに**投入した人日**のこと

##実際に出力したもの：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535102/7a70b63c-0a19-1934-4152-419996737dcc.png)

進捗状況の見方は以下である：
  **オンスケジュール**：EV、PV、ACがくっついている状態（下の図へ参照）
　**遅れ**：PV(オレンジ)が上に出ている状態、ACを見て分析すると以下のことが推測できる（下の図へ参照）
　・EVがACにくっている（あるいは上回っている）場合、生産性が問題なさそうだが、アサイン不足している状態（下の図へ参照）
　・EVがACに下回っている場合、課題による生産性が落ちている状態（下の図へ参照）
　**前倒し**：EVがPVに上回っている状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535102/c8b87e45-3e72-6d4c-d34c-21a44c9e6179.png)

##心得-メリット：
 1.分かりやすさ１：進捗状況が一目で分かること
 2.分かりやすさ２：アサイン状況が一目で分かる
 3.手軽さ１：ペラ一枚で収まる
 4.手軽さ２：マイクロソフトProjectのレポートのテンプレートを生かせば、自動生成が可能

##心得-デメリット：
　1.工数についてばれたくはない場合、お客さんに出せないこと
　2.先行着手した分のEV工数はチャート図に反映されない
　★変更ありきのプロジェクトでは、手間がかかるのでアジャイルティが欠けているように思える。

ウォーターフォール開発であればEVMチャートが王道だと思うだが、
もう一つ、消化したタスクの数をメインとされるバーンダウンチャートはどうなるだろうか。（近年、アジャイル開発ではよく使用されるチャートらしい）


#バーンダウンチャート
　・タスクの数を折れ線グラフにしたものである。
　・一番左上（総タスク数）から右下（0）に向かって下がっていくグラフである。
  ・計画残存タスク（計画したタスクの数のこと）と残存タスク（実際に完了したタスクの数のこと）で構成される。

##実際に出力したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535102/427c7adf-c517-23af-41e4-dac64287425f.png)

進捗状況の見方は以下である：
　オンスケジュール：実績の数＝計画の数（下の図へ参照）
　遅れ：実績の数＞計画の数（下の図へ参照）
　前倒し：実績の数＜計画の数（下の図へ参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535102/70e7cb7f-b256-9b34-aaa1-77ee99784416.png)

##心得-メリット：
　　 1.分かりやすさ１：進捗状況が一目で分かること
 　　2.手軽さ１：ペラ一枚で報告可能
 　　3.手軽さ２：マイクロソフトProjectのレポートのテンプレートを生かせば、自動生成が可能
 　　4.タスクの数で語るチャートなので、工数がばれちゃう心配がない

##心得-デメリット：
 　　・EVMのようにAC分析はできなくなる（情報がEVMよりすくない）

#結論：
　　両方とも「自動生成が可能」なので、同時に出力したほうがいいと思う。EVMは内部ようで、バーンダウンチャートはお客さん向けにすることができる。
　　後、チャート出力自体が進捗管理のすべてではないないので、これらの情報を活かして影響・傾向・代替案分析を行うのを役に立つものである。
rails6で星評価機能を作る。

<h1>Jqueryを入れる</h1>

https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13

これを参考にjqueryを導入してください。

<h1>rails星評価機能を実装してみる</h1>



<h3>imageを保存</h3>
https://github.com/wbotelhos/raty/tree/master/lib/images
これを　app/assets/imagesに保存してください。

<h3>javascriptコードを保存</h3>
rails6では app/assets/javascripts　というフォルダがないので、

app/assets　に　javascriptsというフォルダを作ってください。

そして、 app/assets/config/manifest.jsに

```javascript

   //= link_directory ../javascripts .js
```
を記述してください。

そして、作ったら、app/layouts/application.html.erbに

```erb
     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```
を記述してください。

できたら、先ほど作った　app/assets/javascripts　フォルダに  

application.jsというファイルを　追加してください。

そして、application.jsに

https://github.com/wbotelhos/raty/blob/master/lib/jquery.raty.js

↑ のコードをコピーして、張り付けてください。


<h3>rateカラムを追加</h3>

rateはintegerにしてください。

```
rails g migration AddRateToテーブル名 rate:integer
```
今回は comments に　rateカラムを追加します。

(例)

```
rails g migration AddRateToComments rate:integer
```
⇃
migrateします

```
rails db:migrate
```


そしたら星評価機能を付けたいviewに

⇃　show.html.erb

```erb 

<h1><%= @post.title %></h1>
<p><%= @post.body %></p>

<%= form_with model: @comment, local: true , url: comments_path do |f| %>
    <%= f.text_area :content %><br>
    <%= f.hidden_field :post_id, value: @post.id %>
    <div class="field" id="star">
		<%= f.label :rate,  "星評価 (※必須)" ,id: "e"%>
		<%= f.hidden_field :rate, id: :review_star %>
	</div>
    <script>
        $('#star').raty({
            size     : 36,
            starOff:  '<%= asset_path('star-off.png') %>',
            starOn : '<%= asset_path('star-on.png') %>',
            starHalf: '<%= asset_path('star-half.png') %>',
            scoreName: 'comment[rate]',
        });
    </script>
    <%= f.submit %>
<% end %>

<% @comments.each do |comment| %>
    <p><%= comment.content %></p>
    <h4 class="mb-3">評価：<%= comment.rate %>点 </h4>
    <div id="star-rate-<%= comment.id %>"></div>
    <script>
          $('#star-rate-<%= comment.id %>').raty({
            size: 36,
            starOff:  '<%= asset_path('star-off.png') %>',
            starOn : '<%= asset_path('star-on.png') %>',
            starHalf: '<%= asset_path('star-half.png') %>',
            half: true,
            score: <%= comment.rate %>,
        });
    </script> 
<% end %>

```
のように、viewに記述してみてください。
説明不足ですみません。。。。

そして、controllerに

```rb
  params.require(:comment).permit(:rate)
```

これを追加してください。


これでできるはずです！



<h1>参考</h1>
https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13

https://qiita.com/kitaokeita/items/1e40724c3384507cec13

https://qiita.com/ryohashimoto/items/622c3bcfb3336cb9317e


<h1>完成 最後に</h1>
やっぱり、rails5とrails6だと　いろいろ変わっちゃってるので注意が必要ですね。

皆さんも気を付けてください。

なにか　間違えがあったらコメントください。　お願いいたします。
在宅勤務でデブにならないようにシェルスクリプトでレコーディングダイエットする

# TL;DR
aliasでこういうシェルを登録しておくとレコーディングダイエットになって良いですよ、というスクリプトを書いた。
テクい事はあまりやってない。

# 経緯
エンジニア諸氏については昨今流行している感染症対策としてリモートワークでの勤務に切り替わっている事が多いと思います。
私も漏れずその一人だったのですが、リモートワークが始まってから暫く経った頃、ふと体重計を見ると年末から4kgも増えており、感染症とは別の危機感を覚えました。

一般に、リモートワークという働き方に切り替わると食事と運動に関して変化が訪れます（運動量の低下に伴って体重が増加するようになります）。
私は仕事をしながらデスクで食事をするという最悪なルーチンワークになっていたので、それならばとPCで気軽に食事内容を記録できる方法を考えてみました。

# 実装内容

```shell

WIE_LOG_PATH=~/scripts/log/whatieat.txt
if [ ! -e $WIE_LOG_PATH ]; then
  touch $WIE_LOG_PATH
fi
if test $# -eq 0; then
  echo "argument not specified."
  exit 1
fi
if test $1 = "-log" -o $1 = "log" -o $1 = "-l"; then
  tail -${2:-"10"} $WIE_LOG_PATH
  zgrep "^"`date "+%Y-%m-%d"` $WIE_LOG_PATH | awk -F, '{ sum += $3 } END{ print "today calories: "sum }'
  exit 0
fi
if test $# -ne 2; then
  echo "argument number must be 2."
  exit 1
fi
CALCULATED_ROW=`date "+%Y-%m-%d %H:%M:%S"`","$1","$2
echo $CALCULATED_ROW >> $WIE_LOG_PATH
echo $CALCULATED_ROW
zgrep "^"`date "+%Y-%m-%d"` $WIE_LOG_PATH | awk -F, '{ sum += $3 } END{ print "today calories: "sum }'
```

やっている事は単純で、入力に応じて `日付,食事内容,カロリー` 形式でcsvを追記してゆくだけです。

```
# ログを見る
$ eat log 2 #第二引数は遡る行数。与えられなければ１０行まで表示する
2020-03-31 11:20:08,サバ缶,400
2020-03-31 12:12:04,フルグラ,100
today calories: 1000
```

```
# ログを取る（記録する）
$ eat something 1 #第一引数に食べるもの、第二引数にカロリーを記入
2020-03-31 12:13:55,something,1
today calories: 1001
```

※ `echo "alias eat=＜スクリプトの絶対パス＞" >> ~/.bash_profile & source ~/.bash_profile` 
みたいにalias設定した例。

# まとめ
 - 急激に変わる食事と生活をコントロールしましょう。
 - 食事と仕事が一体化してると何食べたか忘れちゃうのでまずは食事内容の確認を
 - グラフ化したい場合はログをそのままSpreadSheetやExcelでインポートすれば良いと思います

# おまけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82888/14eac1ad-6711-9666-3f1a-fc2f758d829e.png)

で、図のようなグラフを作れます

|列名|値|
|---|---|
|A|csvからインポート|
|B|csvからインポート|
|C|csvからインポート|
|D|日付インクリメント|
|E|`=TEXT($D1, ">=YYYY/MM/dd")`|
|F|`=TEXT($D1+1, "<YYYY/MM/dd")`|
|G|`=SUMIFS(C1:C1000,A1:A1000,E1,A1:A1000,F1)`|
【blender2.8】操作UIでイラついたら見る記事[随時追加]

<img width="256" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/0af45581-70b7-588b-2520-f6c818b595db.png">
##はじめに
- blender2.8を始めて3ヶ月くらいです
- 操作UIでイラついてたけど解決せずに我慢してきた部分が、だんだん解消してきているので解決したことをメモっていきたいと思います

##環境
- blender2.8
- macOS Catalina

##イラついたことと解決策
####1. 操作のビューを拡大する際に、なぜか固まる
- 固まってると見せかけて、これ以上拡大できない感じになっていることがあります。イラつきます> <
- 十分近づいてから操作したいのに...もっと拡大したい！ってことがよくあります

<解決策>

- [こちら](http://bluebirdofoz.hatenablog.com/entry/2018/07/04/025428)の記事などを読みながら、なんとなく問題を把握します
- blenderでのスクロール時の拡大縮小は、ある一点に対しての拡大縮小調整であることがわかります
- 故に、その一点(原点)に対して最大限近づいてしまった時は、それ以上拡大できなくなるのです
- そこで、この原点を任意の場所に動かせればいいとわかります
- (これは経験則ですが)拡大縮小の原点は、スクロールボタン押下(面移動っぽいやつ)操作で切り替わるみたいです

つまり、上の問題に対しては面移動で原点切り替えすることで対処できます！

####2. 操作のビューを拡大縮小する際に、よくわからん方向に拡大縮小される

<解決策>

- おそらく、viewをロックしちゃってることが原因です
- 編集画面の右側の「View」というタブの中からView>View Lockと進み、「Lock to 3D Cursor」にチェックがついていないか確認してください

これですね↓
<img width="220" alt="スクリーンショット 2020-03-31 12.22.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/fe0e5da0-2c49-e06a-bf94-c43586962d3e.png">

####3. 編集していたオブジェクトを見失う
迷子になるってやつですね、オブジェクトは存在するはずなのに...と、ほんと泣きそうになります(笑)

<解決策>
- [この記事](https://wiki3.jp/blugjp/page/48)などをまず試す
- それでもダメなら、カメラをロックしてる問題の可能性もあります(その場合、問題2と同じ解決策でいけます)

まだまだあるのですが、とりまこの辺りで。
随時追加していきます！！

##参考
[Blenderでカメラ移動時にズームができなくなる問題の対処方法](http://bluebirdofoz.hatenablog.com/entry/2018/07/04/025428)
[Tips:3Dビューで迷子にならないためには](https://wiki3.jp/blugjp/page/48)
[http]技術標準化推進団体の構造

# はじめに
- http仕様を定めているHTTP Working Groupについて関連組織の構造について調べてみたので、そのまとめ
- 一言で言うと、IETF（インターネット技術の標準化を進めている任意団体）の下部組織
- IETFもIESGと言う組織に管理されていたりしたので、関係性を下記に示す（IETFの下にIESGが属してるのは違和感。。。）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245534/f1c2a8da-66d1-8faa-ca46-8c4cb79f7b2b.png)



# ISOC (Internet Society)
- **社会的位置付け**: インターネットガバナンスの頂点に立つ学術機関であり、非営利の国際組織
- **役割**: インターネット技術およびシステムに関する標準化、教育、 ポリシーに関する課題や問題を解決あるいは議論すること
- **組織構成**: 現在、150以上の組織会員、 170カ国以上から合計で8,600名の個人会員がISOCのメンバーとして登録している
- **活動内容の定義**: [RFC1602](https://www.ietf.org/rfc/rfc1602.txt)



# IAB (Internet Architecture Board)
- **位置付け**: ISOCの技術理事会(Technical Advisory Group)であり技術者の集団
- **役割**:
  - インターネットの技術コミュニティ全体の方向性やインターネット全体のアーキテクチャについての議論を行うこと
  - IETFチェアとIESGメンバーおよびIRSGチェアおよびIRSGメンバーを任命する
  - RFC、BCP、 IANAによる番号割り当てに関する最終的な責任を負う
  - ITU-T、W3C、 ISOなど外部組織とのリエゾンについての最終的な責任を負う
  - インターネット技術およびアーキテクチャに関して、 ISOCへの技術アドバイザリーとしても機能する。
- **組織構成**: 13名で構成され、 各メンバーの任期は2年(再任可能)IABメンバーは全て、ISOCにより承認される必要がある
- **活動内容の定義**: [RFC1601](https://www.ietf.org/rfc/rfc1601.txt)


# IETF
- **位置付け**: インターネット技術の標準化を推進する任意団体。参加者は個人の資格で参加することになっている
- **役割**: インターネット技術の標準化を推進するため、技術分野ごとにワーキンググループ（WG）を構成し活動している
- **組織構成**: 
  - 2020年現在、下記の7つの技術領域が存在している（[IETF Areas](https://www.ietf.org/topics/areas/)）
  - 各WGは下記のいずれかの技術領域に属する
 
|名称|略称|説明|  
|---|---|---|
|Applications and Real-Time Area| art |アプリケーションプロトコルとアーキテクチャを開発を実施|
|General Area|gen|IETF標準の開発プロセスのサポート、更新、および保守に焦点を当てた活動を実施|
|Internet Area|int|インターネット技術エリア|
|Operations & Management Area|ops|運用管理技術エリア|
|Routing Area|rtg|経路制御技術エリア|
|Security Area|sec|セキュリティ技術エリア|
|Transport Area|tsv|転送プロトコル技術エリア|



# IESG(Internet Engineering Stearing Group)
- **役割**:
  - IETGにおいて議論されるインターネット技術に関する標準化に関する責任を負い、 IETFでの議論の方向性などをガイドする役目を持つ
  - IETFが作成するRFCの取り扱い方法に関する決定を下す
- **組織構成**: IETFにある、八つの技術エリアごとに、エリアディレクタ(AD)が任命される
  - ADは、 担当する技術エリアのWGを統括し、ドキュメントのレビュー、方向性のガイドを行う
  - なお、Genaral Areaのエリアディレクタは、 IETF議長が務めることになっている



# やっと本題、IETF HTTP Working Groupとは
- Applications and Real-Time AreaのWG
- HTTPの「コア」仕様と、HTTPに対する一般的な拡張の維持と開発を担当している
- 参考ページ
  - [IETFのWG紹介ページ](https://datatracker.ietf.org/wg/httpbis/documents/)
  - [HTTP Working Groupのサイト](https://httpwg.org/)
AWS スティッキーセッションの有効化

###ECSでコンテナ(EC2インスタンス）をいくつも立ち上げる場合、何らかの理由でインスタンスが停止してセッションが途切れてしまう場合があります。

インスタンスが停止しても、別のインスタンスからでもユーザーを識別できるようにしてくれるのがスティッキーセッションです。

スティッキーセッションの有効化はとても簡単です。（１分で終わります）
AWSマネジメントコンソールからECSの画面を開き、ターゲットグループを選んで「属性の編集」ボタンから編集可能なります。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/caa4d938-1dc4-fe10-6069-f041c24e2a9b.png)

①「維持設定」の有効化にチェックを入れて、
② 有効時間を設定して
③ 保存すれば完了です。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/17ff10e7-736a-c4a2-4300-e22bf03bcb30.png)

スティッキーセッションの仕組みは難しそうですが、ポチポチクリックするだけでうまく設定してもらえるのは非常に助かります。

難しいこともあっさりできてしまう作りになっている。
ますますAWSが好きになりました。


スティッキーセッションを利用する場合とそうでない場合についても理解が必要かもしれないので、下記のページが分かりやすいかもしれません。

[参考ページ]
[スティッキーセッションを使っていなければApplication Load Balancer障害に耐えれたかも？？？ Amazon EC2をステートレスにする為にやるべきこと](https://dev.classmethod.jp/articles/stateless_ec2/)
bitbucketのpipelinesでgit describeでエラーにならないようにする

# はじめに

普段 kotlin で開発しているのですが、ビルドに時間がかかって困っています。
なので、bitbucketのpipelinesで自動的にbuildして、s3に上げて、それを使おうとしたのですが、tagを付けてもgit describeがpipelines上ではエラーになってしまいます。
ローカル環境ではエラーにならないのに全然理由がわからずに困っていたのですが、やっと解決したので共有します。


## git describeでエラーになる理由

pipelinesのBuld setupに秘密がありました。

ログをみると以下のようになっているかと思います。

```
+ umask 000
+ GIT_LFS_SKIP_SMUDGE=1 retry 6 git clone --branch="master" --depth 50 https://x-token-auth:$REPOSITORY_OAUTH_ACCESS_TOKEN@bitbucket.org/$BITBUCKET_REPO_FULL_NAME.git $BUILD_DIR
Cloning into '/opt/atlassian/pipelines/agent/build'...
```

--depth 50を指定していることにより、タグを付けたところまでcloneしてくれないのが原因でした。

## どうすれば

--depth 50を指定しなければよいので、cloneのオプションを指定します。

```bitbucket-pipelines.yml
image: build用docker-image

clone:
  depth: full

pipelines:
  以下略
```

これで無事にtagを付けたcommitもcloneされます。

```
+ umask 000
+ GIT_LFS_SKIP_SMUDGE=1 retry 6 git clone --branch="master" https://x-token-auth:$REPOSITORY_OAUTH_ACCESS_TOKEN@bitbucket.org/$BITBUCKET_REPO_FULL_NAME.git $BUILD_DIR
Cloning into '/opt/atlassian/pipelines/agent/build'...
```

参考

- [bitbucket-pipelines.yml を設定する](https://ja.confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html)
PuTTY形式→OpenSSH形式に変換

##なんでそんなことするの？
MacでSSH接続する際は、**OpenSSH形式**でないといけないから。
認証に使う鍵がPuTTY形式(.ppk)の場合は、OpenSSH形式に変換してから利用する。

##Macで変換

```shell
//puttyをインストール
$ brew install putty
//変換する　
$ puttygen private_key.ppk -O private-openssh -o private_key
```

##Windowsで変換
参考サイト▼
[【秘密鍵】Putty形式⇔OpenSSH形式の変換](https://bacchi.me/linux/putty-key/)