OmniAICreator/Qiita-1.07M huggingface dataset:
Pulumiの状態管理にクラウドストレージバックエンドを使う

初Pulumiです。

Pulumiは状態管理を行っており、[ローカルかPulumiが用意したWebバックエンドが利用できます](https://pulumi.io/reference/state/)。
しかしそれだけなのでしょうか？terraformはクラウドストレージが使えますし、出来ればPulumiも同じようにしたいと感じます。

調べたところ少し前の[Pulumi 0.17.9](https://github.com/pulumi/pulumi/blob/master/CHANGELOG.md#0179-2019-04-30)にて、大手クラウドベンダ（GCP,AWS,Azure）のストレージサービスをバックエンドとして使えるようになったようです。ですが、ドキュメントに書かれていないようなのでここで紹介しておきます。

実装の裏では[go-cloud](https://github.com/google/go-cloud)を使って抽象化しているようです。（[Pulumi上のコミット](https://github.com/pulumi/pulumi/commit/70bc0436ed165ec1fbebdda33e033e71e1ae5aa7)）

宗教上の理由で今回はAzureのblobで試してみます。[go-cloudのドキュメント](https://gocloud.dev/howto/blob/open-bucket/#azure)によると、アカウント名、アカウントキーもしくはSASを環境変数から与えて使うようです。

あらかじめAzure上にBlobストレージ`fukasawahpulumistates`を作成し、Blobストレージ上にコンテナ`pulumistates`を作っておきます。ストレージキーは`XXXXXXXXXXXXXXXXXXXXXX`とすると、以下のように使います。

``` bash
export AZURE_STORAGE_ACCOUNT=fukasawahpulumistates
pulumi login azblob://pulumistates

# AccessKeyの場合
export AZURE_STORAGE_KEY=XXXXXXXXXXXXXXXXXXXXXX
# SASの場合
export AZURE_STORAGE_SAS_TOKEN='sv=2018-03-28&ss=b&srt=o&sp=rwdlac&se=2020-06-23T22:45:53Z&st=2019-06-23T14:45:53Z&spr=https&sig=XXXXXXXXXXXXXXXXXXXXXXXX'

# 利用(stackをクラウド用に作り直さないといけない)
pulumi stack init dev-azure
pulumi stack select dev-azure
pulumi up
```

stack init後に、クラウドストレージ上にファイルが作られ、upで変更が入れば使えています。

注意点は`pulumi login azblob://xxxx`の時点では`AZURE_STORAGE_ACCOUNT`しか意識していません。「Logged into ...」と出てもただローカル設定でストレージアカウント名を記録しているだけのようです。stack init等やupで失敗する場合、アクセスキーかSASが正しいかどうかを確認してください。

既知のバグで、upの完了後にPermalinkをログへ出力する際のURLをうまく生成できず以下のようなエラーになるバグがあります。クラウド上のファイルの更新は終わった後なので影響はそんなにないです。

```
error: Could not get signed url for stack location: blob (code=Unknown): to use SignedURL, you must call OpenBucket with a non-nil Options.Credential
```

既にIssue（[pulumi/pulumi#2791](https://github.com/pulumi/pulumi/issues/2791)）が上がっており、この対応を待つ必要があります。修正前にCIに組み込む場合、異常終了としないような仕組みが必要そうです。
楽器演奏アプリ

##仕様
・再生ボタンを押すと永続リピートでバックグラウンドで音楽が流れる
・停止ボタンを押すとバックグラウンド音楽が止まる
・楽器の画像をタッチするとその楽器の音を出すことができる（バックグラウンド音楽に新しい音を乗せれる）

##学び

###画像ボタン
UIパーツを置く時に`imageView`ではなく`button`を配置しボタンの装飾として画像を上から貼ってる感じ
mp3ファイルをディレクトリにいれる

###音、画像、動画のフレームワークを入れる
音、画像、動画のフレームワークを扱いやすくするためのフレームワーク`AVfoundation`を読み込む

```swift
import AVFoundation
```

###順番

####①楽器のファイルパス指定→②プレイヤーインスタンス作成→③楽器ボタン押された時の処理(try文とdo~catchでエラー処理も)

###①ファイルパスの取得方法
ディレクトリに配置した`cymbal.mp3`を取得したいとき

```swift
 let cymbalPath = Bundle.main.bundleURL.appendingPathComponent("cymbal.mp3")
```
main→`Bundle`の主なディレクトリ名称
bundleURL→`Bundle`の`main`というディレクリにある保存領域の住所
`.appendingPathComponent("cymbal.mp3")`→`bundleURL`に指定したファイルの住所と名称
参考: https://teratail.com/questions/77240

###②インスタンス作成
```swift
var cymbalPlayer = AVAudioPlayer()
```

###③楽器ボタン押された時の処理(try文とdo~catchでエラー処理も)

```swift
    @IBAction func cymbal(_ sender: Any) {
        do {
            cymbalPlayer = try AVAudioPlayer(contentsOf: cymbalPath, fileTypeHint: nil)
            cymbalPlayer.play()
        } catch  {
            print("エラーメッセージ")
        }
    }
```
tryからメソッドを呼び出して、エラーが起きだ場合のみcatchの中に入って`エラーメッセージ`と表示される
`contentsOf`にはURLを、`fileTypeHint`は補完の際に出てきたがnilなので省略可

参照: [AVAudioPlayerクラスのリファレンス](https://developer.apple.com/documentation/avfoundation/avaudioplayer)


###共通処理のまとめ（リファクタリング）

同一ファイル内からのみアクセスできるアクセス修飾子`fileprivate`を使う(`private`は別物かつ厳しい)

```swift
  fileprivate func soundPlayer(_ player: inout AVAudioPlayer, path:URL, count: Int){
    do {
    player = try AVAudioPlayer(contentsOf:
    path, fileTypeHint: nil)
    player.numberOfLoops = count
    player.play()
    
    } catch {
    print("エラー発生してます")
    }
  }
```
AVAudioPlayerクラスに`inout`と指定することで、引数として受け取り、最後に戻り値として変数を戻している。
つまり、return不要ということだ。

共通処理の`soundPlayer`をつかった処理

```swift
  @IBAction func cymbal(_ sender: Any) {
    soundPlayer(&cymbalPlayer, path:cymbal_path, count: 0)
  }
```


`&cymbalPlayer`は参照渡しというもので、参照先の場所を教えているイメージ。
１分でわかるHyperledger Fabric　ピア編


Hyperledger Fabricについてがんばって短くわかりやすくまとめようと思います。
今回はHyperledger Fabricの概要とピア編です。

###Hyperledger Fabricとは
- Linux Foundationが開発するオープンソースのHyperledgerプロジェクトを元に開発されているブロックチェーンプロジェクト。
- 開発はIBMが主導。
- 主にエンタープライズ向けの用途を想定されている。
- コンソーシアム型ブロックチェーン


###コンソーシアム型ブロックチェーン
- 不特定多数のノードから構成されるパブリックブロックチェーンとは異なり、参加を許可された組織間で構成されている。
- パーミッションドブロックチェーンの一つ


###Hyperledger Fabricネットワークの用語
#####まずこれだけはわかればいいっていう用語
- ピア・・・チェーンコードの処理、ブロックの承認などを行うノード。必ずどこかの組織に属する
- オーダラー・・・ブロックの順序づけを行うノード
- CA・・・ネットワークに参加するための証明書を発行するノード（証明書自体は外部発行のものでも良いので別に無くてもいい）
- チェーンコード・・・スマートコントラクトの呼び方

#####知っとくといいかもな用語
- 組織（Amazon Managed Blockchainではメンバー）・・・ネットワークに参加する組織や個人
- チャネル・・・ネットワークを分割した単位。複数の組織の集合体。
- MSP・・・証明書とか秘密鍵とか色々合わせたもの。ネットワーク内で使用する情報が詰まってるIDだと思うとわかりやすい。



####ピア
ピアは各組織で最低一つ以上参加させるノードです。
ピアの中にはワールドステート（LevelDB、もしくはCouchDB）とブロックチェーンが保存されています。
ワールドステートはネットワークの現在の状態、ブロックチェーンはワールドステートに到るまでの全てのトランザクションの履歴です。

ピアの役割は主に2つあって、どちらの役割もこなせるピアと、一つしかできないピアがいます。
Endorsingピアはチェーンコードのシミュレーションとブロックの承認をどちらも行えます。
Committingピアはブロックの承認のみ行えます。

トランザクションが処理される細かい過程はトランザクション編（？）で書こうと思います。


特殊なピア
アンカーピア、リーダーピアという特殊な役割をするピアがいます。

Hyperledger Fabricはスケーラビリティを確保するためにゴシッププロトコルという通信プロトコルを使用しています。
同じチャネルにいる各組織間で効率的に通信するためのプロトコルです。
アンカーピアには最初から他の組織のアンカーピアのアドレス情報が組み込まれている、というか設定する、ので他の組織のピアとの通信を容易にして組織間での情報共有を効率的に行う役割を果たしています。

リーダーピアはオーダラーからの情報を組織の中で最初に受け取るピアです。
指定しなければランダムで選ばれます。

####まとめ

今回はピア編でした。
もっと書く事ある気がするけど１分でって言っちゃったからなあ


ソースは主に公式ドキュメントです：https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html
「2==1==0 → true」ワイ「！？」

# どういうことか
![スクリーンショット 2019-06-24 0.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/821d65a9-3582-ca20-6745-7f9c12bc2c02.png)

まず最初の2項に注目します。
`2==1`はfalseですよね。

ということは、実際のところは`false==0`を評価することになります。
JSの`==`は暗黙の型変換を行うので、falseと0は等価となり、最終の結果はtrueになります。

```javascript
/* こう書くとわかりやすいかも */
(2==1)==0 //true
```


なので、下記画像のように左側の式をどれだけ長くしようが、結果はtrueです。

![スクリーンショット 2019-06-24 0.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/9a0172dc-b4c1-159c-a485-ee274e45fec3.png)

`10==9==8==7==6==5==4==3==2==1`はfalseなので、結局のところは`false==0`を評価しているだけに過ぎません。



# 元ネタ
Twitterで見つけたネタです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">JS完全に理解した <a href="https://t.co/n6PGbisFB1">pic.twitter.com/n6PGbisFB1</a></p>&mdash; 世界のTANEO (@TaneoKoyama) <a href="https://twitter.com/TaneoKoyama/status/1142438097046474752?ref_src=twsrc%5Etfw">June 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
結合度と凝集度！！

# 概要

以前、仕事中で「結合度と凝集度を考えながら、作業すると良いです。」と言われました。
大学の時、聞いたことある単語ですが、具体的な内容を忘れたので勉強しました。

# 結合度???

結合度は、モジュールが他のモジュールに依存している程度を示すものです。

# 結合度の高いクラスの問題

他の関連クラスが変更されると、加えて変更します。
また、変更するクラスを理解するために、関連する他のクラスを一緒に理解する必要があります。
それで、他のプログラムでは、クラスを再利用することも難しいです。

# 結合度の程度　【wiki参考】

## 内容結合（Content coupling）「高」
病理学的結合とも呼ばれ、あるモジュールが別のモジュールの内部動作によって変化したり依存したりする(例えば別のモジュールの内部データを直接参照する)。したがって、あるモジュールのデータを生成する方法（場所、種類、タイミング）を変更することは、依存するモジュールの変更につながる可能性がある。

## 共通結合（Common coupling）
グローバル結合とも呼ばれ、二つのモジュールが同じグローバルデータ（例えば、グローバル変数）を共有する。共通のリソースを変更すると、それを使用したすべてのモジュールを変更することを意味する。

## 外部結合（External coupling）
二つのモジュールは、外部から供給されたデータ·フォーマット、通信プロトコル、またはデバイスインターフェイスを共有している場合に起こる。 これは基本的に外部ツールやデバイスへの通信に関連している。

## 制御結合（Control coupling）
あるモジュールに何をすべきかについての情報（例えば、処理を制御するためのフラグ）を渡すことで、別のモジュール処理の流れを制御する。

## スタンプ結合（Stamp coupling）
複数のモジュールが複合データ構造を共有し、その一部のみを使用する(例えば、全レコードの中の1つのフィールドを必要とする関数に全レコードのデータの構造体を渡す)。異なる部分も使用可能。これは、モジュールが必要としないフィールドが変更されることにより、モジュールのレコードを読み取る方法を変更することにつながる可能性がある。

## データ結合（Data coupling）
モジュールを介してデータを共有する場合、例えば、引数である。 各データは基本部分であり、これらは単純なデータの受け渡しのみを行う（例えば、数値を渡してその平方根を返す）。

## メッセージ結合（Message coupling）「低」
最も結合度が低い結合の種類である。（引数のない）メソッドの呼び出し。メッセージパッシング。


# 凝集度??

機能を実行するためにどのくらいの関連責任とアイデアが団結しているかどうかを示す程度です。
凝集度が高いプログラムを容易に理解することができますので、メンテナンス性が高くなります。

# 凝集度が低いクラスの問題

理解するのが難しい
別に再利用が難しい
メンテナンスするのが難しい
他のクラスの変化に敏感である。

# 凝集度の程度　【wiki参考】

## 偶発的凝集（Coincidental Cohesion）「最悪」
適当（無作為）に集められたものがモジュールとなっている。モジュール内の各部分には特に関連性はない（例えば、よく使われる関数を集めたモジュールなど）。

## 論理的凝集（Logical Cohesion）
論理的に似たようなことをするものを集めたモジュール（例えば、全ての入出力ルーチンを集めたモジュールなど）。

## 時間的凝集（Temporal Cohesion）
動作させたときにモジュール内の各部分が時間的に近く動作する（例えば、ある例外を受けたときに動作するルーチンとして、ファイルをクローズするルーチン、エラーログを作成するルーチン、ユーザーに通知するルーチンなどを集めたモジュール）。

## 手続き的凝集（Procedural Cohesion）
ある種の処理を行うときに動作する部分を集めたモジュール（例えば、ファイルのパーミッションをチェックするルーチンとファイルをオープンするルーチンなど）。

## 通信的凝集（Communicational Cohesion）
同じデータを扱う部分を集めたモジュール（例えば、同種のレコードの情報を操作するルーチンを集めたモジュールなど）。

## 逐次的凝集（Sequential Cohesion）
ある部分の出力が別の部分の入力となるような部分を集めたモジュール（例えば、全体としてあるファイルを読み込んで処理をするモジュール）。

## 機能的凝集（Functional Cohesion）「最善」
単一のうまく定義されたタスクを実現するモジュール（例えば、角度のサインを計算するモジュール）


# メンテナンス性が高いソフトウェアは？？

メンテナンス性が高いソフトウェアは、
プログラムの各要素が結合度は低く、凝集度は高く設定する必要があります。
requireと@importのそれぞれの仕組みの違い

Railsにおいて、CSSファイルが読み込まれている理由は、application.cssファイルに *= require_tree .というコードが、コメントアウトで記述されているからである。
また、SCSSを使用する場合は、ファイルの拡張子をscssに変更して、@ importでscssファイルを読み込んでいる。

この点、requireと@ importのそれぞれの実体と仕組みの違いは何かを解説する。


#両者の仕組みの違い
##requireとは？
requireは、Railsのアセットパイプラインの仕組みを使ってファイルをインポートするもである。

**アセットパイプライン**とは、cssファイルやJavaScriptのファイルを１つにまとめ、圧縮することで処理速度を早くするための仕組みをいう。sprocketsというgemがこの機能を担っている。

##@ importとは？
@ importは、scssが用意しているメソッドである。そのため、application.scssと拡張子を変更しないと使えない。また、application.scssからscssファイルをインポートするために使用するものでもある。




＜参考記事＞
・https://matatsuna.hatenablog.com/entry/2017/12/03/150520
・http://sakamock.hatenablog.com/entry/2016/02/03/091623
【Go】gormの更新メソッドには違いがある

# はじめに
gormを使っていて、UPDATE周りのメソッドで色々違いがあったので、その備忘


# UPDATE文を発行できるメソッドの種類
* Update
* Updates
* Save
* UpdateColumn
* UpdateColumns

## それぞれのメソッドでできること

Update
Updates
* 二つの違いは引数に取れる値が違う
* before update after updateの処理が走る
* map[string]interface{}型の時は空文字やNULL値を登録できる。
* 構造体の時は構造体のdefault値(0や"")のときは無視する。

Save
* 構造体の場合、構造体の値が、たとえ0値であろうとを全て登録する
* 例外を作りたい場合や、特定のカラムだけを指定または除外したい場合はSelect(), Omit()で指定する。

UpdateColumns
UpdateColumn
* 二つの違いは引数に取れる値が違うだけ。
* 構造体の時は構造体のdefault値(0や"")のときは無視する。
* map[string]interface{}型の時は空文字やNULL値を登録できる。
* OmitとSelectでUpdateしたいorしたくない値を指定可能。

その他
Update/メソッドには
なおignore_protected_attrsが指定されていたので、何奴と思って探して見たら、ソース上はだいぶ前に削除されたパラメータだった。

この記事はこ2018年中頃に書いた記事になります。
変更されている可能性があるため、最新の実装をご確認ください。
DjangoでWebアプリを作ってみる。【vol. 05 Djangoビューを使ってHelloWorldをしてみる。】

※[こちら](https://qiita.com/TsJazz27Sumin/items/a439d6cdad6c97e02f6b)の記事の続きです。
### URLの設定
Django Girls Tutorialの[こちら](https://tutorial.djangogirls.org/ja/django_urls/)のページを参考に進めます。

`firstproject/urls.py`に新たに定義を追加します。

```python

from django.contrib import admin
from django.urls import path, include # includeのインポートを追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('edinet.urls')), # 追加
]
```

これで`http://127.0.0.1:8000/`にアクセスした場合は、`edinet.urls`に応じてルーティングされることになります。

次は、`edinet.urls`に対応した`edinet/urls.py`を作成し、以下記載します。

```py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.corporate_officer_list, name='corporate_officer_list'),
]
```

これで`http://127.0.0.1:8000/`にアクセスした場合は、`views.corporate_officer_list`が呼ばれることになります。

### Viewsの実装
次に`views.corporate_officer_list`に対応する形で`edinet/views.py`にメソッドを定義します。

```
def corporate_officer_list(request):
    return render(request, 'edinet/corporate_officer_list.html', {})
```

これで最終的にブラウザ側に返すHTMLの世界までたどり着きました。

### Templateの実装

次に`edinet/corporate_officer_list.html`に対応する形でTemplateの実装をしていきます。

`edinet/templates/edinet/corporate_officer_list.html`となるように、
フォルダの作成、そして最後にhtmlの配置を行います。

```html

<html>
    <body>
        <p>Hello World!</p>
    </body>
</html>
```

中には、お決まりの`Hello World`です。

### 動作確認

アプリを起動して確認してみたいと思います。

```
python manage.py runserver
```

サーバーを起動して、ちゃんと表示されることが確認できました。
<img width="208" alt="helloworld.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280384/758a6a4c-90cf-bff1-0ee2-06016c3a09f1.jpeg">
次は、スクレイピングに行ってみたいと思います。
MacでUnity動作中、ディスプレイを移動した時に移動先でもUnityが表示されることの解決法

# はじめに
Unityに限ったことじゃありませんが、(若干タイトル詐欺?)
同じような現象に悩んでいるの人もいるのではないかと思いメモしておきます。

MacでUnityを使用しているとき、
3本指でしゅっ...としたり、Ctrl+左右キーでディスプレイを移動した時に、
移動先でもUnityが表示されてしまい、困っていました。

Unity側の設定かと思っていたのですが、
Mac側の設定でした。

# 解決方法
Dockのオプションで割り当て先が「すべてのデスクトップ」となっているので
「なし」または「このディスクトップ」に設定します。

<img width="431" alt="スクリーンショット 2019-06-23 23.35.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236735/800cc3c7-9efc-9483-cd3b-7078a7235f91.png">


Finderとか、移行先でも常に持ってきておきたいアプリとかはすべてのデスクトップに設定しておくと良さそうです。
(わたしは各アプリの表示する場所をきめて、Ctrl+数字でディスプレイを移動する派ですが...)


# おわりに
特にいじってなかったので、Unityインストール時の初期設定だと割当先はすべてのデスクトップ担っているのでしょうか。

...わたしだけ？

割り当て先の設定は「なし」と「このディスクトップ」しか使ったことなかったので、
「すべてのディスクトップ」に設定するとこんな風になるってこと知らなかったです。
はずかしい...
各フェーズの意味について勉強

■勉強の目的


■現状の課題
・各工程でやるべきことを標準化できていない、漏れる
・なぜそれをそのフェーズでやるのかの自分なりの理解を語れない

■現状の自分の理解
0.どのようなフェーズが存在しているのか
　1.要件定義
　2.基本設計
　3.詳細設計
　4.開発
　5.単体検証
　6.結合検証
　7.総合検証
　8.ユーザー検証

1.要件定義は何のために何をすることなのか
目的:
　・業務や既存関連システムの構造の把握、設計対象の範囲と納期と必要コストの把握
何を:
　<業務要件>
　・一連の業務の完了基準は何か(ex.正しい給与計算結果の社員への公開)
  ・業務フロー(業務のINとOUT、業務の分岐パタン)の整理
　・誰が業務を行うのかの確認
　・どの部分をシステム化するのか
　・各業務はどういう情報をどのように変化させることを目的にしているか
　・各業務の業務タイミング
　・次月の業務サイクルに移る際の留意事項(ex.最新→過去に移すかどうか)
　・既存関連システムの制約事項の確認(ex.差分連携が必要か?)
　・データの保管や速度など非機能的な要望の確認
　<プロジェクト要件>
　・導入スケジュールの確定
　・工程定義
　・成果物定義
　・役割分担定義
　・変更管理ルール定義
　・設計対象の確定
　・工数見積もり
　
2.基本設計は何を何のためにすることなのか
目的:
　・ある業務を実現するためにシステムがどのようなふるまい(状態遷移、データ遷移)
　　をするべきか/実現可能かを決めて、顧客と合意すること
　・詳細設計可能な単位に設計を分割すること(サブシステムの役割分担の差配。また、要件が漏れないように注意！)

何を：
　・各業務におけるデータ遷移を定めること(どのようなレコードのどのような属性をどのように追加/更新/削除/演算するのか)
　・画面操作を伴うものは画面レイアウトと画面遷移を定めること
　・データベースの論理設計(ex.ER図の作成)
 
3.詳細設計は何を何のためにすることなのか
目的:
　・あるふるまいをするための実現方法を定めること
何を:
　・あるINからあるOUTをもたらすためにはどのようなプログラムを書けば実現できるのか設計する
　  (ex.要件:社員属性が何々の社員について、当年度の勤怠実績を累計して連携したい → 
　　    基本設計:IFの連携PGで、データベースから各月の勤怠実績を出力して、当年度の勤怠実績を累計する →
　　　　詳細設計：IFの連携PGで集計対象を当年度に絞って集計する方法(ex.レコード限定キーと条件、集計キー)の実装方法を規定する
　　)

4.開発は何を何のためにすることなのか
Windows で nim 0.20 を使う (mingw / Visual Studio 両対応)

Windows に nim 0.20 をインストールして使う手順を、mingw だけでなく、Visual Studio (VC++) を使う場合についてもまとめておきます。

# nim 本体のインストール

基本的には公式の [Windows ダウンロード／インストールページ](https://nim-lang.org/install_windows.html)の通りです。

ただ、私は普段は VC++ を使いたいので、`finish.exe` というコマンドは利用したことがなく、こんな感じでインストールしています：

* `nim-0.20.0_x64.zip`（32 ビット OS なら `nim-0.20.0_x32.zip`）をダウンロード
* 上記 ZIP ファイルをどこぞに展開
* `nim-0.20.0` というトップディレクトリが作成される（以下これを `$NIM_DIR` と呼ぶ）
* `$NIM_DIR\bin` と `%USERPROFILE%\.nimble\bin` を `PATH` に追加

ちなみに、簡単なソースのコンパイルなど、`nimble` を使わない程度の作業ならば、`$NIM_DIR\bin` が `PATH` に追加してあれば OK です。

# mingw を使う場合

同じく公式の [Windows ダウンロード／インストールページ](https://nim-lang.org/install_windows.html) に記載されている

* `mingw32-6.3.0.7z`
* `mingw64-6.3.0.7z`

の適切な方をダウンロード＆展開して、出来上がったディレクトリの `bin` を `PATH` に追加します。

これでコンパイルはできるようになっているはずです。

実際、nim の `examples` ディレクトリにある `hallo.nim` をコンパイルしてみると･･･


```
> nim c hallo.nim
Hint: used config file 'D:\(略)\nim\nim-0.20.0\config\nim.cfg' [Conf]
Hint: system [Processing]
Hint: widestrs [Processing]
Hint: io [Processing]
Hint: hallo [Processing]
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: hallo.nim
Hint:  [Link]
Hint: operation successful (14097 lines compiled; 0.942 sec total; 15.906MiB peakmem; Debug Build) [SuccessX]

> hallo.exe
Hello World
```

無事コンパイルと実行が確認されました。

# Visual Studio を使う場合

Visual Studio は既にインストールされているものとします。

Visual Studio を使ってコンパイルする場合は、 `$NIM_DIR\config\nim.cfg` をテキストエディタで開いて 11 行目あたりにある `cc` という変数の値を `vcc` に変更します。

```
cc = vcc
```

これによって、gcc の代わりに `vccexe.exe` というプログラムがコンパイラとして起動されるようになります。

`vccexe.exe` は、Visual Studio の C コンパイラ `cl.exe` の場所を探し、適切なものが見付かれば、実際のコンパイル処理を `cl.exe` に委譲します（見付からなければ当然コンパイルエラーになります）。

## Visual Studio 2015 以前

Visual Studio 2015 までは、インストール時に `VS*COMNTOOLS` という環境変数が定義されていたので、`vccexe.exe` はこれらの環境変数から自動的に Visual Studio のビルド環境バッチファイルを見つけ出し、それを実行してから `cl.exe` を起動します。

なので、`VS140COMNTOOLS` や `VS120COMNTOOLS` といった環境変数を敢えて削除していない限りは、Visual Studio の C/C++ コンパイラが自動的に検出されるはずです。

## Visual Studio 2017 以降

Visual Studio 2017 からは、Visual Studio の複数のエディションをインストールすることを考慮してでしょうか、上述の `VS*COMNTOOLS` という環境変数が定義されなくなりました。

そのため、nim 0.20.0 の `vccexe.exe` は、Visual Studio 2017 や 2019 の C/C++ コンパイラを自動認識してくれません。

この場合は、次節で説明するように、ビルド環境用のバッチファイルを手動で起動し、その中で nim を利用するのがよいでしょう。

なお、Visual Studio 2017, 2019 も検出するように改良してプルリクを投げておきましたので、次の nim のリリースからは、Visual Studio 2017/2019 のコンパイラも自動認識されるようになると思います。

## 手動で `cl.exe` にパスを通しておく（VS バージョンに非依存）

Visual Studio にはビルド環境用のバッチファイル（`vcvarsall.bat` など）が用意されています。

それらのショートカットを使って、パスなどの環境変数が適切に設定された状態にしたコマンドプロンプトで nim を起動すれば、VS のバージョンに関係なく、問題なくコンパイルできるはずです。

↓こんなやつ
![2019-06-21_11-18-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35311/9fae8895-d9ed-809c-9c32-752181356c0e.png)

なお、Visual Studio の C/C++ ビルド環境については、別記事で詳しくまとめました。

興味のある方はそちらもご参照下さい。

[「Visual Studio (up to 2019) のコマンドラインでの C/C++ コンパイル環境」](https://qiita.com/softgate/items/b9e04da8f8fc9f180855)
HTML構文の中に差し込むPHPの条件分岐

##はじめに
PHPを触ってみて２週間
ログイン機能を実装していたのだが、
ユーザー毎に機能を分けるのがうまくいかない！
**条件分岐の書き方がわからない！！**


##わかったこと
・PHPの条件分岐でわかりやすかったのは２つ

##メモ
###環境
- PHP7.3.6

###やりたかったこと
タスク管理アプリでユーザー毎に権限を与える。
HTML構文の中に差し込みたい

・**管理ユーザー**：ユーザー登録・ユーザー一覧・todo登録・todo一覧
・**一般ユーザー**：todo登録・todo一覧


### 解決
**１つ目　綺麗に区切られていて把握しやすい**

```php:
    <?php if ($sample == '○○○') : ?>
  　if文が通った時のHTMLコード
　　<?php else: ?>
  　elseの時に実行されたいHTMLコード
　　<?php endif; ?>
```

**２つ目　一般的な書き方？**

```php:
　<?php
　　if ($sample == '○○○') {
  　　print 'if文が通った時のHTMLコード';
　　} else ($sample == '○○○') {
  　　print 'elseの時に実行されたいHTMLコード';
　　} 
　?>
```


### 参考サイト
https://saba.omnioo.com/note/2134/html%E3%81%AE%E9%96%93%E3%81%ABphp%E3%82%92%E6%8C%9F%E3%82%80/
【HTM School 日本語解説】HTM Overview (Episode 0) ①

# はじめに
この記事は英語が苦手な解説者が、Youtube字幕機能とGoogle翻訳を駆使してHTM Schoolを日本語訳したものです。このクオリティでも満足できる方は是非、最後までお付き合いください。

[![HTM Overview (Episode 0)](http://img.youtube.com/vi/XMB0ri4qgwc/0.jpg)](https://www.youtube.com/watch?v=XMB0ri4qgwc)
# Matt Taylorさんのご挨拶
あなたが階層的時間記憶(Hierarchical Temporal Memory)を一から学ぶためにここにいるのなら、これはHTM Schoolですので、あなたは正しい場所にいます。

こんにちは、私はMatt Taylorです。 私はNumentaのオープンソースプロジェクトとNuPICのオープンソースコミュニティの旗手(非公式のリーダー)です。

HTMは、新皮質の神経科学から始まる人工知能へのユニークなアプローチです。私たちは脳を作り直そうとしているのではなく、新皮質における知性がどのように機能するのかを学び、同じ原理に基づいてシステムを構築しようとしているだけです。

HTM Schoolのこの最初のエピソードではHTMの概要を概説し、その後のエピソードでは詳細について説明します。あなたがフォローしたいのであれば、購読するだけで通知を受け取ることができ、エピソードを見逃すことはありません。

#大脳新皮質について(～4:56)
それでは、新皮質から始めましょう。

大脳新皮質は脳の上部にできたしわの塊で脳の75%を占めており、これは哺乳類が過去一年間から20億年の間に進化させたものです。ですから、例えば爬虫類は皮質を持っていません、これは哺乳類における発達です。それは私たちに爬虫類と鳥類のいとこたちより決定的な利点を与えます。
人間の大脳新皮質はディナーナプキンほどの大きさで厚さは2.5ミリであり、頭蓋骨の中に押し込まれているので、より多くの表面積を持つことができます。
新皮質の下にある脳のより古い部分は、睡眠や食事、性別、愛、感情などの基本的な生活機能に関わっています。しかし、それらは知的ではありません、脳のそれらの古い部分は本当の知性を表していません。
あなたを構成するものはすべてあなたの記憶が保存されている大脳新皮質にあり、そこに今までに学んだ教訓があります。それがあなたのアイデンティティであり、それがあなたの知性です。

新皮質は脳内の知能の座と考えられています。あなたが自分の新皮質のスライスを脳の中のたくさんの異なる場所から切り取って、顕微鏡でそれらすべてを見たならば、あなたは驚くべき何かを見るでしょう。
切り取ったそのシートの各スライスのセル構造は、切り取った場所に関係なくほぼ同じになります。ですから、あなたが脳の視覚処理部分、聴覚処理部分、あるいは言語生成部からそれを取ったならば、あなたはその構造が同じであることが分かるでしょう。
したがって、これは、世界からすべての感覚情報を得ているときに脳が解決している問題のタイプは非常に似ており、新皮質のあらゆる部分で情報を扱うときに同じ皮質構造と同じアルゴリズム推論を持っていることを示しています。

あなたの新皮質は数十の領域に分割され、これらの領域は白質を通過する神経線維の束を介して接続されています。これらの領域は階層構造で論理的にリンクされており、生の知覚データまたは目や耳からのより低レベルのタイプのデータがその階層のより低いレベルに現れます。そして、下位レベルのノードによるプロセスでは、これらのノードの出力は、皮質全体でこの共通の構造のために同じ方法で処理され、階層の上位レベルに渡されます。そして出力はその階層を登り続け、時間が経つにつれて概念が理解され、より抽象的でそしてより恒久的になります。

例えば、あなたの脳が物の絵を見ているとき、物事のエッジや境界を決定することに階層のより低いレベルが関与しているかもしれず、そしてその上の階層は形状認識であり、さらにその上の階層はオブジェクト認識かもしれない。そして、階層の抽象レベルが高くなるにつれて、それらのオブジェクトをアイデア、モノ、アクティビティと関連付けたり、それらを他の記憶や、皮質の他の部分に格納されているアイデアと関連付けたりすることができます。

HTM理論は、すでに示唆したように、皮質全体に共通のプロセスがあるという考えに焦点を当てています。だから私たちは、すべての異なる感覚入力についてそれらがどのように処理されるのかは気にしていません。
網膜がどのようにデータを処理するのか、または蝸牛がどのようにデータを処理するのかについては気にしていません。新皮質の立場からすると、これらの感覚のどれからの入力もすべて本質的に同じであるからです。それがどこから来ていようとも、それはその入力に対して同じタイプの機能と操作をします。
PHPの制御構文について

<article>
こんにちは！<br>

私は普段からよくPHPを使うのですが、オライリー社の「プログラミングPHP」を<br>
読んでいてへー！となったPHPでの記述方法があったので<br>
それについて備忘録的に書きます。<br><br>

普段私は制御構文を書く場合は
</article>

```ruby:test.php
if([条件式]) {
   // 処理
}
```

<article>
みたいな書き方をするのですが
</article>

```ruby:test.php
if([条件式]):
   // 処理
end if
```

<article>
みたいな書き方もできるとの事でした！！<br>
もしかするとPHPの常識なのかもしれないですが、この記述方法をしている<br>
現場にいまだかつて出合った事が無いので今回書いてみました。<br>
ちなみにこの書き方ですが
</article>

<ul>
    <li>if</li>
    <li>switch</li>
    <li>for</li>
    <li>foreach</li>
    <li>while</li>
</ul>

<article>
で利用できるようです。（ご指摘がありSwitch文も追加しました。）<br>
とても勉強になりました。

</article>
Docker for Windowsでconda createする

(自分用メモに作ったmarkdownをうっかり消す可能性があるので、Qiitaへ公開します。)

# DockerのWindows10での使い方

## そもそも

そもそも論としてWindows ProでないとHyper-Vを有効化できない。Hyper-VはDocker起動に必須の仮想化技術のことを指す。そのため、DockerのためにはWindows Proを開いていることが事前条件となる。

なお、本稿ではDocker for Windowsをインストールしている前提で話を進めます。他の記事をご参照ください。

## 手順

以下で`docker`で始まるコマンドは全てWindows Powershell上で実行します。涙が出そう。

1. OSの鋳型(image)を取ってくる: e.g. `docker pull ubuntu:latest`, `docker pull continuumio/miniconda`
1. マウント(`-v`オプション)する場合には、Docker for Windowsを開いてディスクを共有可能にしておく[c.f. Qiita記事](https://qiita.com/kikako/items/7b6301a140cf37a5b7ac)
1. OSの複製を作る/OSを具体化する(コンテナを作る): `docker run --name paul -v c:/host/machine/path:/NEW_OS_LOCATION -it continuumio/miniconda /bin/bash`
  1. `--network host`をつけないとVMから外へ、特にSSL通信ができないので注意。
1. コンテナを起動する: `docker start paul`
1. 適宜コマンドを実行: `docker exec -ti paul /bin/bash`, `docker exec -ti paul sh -c "echo brabrabgrabar"`
1. 全作業が終わったら...
  1. とりあえずコンテナを停止する: `docker stop paul`
  1. コンテナを消すことも可能: `docker rm paul`

```shell:使用例
docker run --name signac -v d:/pythonprojects/doc2vec:/data -it continuumio/miniconda /bin/bash
docker start signac
docker exec -ti signac sh -c "echo aaaaaaaaaaaaaa"
docker exec -ti signac sh -c "conda env create -f /data/environment.yml"
```

## continuumio/miniconda補足

`vim`や`vi`コマンドがありません。デフォルトで`~/.bashrc`の中に`source activate base`が書いてあります。編集できない場合は`sed -i -e 's/base/YOUR_CONDA_ENV_NAME/g' ~/.bashrc`などと実行すれば大丈夫です。

## Command and Error Message

`conda create` が弾かれる場合があります。いろいろ調べましたが、port-forwardの設定かと思いきや、使用しているWi-Fiネットワークがproxy設定を必要とするから、というのが原因でした。

本当はproxy設定を調べてdockerに認識させるべきです。悪手として、フリーWi-Fiに繋ぐという対応があります(proxy周りをまだ理解していないため)。

```shell:うまくいかない
docker exec -ti signac sh -c "conda env create -f /data/environment.yml"
Collecting package metadata: failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json.bz2>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

ConnectionError(MaxRetryError("HTTPSConnectionPool(host='repo.anaconda.com', port=443): Max retries exceeded with url: /pkgs/main/linux-64/repodata.json.bz2 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7fc2d4784210>: Failed to establish a new connection: [Errno 111] Connection refused',))",),)
```
arXiv APIのPython wrapperを使うときの注意点

[前回の記事](https://qiita.com/tomo-wb/items/38eda141b095948ff220)でACL2019に採択された論文でarXivに上がっているものをリストとして公開したが、そのとき少しだけつまづいたところについて書く。ほんのメモ書く程度。

やったこととしては大したことは特にしていなくて、[ACLのaccepted papersのページ](http://www.acl2019.org/EN/program.xhtml)からタイトルを抜き出して、あとはarXivのAPI（今回は[Python wrapper](https://github.com/lukasschwab/arxiv.py)）を使って、タイトルを検索するだけ。
気持ちはこんな感じ。

```python
import arxiv
res = arxiv.query(query=title, max_results=100)
for r in res:
    arxiv_title = r["title"]
    if title == arxiv_title:
        hogehoge
```

arxiv_titleには"\n"のような改行が含まれていたりするから、そのあたりは正規表現とかで変更。
気をつけないといけないのは、arxiv.queryでタイトルで検索するとき。このとき、"!"など一部の特殊な文字が含まれていると意図した検索結果が返ってこない。正直うまくいかない全ての文字を列挙するのは大変なので、ある程度の文字が一致して入れば検索できるだろうということで、逆に検索に使う文字を限定してしまう。

```python
use_char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%&():;? "
ch = list(filter(lambda x: x in use_char, text))
title = "".join(ch)
```
こうすることで、「Learning from Dialogue after Deployment: Feed Yourself, Chatbot!」が「Learning from Dialogue after Deployment: Feed Yourself, Chatbot」になってなってtitleの中に入るので、api経由で検索しても大丈夫になる。

大量に何かすることがなければタイトルで検索してということは、普通にブラウザの方で検索すればいいので使う機会は少ないかもしれないが、PDFを一括でダウンロードしたりとか他のapiと連携させれば楽に作業ができるようになるので使う機会がどこかであるかもしれない…
nodistでNode.jsのバージョン変えてもnode -vでバージョン確認できない

# やりたいこと
nodistでNode.jsのバージョンを切り替えてローカル環境開発したい

# 事象
### バージョン確認してみる
一見して問題ないように見える

```:コマンドプロンプトorPowerShell
PS C:\Users\take> nodist -v
0.9.1
PS C:\Users\take> npm -v
6.4.1
PS C:\Users\take> node -v
v10.15.3
PS C:\Users\take>
```

### nodistでインストールしているNode.jsを確認してみると
あれ？`node -v`コマンドだとv10.15.3だったはずなのにnodistで入ってるNode.jsは11.13.0ってことになってる。

```:コマンドプロンプトorPowerShell
PS C:\Users\take>nodist
  (x64)
> 11.13.0  (global: v11.13.0)
PS C:\Users\take>
```

### nodistでバージョンを変えてみると
nodistでバージョンを変えてv6.9.2にしたはずなのにやっぱり`node -v`だとv10.15.3が表示される

```:
PS C:\Users\take> nodist add v6.9.2
 6.9.2 [===============] 18078/18078 KiB 100% 0.0s
6.9.2
PS C:\Users\take> nodist v6.9.2
v6.9.2
v6.9.2 (global)
PS C:\Users\take> nodist
  (x64)
> 6.9.2  (global: v6.9.2)
  11.13.0
PS C:\Users\take> nodist npm match
npm match
https://codeload.github.com/npm/cli/tar.gz/v3.10.9 [============== ] 3057/3281 KiB 93% 0.1s
PS C:\Users\take> node -v
v10.15.3
PS C:\Users\take>
```

# 原因
私は以前に[この方法で](https://qiita.com/taketakekaho/items/9710294c6f3c46ee6024)ローカルに直接Node.jsをインストールしていて、環境変数にも`node`コマンド打つとC:\Program Files\nodejsにあるnode.exeが反応するようになってしまっているからでした。
環境変数を見てみるとシステム環境変数のPath変数に確かにC:\Program Files\nodejsが登録されてます。これが原因でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/852b738b-e385-deed-e1e5-a262fcb27b33.png)

[nodistのREADME.md](https://github.com/nullivex/nodist)にはこう書かれています。

>Nodist was designed to replace any existing node.js installation, so if node is already installed on your machine, uninstall it first.
【訳】Nodistは、既存のnode.jsインストールを置き換えるように設計されていますので、nodeがすでにマシンにインストールされている場合は、まずそれをアンインストールしてください。

# 対処
Node.jsのアンインストール
Windowsの[スタート]からNode.jsフォルダの中にある[Uninstall Node.js]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/fed3fce7-e8a8-aef3-cada-a9b767339b01.png)
アンインストールしますか？と聞かれるので[はい]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/53a468e5-68ea-1f1e-89a5-a08ce4402481.png)
1分くらいでアンインストールが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/e7fd303d-0159-beb6-57c4-69bacd80e16c.png)
C:\Program Files\nodejsフォルダも環境変数も自動で削除されました。

# 確認
大丈夫そうです。

```
PS C:\Users\take> node -v
v6.9.2
PS C:\Users\take> nodist
  (x64)
> 6.9.2  (global: v6.9.2)
  11.13.0
PS C:\Users\take> 
```
AWS SAMのローカル環境での使い方とデバッグ方法

例として、sampleappという名前でアプリを生成します。

-nオプションで名前をつけられます

```shell
$sam init -n sampleapp
[+] Initializing project structure...

Project generated: ./sampleapp

Steps you can take next within the project folder
===================================================
[*] Invoke Function: sam local invoke HelloWorldFunction --event event.json
[*] Start API Gateway locally: sam local start-api

Read sampleapp/README.md for further instructions

[*] Project initialization is now complete

```
こんな感じになっていればおk。

実際に実行するコードは、sampleapp/hello-world/app.jsに書かれているのですが、
作成した、sampleappディレクトリまで移動し、以下のコマンドを実行することで、sampleapp/hello-world/app.jsを実行することができます。

```shell
$ cd path/to/sampleapp
$ sudo sam local invoke -e event.json
~~~~~略~~~~~
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
```
値が帰って来ればOKです。

この時指定する「event.json」の正体は、Lambda関数がコード内(今回でいうapp.js)から呼び出せる値です。
例えば、event.jsonが以下のようなファイルだった場合、app.jsでは、「event.headers」で中身全てが、「event.headers.Accept-Encoding」とすると、「gzip, deflate, sdch」が取得できるようになっています。

```event.json
{
  "headers": {
    "Accept-Encoding": "gzip, deflate, sdch",
    "X-Forwarded-For": "127.0.0.1, 127.0.0.2",
    "X-Forwarded-Port": "443",
    "X-Forwarded-Proto": "https"
  }
}
```

#では、event.jsonは何か
では、event.jsonは何かということですが、
実際にAWS Lambdaにアップする際には、samではなく別のフレームワークを使ってデプロイします。

デプロイする時には、

・実際にそのLambda関数はどのタイミングで実行するのか(cron)
・定数
・状態

などを設定できるのですが、その「定数」の部分に当たります。

デプロイしたものであればそれらの値ははもちろん、AWSの画面から確認できますが、今回はローカルなので、そんなものはAWSの画面を確認してもありません。

「AWSに定数が設定されていないから、ローカルでは、「event.json」に書かれている内容をそれだと思ってやってね」

的なやつです。


#デバッグの方法

chrome dev toolを使いたいと思います。
まずは、以下のコマンドを実行します。

```shell
$ sudo sam local invoke -e event.json --debug-port 5858

2019-06-23 22:56:16 Invoking app.lambdaHandler (nodejs8.10)

Fetching lambci/lambda:nodejs8.10 Docker container image......
2019-06-23 22:56:19 Mounting /Users/yournama/sampleapp/hello-world as /var/task:ro,delegated inside runtime container
Debugger listening on ws://0.0.0.0:5858/1vanSLFjvasakvasnav8b
For help see https://nodejs.org/en/docs/inspector
```
こんな画面が出てきて動作が停止すると思うので、次に
chromeを立ち上げ、「chrome://inspect」に行きます。

<img width="465" alt="スクリーンショット 2019-06-23 22.57.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/e97cef8c-dc08-5a68-1f4c-6dcc1e6fabcd.png">

ここのDiscover network targetsの右にあるconfigureを開きます。

そして、「localhost:5858」と入力してください。

<img width="677" alt="スクリーンショット 2019-06-23 23.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/68293932-a3a0-db89-010c-0ca2cd393649.png">


Remote Targetの下にある、inspectを押して、デバッグをすることができます。
コードの中に、「debugger;」と入力して、再度コマンドを打ち直すと「debugger;」と入力した場所でちゃんと止まってくれました。
(devtool上で行数がかかれてあるところを押すおなじみの方法をやったのですがダメでした。
わかる人いれば教えてください。)
vue-star-ratingがNuxtで正しく表示されない原因として考えられること

## vue-star-ratingがNuxtで正しく表示されない原因として考えられること
結論: NuxtのPWAモジュールをOFFにする

vue-star-ratingがNuxtで正しく表示されない現象が起こりました。初回アクセス時は大丈夫なのですが、リロードすると表示されません。
また、キャッシュをクリアすると正常に動いていました。

詳しいことは調べられていないのですが、NuxtのPWAモジュールを使っていることが原因でした。

急いで直したい方は、`nuxt.config.js`でNuxtのPWAモジュールをOFFにすると良いです。
詳しい原因が分かりましたらまた更新します。コメントもお待ちしております。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Rails 5.2系 protect_from_forgery設定(csrfを対策を解除する)

# csrfを対策を解除する

5.2以前は`protect_from_forgery `が`application_controller.rb`に書いてあり、コメントアウトで解消していたが、5.2以降は以下の記述を追加することで、対応

~~~ ruby:application.rb
module TodoSample
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.

    # 以下の行を追加
    + config.action_controller.default_protect_from_forgery = false 
  end
end
~~~
UiPath Orchestrator テナントログイン方法

意外なところに躓いたのでメモしました。

現在、UiPathアカデミーのOrchestrator 2016.2トレーニングのトレーニング環境は利用できません。


> Orchestratorトレーニング手順
> 以下のステップに従って、Orchestratorのトレーニング環境で新規のテナントを作成しましょう。

> https://lts-platform.uipath.com/

よって、以下のリンクから無料で作成できるOrchestratorアカウントを作成します。

https://platform.uipath.com/

参考：https://www.edureka.co/blog/uipath-orchestrator/


ただし、ログイン後の画面は参考リンクにも説明がありません。
この画面はシステム管理者画面と呼ばれるもので、具体的にはテナント画面の追加や削除を行うためのものです。

・システム管理画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/420085ce-24d2-4cee-bc2d-ddb58af4aa2c.png)

よって、テナントへ画面に入るためには、サイドバーのSERVICESを選択して、Defaultとなっているリンクをクリックすることで、テナント管理画面が表示されます。

・システム管理画面　SERVICES -> [UserName]Deafault
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/5dbfbb08-9bae-2480-0937-7413958f0f5f.png)

・テナント管理画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/9ac145fc-306d-6d69-e5fc-930b287b7f2e.png)
Swift：macのディスク使用量を取得する

```swift
func usage() {
    let url = NSURL(fileURLWithPath: "/")
    let keys: [URLResourceKey] = [.volumeTotalCapacityKey, .volumeAvailableCapacityForImportantUsageKey]
    guard let dict = try? url.resourceValues(forKeys: keys) else {
        return
    }
    let total = (dict[URLResourceKey.volumeTotalCapacityKey] as! NSNumber).int64Value
    let free = (dict[URLResourceKey.volumeAvailableCapacityForImportantUsageKey] as! NSNumber).int64Value

    let totalStr = ByteCountFormatter.string(fromByteCount: total, countStyle: ByteCountFormatter.CountStyle.decimal)
    let freeStr = ByteCountFormatter.string(fromByteCount: free, countStyle: ByteCountFormatter.CountStyle.decimal)
    let usedStr = ByteCountFormatter.string(fromByteCount: total - free, countStyle: ByteCountFormatter.CountStyle.decimal)
    
    Swift.print("Total: \(totalStr), Free: \(freeStr), Used: \(usedStr)")
}

// Total: 1 TB, Free: 637.46 GB, Used: 362.78 GB
```
Visual Studio Codeでgit

#

# gitコマンド in VS code

Visual Studio Codeでgitを使う際に、これだけは知っておきたいと個人的に思っているコマンドリスト。
Visual Studio Codeではコマンドパレットからgitコマンドの実行ができるので、ショートカット（`Ctrl+Shift+P` or `F1`）は覚えておいたほうが良い。コマンドパレットに`git`と入力すると、どんなコマンドが実行できるか見ることができる。
また、`Ctrl+Shift+U`でアウトプット画面を表示して、どんなgitコマンドが実行されているか見ることができる。が、想像していたコマンドよりも複雑なことをしているので、勉強しないと理解できん:sweat_smile:

|gitコマンド      |VS Codeコマンド           |備考                  |
|-----------------|--------------------------|---------------------|
|git config --global user.email "name@test.com"|-|メールアドレスの登録|
|git config --global user.name "My name"|-|名前の登録|
|git init         |Git: Initialize Repository|リポジトリの初期化     |
|git add          |Git: Stage Changes        |ステージングへ遷移     |
|git add -A       |Git: Stage All Changes    |変更したファイル全てをステージングへ遷移|
|git commit       |Git: Commit               |変更のコミット         |
|git commit -A    |Git: Commit All           |全てのファイルの変更のコミット         |
|git branch       |Git: Create Branch...     |ブランチの作成         |
|git checkout     |Git: Checkout to...       |作業ブランチの変更     |
|git checkout -b [branch_name] [origin/branch_name]     |Git: Create branch from...     |リモートブランチのローカルレポジトリへのチェックアウト|
|git merge        |Git: Merge Brach...       |現在のブランチに指定ブランチをマージ|
|git clone        |Git: Clone                |レポジトリのクローン   |
|git push         |Git: Push                 |ローカルブランチをリモートリポジトリへpush|
|git pull         |Git: Pull                 |リモートリポジトリをローカルブランチへpull|
|git rebase       |Git: Pull (Rebase)        |ローカルブランチをRebase(*1)|
||Git: Rebase Branch...|ローカルブランチを指定のブランチにRebase|
*1
ローカルブランチはリモートブランチをトラッキングしている必要がある。
トラッキング状態の確認、設定は下記のgitコマンドで可能

```bash
# git status -sb 
# git branch -u origin/develop （ローカルのチェックアウト済みブランチをorigin/developをトラックするように設定）
```

# コミット時の複数行コメント
コミット時に複数行のコメントを入力することができる。画面左の`Source Control`アイコンをクリックし、左上のエディットボックスにコメントを入力する。`Enter`キーを押すと改行される。コメント入力後、`Ctrl+Enter`でコミットする。
コマンドパレットから`Git: Commit`を実行時に表示されるコメント入力ボックスでは、改行できないので注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/b4221c50-5c82-0f1d-5e8e-21b4f75c081a.png)

# リンク
## Download Git
自分の使っているPlatform用gitをダウンロード。VS Codeで使うには、version 2.0.0以降が必要。
[Git](https://git-scm.com/download)

## gitの使い方関連
[Pro Git日本語版](https://git-scm.com/book/ja/v2)
[GIT CHEAT SHEET](https://github.github.com/training-kit/downloads/github-git-cheat-sheet.pdf)
pandasのindexはdatetimeにすると便利

# はじめに
時系列を含むデータをpandasで処理する場合、indexにdatetime型を指定すると便利だったので、
備忘録的にまとめます。

## 使用データ
ネット上で拾ってきた2010年から2019年までの時系列データを使用します。

```python
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")
df.head()
```

| date | A | B |
|:--|--:|--:|
| 2010-04-01 | 93.74 | 1859.96 |
| 2010-04-02 | 94.61 | 1859.96 |
| 2010-04-05 | 94.28 | 1836.82 |
| 2010-04-06 | 93.64 | 1839.07 |
| 2010-04-07 | 93.21 | 1800.12 |

# ここが便利
## 1. 日付を指定することで、データを選択できる。
indexにdatetime型の方式で日付を指定すると、指定範囲のデータを取得できる。

年の指定

```python
df["2011"].head(2)
```

| date | A | B |
|:--|--:|--:|
| 2011-01-03 | 81.67 | 1663.29 |
| 2011-01-04 | 82.06 | 1659.39 |

月の指定

```python
df["2011-3"].head(2)
```

| date | A | B |
|:--|--:|--:|
| 2011-03-01 | 81.92 | 1424.76 |
| 2011-03-02 | 81.84 | 1374.43 |

## 2.範囲指定もできる。

スライスによる範囲指定もできる

```python
df["2012-04":"2012-05"]
```

| date | A | B |
|:--|--:|--:|
| 2012-04-02 | 81.64 | 1654.39 |
| 〜〜 | 略 | 〜〜 |
| 2012-05-31 | 78.36 | 1471.49 |

## 3.特定の月(日)だけ抜き出す
8月だけ抜き出すというような処理も可能です。

```python
df[df.index.month == 8]
```
| date | A | B |
|:--|--:|--:|
| 2010-08-02 | 86.53 | 1509.63 |
| 2010-08-03 | 85.88 | 1527.62 |
| 〜〜 | 略 | 〜〜 |
| 2018-08-30 | 110.98 | 2840.16 |
| 2018-08-31 | 111.04 | 2840.16 |

## 4.年月日ごとに計算を行う。
```python
# 年なら'y'、日なら'D'を指定してください。
# もちろんmeanを他の計算メソッドに当てても計算できます。
df.resample('M').mean()
```
| date | A | B |
|:--|--:|--:|
| 2010-04-30 | 93.455909 | 1784.934091 |
| 2010-05-31 | 91.914762 | 1684.609048 |
| 〜〜 | 略 | 〜〜 |

# 参考サイト様
https://note.nkmk.me/python-pandas-rolling/
https://towardsdatascience.com/basic-time-series-manipulation-with-pandas-4432afee64ea
macOSでblueray


https://www.videolan.org/vlc/index.ja.html

AACSの復号ライブラリをインストールして、VLCメディアプレーヤーで市販・レンタルのブルーレイを再生する方法
https://japanesesoft.com/play-blu-ray-with-vlc-media-player/

https://vlc-bluray.whoknowsmy.name

<img width="536" alt="スクリーンショット 2019-06-23 22.33.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/e9ee89ae-28b4-f98e-9bbe-558d99c4b740.png">
【超初心者の備忘録】 CentOS7でWindows10を使いたい

# はじめに
五十の手習で踏み込んだITの世界。 あまりの進歩のスピードについていけず万年「超初心者」。しかし、高齢化社会になればGサンもBAさんも「そんなん知らん！」では済まされない。 恥を偲んで前進あるのみ。 今回は、「仮想化」なるものに挑戦。

# CentOSでWindows10を動かす
## 背景
自宅にPCサーバーに、2TBのディスクを二つ。 一つをWindows、もう一つをLinux(CentOS7)にして、ブートで切り替えて使っている。
最近、LinuxでElasticやAIを勉強する機会が増えてきた。 今や、Chromeを使えば、メールやドキュメントは殆どウェブ上で事足りる。 OSなど意識しなくても、やりたいことができるようになってきた。
しかし、それでも、時々Windowsでしか動かないアプリがある。
最近、ハマっているのがSimpleMind。 iPhoneで動くので、ポッとわいたアイディアを書留たり、噛った新しい知識を整理したりするのに重宝している。 Linuxで遊んでいる時にSimpleMindにメモったことを参照したい時が多くなってきた。 
LinuxでWindowsのアプリを使う方法を探して辿り着たのが、「仮想化」。 又々、大岩（トライアルで言うところの難関）に出くわしたかと思ったが、世の中に親切な人が沢山いる。 どうやら、簡単に目的が達成出来そうだ。 弱ったメモリー（脳味噌）を補うために書き留めておく。

## 試行錯誤
いつものようにググって基礎知識を集めて、出来そうなところから試してみる。 
最初は、GNOMEのシステムツールにある「仮想マシンマネージャー」からやってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/a651ef97-a83e-955a-1db4-661c8248ee06.png)

が、ここで躓いた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/5cf76ed4-5625-f0aa-e221-a71f2d338d01.png)

しばし、頭を抱えて思考停止。 ぼんやり画面を眺めていると、「Boxes」と書かれたアイコンに目が止まる。 恐る恐るクリックしてみると、なにやらユーザーフレンドリーがウィンドが立ち上がった。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/607612a3-a641-9653-a80a-4d4cce2966c1.png)
さらに勇気をもって「新規」のボタンを押してみると、なんと！
「Microsoft Windows10」と表示されているではないか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/c59d5c43-2f97-0cea-cc09-ae745af4f5eb.png)


ここで、ちょっと立ち止まってBoxesについて少し調べる。 参考：[Gnome Boxes – A Front-end Tool For QEMU And KVM](https://www.unixmen.com/gnome-boxes-a-front-end-tool-for-qemu-and-kvm/)
どうやら、Boxesは、VM（QEMUとKVM）の初心者用のフロントエンドだと分かった。 「Windows10」と表示されていたのは、先にマイクロソフトからダウンロードしていたisoイメージファイルを見つけてくれていたからだ。 正に、超初心者向け！

## Boxesを使ってWindows10を仮想化をセッティングー
1. マイクロソフトのサイトから、ISOをダウンロードする。保存先は、Downloadsが良いようだ（直感）。
2. Boxesを起動
3. 「新規」のボタンをクリック
4. 「かんたんインストール」がオンの場合は、必要な項目を埋める
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/892969b5-7621-c39e-c10f-0e4d64b2e03e.png)
 
5. 「続行」をクリック。 Boxesを信じてひたらすら待つ。 計り忘れたが、凡そ1５分くらい。
6. なんと、途中に何も手を加ずWindows10のインストールが完了。 ネットも繋る状態で起動した。 DVDドライブも認識している。 
7. あとは、必要なアプリをインストールして完了。

周辺機器と繋げるためにあーだこーだ、ブリッジ接続がなんとかかんとか、とググってビビっていたが、拍子抜けするくらい簡単にインストールができてしまった。

# まとめ
- GnomeのBoxesを使えば、高度な知識や難しい操作を必要とせず、ほぼ全自動でCentOSに仮想環境が造られ、さらにWindows10がインストールされる
- 動作
    - 今のところ特に問題なし。 やはり、CPUの使用量が高いが、操作上はイライラするほど遅くはない。 Linux上の作業がメインで、参考程度にWindowsを使う分には満足。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227550/912fb881-dba7-da44-9a78-64b9923240b7.png)
- 環境
    - サーバー
    - 富士通 PREMERGY TX100 S3
    - HDD: 1TB x 2 (Linux用に1TB)
    - CPU： Intel(R) Celeron(R) CPU G550 @ 2.60GHz x 2
    - Memory: 10GB
- OS
    - CentOS Linux release 7.6.1810 (Core)
Swift 動画の音が消える

##　11秒以上の動画の音が消える現象

AVCaptureMovieFileOutputのmovieFragmentIntervalがデフォルトで10秒となっているらしい。

撮影前の設定としてmovieFragmentIntervalを以下のように変更する。

```swift
let fileOutput = AVCaptureMovieFileOutput()

output.movieFragmentInterval = CMTime.invalid
```


参考： [Stack Overflow: No sound if video is more then 12 seconds [duplicate]](https://stackoverflow.com/questions/42891060/no-sound-if-video-is-more-then-12-seconds)
Docckerfileを使ってimageを作成する方法

今回は例としてnodejsのスクリプトを実行するイメージを作成したいと思います。

まずは、実行時のコマンドの紹介
#イメージの生成
dockerfileを用いてdocker imageのbuild
(dockerfileにはあらかじめベースイメージやコマンドなどを書いておく)

```shell:
$docker build -t 生成するイメージ名(:タグ名） dockerfileの場所（絶対パスor相対パス）
e.g) $ docker build -t sample .
```

これで、dockerfileファイルからsampleというイメージが作成される

#作成したイメージの実行

```shell:
$docker run --rm -it image名
e.g)$ docker run --rm -it sample
```

#イメージの生成=>実行をワンライナーで

これをワンラーナーでやるには

```shell:
$docker run --rm -it $(docker build -q .)
```

--rm は実行した後にimageを削除してくれるオプションです。

#nodeを実行するサンプル
[コードはこちら](https://github.com/wjtnk/node_ondocker)
「ローカルマシンにnodeを入れたくないけど、このサンプルコードだけは動かしたい！」みたいなとき。
まずは、node_ondockerという親ディレクトリを作成し、
その中にDockerfileと、実行したいスクリプトを格納するディレクトリnodeを作成します。

```shell:
$mkdir node_ondocker
$cd node_ondocker
$touch Dockerfile
$mkdir node && touch node/test.js
```

Dockerfileを編集します。

```yaml:Dockerfile
#「node:10.13-alpine」というイメージを取得します
FROM node:10.13-alpine
#ホストのディレクトリをコピー
COPY ["node","/node"]
#先ほどコピーしたディレクトリで次のCMDコマンドを実行したいので作業ディレクトリを/nodeに移動します
WORKDIR /node
#$node test.js　というコマンドを実行します。
CMD ["node","test.js"]
```

このDockerfileは、
「node:10.13-alpine」というイメージを取得します

test.jsこんな感じ

```js:test.js
console.log("hello world");
```


そして、以下のコマンドを打つと、test.jsの中身が実行されます！

```shell:
$docker run --rm -it $(docker build -q .)
```
VS codeのショートカットキーまとめ

はじめに
---
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[小栗](https://qiita.com/keitaro-o)です。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
自分が便利だと思うショートカットキーを常に更新していきます。


エディタの切り替え
===

Ctrl + PageUp
Ctrl + PageDown

タブの移動ができる。

ターミナルを開く
===

Ctrl + @

行頭 / 行末に移動する
===
Home / End

単語ごとに 移動 / 選択
===
Ctrl + 左右Arrow / Ctrl + Shift + 左右Arrow

複数キーで編集（マルチカーソル）
===
Ctrl + Alt + 上下Arrow
Ubuntuのバージョン・CPU・GPUを確認するスクリプトを作成しました

# はじめに
今まで何度も何度もUbuntuのマシンスペックを確認してきたのですが，それらのコマンドを覚えられず毎回コマンドを調べていました．

スペック確認を楽にしたかったので，それを一発で調べてしまえるスクリプトを作成しました．

# 完成したスクリプトファイル
以下は，Ubuntuのバージョン・CPU・GPU（NVIDIA製）を一覧として調べるものである．

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

echo
lsb_release -a 2>&1 | grep 'Description'
cat /proc/cpuinfo | grep -m 1 -i 'model name'
lspci | grep -i NVIDIA
echo
```

# 出力例
手元にGPUの載っているPCがなく，その場合の出力は以下である．

```sh:sample_output
$ bash ./checkMachine.sh

Description:	Ubuntu 16.04.6 LTS
model name	: Intel(R) Core(TM) i5-4300U CPU @ 1.90GHz

```

しっかりとUbuntuのバージョンとCPUの情報が出力された．

# 参考
- [Linuxでコマンドラインからマシンスペックを確認する方法](https://qiita.com/DaisukeMiyamoto/items/98ef077ddf44b5727c29)
- [UbuntuのOSやCPU, GPUの情報を確認するコマンド](https://qiita.com/sabaku20XX/items/97db2c0bf7298e3a645c)
Tips: Windowsで便利だなと思うショートカットキー

##概要
コンピュータは、[約50年前のマウスの発明](https://en.wikipedia.org/wiki/Computer_mouse#History)により使いやすくなりました。
とはいえ、文字入力にはまだまだキーボードが必須であり、キーの組み合わせにより様々な操作を直ぐに実行できるような工夫も並行して実施されてきました。
ショートカットキーをマスターすれば、TVドラマのハッカーのように作業が格段に速くなるかも知れません。

本投稿では、そんなショートカットキーのうち、筆者がWindowsにおいてよく使うものを紹介します。

##ショートカットキー一覧
####基本の基本
まずは誰もが普段から利用しているであろうコピペに関わるショートカットキーです。

|キー|効果|対象|
|:--|:--|:--|
|[Ctrl]+[A]|すべて選択|テキスト、あらゆるオブジェクト|
|[Ctrl]+[C]|選択部分をクリップボードへコピー|テキスト、あらゆるオブジェクト|
|[Ctrl]+[X]|選択部分を切り取り、クリップボードへコピー|テキスト、あらゆるオブジェクト|
|[Ctrl]+[V]|クリップボードから貼り付け|テキスト、あらゆるオブジェクト|
|[Ctrl]押したまま|複数選択|あらゆるオブジェクト|
|[Shift]押したまま|範囲選択|テキスト、あらゆるオブジェクト|

####デスクトップ・エクスプローラ
デスクトップ上やエクスプローラ上で使用可能なショートカットキーです。Windowsキーを使用したものが多いです。
* この中で特に活用しているのが、[Ctrl]+[N]です。エクスプローラで「今のフォルダも開きながら一つ階層を遡って他のフォルダも開きたい」なんていう時に使えます。
* [Win]+[R]もよく使いますが、筆者は専ら "cmd"（コマンドプロンプト）を開く専用にしか使っていません。エクスプローラのアドレスバーでネットワークフォルダは開けますし、プロンプト画面で大抵のプログラムは起動できます（環境変数の%PATH%に登録されたディレクトリに配置されていれば）。

|キー|効果|対象|
|:--|:--|:--|
|[Win]+[R]|ファイル名を指定して実行|Windowsデスクトップ画面上|
|[Win]+[E]|エクスプローラを起動|Windowsデスクトップ画面上|
|[Win]+[D]|デスクトップの表示|Windowsデスクトップ画面上|
|[Win]+[L]|ロック画面|Windowsデスクトップ画面上|
|[Ctrl]+[N]|エクスプローラ画面を複製|エクスプローラウィンドウ上|
|[Win]+[↑]|ウィンドウを最大化※|任意のウィンドウ|
|[Win]+[↓]|ウィンドウを最小化※|任意のウィンドウ|
|[Win]+[←]|ウィンドウを画面左側半分に表示※|任意のウィンドウ|
|[Win]+[→]|ウィンドウを画面右側半分に表示※|任意のウィンドウ|
|[Alt]+[F4]|アプリケーションの終了|任意のウィンドウ|

※ショートカットキーを押したときのウィンドウの大きさの変化
[Win]+[↑] … 最小化 ⇒ 通常の大きさ ⇒ 最大化
[Win]+[↓] … 最大化 ⇒ 通常の大きさ ⇒ 最小化
[Win]+[←] … 右側 ⇒ 通常の大きさ ⇒ 左側
[Win]+[→] … 左側 ⇒ 通常の大きさ ⇒ 右側

####ファイル編集画面
Officeやテキストエディタなどの各アプリケーションで、ほぼ共通して採用されているショートカットキーです。

|キー|効果|対象|
|:--|:--|:--|
|[Ctrl]+[N]|新規作成|各アプリケーション|
|[Ctrl]+[O]|ファイルを開く|各アプリケーション|
|[Shift]+[Ctrl]+[S]|名前を付けて保存|各アプリケーション|
|[Ctrl]+[S]|上書き保存|各アプリケーション|
|[Ctrl]+[F]|検索|各アプリケーション|
|[Alt]+[(各頭文字)]|メニューを展開する|各アプリケーション|

####Microsoft Office
Office特有のショートカットキーです。

|キー|効果|対象|
|:--|:--|:--|
|[Ctrl]+[B]|テキストを太字に|各アプリケーション|
|[Ctrl]+[I]|テキストを斜体字に|各アプリケーション|
|[Ctrl]+[U]|テキストに下線|各アプリケーション|
|[Ctrl]+[矢印]|値があるセルの端まで移動|Excel|
|[Ctrl]+[Space]|列全体の選択|Excel|
|[Shift]+[Space]|行全体の選択|Excel|
|[Ctrl]+[;]|日付入力|Excel|
|[Ctrl]+[:]|時刻入力|Excel|
|[Ctrl]+[L]|左寄せ|Word|
|[Ctrl]+[E]|中央寄せ|Word|
|[Ctrl]+[R]|右寄せ|Word|
|[Ctrl]+[M]|インデント|Word|
|[Ctrl]+[Shift]+[M]|逆インデント|Word|
|[Ctrl]+[Shift]+[F8]|矩形選択モード|Word|
|[F5]|プレゼンの開始|PowerPoint|

* Excelの関数活用方法も記事にしたいところです。
* 代表的なものや筆者が良く使うものに限定しました。その他のショートカットキーについては、プレジデントWOMANに掲載されていた[**定時で帰るための"エクセル時短"5大テク**](https://president.jp/articles/-/28874?page=2)や、できるネットに掲載されていた[**【まとめ】 ショートカットキー 【一覧】**](https://dekiru.net/article/5002/)を参考にしてください。
php-master-changes 2019-06-22

今日はメモリリークの修正、不要コードの削除、mysqli のバグ修正、time_sleep_until() のテストへデバッグ用コードを追加する修正があった！

# 2019-06-22
## nikic: Fix prompt leak in phpdbg
- https://github.com/php/php-src/commit/a7bcfee9c982bd301ad720d880f35ed949c701a0
- [7.4~]
- sapi/phpdbg で、メモリリークの修正

## nikic: Fix stack leak in phpdbg
- https://github.com/php/php-src/commit/152ccfb08dd766cdb76583b061dcc2c8a73a7255
- [7.4~]
- sapi/phpdbg で、メモリリークの修正

## nikic: Remove unused zend_verify_arg_type() function
- https://github.com/php/php-src/commit/d82b270fa45a66321a683dd54476f0a633f4d919
- 不要コードの削除

## derickr: Fixed bug [#67348](https://bugs.php.net/bug.php?id=67348): Reading $dbc->stat modifies $dbc->affected_rows
- https://github.com/php/php-src/commit/579562176b71820ad49d43b2c841642fef12fe57
- [7.4~]
- ext/mysqli で、$dbc->stat の読み込みで $dbc->affected_rows の値が変わってしまう問題の修正

## nikic: Add debugging code to time_sleep_until test
- https://github.com/php/php-src/commit/df27bfe58bb7bc0b2cb8f182a94347d36e2cb6b6
- [7.4~]
- time_sleep_until() のテストへデバッグ用コードの追加
ESXiにSSHログインできない

ログイン画面までは表示されるけどパスワード認証が表示されない。

![alt](https://qiita-image.cloudremix.net/ESXi-SSH-Login-ERROR.jpg)

# 原因はパーミッション

 -  SSHサービスが起動していない？
⇒起動しているし、ログイン画面は表示されている。

 - チャレンジレスポンス認証になっていない？

⇒なってるし、間違ったらエラーが表示されるはず。

 - 変なログが出ていない？

⇒ 鍵のパーミッションエラー？！

```
/etc/ssh/sshd_config line 15: Unsupported option PrintLastLog
error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
error: @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
error: Permissions 0755 for '/etc/ssh/ssh_host_rsa_key' are too open.
error: It is required that your private key files are NOT accessible by others.
error: This private key will be ignored.
error: key_load_private: bad permissions
error: Could not load host key: /etc/ssh/ssh_host_rsa_key
error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
error: @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
error: Permissions 0755 for '/etc/ssh/ssh_host_dsa_key' are too open.
error: It is required that your private key files are NOT accessible by others.
error: This private key will be ignored.
error: key_load_private: bad permissions
error: Could not load host key: /etc/ssh/ssh_host_dsa_key
Disabling protocol version 2. Could not load host key
sshd: no hostkeys available -- exiting.
```

特にいじっていないが、パーミッションが600以外になっている模様。

とりあえず 物理コンソール（例の黄色画面で ALT + F1 で表示される）で以下を叩くとなおった。

```
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_dsa_key
```