OmniAICreator/Qiita-1.07M huggingface dataset:
Driverless AI ついに日本語化！

# Driverless AIが日本語化されました

Driverless AIの公式ページは[こちら](https://www.h2o.ai/products/h2o-driverless-ai/)

[ダウンロードページ](https://s3.amazonaws.com/artifacts.h2o.ai/releases/ai/h2o/dai/rel-1.8.0-6/index.html)に行くと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/520484ab-9b32-0a5e-a884-4e7961485109.png)
バージョン 1.8.0 がリリースされています。

英語ですが、ドキュメントは[こちら](http://docs.h2o.ai/driverless-ai/latest-stable/docs/userguide/index.html#)で確認できます。

ただ、ドキュメントを見ても日本語の表記はなかなか見つかりません。
実は、設定ファイルのオプションとして表記されています。
設定ファイルのドキュメントは[こちら](http://docs.h2o.ai/driverless-ai/latest-stable/docs/userguide/config_toml.html?highlight=language)

2034行目あたりにこんな表記があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/7bd4d673-bd4a-040a-0bed-2d590d623fe6.png)
debやrpmでインストールしている場合は、`/config/config.toml`に`app_language = "ja"`を追記して再起動すれば日本語で立ち上がります。

コンテナの場合は、起動時に`-e DAI_APP_LANGUAGE="ja"`をオプションに入れると日本語化されるようです。

日本語化されたDriverless AIにアクセスしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/9407145d-c3b3-bf68-6819-45c292892ef0.png)
ログイン画面も日本語です。

データセット画面もしっかり日本語です。
![スクリーンショット 2019-10-10 10.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/4cbe937a-58c7-8135-16c3-e00332b5222b.png)
上部の「Experiment」なんかは英語ですが、無理やり日本語にしているよりもわかりやすいですね。

Experimentの設定画面もこの通り日本語です。
![スクリーンショット 2019-10-10 10.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/3bdc8896-9019-3970-0303-df25472ca60f.png)

さらに、設定項目などの説明を表示してくれるアシスタント機能も日本語化されていました。
![スクリーンショット 2019-10-10 10.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/511550b0-1793-2135-522d-aaa85eb7a935.png)

学習中はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/e5147054-d113-7631-a1ec-d60c1b6b6c38.png)
Experiment画面のアシスタントも日本語化されています。
詳細情報も確認できるので、馴染みのないグラフが何を表しているか理解しやすくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/e8785775-34f8-b6bc-0665-39ee6aabac6b.png)

~~Aquariumの環境は、まだ1.7.0のようです。~~
※追記(10/21) : Aquariumの環境も1.8.0にアップグレードされていました。
ただ、日本語化は設定ファイルが必要なためAquarium環境では利用できなさそうです。

Driverless AIの使い方を紹介した記事も書いているので、そちらも参照いただければと思います。

今まで書いたもの
[まずは起動から！Driverless AI -MLの自動化ツール- Part 1](https://qiita.com/tom_m_m/items/32f79edba6c47b95f3b3)
[学習の実行！Driverless AI -MLの自動化ツール- Part 2](https://qiita.com/tom_m_m/items/318569bf762c527174ec)
[モデルの評価！ Driverless AI -MLの自動化ツール- Part 3](https://qiita.com/tom_m_m/items/15a669e13e7f377dbb5b)
Linux > strace > コマンド実行時の詳細を表示する > OSの違いによる振舞いの違い確認などに使えそう

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

### strace 

https://stackoverflow.com/questions/8377312/how-to-convert-symlink-to-regular-file

answered Sep 7 '16 at 23:29
Kazさん
による回答に以下のコマンドがある。

```
$ strace mv /tmp/target link
```

これを実行すると、mv処理の詳細が分かるようだ。

### 用途

OSが異なるときにmvの振る舞いが異なるようで、その違いを確認するときなどに使えそう。
JSで文字列かどうかの判定ですら困った

以下のコードはTypeScriptで書いてますがJavaScriptでも結論は同じはずです。

# 結論
lodashをimportして_.isStringを使うのが一番心配が少ない。

# 結論に至るまでの経緯
## 最初にやったこと
文字列かどうかを判定しようとしてinstanceofを使ったらうまくいかなかった。

```ts
let x = "string" as any // TypeScriptに怒られないようにわざとas anyしてるだけ
console.log("x:", x instanceof String) // -> false
```

## 調べた公式情報
> JavaScript では、プリミティブ値の文字列とString オブジェクトの文字列は区別されます。(中略)JavaScript では、必要に応じてプリミティブ値の文字列が自動的に String オブジェクトに変換されるので、プリミティブ値の文字列に対して String オブジェクトのメソッドを使用することができます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects

## ↑を踏まえて実験

```ts
let x = "abc" as any
let y = new String("abc")

console.log("x:", x instanceof String, typeof(x) == "string") // -> false, true 
console.log("y:", y instanceof String, typeof(y) == "string") // -> true, false
```

つまり文字列かどうかの判定は`x instanceof String || typeof(x) == "string"`としないといけない気がする。

## ライブラリあるよね
まさか都度上の判定を書いてるとは思えなかったので調べたらやっぱりlodashにあった

```ts
import _ from "lodash-es"

let x = "abc" as any
let y = new String("abc")

console.log("x:", _.isString(x)) // -> true
console.log("y:", _.isString(y)) // -> true
```
【Ruby】メソッドをオーバーライドした時のsuperの引数の有無について

引数をそのまま渡したい → `super`
引数を指定して渡したい → `super(name)`
引数を渡したくない → `super()`

[Ruby 2.6.0 リファレンスマニュアル > メソッド呼び出し(super・ブロック付き・yield) - super](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#super)
RPAのサイトログイン部分をどう作ってるか

# はじめに
この間までSharePointやらPowerAppsやらFlowをやっておりましたが
現在Automation Anywhere EnterpriseというRPAツールを使用して業務自動化をしており、
Webサービスへのログイン部分どう作ったかタスクロジック部分の技術共有です。
（別に大した機構ではないんだけど、そもそも他にあまり情報がないよね）
他のエンジニアがどうしてるのかめっちゃ知りたいので
AAEじゃなくても自動化やってる方、お気軽にコメントしてください。
<b>※10/24：TaskとMetabotを実際のコードに差し替え。（.txtで書きだしたもの）</b>


# ログイン部分は個別化するべき
* なんで？
    * ログインページが変わったときに、全部のタスクを直すの大変。（コード置換使えないから）
        *  今はmetabotなんだけど、taskにした方がいいか悩み中。
        * metabotだと、taskをテンプレート化したときに、Credential情報が死んでxmlタグが入力フィールドに入ってしまう。引数設定しなおしになる。そのMetabotLogic使うタスクが1つだったら、別にそのままでもいいんですが。

# タスクとメタボットのコード
## ログイン部分
```
1	If Window Does Not Exist ("ログイン後のWindowName - Internet Explorer")  Then  (Wait up to 10 seconds - for Window not to exist) 
2	     Comment: ログインしていなかったら、MetabotのLoginロジックをRunさせてサイトにログイン
3	     Loop While $LoginStatus$ Not Equal To(<>) "Success" AND $Counter$ Less Than(<) "6" 
4	          Comment: Loginロジックへ引数としてLoginID,Passwordを渡す。直打ちではなく、ControlRoomのCredentialsに登録してある情報を渡す。
5	          Comment: LoginロジックがLoginStatusを戻り値として返す。(Success or Fail)
6	          Comment: Loop条件：LoginStatusがSuccessではない(1週目はnull,2週目以降はFail)andループ回数(Counter)が6未満
7	          Run Logic "Login" from MetaBot "My MetaBots\Login_MetaBot.mbot"
8	     End Loop
9	End If
```

## 中のMetabot(仮に、Login_metabot)の、該当ページログインロジック
```
1	Comment: ログインページを開き、ControlRoomにあるCredencials情報をLoginIDとPasswordに代入することで、該当サイトにログインする。
2	Comment: I/Oは、I:LoginID,Password O:LoginStatus
3	Begin Error Handling; Action: Continue; Options: Variable Assignment,  Logic Status: Fail
4	     Comment: エラーが起きたらLoginStatusにFailを返す
5	     Launch Website "Site URL（サイトURL入れる）"
6	     Comment: EdgeでLaunchWebsiteできないか試してみたが、Edgeが起動したもののIEにオーバーライドしてIEでLaunchした。既定のブラウザがIEになっているのが原因かと。
7	     Object Cloning: Set Text of TextBox "user.id" in window 'WindowName - Internet Explorer'; Value:"$LoginID$"; Source: Window; Play Type: Object
8	     Object Cloning: Set Text of TextBox "user.password" in window 'WindowName - Internet Explorer'; Value:"$Password$"; Source: Window; Play Type: Object
9	     Object Cloning: Click On PushButton "Submit" in window 'WindowName - Internet Explorer'; Click Type: Click; Source: Window; Play Type: Object
10	     If Window Exists ("WindowName - Internet Explorer")  Then  (Wait up to 10 seconds - for Window to exist) 
11	          Comment: ログイン出来たらSuccess,できなかったらLoginStatusにFailを代入
12	          Variable Operation: Success To $LoginStatus$
13	     Else
14	          Variable Operation: Fail To $LoginStatus$
15	     End If
16	End Error Handling
17	If $LoginStatus$ Equal To (=) "Fail" Then  
18	     Comment: LoginStatusがFailの時、IEをTaskKill（呼び出し元TaskでこのMetabotの再試行をする際、ログインページが2枚になると不具合出る）
19	     Open: "TASKKILL /F /T /IM iexplore.exe"
20	End If
```
ネットワーク｜ICMP

#ICMPとは？
ICMP(Internet Control Message Protocol)は、IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコル。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用される。ICMPはインターネット層で動作するプロトコル。

#ICMPのフォーマット
![](https://www.infraexpert.com/studygif/tcpip11.gif)
※(参考元リンク)[https://www.infraeye.com/study/linuxz49.html]

ICMPメッセージは「タイプ」「コード」「チェックサム」「データ」の4つフィールドにより構成される。

|各フィールド|英語表記|ビット数|各フィールドの説明|
|---|---|---|---|
|タイプ|Type|8bit|ICMPメッセージの機能タイプの値が入る。|
|コード|Code|8bit|ICMPメッセージの詳細な機能コードの値が入る。|
|チェックサム|Checksum|16bit|エラーがないかどうかチェック|
|データ|Data|可変長|ICMPの「タイプ」により長さが異なる|

#ICMPの2種類のメッセージ
ICMPメッセージには大きく分類して2種類ある。
1. 問い合わせ(Querry)のメッセージ
　QUerryにより、あるノードから特定のノードに対する通信状態を確認することができる。(ping, traceroute)
2. エラー通知(Error)のメッセージ
　ノード間の通信で経路途中でパケットが廃棄された場合に、その原因を送信元のノードにエラー通知する。

- ICMPメッセージのタイプ一覧

|タイプ|内容意味|種類|
|---|---|---|---|
|0|Echo Reply|エコー応答|Query|
|3|Destination Unreachable|Error|
|5|Redirect|Error|
|8|Echo Request|Query|
|11|Time Exceeded|Error|

- ICMPメッセージのコード一覧


タイプが「0」= 「Echo Reply」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Echo Reply|エコー応答||

タイプが「3」= 「Destination Unreachable」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Net Unreachable|宛先ネットワークに到達できない|Error|
|1|Host Unreachable|宛先ホストに到達できない||
|2|Protocol Unreachable|プロトコルに到達できない|Error|
|3|Port Unreachable|ポートに到達できない|Error|
|4|Fragment Needed and DF was Set|パケットの分割が必要であるが分割禁止フラグ(DF)が立っているので、パケットを破棄|Error|
|5|Source Route Failed|ソースルーティングが失敗|Error|
|6|Destination Network Unknown|宛先ホストが不明|Error|
|7|Source Host Unknown|送信元ホストが使用されていない|Error|
|8|Source Host Isolated|送信元ホストが使用されていない|Error|
|9|Communication with Destination Network is Administratively Prohibited|宛先ネットワークとの通信が管理上禁止されている|Error|
|10|Communication with Destination Host is Administratively Prohibited|宛先ホストとの通信が管理上禁止されている|Error|
|11|Destination Network Unreachable for ToS|指定された優先制御値では、宛先ネットワークに到達できない|Error|
|12|Destination Host Unreachable for ToS|指定された優先制御値では、宛先ホストに到達できない||
|13|Communication Administratively Prohibited|通信が管理上禁止されている|Error|
|14|Host Precedence Violation|ホストの優先度が違反している|Error|
|15|Precedence cutoff in effect|優先制御が事実上切断された|Error|

タイプが「5」= 「Redirect」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Redirect Datagram for the Network|ネットワークへの最適経路変更を通知|Error|
|1|Redirect Datagram for the Host|ホストへの最適経路変更を通知|Error|
|2|Redirect Datagram for the ToS and Network|優先制御でネットワークへの最適経路を通知|Error|
|3|Redirect Datagram for the ToS and Host|優先制御でホストへの最適経路を通知|Error|

タイプが「8」= 「Echo Request」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Echo Request|エコー要求|Query|

タイプが「11」= 「Time Exceeded」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Time to Live exceeded in Transit|転送中にTTLの値が超過した|Error|
|1|Fragment Reassemly Time Exceeded|分割パケットを組み立て中に時間が超過した|Error|
HTMLの勉強で知ったこと 2 (CSSのことも含む)

[HTMLの勉強で知ったこと 1](https://qiita.com/yuyaaaaaaaaaaaa/items/71d521ab5ed05e905c65)の続き。

今回はどちらかといえばCSSのことばかりになってしまった。

## CSS便利

htmlではないが、インラインでCSSを書くにあたって、あまりCSSを意識していなかったが便利だと思った。

## HTMLリンクのターゲット属性

リンクに`targer`属性を設定することで、リンク先を開く場所を指定できる。

今までwebサイトを閲覧して、リンクを同じタブで開く時と新しいタブで開く時があったが、これが関係していたのか、と思った。

`target`属性には、次の値を持つことができる。

* _blank
  リンク先のページを新しいウィンドウまたはタブで開く

* _self
  クリックされたのと同じウィンドウ/タブでリンクされたページを開く（これがデフォルト）

* _parent
  親フレームにリンクされたページを開く

* _top
  リンクされたページをウィンドウ全体で開く

* framename
  指定した名前付きフレーム内でリンクされたページを開く

## 画像を文字の左右に表示させる(CSS)

CSSの`float`プロパティを使用することで、画像をテキストの左右に表示させることができる。

## 画像の中の任意の場所をクリック可能にする

昔懐かしのフラッシュゲームのようなイメージ。

`map`、`area`タグを使うことで、画像の中の一部をクリック可能にすることができる。

## 文書(要素)の背景を画像にする(CSS)

CSSの`background-image`プロパティを使用することで、背景を画像にすることができる。

## 条件(ウィンドウの幅)で画像を切り替えることができる

`picture`、`source`タブを使うことで、画像の切り替えをすることができる。

例えば、ウィンドウの幅が大きいときは大きい画像を、ウィンドウの幅が小さいときは小さい画像を表示することができる。

## Tableの枠線の表示方法の切り替え(CSS)

`border-collapse`プロパティを追加することで切り替えることができる

* collapse
  隣接するセルのボーダーを重ねて表示

* separate
  隣接するセルのボーダーを間隔をあけて表示

## セルを複数の列にまたがらせる

`th`タグの`colspan`属性を使う

## セルを複数の行にまたがらせる

`th`タグの`rowspan`属性を使う

## Tableに見出しを追加

`caption`タグを使う

`caption`タグは`table`タグの直後に入れなければならない

## 疑似クラス(CSS)

tableにcssを適用させる際に`nth-child`というものがあった。

これは疑似クラスといわれており、要素に対して、特定の状態のものに対してcssを適用することができるものである。

`nth-child`は訳すとn番目の子供といい、その通り、後に続く条件の子要素に対してCSSを適用することができる。

* odd
  一連の兄弟要素の中で奇数番目の要素を表す

* even
  一連の兄弟要素の中で偶数番目の要素を表す

* An+B
  一連の兄弟要素の中で、 nに正の整数か0が入るとき、An+Bのパターンに一致する位置の要素を表す。最初の要素の番号は1。AとBの値は両方とも `<integer> `。
pyspark write csv turn off scientific notation

When I write spark DataFrame to CSV file in databricks,
I found the number column show like `2.6220427383E10`,
the scientific notation format.

I searched in stackoverflow and found a lot of solutions,
such as `DecimalType(18, 0) ` etc.

But in my case,
I found the reason is that the column is divided by 100,
like 

    (df_sale['TOTAL_PRICE'].cast('integer')/100).alias('TOTAL_PRICE')

Although when I `display(df_sale)` it shows like an integer value,
But when I write it to csv file, it become to `2.6220427383E10`.

So the solution is `cast('integer')` one more time like this:

    (df_sale['TOTAL_PRICE'].cast('integer')/100).cast('integer').alias('TOTAL_PRICE')

And then, everything is going well.
【jQuery】$(function() {...}) について　「意味や実行されるタイミング」

# はじめに
jQueryの学習をしていると必ず出てくる**$(function(){...})**
とりあえずjQueryの記述をする時に
一番最初に記述する事はなんとなくわかった・・・

けど、これを記述するのにどんな意味があるの？？
仮に記述しなかったらどうなるの？？
こちらを今までなんとなく理解していた方にご紹介したいと思います。

# $(function(){...})の意味
$(function(){...})は簡単に言いますと**予約状態**という事になります。
さすがにこれだけでは意味がわからないので
functionの理解に欠かせないHTMLのコードもまじえながらご紹介していきます。

**HTML**

```html:index.html
!DOCTYPE
<html lang="ja">
 <head>
  <meta charset="UTF-8">
  <title>jQuery</title>

<!-- scriptファイルの読み込み -->
  <script src="jquery-3.4.1.min.js"></script>
  <script src="main.js"></script>             <!-- 1 -->

 </head>
 <body>

 </body>
</html>
```

**JavaScript**

```js:main.js

$(function(){
 //なにかしらの処理
});
```
jQueryのライブラリと実際にコードを書いていく(main.js)ファイルは外部から呼び出しています。
そしてmain.jsの中身は処理を書いていく為に必要な最初のコード
今回ご紹介する$(function(){...})が書かれています。


さて、$(function(){...})について説明する前に
HTMLが実行される順番から見ていきます。
HTMLは基本的に**上から順番に処理が実行**されます。

そして1の所まで到達すると読み込みを開始し、完了後すぐにその内容を実行することになります。

**しかし、ここで一つ問題が・・・**

main.jsの中身にはHTMLの要素を操作する命令が書かれていることが多のですが
コードではまだhead要素の途中までしか読み込めていません。
1番以降の要素がまだ認識されていない為
処理を実行する事ができないということになってしまいます。

そこでその問題を解決するのが**$(function(){...})**です。

冒頭に述べた通り、main.jsの処理を一旦予約状態で止めておいて
HTMLの読み込みが全て完了した後にmain.jsが実行されるというわけです。

# $(function(){...})を書き忘れると？
わざわざこれの見出しを分ける必要があったのか？と疑問に思いましたが一応・・・
もうお気づきの方はたくさんいらっしゃると思いますが
こちれのコードを書き忘れるとHTMLを最後まで読み込まずにmain.jsが実行されちゃいます。

やっぱり理解が難しい！って方はHTMLで言う所の!DOCTYPEのように
jQueryを使う時は$(function(){...})と覚えていれば
とりあえず大丈夫だと思います。

# 番外編
さて、jQueryを使う時の決まり文句に$(function(){...})をご紹介しましたが
実は他にもいろいろ書き方があります。

```javascript
$(document).ready(function{
 //処理
});
```
```javascript
jQuery(document).ready(function(){
 //処理
});
```
```javascript
jQuery(function(){
 //処理
});
```
上記の三つはもしかしたらあまり使う機会がないかもですが
もし他の所で出てきたら、$(function(){...})と同じなんだなと
思ってもらっても大丈夫だと思います。


ここまで読んでくださってありがとうございます。
今後の活動の為に誤情報などございましたら
コメントでご指摘くださいm(__)m
【Python】動的に生成されるnumpy.ndarray画像列を動画として保存する（OpenCV + ffmpeg）

# やりたいこと

Pythonで画像列を作って動画にしたいことはよくある。よく転がっているコードは以下の2つ。

- OpenCVのVideoWriterを使う → 保存形式を細かく設定する方法がわかりにくい。
- 一旦ファイルに書き出してffmpegを使う → 先にすべての画像を作っておく必要がある。また，ファイルに書き出してまた読む余分な時間が無駄。

今回は，

- 動的に生成されるnumpy.ndarray画像列を
- ffmpegのオプションを使って
- 余分なファイル入出力無しで
- 動画ファイルとして保存したい

# できたもの（Python 3.5）

ffmpegには入力画像列をパイプで受け取る機能があるので，Popenして順番に渡してやればいい。

```python
def save_images_as_movie(filename, images, fps, ffmpeg_args='-y', ffmpeg_executable='ffmpeg'):
    """画像列を動画ファイルとして保存する.
    
    Parameters
    ----------
    filename: str
      保存先ファイル名.
    images: iterable of array-like
      動画として保存する画像列.
    fps: int
      動画のフレームレート.
    ffmpeg_args: str or iterable of str
      ffmpegの出力ファイル設定.
      例: PowerPointで再生可能かつ無圧縮にしたいなら '-vcodec rawvideo -pix_fmt yuv420p'
    ffmpeg_executable: str
      ffmpegの実行ファイルパス.
      
    Return
    ------
    completed_process: subprocess.CompletedProcess
      ffmpegの実行結果.
      
    Examples
    --------
    >>> import numpy as np
    >>> images = [np.full(shape=(128, 128), fill_value=v, dtype=np.uint8) for v in np.linspace(0, 255, 60)]
    >>> result = save_images_as_movie('example.mp4', images, fps=60)
    >>> result.check_returncode()
    """
    from subprocess import Popen, PIPE, CompletedProcess
    from cv2 import imencode
    
    if isinstance(ffmpeg_args, str):
        ffmpeg_args = ffmpeg_args.split()
    ffmpeg = Popen(
        args=[
            ffmpeg_executable,
            '-r', str(fps), '-f', 'image2pipe', '-i', '-',
            '-r', str(fps), *ffmpeg_args, filename,
        ],
        stdin=PIPE,
        stdout=PIPE,
        stderr=PIPE,
    )
    try:
        for image in images:
            success, buffer = imencode('.bmp', image)
            if not success:
                raise ValueError('imencode failed')
            ffmpeg.stdin.write(buffer)
    finally:
        out, err = ffmpeg.communicate()
    return CompletedProcess(
        args=ffmpeg.args, 
        returncode=ffmpeg.returncode, 
        stdout=out, 
        stderr=err,
    )
```
Mac  OS をアップデートしたら #zsh でタブキーでの #git 補完が効かなくなった

# .zshrc

```
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
fpath=(~/.zsh $fpath)
autoload -Uz compinit && compinit
```


# タブキーを押した時のエラー

```
$ git checkout
_git:.:42: no such file or directory: /Users/yumainaura/.zsh/git-completion.bash
__git_zsh_bash_func:9: command not found: __git_aliased_command
```


# 解決

ファイルをダウンロードし直し
それだけ。

```
# Create the folder structure
mkdir -p ~/.zsh
cd ~/.zsh

# Download the scripts
curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
```

[Adding Git Completion to Zsh - Oliver Spryn - Medium](https://medium.com/@oliverspryn/adding-git-completion-to-zsh-60f3b0e7ffbc)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2572








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
axios


- fetchと類似

```
class App extends React.Component {
  constructor(props){
    super(props)
    this.state = {
      data: []
    }
  }

   componentWillMount(){
     axios.get('https://api.github.com/users/KrunalLathiya')
       .then(res => this.setState({data: res["data"]}))
   }

  render(){
    const {login, id, avatarurl} = this.state.data
    return (
      <div className="App">
       <div>
        {login}
       </div>
       <div>
        {id}
       </div>
       <div>
        {avatarurl}
       </div>
      </div>
    );
  }
}
```

参考記事

https://qiita.com/reoisym/items/245e3cdedc194a9f4062
GASを利用したWebサーバのグローバルIPアドレスを調べてみたら、訳のわからない事実が判明

#目的
ただのいたずら心と好奇心です。

#やったこと
まずは、GASがGAS自身（という表現が正しいかはわかりませんが）のグローバルIPアドレスを教えてくれるサービスを作りました。

グローバルIPアドレスの取得には、ifconfig.co/jsonを利用しました。
リクエストを投げると、グローバルIPアドレスを返してくれます。
また、プログラムからリクエストを投げるためにはURLFetchApp.fetchメソッドを利用しました。

```js:endpoint.gs
  //ifconfig.co/jsonへリクエストを投げる
  var response = UrlFetchApp.fetch("https://ifconfig.co/json"); 
  //レスポンスを受け取る
  var rawJSON = response.getContentText();
  //受け取ったJSONをパース
  var parsed = JSON.parse(rawJSON);
  //このWebサイトのレスポンス値としてそのまま受け取ったJSONを返す
  return ContentService.createTextOutput(JSON.stringify(parsed)).setMimeType(ContentService.MimeType.JSON);
```

上記コードを書いた後、Webアプリとして公開します。

#返ってきたレスポンス
自分で立てたWebサーバへアクセスしてみたところ
レスポンスが返ってきたので、一部伏せますがこんな感じでした。

```json
{
  "ip":"35.187.XXX.XXX",
  "ip_decimal":599491999,
  "country":"United States",
  "country_eu":false,
  "country_iso":"US",
  "city":"Mountain View",
  "latitude":37.4043,
  "longitude":-122.0748,
  "asn":"AS15169",
  "asn_org":"Google LLC"
}
```

ここでやめておけばよかったのですが...。
興味本位でもう一度アクセスしてみると、なんとIPアドレスが変わってる！？
ついでに、レスポンスの内容が微妙に違う！
hostnameがついていてどうやらGAE（Google App Engine）上でホストされているらしい。

```json
{
 "ip":"107.178.XXX.XXX",
 "ip_decimal":1806877999,
 "country":"UnitedStates",
 "country_eu":false,
 "country_iso":"US",
 "hostname":"135.194.XXX.XXX.gae.googleusercontent.com",
 "latitude":38.6583,
 "longitude":-77.2481,
 "asn":"AS15169",
 "asn_org":"Google LLC"
}
```

もう止まりません。
何度も何度もやっていると、時々1つ目の結果のような感じになることもあれば、
2つ目と同じIPアドレスだけどhostnameが微妙に違うとか、わけがわかりません。

```json
{
 "ip":"107.178.XXX.XXX",
 "ip_decimal":1806877999,
 "country":"United States",
 "country_eu":false,
 "country_iso":"US",
 "hostname":"100.194.XXX.XXX.gae.googleusercontent.com",
 "latitude":38.6583,
 "longitude":-77.2481,
 "asn":"AS15169",
 "asn_org":"Google LLC"
}
```

#考察兼まとめ
貧弱な知識で考えましたが、結局まともな考察はできませんでした。
Google Cloud Platformはちょくちょく弄っているのでなんとなくの察しはつきますが、
・CDN的なキャッシュサーバから応答が返ってきていることがある
・私が実際に立てているサービス自体が負荷分散されている
・GASが自体がFunction as a Service的な感じなので、そのときに都合の良いコンピュータ上で処理が行われている

ぐらいしか思いつきませんでしたが、そこそこ楽しかったです。
技術評論社の Software Technology シリーズから Pascal 関連の書籍を読んでみる <番外編>

# はじめに
技術評論社の Software Technology シリーズで出ていた Pascal 関連書籍の書評を書きました。

 - [技術評論社の Software Technology シリーズから Pascal 関連の書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/06946a72b51f577523bb)

# Turbo Pascal (Object Pascal) によるオブジェクト指向プログラミング
そしてこう書きました。

> Software Technology シリーズを `Pascal` という観点から見た場合に残念なのは **Turbo Pascal 5.5 以降での Object Pascal 拡張部分**がキレイに抜け落ちている事ですかね。『はじめての Object Pascal』なんてのがあれば完璧だったのですが。

Software Technology シリーズではないのですが、あるにはあるのです、これが。

## 番外編 ゲーム&&オブジェクト指向プログラミング
『#20 はじめての Delphi』『#21 Delphi 応用プログラミング』『#22 Delphi オブジェクト指向プログラミング』著者による書籍。こっそり (?) Turbo Pascal 5.5 以降に対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/786a9694-2670-c838-9cbd-74914bb1bc1c.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| N/A | ゲーム&&オブジェクト指向プログラミング | 塚越 一雄 | [4874085644](https://www.amazon.co.jp/dp/4874085644)  | 1993/5/25 |

### 書評
Chapter 1 が `プログラミング・パラダイム` なので嫌な予感 (?) しかしないと思うが、本書は Turbo Pascal **にも**対応したオブジェクト指向プログラミングの本である。Software Technology シリーズと同じ技術評論社から出版されている。

全体的な構成はヒット＆ブローのようなテキストベースのゲームを題材とし、それを C++ (と Object Pascal) のソースコードで説明するものとなっている。奇数章だけを読むとゲーム部分のないオブジェクト指向プログラミングの概念だけを説明したものとなっている。

`ゲーム (偶数章) && オブジェクト指向プログラミング (奇数章) `

タイトルに偽りはない。

C++ はこの本を出版するためのオマケというか、Turbo Pascal のオブジェクト指向本を書くための隠れ蓑である。この事は『#20 はじめての Delphi』のまえがきにちゃんと書いてある。

C++ でのオブジェクト指向プログラミングを目的として読んだ人には Turbo Pascal のくだりが邪魔だっただろうし、Turbo Pascal でのオブジェクト指向プログラミングを目的として読んだ人には C++ のくだりが邪魔だっただろう。『#9 はじめての Pascal』のように同じ言語ならまだしも、異なる言語だとどうしても冗長に感じてしまう。加えて奇数章/偶数章のギミックがあるのでお世辞にも読みやすいとはいえない。

それでもある程度のまとまりがあるのは、対象言語が Borland / Turbo C++ と Turbo Pascal という Borland 系の言語で統一されているからだろう。

個人的な評価: ★★★☆☆

# おわりに
評価が低いのは、今となっては内容がモロ被りしている『#22 Delphi オブジェクト指向プログラミング』を読んだほうが手っ取り早いからです。Pascal 側から読むと微妙かな、と。

ただ、本書を読むと『#22 Delphi オブジェクト指向プログラミング』を読んだ時に「？？？」となる箇所が減るのではないかとは思います。

**See also:**

 - [Pascal / Delphi 関連の書籍を読んでみる (まとめ) (Qiita)](https://qiita.com/ht_deko/items/34bbcdea27ce224079e0)
HTMLの勉強で知ったこと 1

vue.jsをやるにあたり、html,js,cssの基本知識がないと難しいことが分かった。

なので基本の勉強を[w3schools.com](w3schools.com/default.asp)を通じて勉強していく。

そこで初めて知ったことを書いていく。

## 閉じタグのいくつかは省略できる

[Google HTML/CSS Style Guide まとめ](https://qiita.com/Sugima/items/785644372397595644ba#%E3%82%BF%E3%82%B0%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B%E4%BB%BB%E6%84%8F)

## hrタグで水平方向の罫線を挿入できる

あまり使わないと思うけど知らなかったので

## hrefのhttp、httpsは省略できる

httpのサイトにhttpsでリンクするとアクセスできないからこれはうれしい

## spanタグは無意味なタグ

styleのcolorとかを付けるときには役立ちそう

## qタグは言語で変わる

日本語だと括弧(「」)、英語だとダブルクォーテーション("")
Paper Trial 取り消し機能


## できる事

ログ管理サービス
→なんのログ？


## 使い方
https://qiita.com/ko-he-8/items/bd8fae10b6852840691b


has_paper_trailを追加することでcreate, update, destroyを追跡するようになる。





記事；
https://ruby-rails.hatenadiary.com/entry/20150214/1423923524
GitHubで困った記録

# HTTPS, SSHで接続する方法が分からなくて困った時
公式が一番早い罠。
**HTTPS、SSHでのクローン方法**
https://help.github.com/en/articles/which-remote-url-should-i-use
**以下を利用している場合はアクセストークンを利用する。その方法。（コマンドライン）**
* 二段階認証
* SAMLシングルサインオン (SSO)
https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line
MAMPでエラーメッセージを表示する設定の仕方

## 概要
PHPを学習するときに使用するサーバ環境としてMAMPを使っている、もしくは使おうかと考えている人に向けて、エラーメッセージを表示させるための設定方法を簡単なメモとして残します。

エラーの出力は、開発効率や品質を上げるためにも重要なので設定していないという方はぜひ設定の参考に。
<br>

## 設定の仕方
- MAMPのメニューにある「**Preferences**」を選択。
<img width="648" alt="スクリーンショット 2019-10-09 18.10.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/a13dc5f1-2862-f217-cc77-a909cceb78f7.png">

<img width="1440" alt="スクリーンショット 2019-10-09 18.10.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/6017cc01-e6e8-a24c-6d29-d6e7dee24eb5.png">
<img width="249" alt="スクリーンショット 2019-10-09 18.10.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/73809a38-9779-93bd-57c0-5246b76c592a.png">

<br>

- PHPタブの「**Standard Version**」でバージョンの確認をしましょう。
<img width="648" alt="スクリーンショット 2019-10-09 18.11.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/bed522c4-1f7a-a004-8374-1c479a800458.png">


<br>

- 確認したバージョンのフォルダを、Finder(Windowsはエクスプローラ)の**MAMP**の中の「**confフォルダ**」から選択して、**php.ini**を開きます。
<img width="1552" alt="スクリーンショット 2019-10-09 18.07.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/1b98af81-057c-34ad-635c-b1746840df92.png">


<br>

- そしたらcommand⌘(WindowsはCtrl)＋Fで「**`display_errors`**」と検索しましょう。

検索結果はいくつかありますが、「**`= off`**」と書かれているところを「**`= on`**」と書き換えて上書き保存すれば完了です。
<img width="752" alt="スクリーンショット 2019-10-09 18.15.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/8d0764fb-1f63-635a-4ceb-bdf516163c29.png">

<br>

最後にサーバを再起動してあげると設定が完了です。
<br>

## 参考
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
vue+storybook+bootstrap環境でのbootstrapの適用方法

storybookを使ってコンポーネントの一覧を作成したかったが、bootstrapを使ったコンポーネントがうまく表示できなかったのを対処できたのでメモを残します。

## 経緯

webのフロントエンドの開発がしたい↓

フロントエンドのフレームワークを使おう↓

フロントエンドのフレームワークではReactがスタンダードだけど、Githubでスター数が伸びている且つ小さく始められるVue.jsにしよう↓

CSSフレームワークはとりあえず情報の多いbootstrapにしよう↓

コンポーネントの一覧が見られるstorybookが面白そうだから入れよう↓

bootstrapを使って作ったコンポーネントがうまく表示できない↓

なんとか表示できた←イマココ

## 対処内容

.storybook/config.jsに、vueのプロジェクトでbootstrapを適用した時と同じ内容を記述しました。

``` javascript:.storybook/config.js
import BootstrapVue from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
Vue.use(BootstrapVue)
```
pythonでのJSONの作り方とパースの仕方

Pythonに関するJSONの作成の仕方とパースの仕方を書いておこうと思います。
JSONは最近多くのREST APIで使わているので学んでおくと便利でしょう。

##まずはJSONの作成方法から
JSONって作るの億劫になる人が多いです。
意外と簡単に作ることが可能なので覚えておくと良いと思います。

```python:JSON作成
#まずは元になるデータを作成します。
#内容はヘッドになるデータを入力し中身を作ります
str_json = {
    "ヘッド1":{
        "Key1": Value1,
        "Key2": "Value2"
    },
    "ヘッド2":{
        "Key1": Value1,
        "Key2": "Value2"
    },
    "ヘッド3":{
        "Key1": Value1,
        "Key2": "Value2"
    }
}

#JSONを書き込むファイルを開く
f = open('output.json', 'w')

#JSONを作ります
json.dump(str_json, f, ensure_ascii=False) #このとき気をつけないといけないのはASCIIコードを使わないということです。
#日本語のみ使うようにします。
```
気をつけていただきたいのはjson.dumpにて作成するときに第２引数としてfと第３引数としてensure_ascii=Falseを設定しています。
これは第２引数でファイル開き、第３変数でASCIIモードでの書き込みをできなくしています。
なぜかと言う第３引数にASCIIをFalseすることで日本語コードを文字化けしないようにするためです。

次にJSONのパースに仕方を説明したいと思います。

##JSONのパースの仕方
JSONのパースというと結構難しく考える人も多いです。
実際はJSONで書かれた部分を連想配列化してデータを取ってくると思っていただいたほうが楽かと思います。
前に書いたコードの一部を抜き出して書きますので注意してみていただけると助かります。

```python:JSON_Parseの仕方
str_json = json.loads(str.text) #JSONデータのロード
to_direct = str_json['ヘッド1']['Key1'] #JSONのヘッドデータからKey1を取り込む
to_client = to_direct['Value1'] #キー値データからValueを抜き出す
```

str_jsonはJSONデータになるのでこのデータを取り込みJSONのデータを連想配列化します。
to_directはstr_jsonからKey1のデータを取り込みます。
to_clientにてto_directの値を抜き出し変数化するわけです。
実に3回データを格納することにより的確にデータを取り出していることがわかります。

意外とPythonって実直なJSONのパースをしていると思います。
連想配列使うとは誰も思っていません。
意外とこの方法がやりやすいと思ったので書いてみました。

実際にPHPとjQueryのJSONの作成方法とパースの方法はプログラミングしたことがありますが。
ワンコードで終わってしまうのでどうやって作成されたのか実際のデータで確認していましたが。
Pythonの方が実際に作り方とパースの仕方がわかりやすいと思います。
MacOS catalinaでhomebrewで入れたclangとclangdを使う方法

#導入
MacOS catalinaを入れたら/usr/includeが蒸発
mojaveでも同様の事象が合ったが、別途/usr/includeを作る方法がサポートされていた。
しかし今回のアプデでそれがなくなり、xcodeの方からうまく今までの/usr/includeにあたるものを持ってくる必要がある。

##clang
コンパイル時にsysrootオプションを付与する。

```
clang++ main.cpp -o main --sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk
```

参考
https://anatofuz.hatenablog.com/entry/2019/10/09/174913

##clangd
ソースコードと同階層のcompile_flags.txtに以下を書き込む

```
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
```

参考
https://twitter.com/false/status/1168529432115470337

###追記
と思ったけどcompile_flags.txtにも同様に

```
--sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk
```

を書き込んだらうまく補完が動いた。
原理的にはそりゃそうなんだろうけど、初めに試した時はうまく動かなかった。
compile_commands.jsonと干渉してたのか消した後に動いた。

###更に追記

clang及びclang++については以下のようなエイリアスを設定

```zsh
SYSROOT='/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk'
alias clang="clang --sysroot=${SYSROOT}"
alias clang++="clang++ --sysroot=${SYSROOT}"
```

そしてcompile_flags.txtについては、どこに置いておけばうまく読み込んでくれるのか（同階層にcompile_flags.txtがなかったら再起的に上の階層を読み込んでくれるのか)試していたら恐らくホームに置いておけば良いっぽいのでホームに置いた。
これで表面上は今までと同じように使えることになった。

#追記及び補足(19/10/13)
pyenvでpythonをインストールしようとしたが、homebrewでインストールしたclangではpythonのビルドがうまくできなかった。
pyenvを使う時はシステムのclangに戻す必要があるかもしれない

#追記(19/10/15)
SDKROOTなる環境変数を設定すれば良いらしい
https://qiita.com/imbsky/items/da709a514dded95b8575#_reference-3447ae53b2cd77fc530b
sysrootを指定する環境変数ありそうだなと思いつつググっても見つからなかったのでありがたい

#終わり
xcodeが絡むといろいろ厄介だ
それにしても毎回オプションを付与したりtxtファイルを用意するのは面倒、makeファイル作るなり自動生成するなりするしかないのか
DB作成時の「Sprockets::Railtie::ManifestNeededError:」の解決方法

プログラミングのカリキュラムで、とあるRailsアプリをgithubからクローンしたんですが、データベースを作る際に以下のエラーが発生しました。

```rb
Sprockets::Railtie::ManifestNeededError: Expected to find a manifest file in `app/assets/config/manifest.js`
But did not, please create this file and use it to link any assets that need
to be rendered by your app:
```

複数人で同じ症状が出たので、これはアプリの内容に問題があるなと。

エラーに以下の記載があるので、大人しく指示に従います。

```
Expected to find a manifest file in `app/assets/config/manifest.js
```
assets直下にconfigフォルダを、さらにconfigフォルダの直下にmanifest.jsを作成しました。
manifest.jsの記述は次のとおりにします。この宣言がないとローカルサーバーが起動しません。

```ruby:/app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
```

これでもう一度、

```
rake db:create
```


を実施したところ、問題なくデータベースの作成に成功。

なぜこのファイルがなかったのかは不明だし、他にも適切な解決策があるかもしれません。

同じような問題で困っているビギナーの方々の助けになれば幸いです。
UbuntuでLaradockを使ったLaravel開発環境構築

#**はじめに**
以下の記事を参考に環境構築したのですが、自分の環境(Ubuntu18.04 2019年10月現在)では一部うまく行かない部分がありましたので記載しました。

[Laradockを使ったLaravel開発環境構築 - Qiita](https://qiita.com/J_Shell/items/695a30fd38444d065ae5)

#**前提**
1. Ubuntu 18.04
2. Dockerがインストールされている事　　
3. gitがインストールされている事

#**環境構築手順**
##**その1：Laradockのインストール**
**◆ディレクトリ準備**
いまから開発環境を整える為のディレクトリを準備します。
今回は"App"という名前で作成します。

```console
~ $ mkdir App
````

カレントディレクトリをAppに変更します。

```console
~ $ cd App
```

**◆Laradockのインストール & 各種準備**
下記コマンドでlaradockをAppディレクトリ内にCloneします。

```console
~App $ git clone https://github.com/LaraDock/laradock.git
```

終わったらlsコマンドでlaradockディレクトリが作成されている事を確認して、laradockディレクトリに移動します。

```console
~App $ ls
laradock
~App $ cd laradock
```

**◆.envファイルの作成 & 編集**
.envファイルはlaradock内の「env-example」ファイルをコピーして作成します。

```console
~App/laradock $ cp env-example .env
```

次に.envファイルに以下3行を追加します。

```ini
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
```

**◆コンテナの起動**
それではlaradock内で各種必要なコンテナ(Nginx、Redis、Beanstalkd)を起動させます。
ついにDockerを・・・

```console
$ docker-compose up -d nginx mysql redis beanstalkd
```

しばらくして処理が終わったらコンテナが起動しているか、下記コマンドで確認しましょう。

```console
$ docker-compose ps
```

StateがUpになっていれば、コンテナが立ち上がっている状態となります。

##**その2：Laravelプロジェクトの作成**
先ほど"docker-compose ps"コマンドで**laravel_workspace_1**というコンテナが立ち上がっているのを確認しました。
そのコンテナにアクセスしLaravelプロジェクトを配置してみましょう。

**◆コンテナへのアクセス & 準備**

```console
$ docker exec -it laradock_workspace_1 bash
root@84df08e29420:/var/www#
```

アクセスしたらまずはパッケージリストの更新をしましょう。

```console
root@84df08e29420:/var/www# apt-get update
```

**◆Laravelプロジェクトの作成**
それでは準備ができたのでLaravelプロジェクトを作成します。
今回は**my-project**というプロジェクト名で進めます。
下記コマンド実行後しばらく待機します。

```console
root@84df08e29420:/var/www# composer create-project "laravel/laravel=6.0.*" my-project
```

Laravel のバージョンをLTSにしたかったので 6.0 を指定してますが、git clone した環境で composer install するとなぜか 6.2 がインストールされていたので固定する必要と思います。

composer.json

```
-        "laravel/framework": "^6.0",
+        "laravel/framework": "6.0.*",
```

composer.lock は v6.2 になっていたので再作成したほうがいいかもしれません。

これでLaravelプロジェクトの作成は完了ですので、lsコマンドでディレクトリが作成されているか確認しましょう。

```console
root@84df08e29420:/var/www# ls
laradock my-project
```

ここまででLaravelプロジェクト作成は終了ですので、コンテナから出ます

```console
root@84df08e29420:/var/www# exit
```

設定を変更するため、コンテナを一時停止させます。

```console
$ docker-compose stop
```

**◆ホスト側(my-project)の編集内容をDockerコンテナ側に反映させる設定**
".env"を編集して、上記を実現します。
".env"はlaradockディレクトリ直下に存在します。

APP_CODE_PATH_HOSTの部分を以下のように書き換えます

```
### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../my-project
```

##**その3：最後の仕上げ**
**◆パーミッション設定**
「storage」「bootstrap/cache」ディレクトリについて、webサーバーから書き込みを許可するために、
パーミッションの設定を変更します。

まず再びコンテナへ入り、MyProjectディレクトリへ移動します。

```console
docker exec -it laradock_workspace_1 bash
```
パーミッションを変更します。

```console
root@84df08e29420:/var/www/MyProject# chmod 777 storage -R
root@84df08e29420:/var/www/MyProject# chmod 777 bootstrap/cache
```

お疲れ様でした！
これでlocalhost [http://localhost/] にアクセスしたらLaravelのトップ画面が表示されるはずです。
CentOS 6.9 | CentOS7.7 > patchコマンド > シンボリックリンクファイルへの振舞いが異なる | --follow-symlinksオプション

```txt:動作環境
A. CentOS release 6.9 (Final)
  patch v2.6
B. CentOS Linux release 7.7.1908 (Core)
  patch (GNU patch 2.7.1)
```

### 概要

WRF (Weather Research and Forecasting Model)のシステムをCentOS6.9からCentOS7.7へ移行中の調査にて気づいた事項。
patchコマンドの振る舞いが異なる。

シンボリックリンクファイルへのpatchをしたときに、シンボリックリンクが切れてファイルが生成される振る舞いであった。
その振る舞いに基づいて作ったスクリプトがCentOS 7.7ではエラーになる。


#### CentOS 6.9

```
$ patch namelist.wps CODE_170613/diff_FNLtoSST 
patching file namelist.wps
Reversed (or previously applied) patch detected!  Assume -R? [n] 
```

#### CentOS 7.7

```
$ patch  namelist.wps CODE_170613/diff_FNLtoSST 
File namelist.wps is not a regular file -- refusing to patch
1 out of 1 hunk ignored -- saving rejects to file namelist.wps.rej
```

### 対応

対応として、「シンボリックリンクに直接patchを当てる方法はやめる」。

### 関連

シンボリックリンクをはずす方法として以下について知った。

- [2019-10-10 CentOS 7.7のmv > StackOverflow掲載とは異なる動作 > シンボリックリンクは解除されない](https://qiita.com/7of9/items/2f3334a3a819e923c225)


### 補足

CentOS 7.7のpatchコマンドにはシンボリックリンクを扱うための新しいパラメータ「`--follow-symlinks`」がある。
これを使うことでCentOS 7.7では動くかもしれないが、現在の調査ではCentOS 6.9とCentOS 7.7で同一のスクリプトを動かす必要があるので、その選択肢は選択していない。
LinuxからのWindows共有フォルダの利用

#使いどころ
ネットワーク上でLinuxマシンからWindows上の共有フォルダを見たいときというとシチュエーションが一般的だが、WindowsServer上のHyper-VにLinuxを建てて作業している際に、Windowsのフォルダにログなどの証跡物を持っていきたい時などにはこの方法が一番楽だと思う。
どちらかというと自分の備忘録的に記しておく。

#前提条件など
前提として、コマンドの実行ユーザーはsudo権限を持っていることが必要になる。
コマンドの表記は、Windowsのサーバー名またはIPアドレス(ホスト名解決ができていない可能性が高いので、この場合はIPか？)を<severname>、共有フォルダの名称を<foldername>、マウントするフォルダを/mnt/win/sharedとする。
また、WindowsにログインするユーザーIDは<user>、パスワードは<password>と記載する。

#共有フォルダをマウントする場合
以下のコマンドを実行

```bash
sudo mount -t cifs //<servername>/<foldername> /mnt/win/shared/ -o username=<user>,password=<pass>,dir_mode=0777,file_mode=0777
```
ここでcifsはwindowsのファイルシステムのこと。また、dir_mode, file_modeで書/読の権限を設定している。

#共有フォルダをアンマウントする場合
共有フォルダを使わなくなった場合は、不用意にファイルの操作を行わないよう、忘れずにアンマウントしてあげる。

```bash
umount  /mnt/win/shared/
```
[Rails]Xcodeの自動バージョンアップに注意（ERROR: Failed to build gem native extension.）

# 環境
macOS 10.14.5
ruby 2.6.3(rbenv)
rails 6.0.0
Xcode 11.1

# bundle install でエラー発生

久しぶりに Railsアプリ（6.0.0）を作成しようとしてハマりました。nokogiri gemがインストールできなくなっており、進めなくなっていたのです。

```
Installing nokogiri 1.10.4 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
...
To see why this extension failed to compile, please check the mkmf.log which can
be found here:

/Users/mac_user/environment/api_test/vendor/bundle/ruby/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/nokogiri-1.10.4/mkmf.log

extconf failed, exit code 1
```

# 原因は Xcodeにあり

色々調べて時間がかかってしまったのですが、エラーメッセージに書いてある通りに、mkmf.log を確認すれば解決しました。Xcodeのライセンスに「Agree」せよと書かれています。


```mkmf.log
/Users/nspenchan/.rbenv/versions/2.6.3/lib/ruby/2.6.0/mkmf.rb:406: warning: Insecure world writable dir /Users/nspenchan in PATH, mode 040777


Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license” and then retry this command.


checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */
```

# 解決　Xcodeでライセンスに同意する

Xcodeを立ち上げて、ライセンス確認画面で「Agree」します。必要なコンポーネントが自動でインストールされて、問題が解決しました。

知らない間に Xcodeがアップデートされていたのです。そういえば、前もこんなことがあったような... すっかり忘れていましたわ。
エラーメッセージを見るのは苦手ですぐに日本語情報をググってしまいます。今回はそれで時間を無駄にしてしまいました。まずは「親切なエラーメッセージさん」を確認することを習慣にしたいと思います。

たったこれだけのことですが、自分のような初心者はハマると思いますので、情報共有します。
OCI上のDBaaS(19c)へのサンプルスキーマのインストール

# Oracle 19cでのサンプルスキーマのインストール

OCIで19cのDBaaS環境を構築したところ、サンプルスキーマはデフォルトでは作成されず、
作成スクリプトも19cからは(その前から？)バンドルされているサンプルスキーマがHRユーザーのみとなり、
SHなどのその他のサンプルスキーマは、[Github](https://github.com/oracle/db-sample-schemas/releases/tag/v19c)からスクリプトを落として実行する形になっていた。

と言う様な状況だったので、今後同様に検証環境を作成した際に、
サンプルユーザーの導入で躓くのも面倒なので、こちらに手順をまとめてみた。

尚、一括で作成する場合は特にユーザー側で考慮する必要はないが、
サンプルスキーマは依存関係が存在するスキーマがあるため、
個々別で作成する場合は下記の順番で作成する必要があるので注意。

1. HRスキーマの作成
2. OEスキーマの作成
3. SH、PM、BIスキーマの作成

## ０．使用環境
OCI環境上に作成したDBaaS環境(Virtual Machines)
Database Version：19c(19.0.0って書いてあったけど、正式には何だろうか？後で確認)
OS：OEL 7.5

## １．サンプルスキーマのDL

今回はGit cloneではなく、Githubから直接DLしたものをサーバーにアップロードして一括作成をする。
DL元は、上述の通り[こちらのGithub](https://github.com/oracle/db-sample-schemas/releases/tag/v19c)。


## ２．インストールの前作業

スクリプトのDL後、サーバーにアップロードして、以下で解凍。

```
$ tar -zxvf db-sample-schemas-19c.tar.gz
```

スクリプト内の`__SUB__CWD__`という文字列を置換させる必要がある(PATHの置換？)ので、
解凍したディレクトリに移動後、以下を実行。
個別の情報を入力するとかはなく、一括で以下のコマンドで置換させればいい様なので、
置換してある状態で配布してくれればいいのに…

```
$ /u01/app/oracle/product/19.0.0.0/dbhome_1/perl/bin/perl -p -i.bak -e 's#__SUB__CWD__#'$(pwd)'#g' *.sql */*.sql */*.dat
```

スキーマはPDB01というPDBに作成したいので、tnsnames.oraに接続文字列を追加。
基本的にはCDB用の設定をコピーして、サービス名と接続文字列を変更でOK。
変更点のサービス名は`lsnrctl status`コマンドで確認できるPDBのサービス名を記載。

```
pdb01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <ホスト名>>)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <サービス名>)
    )
  )
```

## ３．サンプルスキーマの作成

tnsnamesへの設定の追加後、SQL*Plusに接続して、「mksample.sql」を実行。
実行するとSYS、SYSTEM、各スキーマのパスワードと表領域、一時表領域、
tnsmamesに追加した接続文字列を聞かれるので、入力して作成シーケンスを開始する。

以下の手順の場合、スクリプトの最初で各サンプルスキーマをDROPするので、
存在しない場合はエラーが返るので注意。

```
SQL> @<解凍DIR>/db-sample-schemas-19c/mksample.sql

specify password for SYSTEM as parameter 1:
Enter value for 1: <パスワード>

specify password for SYS as parameter 2:
Enter value for 2: <パスワード>

specify password for HR as parameter 3:
Enter value for 3: <パスワード>

specify password for OE as parameter 4:
Enter value for 4: <パスワード>

specify password for PM as parameter 5:
Enter value for 5: <パスワード>

specify password for IX as parameter 6:
Enter value for 6: <パスワード>

specify password for  SH as parameter 7:
Enter value for 7: <パスワード>

specify password for  BI as parameter 8:
Enter value for 8: <パスワード>

specify default tablespace as parameter 9:
Enter value for 9: <表領域名>

specify temporary tablespace as parameter 10:
Enter value for 10: <一時表領域名>

specify log file directory (including trailing delimiter) as parameter 11:
Enter value for 11: <作成ログ保管ディレクトリ>

specify connect string as parameter 12:
Enter value for 12: <接続文字列>

Sample Schemas are being created ...

・・・
```

作成シーケンスが進んでいくのでそのまま待っていると、
作成したサンプルスキーマのオブジェクトなどの情報を表示するので、
そういったログや、プロンプトが戻ってきた後に作成したスキーマにスイッチして
user_objectsやuser_tablesをselectして確認をするのが吉。

個別でインストールしていくのもいいけど、一括で作ったうえで不要なものをDROPした方が
早そうな気が個人的にはしている。
#Rails + #rspec で have_attributes と他のマッチャを組み合わせて使う

こんな感じ

```rb
expect(user).to have_attributes({
  name: 'Alice',
  age: (a_value > 30),
  created_at: be_an(Time)
})
```

[`have_attributes` matcher - Built in matchers - RSpec Expectations - RSpec - Relish](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/have-attributes-matcher)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2571








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
swift5でiPhoneの音量ボタンの押し下げを検出する

#コード
```swift

    @objc func volumeChanged(notification: NSNotification) {

        if let userInfo = notification.userInfo {
            if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String {
                if volumeChangeType == "ExplicitVolumeChange" {
                    print(userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")])
                    if volumeValue > userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")] as! Float{
                        print("volume down")
                        minusAction()//minusActionをあとでつくる
                    }
                    else if volumeValue < userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")] as! Float{
                        print("volume up")
                        plusAction()
                    }
                    else if volumeValue == userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")] as! Float && volumeValue == 1{
                        print("volume max")
                        plusAction()
                    }
                    else if volumeValue == userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")] as! Float && volumeValue == 0{
                        print("volume min")
                        minusAction()
                    }
                    volumeValue = userInfo[AnyHashable("AVSystemController_AudioVolumeNotificationParameter")] as! Float
                }
            }
        }
    }
```

plusActionとminusActionの中に押された時のアクションを作ってください
これは実際に音量変わっちゃういます
上限まで音量上げた状態で＋ボタン押しても反応します
音量の変化に対して反応するのではなく、あくまでもボタンを押したことを検出します
GCP アップデート (10/4-10/10 2019)


### BigQuery: [Oct 3, 2019 feed来ない。。？](https://cloud.google.com/bigquery/docs/release-notes#October_03_2019)
- IFやWHILE使えるスクリプティングや、ストアドプロシージャ、一時テーブルがベータになったよ。
  - どんどんBQが機能拡張されていく。。

### Dataproc: [Oct 4, 2019](https://cloud.google.com/dataproc/docs/release-notes#october_4_2019)
- 自動でノード数をスケールしてくれる[autoscalinig](https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/autoscaling)がGAになったよ。
  - 使い方次第なので[いつ使うか](https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/autoscaling#when_to_use_autoscaling)は確認してから利用検討すべき。
    - 例えばdataproc起動とスケーリング同じぐらいの時間でできるので、アイドルするためにスケールさせるよりはそれごとに起動する、とかHDFS使ってるときは使わない、など。

### AI Platform: [Oct 4, 2019](https://cloud.google.com/ml-engine/docs/release-notes#october_4_2019)
- us-west2、us-east4、europe-north1がトレーニングとバッチ推測に使えるようになったよ。
- us-west1とeurope-west4はこれまでのトレーニングに加えてバッチ推測にも使えるようになったよ。

### Compute: [Oct 7, 2019](https://cloud.google.com/compute/docs/release-notes#october012019)
- APIやgcloudコマンドからPDのスナップショットからインスタンスを作る機能がGAになったよ。

### DNS: [Oct 8, 2019](https://cloud.google.com/dns/docs/release-notes#October_08_2019)
- DNSに対するクエリをロギング/モニタリングする機能がGAになったよ。
  - どこ向いてるかのデバッグやどれぐらい使われてるか、どこまで展開されたか確認するのに使えそう。

### Dataflow: [Oct 7, 2019](https://cloud.google.com/dataflow/docs/resources/release-notes-service#October_07_2019)
- ShuffleとStreaming Engineがus-west1とasia-east1に来たよ。(東京はもう来てる。)
  - ShuffleはバッチでGroupByKeyやCoGroupByKey、Combineといったshuffle処理をdataflowのワーカノードではなく、dataflowのバックエンドに実行させる。
  - Streaming Engineはストリーム処理してるときのパイプライン実行をワーカノードではなく、dataflowのバックエンドに実行させる。

### Dataflow: [Oct 8, 2019](https://cloud.google.com/dataflow/docs/resources/release-notes-service#October_08_2019)
- Python streamingがGAになったよ。
  - Pythonで上のStreaming EngineやUpdate/Drain、オートスケーリングができるようになったよ。

### Cloud Run: [Oct 1, 2019 feed不正？](https://cloud.google.com/run/docs/release-notes#october_1_2019)
- トラフィックを処理するコンテナ数の最大値を制御する[max instance settings](https://cloud.google.com/run/docs/configuring/max-instances)がリリースされたよ。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
【初心者】Amazon Forecast を使ってみる

# 目的
- 仕事に直結していないが、時系列データの分析に興味があったため、基本動作を確認することにした。

# Amazon Forecast とは（自分の理解）
- 過去の時系列データ、および関連データを入力すると、それらのデータを元に未来予測を行ってくれるサービス。

# やったこと
- 気象庁のオープンデータから、過去の東京地方の日次平均気温データを取得。
- 4年分の過去データ(2015/9/1～2019/8/31)をAmazon Forecastに入力。2019/9/1～2019/9/30の予測を出力させる。
- 2019/9/1～9/30の値について、Forecastが出力した予測と、実際のデータを比較し、予測の正確性を確認する。

# 構成図

![forecast01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ae8c6bb6-45ff-6755-0221-00ccb33f611e.png)


# 作業手順

## データの準備
- [気象庁のデータ公開サイト](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)から、過去の東京の平均気温データをダウンロードする。
- 整形前のデータ(.xls)は以下のフォーマットになる。

![forecast02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/bb00539d-3876-d255-5434-6118748b54f5.png)

- forecastで処理できるフォーマットに整形する。不要な列を削除し、日付のフォーマットを修正する。日付はExcelの機能で「yyyy-mm-dd hh：mm：ss」（「:」は実際には半角）を指定して整形する。

![forecast03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/249bf2f5-fc6a-2567-1ce6-cbc6801d1540.png)

- 4年分のデータをグラフにすると以下のようになる。30℃(真夏)～5℃(真冬)の間を推移する。

![forecast04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/75834f31-0445-e0c0-b1ce-ff1d2b30b489.png)


## Forecastでの処理
###処理プロセス
大きく分けて以下の3つの処理を実施する。

- Dataset Group ：入力データの作成
    - S3にcsvデータをアップロード。
    - forecastにて、入力データとしてそのcsvを指定して読み込ませる。
    
- Train predictor ：学習モデルの作成
    - 各種パラメータを入力し学習処理を行う。
        - Forecast Frequency(データの頻度): 今回は1日(日次データなので)
        - Forecast Horizon(何周期予測する): 100(約3か月分の未来を予測)

- Generate forecasts :予測の作成
    - 実際に予測を作成する。

###処理時間
上記のそれぞれのプロセスでの所要時間は以下の通り。今回のデータ量は約1500行(365日*4年分)だが、それなりに時間がかかる。

- Dataset Groupの作成(データのimport)：約4分
- Train predictor(学習モデルの作成)：約90分
- Generate Forecasts(予測の作成)：約90分

###予測の出力
2019/7,8月分（入力データ）と、2019/9月分（予測データ）を表示。9月はだんだん寒くなっていくので、正しい傾向での予測はできている。
![forecast05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3099a261-c097-1ccc-800c-20ce093c7402.png)

## 予測データの検証
2019/9月分について、forecastが予測したデータと、気象庁から取得した実データを比較する。大きく外してはなさそうだが正確かどうかは素人では判断不能。

![forecast06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b247d5cb-187d-176d-caf2-cf4d76c31d94.png)

# 所感
- 基本的な手順としては簡単なので、サーバの負荷の予測とか、実業務に関わるところに活かせないかを考えてみたい。
- 学習のアルゴリズムとして、ARIMA, Deep_AR_Plus, ETS, NPTS, Prophetが選択可能で、今回は自動選択にしたところ「Deep_AR_Plus」が使用されていた。[公式ドキュメント:　Amazon Forecast アルゴリズムを選択する](https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/aws-forecast-choosing-recipes.html)にそれぞれの解説があるが、さっぱり分からないため、理解して使おうとするとかなり奥深そう。

# 参考
- [Amazon Forecast を使ってお手軽に時系列予測する（GUI編）](https://qiita.com/osamasao/items/7eef286ea9a0f73e88b0)
    - これを読めば一通り理解し、ハンズオンできる分かりやすい記事。

- [Amazon Forecastを使ってむこう1年のビットコインの相場を予想してみた](https://dev.classmethod.jp/business/business-analytics/bitcoin-price-amazon-forecast/)
    - 複数のアルゴリズムを全て試して差を確認している良記事。
[Byte Buddy] A method to create a linearly nested parameterized type

Byte Buddy でリニアにネストしたパラメータ化された型を KClass 群を指定して作成するメソッド。

```kotlin
/**
 * Creates a linearly nested parameterized type.
 * ex. parameterizedType(List::class, Set::class, Class::class, String::class) -> List<Set<Class<String>>>
 */
fun parameterizedType(vararg t: KClass<out Any>): TypeDescription.Generic {
    require(t.size >= 2)

    val r = t.reversed().map { it.java }

    var parameterizedType: TypeDescription.Generic =
        TypeDescription.Generic.Builder.parameterizedType(r[1], r[0]).build()

    r.drop(2).forEach { jClass ->
        parameterizedType = TypeDescription.Generic.Builder.parameterizedType(
            TypeDescription.Generic.Builder.rawType(jClass).build().asErasure(),
            parameterizedType
        ).build()
    }

    return parameterizedType
}

```