OmniAICreator/Qiita-1.07M huggingface dataset:
Googleスプレッドシートで簡易APIを3分で作るよ

# 1. データ用のスプレッドシートを作る
ここでは、[Online Data Generator](https://www.onlinedatagenerator.com/)を使ってサクッとダミーデータを作りました。
![apitest_-_Google_Sheets.png](https://qiita-image-store.s3.amazonaws.com/0/26419/e9f55aa9-a7ca-2b83-d98f-86d140885ae0.png)


# 2. スクリプトエディタを起動
メニューバーから Tools > Script editor を選ぶ。
![Screen Shot 2018-12-27 at 3.11.53 pm.png](https://qiita-image-store.s3.amazonaws.com/0/26419/8156a0ee-d80f-42c4-0acc-ed7f17b5f50c.png)


# 3. データをJSON化して返すスクリプトを書く
スクリプトエディタに以下のコードをコピペして適当な名前を付けて保存。

```js
function doGet() {

  // スプレッドシートを取得。（シート名を指定してね！）
  const sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1')

  const rows = sheet.getDataRange().getValues()  // 全ての行を取得
  const keys = rows.splice(0, 1)[0]  // 最初の行はkeysだよ

  // データをJSONに整形するよ
  const data = rows.map(function (row) {
    var item = {}
    row.map(function (val, i) {
      item[String(keys[i])] = val
    })
    return item
  })

  return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON)
}
```


# 4. スクリプトをWebアプリ化
メニューから Publish > Deploy as web app... を選ぶ。
![Screen Shot 2018-12-27 at 3.19.06 pm.png](https://qiita-image-store.s3.amazonaws.com/0/26419/d341f859-b221-eca6-50fa-51372502e260.png)

設定は以下のようにすると公開できるよ。権限の確認があるのでOKすべし。
![apitest.png](https://qiita-image-store.s3.amazonaws.com/0/26419/7dd7541e-1118-d621-2e50-af436bca8c10.png)


# 5. ブラウザからアクセスしてみる。
以上、こんな感じでバッチリ機能してますね。[実際のAPIはこちら](https://script.googleusercontent.com/macros/echo?user_content_key=JMRJYPi-EDSvj_U4R93T0PwWUmg5Vf3u0J2fJmHiWFa7CS-x7hJTbeAFCaPjt-TMw29RQ51J-uaA1nzMgDtsV7mFqjtcA0Hom5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnPtUlaZgx2upEfMK9zvlZ5pl2g05pjNv9txgxIr6EIhuVzNARwmk-obo3c-oK4_rbaV-rV9yhQ38&lib=MFLY-srG48m6UdsUv3Vzo46CvRfjP4GRS)。
<img width="857" alt="Screen Shot 2018-12-27 at 3.23.31 pm.png" src="https://qiita-image-store.s3.amazonaws.com/0/26419/0474d61f-ce44-9031-36df-2166b20853ff.png">
RailsでテーブルのSortかつPaginationを実現できた

###成果
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/305759/5bf7845b-25ca-ef3b-ca7a-370fb21543fc.gif)

###実現方法
「rails table sort」というキーワードでグーグル検索したら、下記の文章を発見。
https://www.virment.com/rails-sortable-table/
大変助かりましたので作者に感謝を申し上げたい。

この文章はSortだけなのでPaginationを加えたらどうするのか自分で試した上、
下記に整理します。

#####①Help methodを追加
```transactions_helper.rb
module TransactionsHelper
    
    def sortable(column, title = nil)
        title ||= column.titleize
        css_class = (column == sort_column) ? "current #{sort_direction}" : nil
        direction = (column == sort_column && sort_direction == "asc") ? "desc" : "asc"
        link_to title, {:sort => column, :direction => direction}, {:class => css_class}
    end

    def sort_direction
        %w[asc desc].include?(params[:direction]) ?  params[:direction] : "asc"
    end

    def sort_column
        Transaction.column_names.include?(params[:sort]) ? params[:sort] : "occurred_date"
    end
        
end
```
Ruby初心者なので正直言うとこのコードはまだハッキリ分からないけど、一応結果的にできるようになったのでとりあえず嬉しい。後で十分理解できるように頑張っていきます。
#####②controllerにindexを下記のように修正
```transactions_controller.rb
include TransactionsHelper

  def index
    @transactions = Transaction.paginate(page: params[:page], per_page: 8).order(sort_column + ' ' + sort_direction)
  end
```
#####③index.html.erbを修正
```index.html.erb
<%= will_paginate %> 　　　<-----追加
<中略>
<th><%= sortable "occurred_date", "発生日" %></th>
<略>
```
以上。

**【2018年12月29日更新】**
上記のコードを理解できました。
自分で書き直したコードは以下になります。

```transactions_helper.rb
    def sort_asc(column_to_be_sorted)
        link_to "▲", {:column => column_to_be_sorted, :direction => "asc"}
    end
    
    def sort_desc(column_to_be_sorted)
        link_to "▼", {:column => column_to_be_sorted, :direction => "desc"}
    end

    def sort_direction
        # If params[:direction] is nil, set sort_direction to "desc" by default
        %W[asc desc].include?(params[:direction]) ? params[:direction] : "desc"
    end

    def sort_column
        # If params[:column] is nil, set sort_column to "occurred_date" by default
        Transaction.column_names.include?(params[:column]) ? params[:column] : "occurred_date"
    end
```
**transactions/index.html.erb:**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305759/0ad3ee38-9f2d-bcfd-e0f3-0d81d7d21191.png)

**最終効果：**
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/305759/d6454e52-1af8-b349-4a3f-81560f302e41.gif)
【insert/ update/ delete】データの挿入、更新、削除（複数データ挿入対応）[SQL/Rails]

# **はじめに**
開発するにあたって、手っ取り早く少数のデータをデータベースにインサートしたい時が多々ございました。
時と場合によりますが、有効な手段としてSQLを発行することがあります。
記憶することができず検索することが何度もあったので、削除、更新を含めて、ここに備忘録として簡単にまとめておきます。


#**SQL操作(基礎)**

##**開発環境でデータベースにアクセスする**
デフォルトでは開発環境で立ち上がります。今回のデータベースは`Mysql`だとします

```
$ rails db
```
今回はtextカラムとuser_idカラムデータを扱うとします。

##**データの挿入**

```
mysql> insert into answers (text, user_id) values ('hello, takuyanin', 2);
```

##**データの更新**

```
mysql> update answers set text = 'hello, world', user_id = 2 where id = 5;
```

##**データの削除**

```
mysql> delete from answers where id = 5;
```

#**SQL操作(応用)**

##**複数のデータの挿入**
通常の`insert`文の`values`以下に複数記述するだけで複数データを登録できます。


```
mysql> insert into answers (text, user_id) values ('hello, takuyanin', 2), ('hi', 4), ('wow', 7), ('good morning', 3);

```

#**おわりに**
参考になった方は、いいね、お願いします(^^)
railsのgeneratorのmergetoolをvscodeに変更する

## やりたいこと

railsのgenerator、例えば`rails g controller Root index`などを実行した時、生成対象のファイルが既に存在し、生成したものと内容が違った場合、

```
Running via Spring preloader in process 26159
    conflict  app/controllers/root_controller.rb
Overwrite /path/to/app/controllers/root_controller.rb? (enter "h" for help) [Ynaqdhm]
```

の様な選択肢が出てきて`m`キーを叩くとマージできるのですが、その時起動するmergetoolをvscodeに変更します。

## やりかた

### シェルスクリプトを作ります

```bash
#!/bin/bash

tmp_path=$1
destination_path=$2
orig_path=${destination_path}.orig

# オリジナルを一度別名でバックアップ
mv ${destination_path} ${orig_path}

# 二つのファイルを見比べる基準、共通の祖先となるファイルを空で生成
touch ${destination_path}

# mergeする
git merge-file\
  --stdout\
  -L ORIG\
  -L BASE\
  -L GENERATED\
  ${orig_path} \
  ${destination_path} \
  ${tmp_path} > ${destination_path}

# vscodeを起動して、オリジナルのバックアップを削除。
code --wait ${destination_path} && rm -f ${orig_path}
```

これをどこかパスの通ってる場所に適当な名前でおきます。今回は`mergetool_for_rails_generator`という名前でおきました。


### 環境変数を設定する

```
# ~/.bash_profile

...
export THOR_MERGE=mergetool_for_rails_generator
```

反映する

```
source ~/.bash_profile
```

これで変更かのです。

## なぜこんなめんどくさいか？

git mergetoolをvscodeに変更する方法は[散見](https://stackoverflow.com/questions/44549733/how-to-use-visual-studio-code-as-default-editor-for-git-mergetool)し、これは期待通り変更できるのですが、これを変えてもgeneratorで起動するmergetoolは変わりません。

変わらないというか`sh: vscode: command not found`というエラーで動かなくなります。

なぜそんなことが？？と思って保存してるソースを見ると

https://github.com/erikhuda/thor/blob/d3762d0b89a80da488285d640b052f5276fac6bb/lib/thor/shell/basic.rb#L464-L479

```rb
      def merge(destination, content) #:nodoc:
        require "tempfile"
        Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp|
          temp.write content
          temp.rewind
          system %(#{merge_tool} "#{temp.path}" "#{destination}")
        end
      end

      def merge_tool #:nodoc:
        @merge_tool ||= ENV["THOR_MERGE"] || git_merge_tool
      end

      def git_merge_tool #:nodoc:
        `git config merge.tool`.rstrip rescue ""
      end
```

こんな感じで`git config merge.tool`から採れたコマンドを`"#{temp.path}" "#{destination}"`という引数で呼び出しているからですね。

## ここがハマった

[git merge-file](https://git-scm.com/docs/git-merge-file)というコマンドがあって、コンフリクトが起きた時よく見る

```
<<<<<<< A
lines in file A
=======
lines in file B
>>>>>>> B
```

のようなファイルを生成してくれるので使いたかったのですが、これの引数の渡し方がよくわからなかったです。

```
git merge-file fileA fileB fileC
```

オプションはさておき、三つの引数が必要なのですが、「fileBとfileAの差分」と「fileBとfileCの差分」をfileBにマージしてfileAに書き込むという難しい仕様です。

要はfileBが共通の祖先で、そこから先の変更のみに注目してマージすると言うことですね。書き込み先ファイルも変更したかったので`--stdout`で書き出しを抑制し指定したファイルに書き込んでます。

generatorの場合、例えばcontrollerだったら、本当はクラス定義部分などは共通の祖先として指定したいところではあります。それができればオートマージが成功する可能性も上がると思われます。

独自generatorであればテンプレートにコメントでマークをつけておいて「共通の祖先」を生成することも不可能ではないと思いますが・・・ファイルの種類も多いしとりあえずこれでお茶を濁します。
matplotlibが原因でanacondaが無言で落ちた時 / 何も表示されない時

Windows環境のAnacondaでmatplotlibを使用した時に、
pythonが強制終了したりimshowでも何も表示されない場合、
matplotlibのバックエンドを入れ替えると動く場合があります。

```
import matplotlib.pyplot as plt #ここで落ちる
```
↓

```
import matplotlib
matplotlib.use('TkAgg') #その前にバックエンドを入れ替える指定をする
import matplotlib.pyplot as plt
```

TkはTkinterのこと。
Cognosの認証でJDBCSampleを使用してる時のEメールプロパティのセット


CognosでJDBCSampleを使用している際に、
ユーザーテーブルには登録しているEメールの値が、ユーザープロファイルのEメールプロパティでは取得できておらず困ったと言った事象に遭遇したことはありませんでしょうか。

このような挙動になるのは、ユーザーテーブルからアカウントプロパティ情報を取得する際に、Eメールに関する値がSELECTされていないので当然なのですが、

下記のファイルを編集することでEメールの値をテーブルから取得できるようになるのでご紹介します。

対象のファイル ： <sdk Install Dir>/sdk/java/AuthenticationProvider/JDBCSample/AccountCache.java
対象の関数 ： setAccountProperties()
修正内容 ： 下記キャプチャの赤枠部分
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/be5344d7-e470-7419-dea9-ad63c9aec225.jpeg)
20181227

#やりたかったこと

- Rでのt検定

#経過

- エクセルファイルをcsvに変換
- 作業ディレクトリの変更
- データフレームの作成

#できなかったこと

- ファイルの1列目を因数として読み込みたくなかった。
    - row.names="列名"で解決
- ポチッと押したらインポートできないのか？

# 後日繰越
- t検定
- Rの基本的ボタンの役割を知る
- Rstudioって何


#参考URL
- http://cse.naro.affrc.go.jp/takezawa/r-tips/r/40.html
- http://www.obihiro.ac.jp/~masuday/resources/stat/r_t-test01.html
ndenv から nodenv に乗り換える


ndenv local が動作しなかったため、[github(riywo/ndenv)](https://github.com/riywo/ndenv)を見に行ったら、乗り換え推奨してた。

```
[Deprecated] nodenv is better alternative
Please consider to use nodenv. ndenv repository is not maintained actively.
```

幸い anyenv から nodenv がインストール可能。

### nodenv インストール

```
$ anyenv install nodenv
$ exec $SHELL -l

$ nodenv -v
nodenv 1.2.0-3-gd5fb564
```

### ndenv はアンインストールする

```
$ anyenv uninstall ndenv
```

### node をインストールする

```
$ nodenv install -l
Available versions:
  0.1.14
  0.1.15
  0.1.16
  0.1.17
  0.1.18
  ︙

$ nodenv install 8.11.4
$ nodenv global 8.11.4
$ node -v
v8.11.4
```

ndenv時代に生成された .node-version は　nodenv でも使るのでストレスレス
to:me / from:me / #Slack #DM #ダイレクトメッセージ から #検索 する #方法 を知りたい人生だった‥ @yumainaura

`to:me 検索したいキーワード` で良さそう


---

[Slack 検索ガイド – Slack](https://get.slack.help/hc/ja/articles/202528808-Slack-%E6%A4%9C%E7%B4%A2%E3%82%AC%E3%82%A4%E3%83%89-#%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB-dm-4)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fff1278f-72ba-7749-a3d4-2ba61653bba4.png)


例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/329ec7c8-6637-8321-3326-f517ba8f6018.png)

#検索モディファイアとは

エンジニア用語で書かれていて勉強になりそう。翻訳がうまくできていないだけだとは思うけど。

>モディファイアとは非破壊的にオブジェクトに作用する自動処理です。モディファイアを使うと、手作業で行うには面倒な効果（たとえばsubdivision surfaces）を自動的に施してくれます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9d27a9ab-8cc0-54bd-dd47-0bcf703697dc.png)


# `from:me` もできるっぽい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2343a5a0-cc74-ed5c-49f4-3bbb1d828e8b.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gulp-sassのコンパイルがうまくいかないと思ったらautoprefixerが消してた話

# TL; DR
この記事は、Gulpでsass(scss)をコンパイルしてる人がautoprefixerを噛ませていたら、ベンダプレフィクス消えてるかも。というお話。

# 環境
- Windows10
- WSL (Windowsの中にUbuntuが...!)
  - [こちら](https://oratake.hateblo.jp/entry/2018/12/12/110003)に詳細(自分を売る)
- gulp v4
  - autoprefixer
  - gulp-sass
  - browser-sync (関係ないけど一応

# やったこと
## 状況の確認
今回やりたかったことは、記事のタイトル一覧などの動的ページでタイトルを並べる時、
長すぎｨ！なタイトルを、CSSで以下のように三点リーダ（…）で省略したかった。

```scss:1行の時
.longBrilliantTitleName {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
```
```scss:複数行の時
.quiteLongBrilliantTitleName {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; /* clampしたい行数 */
  overflow: hidden;
}
```
※ただし2行以上の複数行ではwebkitを使用しているのでchrome,safariなどでしか使えない。

だが、何故かgulp-sassでcssを出力しても複数行で三点リーダが出ない。
で、出力されたcssを確認すると、

```css:gulp-sassとautoprefixerを経て出力されたcss
.quiteLongBrilliantTitleName {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  overflow: hidden;
}
```
あれ、小生の`-webkit-box-orient: vertical;`が消えてる...。

## 解決
どうやらautoprefixがベンダプレフィクスを消していた模様。なので安直ではあるが、gulpfiles.jsでscssをコンパイルする過程で、autoprefixerに、ベンダプレフィクスを消さないで。と頼んでみた。

```js:gulpfile.js(適宜省略
gulp.task('scss', function() {
  return gulp.src(paths.scss)
    .pipe(sass(sassOptionsIsCoco))
    .pipe(autoprefixer({remove:false})) // 消さないで。の設定
    .pipe(gulp.dest(paths.css));
});
```
解決。
やったぜ。

# 参考
https://github.com/postcss/autoprefixer/issues/776
SEに対する業界外からのあるあるな誤解

# ありがちな誤解
SEしてますっていうと「頭よさそう」とか「大学は理系だったの？」とか「オタク多いんでしょ」と「PC詳しいんでしょ」とか「給料いいんでしょ」とか「ブラック企業じゃない？」とか言われがちですよね。
給料は会社に依るところが多いので(今いる会社は少ない方です)置いといて、それ以外の話をします。ポエムです。~~今めっちゃ暇なんです。~~

# 学歴あんまり関係ないです
私は文系四大卒の新卒でこの業界に入りました。理系卒と間違えられがちですが、式は合ってるのに計算結果を間違うタイプの算数できないマンです。
現国は得意なので文章題は解けるんだ。答えが合ってないだけで。
大学でやってた内容はSEの業務と全く関連性がありません。文系なので、PCに触るのはレポート書く時くらい。あと統計学の授業とか。
C言語を般教で履修したんですが、ポインタが理解できなくて授業行かなくなって落としたレベル。~~それでよくこの業界入ったな。~~
今でもC言語は読み書きできないままですが、使う機会がないので…多分必要に迫られたらできるようになると思います(新人の技術研修をC言語で無茶ぶりされてどうにかしたことがある)。ポインタは仕事してるうちに流石に理解したので。(笑)

社会人になった時点で書けてたのはHTMLとCSSです。SNS全盛期前に、趣味でサイトをいくつか作ったり潰したりして得たスキルです。
最初にソースを意識したのがFrontpageExpressで作成したファイルで、毎行fontタグで囲まれたクソ汚すぎる自動生成にブチ切れた挙句、自力でメモ帳で書くようになった口です。おかげでソースをきれいに書こうという意識が生まれました。~~反面教師ありがとうなMicr○soft！~~

まあそんな低スキルで基礎知識も何もない文系卒でもまあ、Javaその他のSEとしてお賃金もらって生きていけます。
ハード系じゃないエンジニアに必要なのは、国語能力と英語能力、コミュニケーション能力ですね！
いわゆる理系脳的な論理的な思考は必須というか前提条件だけど、数学とか物理化学が得意である必要はない。なぜなら計算はPCがやってくれるから。エンジニアとしては式を立てられればいいのです。
(わからないことを)人に聞くことが大事なので、人とコミュニケーション取りたくないし机に向かってればいいという考えで就職すると詰みます。
そもそもそんなの会社組織で働くのに向いてないから、自分だけで稼げる自営業目指すほうがいいですよ。SEどころかサラリーマンに向いてないです。
あと案件ごとに常に新しいことを覚えていかざるを得ないので、自分の覚えたことだけで仕事していきたい人には向いてないですね。

追記：やっぱエンジニアには国語能力大事だわって人、いましたね。
[エンジニアには国語的能力が重要だ。実は言語的能力が80%を占める文系の仕事だとさえ思える。理系的な要素だけでプログラミングが成り立つと思ったら間違えた。ロマンロランのジャンクリストフを読もう。良い小説だから。日本語や言語的なものを大いに愛そうじゃないか。僕らプログラマは。](https://qiita.com/YumaInaura/items/8a0cc0721ae78175bce4)
私だけじゃなかったのうれしー。文系能力高い方が仕事しやすいよ！まあ、要件定義とかするにも文章書けないといけないですしね。
コメントも読んだけど、そりゃあ数学出来るほうが幅は広がりますよーそれは知ってる。私は必要のないジャンルのシステム作ってるだけなんだってことも。
でもそういうシステムの仕事、たくさんあるので。数学出来ないなら不要なジャンルでエンジニアすればいいだけだと思います。

# 鉄板ブラック企業ネタ
ブラック企業ネタ…実は中小IT企業は大抵ブラックだと認識しています。
まあどブラック企業で都内で一人暮らしとか到底無理なお賃金で14時間くらい毎日働かされて心身壊して通勤往復4時間で(そんな現場にアサインする自体もうクソ企業)早朝に家を出て終電で帰宅しては意味もなく泣いて当時実家住まいだったため親に「いいからもう一旦会社辞めなさい！」とか言われ続けた時期があって、今でも通勤に使ってた路線に乗れないPTSD抱えてます(3駅が限度)ので、ブラック企業があるのは事実ですね。
まあ昨今そんな現場あんまりないと思うけどね！
プロパーに「安定剤飲まないと胃痛やばいんだけど飲むと眠気がやばいから結局飲めない」という話をしたら、「そんな人沢山いるよ！」ってサムズアップ返ってきたの、今考えても完全に病んでる現場だった。逃げてよかった。(夜逃げではないです)後遺症引きずってるけど。
その現場では、身内の友人(20代前半の健康な男性)が半年で狭心症になったらしく、私が実際に体験した中ではレジェンドオブデスマな現場です。~~YRPに行かなくてもデスマは経験できるよ！~~
もし、そういう状態の方がいましたら。**そんな現場からは今すぐ逃げろ我慢する必要はないからな。**無意味な苦労はしないほうがいいよ。長時間労働はすべき苦労じゃないよ。同じ苦労ならすべき苦労にしようよ。
実は他にもこの会社でのブラックエピソードは事欠かないんですけど。給与遅延(複数回)とかボーナス分割支給とか。
転職で相手先企業の面接官に「火の車というか、そういうの、普通は倒産しているって表現するんですよ」って何とも言えない表情で言われたの、忘れられない。**未だにその会社は存在しているのが本当に怖い話。**
ちなみにこの会社はハロワ経由なので、**ハロワはもう絶対に信用しない**。ボーナスも募集要項通り出たことなかったし。

えーと、私自身はSEは天職だと思ってますよ。まあ、いい環境目指して転職しようとしてますが。
でもまあ、ブラック企業を経験してても会社を変えてこの業界にいるくらいには、この仕事が好きです。お仕事たーのしー！

# アニオタとかなんかオタク系多いの？
現場による、と思います。
私は官公庁とかお堅い案件が多いんですけど、デスクにフィギュア飾ってる系オタクはまず見ないですね。
ペットボトルのおまけ、くらいだったらいますけど、フィギュア持ち込み系オタクは本当に見ない。~~絶対いると思ってたのに。~~
あ、でも一般ユーザ向けWebの案件系の現場ならいることもあります。実際見た。私服でフレックス勤務でコアタイム11～19時みたいな現場に多いです。
スマホゲーのデザイナーとかやってた友人の現場は、「今日は嫁が出るゲームの発売日なので早退します」とか普通にまかり通ってたらしいし。私の近辺ではそういう理由を明言して有給取る人見たことないんですが。
やっぱり現場の傾向に依ると思います。

オタク関連でいえば、SE職なら全員PCのことなら何でもわかるとか、ガジェットオタクである幻想は捨てたほうがいいですよ。
好きでPC触ってる私みたいなタイプは、非IT業界人から見てPC全般詳しいしスマホやゲーム機関連の情報追ってたりしますけど、ただ職業であるだけの人の場合、Offceも関数わかんないから全部手作業でやるしPCもよくわかんない、スマホもよくわかんない！みたいなパターンも見かけます。必要最低限しか覚える気がない人っていうか？
一番驚いたのは「ネット通販はカード番号とか入れるの怖いからしない」って言ってたSEですね。あなた何の仕事してんすか…

---

やっぱり、業界に入ってみないとわからないこと多いです。
SEに対する誤解が少しでも解けたら嬉しいです。
Twitter連動アンケートアプリを作ってみた

質問箱みたいなTwitter連動アプリを作ってみたくて、アンケート投稿アプリを作ってみました。
宣伝も兼ねて使用したライブラリや苦労した点などを公開します。

#できあがったもの
##キキタイ？
https://kikit.ai
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">キキタイことをアンケートにしよう💕<br>キキタイ？はカンタンにTwitterアンケートが作成できるサービスです🔅<br><br>Twitterの投票より少しだけ色んなことができます。<br>・私のあだ名を決めて💓<br>・どっちのコーデがいい❓<br>・写真で一言💡（大喜利）<br><br>今すぐアンケートを作成しよう⬇️<a href="https://t.co/3yh22A2FrR">https://t.co/3yh22A2FrR</a></p>&mdash; キキタイ？ (@kikit_ai) <a href="https://twitter.com/kikit_ai/status/1077005665774710784?ref_src=twsrc%5Etfw">2018年12月24日</a></blockquote>

#背景
質問箱みたいなTwitter連動アプリが、どれくらいの期間で作れるかやってみたかったのです。
結果的には、本業の合間にコツコツ作って、約1ヶ月もかかりました。
シンプルにするつもりが、結局多機能になってしまったのが反省点です。
とはいえ、アンケート機能はTwitterにもあるので、差別化するためには多機能にするしかないという悪循環でした。

#サービス名について


#環境
ベタなLAMP環境です。ConohaでVPSを借りました。
・CentOS7
・Apache2.4
・MySQL5.7
・PHP7.2

#フレームワークなど
PHPやJSのフレームワークは使ってません。
この程度の一人プロジェクトなら使わない方が早いと思ってます。

##PHP
- Twig
    - https://twig.symfony.com/
 - Symfonyで使われているテンプレートエンジンです。シンプルで融通が利くので気に入ってます。
- Twitter API
 - 公式のやつです。

##JavaScript
- jquery
- jquery-confirm
    - https://craftpip.github.io/jquery-confirm/
    - アラートや確認ダイアログを出すのに使っています。
- JsRender
    - https://www.jsviews.com/
    - JS側のシンプルなテンプレートエンジンです。JS内では極力htmlを組み立てないようにしています。
- fancyBox
    - http://fancyapps.com/fancybox/3/
    - 画像のライトボックスです。スマホでも気持ちよく動くので気に入っています。
    - ライセンスは買いましたが、買ったことをどう提示すればいいのか謎です。
- Mega pixel image rendering library
    - https://github.com/stomita/ios-imagefile-megapixel
    - 画像アップロードの際に、画像を圧縮するのに使っています。
- exif.js
    - https://github.com/exif-js/exif-js
    - スマホからの画像が勝手に回転しないようにしています。
- html2canvas
    - https://html2canvas.hertzen.com/
    - 今回、Twitter投稿用に画像を生成していますが、PHP側で画像生成するのが面倒だったので、JS側で作成してアップロードしています。
- AutoSize
    - http://www.jacklmoore.com/autosize
    - テキストエリアの高さを自動的に広げるのに使っています。

##他
- Google Font
    - 全体的にかわいくしたかったので、M PLUS Roundedフォントを使っています。
- Font Awesome
    - Webフォントを使った、いけてるアイコン集です。
    - これを使ってマテリアルデザインにするだけで、ちゃんとしたデザインぽくなるのがいいですね。
    - Proライセンスを買いました。

#レスポンシブ対応について
特別なライブラリは使用していません。
基本的には、CSSのメディアクエリを使って、横800以上の場合は、メインの幅を800に、横800より下の場合は、メインの幅を100%にしています。

細かいレイアウト調整が必要な、質問テーマの表示については、横1200固定でレイアウトして、表示時にJSでzoomをかけています。

#苦労した点
iOSのsafariにハメられました。
自分のメイン端末はAndroidで、サブで使ってるiPhoneSEも、Chromeを使ってたので気付かなかった・・。
html2Canvas周りでハマりまくったので、結果的にはサーバーサイドで画像生成した方がよかったかもしれない。

一応、ハマった点を書いておきます。

- CSSのzoomが効かない場合がある
    - 要素全体にzoomをかけても、中の要素のフォントサイズにzoomが効かなかった。
    - 中の要素にzoom:0.999とすることで回避できた
- html2Canvasをすると、fontawesomeのアイコンが消える
    - beforeクエリが無視される？
    - &xfXXX;のように、文字コードを直接書くことで回避
- fontサイズが色々おかしい
    - fontSize: "-=1px"とやっても、なぜか拡大される場合がある。
    - -webkit-text-size-adjust: noneを入れても回避できなかった。

#これから
なんとかサービスインまでこぎつけましたが、ここからどう広めていけばいいのかが課題です。。
普通にSEOしたところで、メインターゲットがTwitterユーザーなので、あんまり意味なさそう。Twitter SEOってどうすればいいのだろう。
Twitter広告を出すか、DMなりで宣伝していくしかないですかね。。
Azure DevOpsの通知をTeamsのチャネルに投げる方法

# はじめに

この操作で行えることは、Azure DevOpsでコードのプッシュやプルリクエストなどが行われた際に、Teamsの特定のチャネルの会話に投稿をすることです。

# 課題

* Teamsにメンションを送る方法

# 補足

* Teamsでは「自分」というチームの「サンプル」というチャネルに投稿をする
* Azure DevOpsでは「Sample」というプロジェクトを作成している

# 手順

まずAzure DevOpsから通知を受けたいTeamのチャネルを開き、チャネルの「・・・」（その他のオプション）から「コネクタ」を選択する。

![手順１png](https://qiita-image-store.s3.amazonaws.com/0/332099/198970cd-60d0-ee30-9aa7-1c2e451035e3.png)

既存のコネクタの中から「Azure DevOps」の「構成」ボタンを押下する。

![手順２.png](https://qiita-image-store.s3.amazonaws.com/0/332099/a68a908c-08f5-e82f-8785-2ab9ee1e95a8.png)

開かれた画面において、更新を受け取る対象の以下を選択する。

* 組織
* プロジェクト
* チーム

![手順３.png](https://qiita-image-store.s3.amazonaws.com/0/332099/23923895-14a3-24d2-13bf-f74d3d959f92.png)

「イベントの種類」でAzure DevOpsでどのアクションをした際に通知を受け取るか選択する。
※ここでは、「プル要求の作成完了」を選択

![手順４.png](https://qiita-image-store.s3.amazonaws.com/0/332099/f44f6847-547a-dc73-c638-4408ca354822.png)

更新を受け取る対象の以下を選択し、「保存」ボタンを押下する。

* リポジトリ
* ターゲット分岐
* グループのメンバーによって要求されました
* レビュー担当者にグループが含まれています

※項目は、イベントの種類によって変わる

![手順４ (2).png](https://qiita-image-store.s3.amazonaws.com/0/332099/2af5c174-aa84-850b-6130-5a331e411512.png)

以上で構成完了！

![手順５.jpg](https://qiita-image-store.s3.amazonaws.com/0/332099/79b33cda-ac50-5dd1-fff7-d99ff03d2b1a.jpeg)

構成内容がTeamsの会話に上がっています。

![手順６.jpg](https://qiita-image-store.s3.amazonaws.com/0/332099/7657401e-eef0-565f-c1ef-7f7d653a8c39.jpeg)

以上でTeamsでの設定は終了です。


# 動作確認

ここからは、実際にTeamsに通知が送られるかの確認です。


【Azure DevOpsでの操作】

今回は構成したイベントの種類が「プル要求の作成完了」なので、Azure DevOps上でPullRequestsを行う。（詳しい操作内容は割愛）
※ここでは「abcde」というタイトルを設定

![手順８.png](https://qiita-image-store.s3.amazonaws.com/0/332099/973916aa-b517-97a0-7270-4065a6bb0a9e.png)

PullRequestsすると、Teamsの会話に上記のプルリクエスト内容が上がっているのが確認できる。

![手順8(2).jpg](https://qiita-image-store.s3.amazonaws.com/0/332099/ffce3bac-0dd7-ac34-0aad-eeb656a0d241.jpeg)

以上です。
#Mac #slack #エンジニア #共有 / #画像 #スクショ #再利用性 #低い #テキスト #比較 / #Bigquery #SQL /  @yumainaura

# MAc環境だと特に画像は爆走でスクショ撮影可能

Control+Command+4 

大定番


# コピペで画像アップロードできて最強に便利すぎる

だけど他の人が再利用しにくいので注意しよう

# たとえばSQLクエリでも、テキストでないと他の人が再利用するのは極めて困難

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4ef10e04-2800-b920-0909-45605bb95943.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/682c8bdd-4cc5-9659-28af-c2fe68bb4cc3.png)

テキストでしょ？必要ならね。

# BigQuery であれば saved query できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/053bf349-a097-1b16-0d4d-f78e845fab32.png)

# URL共有できる。

# こんなサービス固有の仕組みを使うのも良い。

# 記録

5分で執筆








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GoでFormのBodyを作る

POSTリクエストでテストをしたい時があり、そういう時は`http.Request`でインスタンスを作ってテストをするかと思う。

```go
req := &http.Request{
	Method: "POST",
}
```

通常POSTリクエストのユースケースはリクエストボディが付与されているのだが、goの`http.Request`の`Body`は`io.ReadCloser`となっているので単純に`bytes.Buffer`を利用してモックデータを与えることが出来ない。

`io.ReadCloser`は型が以下のようになっている。

```go
package io
type ReadCloser interface {
	Reader
	Closer
}
```

`bytes.Buffer`はこのうち`Reader`インターフェースに準拠しているが、`Closer`インターフェースには準拠していないためこのままでは利用することが出来ない。

これを解決するには、`bytes.Buffer`をWrapした`Closer`インターフェースに準拠する型を作ってあげれば良い。

```go
type FormBody struct {
	buffer *bytes.Buffer
}
func (f *FormBody) Read(p []byte) (n int, err error) {
	return f.buffer.Read(p)
}
func (f *FormBody) Close() error {
	return nil
}
```

このような型を作っておけば以下のようにリクエストボディにMockデータを差し込むことが出来るようになる。

```go
req := &http.Request{
	Method: "POST",
	Header: func() http.Header {
		header := http.Header{}
		header.Add("Content-Type", "application/x-www-form-urlencoded")
		return header
	}(),
	Body: &FormBody{bytes.NewBufferString("foo=1&bar=2&baz=3")},
}
```
#Mac #熱い #発熱 / #風 #ファン #止まらない / #docker #原因 #疑惑 / #冬 #風邪 #注意 / @yumainaura

# 7.7GB!!!!

# 7.7GB!!!!

# 7.7GB!!!!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/437a49a9-f5b9-4aad-e166-19e74bea56b4.png)

ついつい忘れがち

まったく別原因のこともあるので、Dockerのせいじゃないかと疑いを持てない場合がある

アクティビティモニタを見る癖がないWeb開発エンジニアなんて‥！

良い子はもっと良い終了をさせよう、Gracefulに








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
基礎からのVMware Cloud on AWSーその１

Qiitaでの投稿は初めてとなります。
ここのブログでは、VMware Cloud on AWSについての
基本を共有するべく投稿していきます。

なぜ今回VMware Cloud on AWSについての
記事を書こうと考えたか背景をお伝えしたた上で、
まずはVMware Cloud on AWSの基礎的なところから
おさらいしていきます。

ちなみに投稿者はVMwareさんの中の人ではありませんので、
一部情報が古い場合もありますが、ご容赦ください。
その一方で、中の人ではないゆえに、
中立的な立場で記事を掲載します。

全８回のシリーズになっています。
第１回　物理構成の理解
https://qiita.com/hiroito1118/items/48d8d66fab24acd16c1d

第２回　管理方法と初期デプロイの概要
https://qiita.com/hiroito1118/items/8ed96c156b8577ca4749

第３回　ユースケース
https://qiita.com/hiroito1118/items/2669fc0ef64d8e07eb08

第４回　調達方法
https://qiita.com/hiroito1118/items/3ebbf3ce7a555d2f39f6

第５回　ハイブリッドクラウドを支えるネットワークサービス・製品
https://qiita.com/hiroito1118/items/7e57393e72d72e00d4a2

第６回　AWSネイティブサービスとの連携
https://qiita.com/hiroito1118/items/80b05507f7e77c14e9db

第７回　サポートとメンテンナンス
https://qiita.com/hiroito1118/items/ba5b6ca4f11b153ab867

第８回　サードパーティー製品との連携
https://qiita.com/hiroito1118/items/0d367c82afe7715fc496

# １．そもそも何故この記事を書こうと考えたか

自身はSIerに所属する為、お客様から
様々な提案依頼や情報提供依頼を頂戴します。
特にここ最近VMware Cloud on AWSに関する
情報提供のお声がけが増えましたので、
市場的にも注目度はあるサービスなのだなと感じています。

その一方で、危機感も抱いています。
市場を見てみると、十分なサービス理解もないまま
お客様に提案をしているケースが散見されるからです。
（これが意外と少なくない模様）
事実と異なる使い方でお客様のRFPを書こうとしていた、
などということもありました。

決して安い買い物ではありませんので、
少しでも正しい知識・理解で購入してくださる方が
増えればと思い、記事を立ち上げたということが背景です。


# ２．VMware Cloud on AWSの物理的な構成を理解する
本投稿は、VMware Cloud on AWSに関する
基本的なことを正しくお伝えすることを目的にしていますから、
まずは当たり前のところから。

## 基本的なつくり
AWSのベアメタルサーバを活用し、
VMwareさんがその上でVMwareテクノロジをオーバーレイして提供される
IaaSな感じのサービスです。

環境内に導入されるESXiやvCenterやNSXは、
全てVMwareさんが運用管理を行い、
ユーザはその中のリソースを使うという仕掛けになっています。

細かいことを言いますと、足回りはAWSを使用していますので、
当然VPCなどは作成されています。
その１VPCを１テナントとしてみなしネットワークなどを構成、
ベアメタルのインスタンスをアサインして、
その上にVMwareテクノロジをかぶせているイメージです。

なお、マネージドされたサービスですので、
本VPC環境はVMwareさんが管理する
AWSのアカウント内に作成されます。
ユーザのアカウント内ではないので注意が必要です。

ユーザが所有するAWS環境とは、
Elastic Network Interfaceを介して高速接続されますので、
比較的同一環境のようには扱うことができます。

## リソースの規模
まず基本としてAmazon EC2 I3.metal インスタンスが
ベースとして利用されています。

このインスタンスのスペックは以下です。
　―　合計 36 コアのデュアル 2.3 GHz CPU
　―　512 GiB RAM、
　―　15.2 TB Raw NVMe ストレージ

これがベアメタルの状態なので、
総リソース量になります。
ここからさらに読み解きが必要です。

本環境は、ストレージにvSANを使用しています。
その為、上記のインスタンスを最低３ノード以上で
構成しなければなりません。

また、vSANの仕様上、ディスクをキャッシュと
データ保管領域に分けて利用します。
3.6TBはキャッシュ領域となり、
データ保管に使えるのは10.7TiBというのが実際の数値です。

これらを加味すると、実際は最低利用リソース量は
以下の値となります。（3ノード構成）
　―　108 コアCPU
　―　1.5 TiB RAM、
　―　32.1 TB Raw NVMe ストレージ

これらはあくまで物理的に用意された値になりますので、
ESXiやvCenter、NSX等のコンポーネントを
構築していくと、ここからさらに該当分のリソース量が差し引かれます。
その為、実際に使える値はこれより小さいものになります。

全量使えると思って検討しないように、ご注意ください。


長くなりましたので、今回は以上です。
次回は管理インターフェースと基本的な構成の方法について触れます。
WebComponentの簡単な使い方（シンプルに第一歩目に）

## なに？

わたしが Vue.js や Riot.js やその他を使う１つの大きな理由はHTMLの部品化にあります。

例えば、ヘッダやフッタなど全ページにまたがるやつの共通化です。
以前はSSI（Server Side Include）使ってましたけど、だんだんサーバ多様化してきてどうにも使い勝手がわるく。

ということで、こうなったら**WebComponents**です！！！

## WebComponentsとは？

> Webコンポーネントは、再利用可能なカプセル化された新しいカスタムタグを作成して、WebページやWebアプリで使用できるようにするためのWebプラットフォームAPIです。

ということで、再利用するために「カスタムタグ」というのを作ることができる技術です。

まだブラウザの実装状況が怪しいところもありますが、今回紹介するもっともシンプルな機能（`customElements`）であればわたしが見てる限りでほとんどのモダンなブラウザでは実装済みでした（なんならIE11でも）。
本番導入するにはもう少し慎重に調査した方がいいと思いますが十分に検討の余地ある技術です。

## さっそく

コード見た方が早いので見てみましょう。
全体です。

```html
<!DOCTYPE html>
<html>
<head>
    <title>test</title>
</head>
<body>
    <my-header></my-header>
    <h1>hello WebComponents!!</h1>
    <my-footer></my-footer>
    <script>
        class MyHeader extends HTMLElement {
            constructor() {
                super();
                this.innerHTML = `
                <div>
                    <p>ヘッダー</p>
                </div>
                `;
            }
        }
        customElements.define("my-header", MyHeader);

        class MyFooter extends HTMLElement {
            constructor() {
                super();
                this.innerHTML = `
                <div>
                    <p>フッター</p>
                </div>
                `;
            }
        }
        customElements.define("my-footer", MyFooter);
    </script>
</body>
</html>
```

実行結果はこうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33095/e08486b8-2dfc-dd67-c629-453c871dfa3f.png)

まあ、説明不要なほどシンプルなコードですね。。

通常のHTML内をみると `my-header` や `my-footer` という見覚えのないタグがあります。
その後の `script` 内で `HTMLElement` を継承したカスタムタグクラスを実装して、 `customElements.define` によって、カスタムタグとカスタムタグクラスを結び付けています。

これでOK、完了です。

簡単に使おうとするとこれだけです。
シンプルですね。


## どう使うの？

最初にも言いましたがヘッダとかフッタとかは共通部品として複数のページで同じように使いたいですよね？ ということでそれらをカスタムタグ `my-header` や `my-footer` として定義しておきます。その定義を外部の`js`として定義しておいてすべてのページから`script`タグとかで読み込めばいいのです。

## 注意点

### カスタムタグの名前は - が入ったモノにする

`myheader` とかだとエラーになります。 `my-header` とかにしてください。

### スクリプトの実行順序に気を付ける

細かいところはいろいろありますが `customElements.define` を呼び出すのは `body` の最後にしておく方が安全です。 もし外部の .js などにまとめたとしても `script` での .js の読み込みは最後に書いておきましょう。

## 蛇足・補足

今回ちょっとわけあって `Vue.js` が使えなくて、サーバ側処理も実装したくなくて、ひさびさに WebComponentsを調べました……が……すごい色々拡張されていて驚きました。

WebComponentsの第一歩目はこの記事でいいですが興味ある方は調べてみると面白いと思います。
Qiita の記事を PDF にする

#はじめに
Qiita の記事をタブレットで読みたいけど、ブラウザの pdf エクスポートはうまくいかなった。
なので、以下のような手順で pdf にした。
（特に大したことしてないです）

#Quiver
以下のリンクから Quiver をダウンロードする。
http://happenapps.com/#quiver

#Quiver で編集
Quiver を起動したら `cmd + n` で新規 note 作成。
- タイトル入力
- cell を `Markdown Cell` に設定
- Qiita の記事の `…` をクリックし `Mark down で本文を見る` を選択
- それを cell にコピペ（`---` で囲まれているヘッダ（？）部分は消しても良いかも）

<img width="1308" alt="スクリーンショット 2018-12-27 10.51.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/309795/393e4376-f4e3-818c-6a67-6a041711d2e5.png">

#Quiver で pdf 出力
`cmd + p` で pdf 保存するだけ

#感想
なんか他にいい方法があると思って検索したら、下記の記事の手動の方法が簡単で楽だったw
> [Qiitaの投稿を手っ取り早くPDF化](https://qiita.com/piyo7/items/4cd941752d2d60c1e5df)

一応、今回の方法だとコード部分の背景が黒になります（当たり前ですが）。
個人的には `Quiver` の出力だと割と綺麗に出してくれるのでお気に入りです。
機械学習論文読みメモ_148

[ADVERSARIAL MACHINE LEARNING AT SCALE](https://arxiv.org/abs/1611.01236)
Adversarial exampleは機械学習モデルを騙すような入力の事である。
こうしたexampleは異なったモデルに対して一貫して効果があるため、
attackerにblack box attackを行う事を可能にする。
Adversarial trainingはそうしたadversarial exampleを取り入れた学習で、
結果としてadversarial exampleに対してロバストなモデルを獲得する。
しかし従来研究では、こうした学習は小規模なデータに対してのみ
行われてきた。
本研究ではImageNetなどの大規模なデータに対してadversarial trainingを
適用した。
その過程においていくつかの発見があった。
まずadversarial trainingをスケールアップするにあたっての指針。
Adversarial trainingを行う事でsingle-step attack手法によって生成される
Adversarial exampleに対するロバスト性が獲得できる事を確認した。
Multi-step attack手法に基づくadversarial exampleは特定のモデルにのみしか
有効でない事が多く、black box attackを考えた際には、single step attackのみ
を考慮すれば良い。
Adversarial trainingによって獲得されたモデルが、通常のサンプルより
Adversarial exampleに対して高性能を発揮するlabel leaking効果が観測
された。

[Hessian-based Analysis of Large Batch Training and Robustness to Adversaries](https://arxiv.org/abs/1802.08241)
Large batch size trainingは従来の学習手法を用いた場合に、mini batch sizeの場合と比較して
予測精度の誤差が多く発生する事がわかっている。
この原因はまだ完全には理解されていない。
本論ではこれをHessian operatorとrobust optimizationの観点から解明する。
具体的には損失関数のHessianを解析し、large batch sizeの場合に何が変わってくるのか
を明らかにする。
ここでは、2nd order derivativeのback propagationを通した計算によって、
正確なHessianの計算を行った。
結果、large batch size学習が収束した際には、Hessianのspectrumが大きくなっている
事がわかった。
さらにlarge batch学習で得られたモデルはmini batchの場合と比較してadversarial attackにも
弱い事がわかった。
このとき、adversarial perturbationを探す問題は鞍点のない最適化問題である事を示す。
そして、adversarial trainingを行う事でHessian spectrumが小さいような収束点へ収束できる
事を示した。

[On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization](https://arxiv.org/abs/1802.06509)
従来の理解ではdeep networkはその深さを増す毎に表現力を向上させる事が可能だが、
その一方で最適化を難しくさせる。
本論では、時々において、深さを増す事で最適化を高速化できる事がある事を示す。
深さの最適化への影響は、linear層を単純に積む事により評価できる。
理論と実験の双方により、深さを増す事で起きるover-parameterizationの効果により、
結局gradient descentによる最適化がshallow networkに対して行われているかのような
挙動となる。
これは以前と同じような更新ステップを推進するようなpreconditioningを導入する事
で実現する。
これによりdepthを増す事で収束を高速化する事が可能になる。
踏み台サーバー越しにMacの画面共有をする

気付けば年末・・・

不具合が起きた時のことを考えると、エンジニアにとっては何かと頭を悩ます時期だと思います

年末はゆっくり自宅にいたい、遠距離に旅行に行きたい等ありますが、その間障害発生した際に何もできないと、休み開けたくない気持ちでいっぱいになります

対策として、リモートの自宅PC（Mac）から会社の個人PC（Mac）へ画面共有する方法をご紹介します

<img src="https://qiita-image-store.s3.amazonaws.com/0/53200/24df3ce2-963e-63a3-66d5-b9fdabb78eba.png" width="50%">

## 前提

* 自宅PCから踏み台サーバーにはSSHできる
* 自宅PCから会社PCには直接SSHできない
* 会社PCと踏み台サーバーはSSHできる

## 1.会社PC設定

MacにSSHでログインしたり、画面共有するには環境設定を変更する必要があります

**システム環境設定 > 共有** を開いてください

<img src="https://qiita-image-store.s3.amazonaws.com/0/53200/630ebfbe-4953-7ea1-716e-1d1cc9df1aea.png" width="50%">

**画面共有** と **リモートログイン** にチェックを入れてください

<img src="https://qiita-image-store.s3.amazonaws.com/0/53200/0788ac4a-7b99-6a8c-127e-5d086f21db10.png" width="50%">

**重要: 会社PCはこのまま電源入れた状態にしておいてください**

> 画面共有でFinderからサーバー接続で **vnc://xxx.xxx.xxx.xxx/** でこのマシンに接続できます
> リモートログインで **ssh {user}@xxx.xxx.xxx.xxx** でこのマシンにログインできます

（今回リモートログインはついでです）

## 2.自宅PC - 踏み台サーバー - 会社PC へのSSHトンネル

自宅PCのターミナルを開いて、以下のコマンドを実行してください

```
$ ssh -L 4000:{会社PCのローカルIP}:5900 {踏み台サーバーSSHユーザー}@{踏み台サーバー}
```

説明入れると

* **-L** : ローカルへの通信をリモートにバインドするためのオプション
    * 例えば、`-L 4000:192.168.0.10:5900` で `localhost:4000` の通信をリモート `192.168.0.10:5900` へ飛ばしますよの意味
* **4000** : 適当なローカルポート
* **5900** : Macの画面共有のためのポート

また、今回省いてますが踏み台サーバーへの接続に鍵設定していれば
`ssh -i {key} ...` つけてください（~/.ssh/config に記載でも可）

**接続できたらそのままの状態にしておいてください**

## 3.Finderで画面共有

**Finder > 移動 > 画面共有** or Finder で **command + K** 

<img src="https://qiita-image-store.s3.amazonaws.com/0/53200/3343f32b-2340-d579-b46c-dae2dff7b2b5.png" width="50%">

サーバへ接続のウィンドウが開きますので、
**vnc://localhost:4000** と入力して接続を押してください

<img src="https://qiita-image-store.s3.amazonaws.com/0/53200/5dfae8d9-02b6-00cf-db0a-1ec09c176e01.png" width="50%">

サインインするユーザーとパスワードを求められると思いますので、入力後画面共有されます

---

何事もなく、年末を迎えたい・・・
GKEのコンテナ内からノードの外部IPアドレスを取得する

GKEのノードはCompute Engineのインスタンスなので，インスタンスのメタデータとして外部IPアドレスが取得できる。

```shell
curl --header "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/network-interf
aces/0/access-configs/0/external-ip
```
---
###### 参考
[インスタンス メタデータの格納と取得  |  Compute Engine ドキュメント  |  Google Cloud](https://cloud.google.com/compute/docs/storing-retrieving-metadata)
curlでタイムアウトを設定する方法

タイムアウトを２秒に設定する場合

```shell:command.sh
curl -m 2 -o output https://example.com
```
デフォルトは300秒（300000ミリ秒）です。

ソース：
`#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */`
https://github.com/curl/curl/blob/master/lib/connect.h
[iOS]UIView.animateがキャンセルされ、completionが呼ばれる問題

長年疑問だった挙動を確認しました。

例

```.swift
hogeViewX.constant = 100
UIView.animate(withDuration: TimeInterval(2.0),
               animations: {
                self.view.layoutIfNeeded() },
               completion: { (finished) in
                print("🤔")
})

```

例えばこういうアニメーションを、アニメーション中に複数回呼ぶと、前のがキャンセルされてcompletionが呼ばれます。
completionのfinishedはなぜかtrueを返すので、キャンセルされたかどうかがわかりません。

### 困ること

例えばanimationの発火ボタンを連打しても、問題ないように見えます。
しかし、completionで例えばisHidden = trueとしていたりすると厄介です。
アニメーション後に消えてほしいのに、2回目を押した瞬間に消えてしまいます。

### 回避方法1.フラグで管理

1回目のアニメーションが終わるまで他の同一のアニメーションを排除します
これは上手く動きました

### 回避方法2.別のアニメーションと判断させる

内部的に、animationの中身（アニメーション対象？）が同じなら同じアニメーションと判断しているようです。
なのでこういう風にanimationの中身を変えてしまえばゴリ押しで解決できるようです。

```.swift
hogeViewX.constant = CGFloat(100 + Float.random(in: 0..<1.0))
UIView.animate(withDuration: TimeInterval(2.0),
               animations: {
                self.view.layoutIfNeeded() },
               completion: { (finished) in
                print("🤔")
})

```

### 回避方法3.他のアニメーションを使う

これはStackOverflowであったものの未確認

### この問題に、どこで遭遇しやすいか

scrollViewDidScrollでアニメーションを呼ぶ時に起こりがちです

### 公式仕様は？

発見できませんでした
あまり話題になってるのも見たことがありません
でも私は定期的にこの問題に遭遇します
Django で csv のアップロード、ダウンロード

こちらのページと同様のことを行いました。
[Python + Django でCSVのダウンロード／アップロード](https://qiita.com/t-iguchi/items/d2862e7ef7ec7f1b07e5)

違いは
>OS が Arch Linux
>データベースが MariaDB
>ライブラリーが django-bootstrap4
>csv ファイルの文字コードが utf-8
です。

コードは GitHub にあります。
[ekzemplaro/django_csv_upload_download
](https://github.com/ekzemplaro/django_csv_upload_download)

手順

1) ライブラリーのインストール

```bash
sudo pip install django-bootstrap4
```

2) MariaDB の用意
>User:   django
>Password:       tiger123
>Database:       django_csv

```text
MariaDB [(none)]> create user django@localhost identified by 'tiger123';
MariaDB [(none)]> select user,host from mysql.user;
MariaDB [(none)]> create database django_csv;
MariaDB [(none)]> grant all on django_csv.* to django@localhost;
```

3) GitHub からクローン

```bash
git clone https://github.com/ekzemplaro/django_csv_upload_download
```

4) データベースの作成

```bash
cd proj01
python manage.py makemigrations csvdownload
python manage.py migrate
python manage.py createsuperuser
```

5) 開発サーバーの起動

```bash
python manage.py runserver
```

6) ブラウザー　で http://127.0.0.1:8000/ にアクセス

7) 例えば、次のファイルをアップロード

```csv:example01.csv
102,社長
103,部長
104,課長
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.9.7
$ python -m django --version
3.1.4
```
与えられた数が素数か合成数かを判定する最速の方法(Ruby)

素数を求める方法としてはエラトステネスの篩が有名です。非常にシンプルなアルゴリズムなので簡単に実装できます。
しかし、この方法は2から順に素数を求めていくためのものなので、例えば、`30131539`が素数か合成数かを判定したいと思ったときに必要以上の計算をすることになります。

なので、ある数が素数か合成数を高速に判定する方法を紹介します。

プログラムだけみたいって人はこちら(wikiからのコピペです) 。
ただし、ごくごく僅かな確率で合成数を素数と判定してしまうことに注意。


```ruby
class Integer
  def prime?
    n = self.abs()
    return true if n == 2
    return false if n == 1 || n & 1 == 0
    d = n-1
    d >>= 1 while d & 1 == 0
    # 4^(-20)の確率で合成数が素数と判定されることに注意
    # 30.times doにすると、4^(-30)の確率になる
    20.times do
      a = rand(n-2) + 1
      t = d
      y = ModMath.pow(a,t,n)
      while t != n-1 && y != 1 && y != n-1
        y = (y * y) % n
        t <<= 1
      end
      return false if y != n-1 && t & 1 == 0
    end
    return true
  end
end

module ModMath
  def ModMath.pow(base, power, mod)
    result = 1
    while power > 0
      result = (result * base) % mod if power & 1 == 1
      base = (base * base) % mod
      power >>= 1;
    end
    result
  end
end
```

# 決定的素数判定法と確率的素数判定法
素数を判定する方法には大きく分けて以下の2種類が存在します

1. 決定的素数判定法 (正確だけど計算量が多い)  
  [AKS素数判定法(wiki)](https://ja.wikipedia.org/wiki/AKS%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95)が有名
2. 確率的素数判定法 (たまーに間違うけど、計算量が劇的に少ない)  
  [ミラー–ラビン素数判定法(wiki)](https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC%E2%80%93%E3%83%A9%E3%83%93%E3%83%B3%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95)が有名


確率的素数判定法の中でも最速なのが、ミラー–ラビン素数判定法。
さらに、ミラー–ラビン素数判定法が素数を誤判定する確率は任意にコントロール可能なので、実用的にはこれを使えばOKなはず。

# ミラー–ラビン素数判定法
特徴

- 最速の素数判定  
  計算量は O(k × log3 n) 
- 素数判定を間違う確率をコントロールできる  
  4^(-k)の確率

プログラムは上記の通りで、詳細はwikiをみてください！

ちなみに`30131539`は素数です。
Docker for Windows で Shared Drives のチェックが入らないときの対処法

# 概要

Docker for Windows でコンテナとローカルのファイルの橋渡しとなるボリューム機能を使うためには `Shared Drives` の設定が必須となります。
しかし、ある日突然 `Shared Drives` のチェックを入れて `Apply` を行ってもチェックが入らなくなってしまうことがあります。
ここではチェックが入らなくなってしまったときの対処法について記載します。

# 現象

`Shared` にチェックを入れて認証情報を入力後、しばらくするとチェックが自動で解除されてしまいます。
画面下にある `Reset credentials` で認証情報をリセットしても症状は改善しません。
マシンの再起動や docker のリスタートを行ってもチェックが入る気配はありません。

![shared drives.png](https://qiita-image-store.s3.amazonaws.com/0/278145/69651bab-b6ec-7cce-f655-eaa546f96ad7.png)

# 対処法

`Reset` にある `Reset to factory defaults` で docker の初期化を行うことでチェックが入るようになります。
ただし、 **イメージやコンテナなどのデータがすべて消えます** ので、初期化の前にはデータの退避を必ず行ってください。

![reset.png](https://qiita-image-store.s3.amazonaws.com/0/278145/496730e3-5763-4b28-1a54-ead2f5df9e7e.png)

初期化の完了後は、まず先に `Shared Drives` 以外の設定を済ませます。
これは、 `Shared Drives` の設定後にCPUやメモリなどの設定を変更すると docker が不安定になるためです。
Docker for Windows は非常にデリケートなので設定を変更する際は十分に注意してください。

最後に `Shared Drives` の `Shared` にチェックを入れて、チェックが解除されないことを確認します。
コンテナを起動してローカルのファイルが見えるようになっていれば問題ありません。

```
> docker run --rm -v c:/Users:/data alpine ls /data
```
ZFSのsnapshotをまとめて削除する

# ZFS snapshotの浪費
ZFSで定期的にsnapshotをとりながら長期間運用していると、snapshotに不要なデータがたまり、ファイルを削除しても実体はsnapshotに残るのでディスクの空き容量が増えないということもよくあります。

```
$ cd ~/tmp
$ ls
Data
$ du -s Data
528     Data
$ rm -rf *
$ ls
 (ファイルは何もない)
$ df -h .
Filesystem               Size    Used   Avail Capacity  Mounted on
zvol0/home/minmin/tmp    2.2T    228K    2.2T     0%    /home/minmin/tmp
(ディスク使用量は 見かけ上はディレクトリ分のみ)
$ zfs list -o space zvol0/home/minmin/tmp
NAME                   AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
zvol0/home/minmin/tmp  2.16T  1.01G     1.01G    227K              0          0
(実際は zfsとして 1GB程 snapshot が消費)

```

このような状態で過去のsnapshotのデータが不要であればsnapshotを削除しないとディスク容量が無駄になります。

# zfs destroy で snapshot を指定するときの %

指定したZFSのsnapshotをまとめて削除するシェルスクリプトを作るかなと思い、改めて man zfs していて気づきました。

```
    zfs destroy [-dnpRrv] filesystem|volume@snap[%snap][,snap[%snap]][,...]
```

削除のときは % でsnapshotの範囲を指定できるわけで、最古のsnapshotと最新のsnapshotを調べて % で挟むめば、その間の不要な snapshot をまとめて削除できます。

```
zfs destroy ZFS@oldest_snap%newest_snapshot
```

他にも複数の snapshot のうち不要なものを個別に指定する , (カンマ) のオプションがありますね。これらを活用すると、snapshotを一つづつ削除するのに比べると、かなり効率がよさそうです。

# ZFS snapshot をまとめて削除するコマンド

zfs-purge-snapshot というコマンドを作ってみました。使い方は

```
$ zfs-purge-snapshot zvol0/home/minmin/tmp 
```

のように、引数にzfsのfilesystemを指定します。

実際に使ってみた例です

```
$ df -h .
Filesystem               Size    Used   Avail Capacity  Mounted on
zvol0/home/minmin/tmp    2.2T    228K    2.2T     0%    /home/minmin/tmp
$ zfs list -o space zvol0/home/minmin/tmp
NAME                   AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
zvol0/home/minmin/tmp  2.16T  1.01G     1.01G    227K              0          0
$ zfs-purge-snapshot zvol0/home/minmin/tmp
$ zfs list -o space zvol0/home/minmin/tmp
NAME                   AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
zvol0/home/minmin/tmp  2.16T   227K         0    227K              0          0
```

このとおり、df と zfs list それぞれの使用量が一致しました。

プログラムは以下の通りです。

```
#!/bin/sh

PATH=$PATH:/sbin:/usr/sbin

ZFS_list_snap='zfs list -H -o name -d 1 -t snapshot'

if [ $# -le 0 ]; then
        echo "Usage: ${0##*/} zfs [zfs ...]" 1>&2
        exit 2
fi

for fs in "$@"; do
        if [ $(${ZFS_list_snap} "${fs}" | wc -l) = 0 ]; then
                continue
        fi
        snap0=$(${ZFS_list_snap} "${fs}" | head -1)
        snap1=$(${ZFS_list_snap} "${fs}" | tail -1 | sed 's/.*@//')
        zfs destroy "${snap0}%${snap1}" || exit
done
```
環境によるセンサーの通信可否検証

こちらの記事は、Gravioで対応しているセンサーの「通信可能な距離や環境」について記載していきます。
[Gravio](https://www.gravio.com/jp/gpromo/1901-casual-iot)は簡単にエッジでセンサーからのデータ収集を始めることができる、IoTソフトウェアです。

#【Aqaraセンサー】
![センサー一覧2.png](https://qiita-image-store.s3.amazonaws.com/0/247209/5466d800-f178-1ca8-597d-7a267785d571.png)

Gravioの500円プランで無償にてお貸し出ししている、センサーです。
通信方式は、ZigBeeを使用しています。2.4G帯の電波ですので、無線LANやBluetoothと同じ周波数帯を利用しています。

こちらのセンサーで通信可能距離を何度かテストしましたので、情報をまとめます。


###■11/15　ET&IoT Technology2018にて検証
無線LANやBluetoothなど、同じ2.4G帯を使う機器が非常に多く混雑した環境。
※2.4G帯を利用する無線LANのSSIDが50個以上表示されている状態
（加えて相当数のHiddenなSSIDも利用されていると思われます）

| 通信可否      |検証環境   |
|:-----------------:|:------------------|
| **○**          | ・40mほど離れた設置エリアが目視できる場所|
| **○**          |・20mほど離れた設置エリアが目視できない場所<br>（ブースなどの壁によって見えない場所）|
| **×**         |・30mほど離れた設置エリアが目視できない場所|

なお、会場の間取り、スペースの関係上、目視できる状態での40m以上の距離を計測できませんでした。

###■11/24　IoTつくるよ！にて検証
無線LANやBluetoothなど、同じ2.4G帯を使う機器が非常に多く混雑した環境。
無線LANのSSIDが20～30個以上表示されている状態


| 通信可否      |    検証環境   |
|:-----------------:|:-------------------------------------------------------------|
| **○**          |・20mほど離れたガラス窓を挟んだ場所|
| **×**         |-|

会場の間取りの関係上、20ｍ以上は測定できなかった。

###■12/21　弊社内での検証（その１）
弊社フロアの無線LAN複数に加え、別フロアの無線LANも確認できる環境

| 通信可否      |    検証環境   |
|:-----------------:|:------------------|
| **○**          | ・直線距離で約40ｍ離れた、目視できる道路と弊社10Fのオフィス。|
| **○**          | ・エレベータホールに設置した受信機から、1つ下の階のエレベータホール|
| **○**          | ・階段に設置した受信機から、2つ下の階踊り場|
| **×**         |・10Fから見通し外でビル陰になる場所<br>・エレベータホールに設置した受信機から、2つ下のフロアのエレベータホール|
| **×**         |・階段に設置した受信機から、3つ下の階の踊り場|


###■12/25　弊社内での検証（その２）
弊社フロアの無線LAN複数に加え、別フロアの無線LANも確認できる環境

| 通信可否      |    検証環境   |
|:-----------------:|:------------------|
| **○**          |・10ｍの距離で、間に7cm程度の壁を挟んだ場所|
| **○**          |・20mの距離で、間に鉄製の扉を2枚挟んだ場所|

#まとめ
検証の結果から、Aqaraセンサーでカバーできるエリアをまとめてみました。

|センサーから受信機|通信可能距離|
|:-----------------:|:------------------|-
|目視可能な場所|40m程度|
|目視できない場所|20m程度（壁の材質や厚さなどにもよる）|


設置状況により無線環境が異なるため、一概に距離をお約束するものではありませんが、導入の際のひとつの参考にしていただけば幸いです。
また、検証結果は随時追加していきます。





##参考

[Gravioとは？](https://www.gravio.com/jp-blog-article/2018-11-02-about-gravio)

[5分でわかるZigBee](http://www.atmarkit.co.jp/frfid/special/5minzb/01.html)


[温度センサーのデータをエクセルで簡単に表示]
(https://qiita.com/mikawan/items/3d93543566680afda868)

[Slackとボタンスイッチセンサーで「呼び出しシステム」を作ってみた！](https://qiita.com/mikawan/items/ac196bbb5506a3251c55)

[Microsoft Teams に PowerShell で投稿してみる](https://qiita.com/miyamiya/items/ccae505b8e97b5b532a7)
#エンジニア #プログラマ #ハック #エラー #見逃す #数える #ブラウザ #検索 #Chrome #iterm2 @yumainaura

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/01f31fa8-d721-0cfe-9047-3ad7f7b52b3a.png)

あ、、例があれで申し訳ない。

意外と画面からキーワードを探すために、ブラウザ検索などを使っていないエンジニアが多いような。習慣化されていないような感じがする。

自分は一瞬でブラウザ検索する派。

ヒットした数を見れば、エラー個数のカウントもできたりする。


ちなみにiTerm2などコンソールでも画面から検索できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/59f164b3-35df-2f16-9113-4450f9205157.png)

ハイライト目的で使っていこう！










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Swift4でウィンドウを表示するだけのCocoaアプリケーションをつくってみた

シェルスクリプトから複数の画像とテキストの組み合わせをリスト表示させたいような場合に、単機能のTableView Cocoa Appがほしくなりました。
ダイアログだけだったらosascriptやCocoa Dialogで事足りるのですが、TableViewは出せないみたいです。（Echofon for Macみたいな見た目のを出したい）
コマンドラインから起動する前提だと、Application Bundle（.app）も邪魔だしな・・・（NSBundleは素晴らしい仕組みですが要らないときはいらない）

# 単機能のSwift Cocoaアプリをつくる

[Single-file Cocoa application with Swift](http://czak.pl/2015/09/23/single-file-cocoa-app-with-swift.html) で紹介されていたSwiftスクリプト 1ファイルで書くCocoaアプリケーションがやりたいことにマッチしそうだったので試してみました。

`Case 2. Minimal windowed application`を起動してみたところ、エラーがいくつかでて動きません。
Swift4でいろいろ変わったようなので、リファレンスを見ながら修正します。

# 修正したコード

```swift:window.swift
#!/usr/bin/swift

import Cocoa

let window = NSWindow.init(
  contentRect: NSMakeRect(0, 0, 320, 200),
    styleMask: [.titled],
      backing: .buffered,
        defer: true
)
window.orderFrontRegardless()

NSApp.run()
```

# 実行結果

<img width="817" alt="スクリーンショット 2018-12-27 8.53.29.b.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/5379d927-9507-27b4-74c9-9b8396cbb851.png">

# Cocoaアプリケーションをビルドしてみる

`swiftc`コマンドを使うとさっきまで動かしていたスクリプトをそのままビルドできます。便利だな。

```shell-session
swiftc -o window window.swift
```

実行は、

```shell-session
./window
```

起動超速い。

バイナリもたったの55kBでした。

```shell-session
$ ls -alh
total 120
drwxr-xr-x   4 miminashi  staff   136B 12 27 09:02 .
drwxr-xr-x  77 miminashi  staff   2.6K 12 27 07:19 ..
-rwxr-xr-x   1 miminashi  staff    55K 12 27 09:02 window
-rwxr-xr-x   1 miminashi  staff   220B 12 27 08:28 window.swift
```

ところでこのバイナリはポータブルなんだろうか・・・？


# 複数起動してみる

シェルスクリプトアドベントカレンダーなので一応シェルスクリプト（というかただのワンライナーだけど）も書きます。
複数個のCocoaアプリケーションを起動してみます。

```shell-session
$ ./window | ./window | ./window
```

<img width="842" alt="スクリーンショット 2018-12-27 9.08.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/c8dd1af9-8424-c666-ae60-7beaa1f2613f.png">

パイプで繋いでるのはあんまり意味ないけど。

# まとめ

- AppKitのSwiftAPIがドラスティックに変わっているのと、Xcodeで普通にMac Appをつくる場合は触らないようなAPIを呼び出してるので、新しいAPIの呼び出し方を調べるのがちょっと大変だったが、それ以外は思ったより簡単だった
- 次回は実際にNSTableViewを備えたアプリに仕立てたい
php-master-changes 2018-12-26

今日はエンジン/一部拡張の不要コード削除、master のテストこけ修正、hash_init() でのパラメータチェック失敗時の不要なオブジェクト生成削除、VM スタック伸長でページサイズの指定が反映されるようにする修正、windows 版で 7.3.0 だと subst コマンド利用パスでのパスの扱いで互換性崩れていた問題の修正、pkg-config 利用の一層の推進、AppVeyor のバイナリ SDK バージョンを更新する修正があった！

# 2018-12-26
## dstogov: Removed dead condition
- https://github.com/php/php-src/commit/a111dfae0b877a17e8eb5c8bc8250b5d6bde4f3f
- 不要な分岐を削除

## dstogov: Fixed crashes introduced by [7e597f48e9fda982e930e4f617d2b2d98d8878a5](https://github.com/php/php-src/commit/7e597f48e9fda982e930e4f617d2b2d98d8878a5) (only master was affected)
- https://github.com/php/php-src/commit/636b16402b7c086e51d80d709508391aa95ebed3
- [一昨日の修正](https://qiita.com/sj-i/items/bbc6f2b9268c38d6bf3e#dstogov-fixed-bug-77339-__callstatic-may-get-incorrect-arguments) で master がクラッシュするようになった問題の修正
- [2954a30](https://github.com/php/php-src/commit/2954a309de7844c7a9cce36853f649b22ec01a46) のコミットコメントで指摘入ってたテストこけの奴かな

## dstogov: Micro optimization
- https://github.com/php/php-src/commit/d90a5d2e1a41c22ef632c2263784e87d15b58dde
- 一時変数を減らして局所最適化

## dstogov: Removed useless zval_ptr_dtor(return_value)
- https://github.com/php/php-src/commit/22c9d19144285efaa28ece5d510fbd9ab800ffa8
- ext/filter、ext/imap、ext/spl で、不要な zval_ptr_dtor(return_value) を削除

## dstogov: Create object only after parameter checks
- https://github.com/php/php-src/commit/cbf642b7154d55ea6378d2c8dd5be2a57f995b88
- ext/hash で、[hash_init()](http://php.net/manual/ja/function.hash-init.php) の際にパラメータチェックより前にオブジェクトの生成を行っていたのを修正

## dstogov: Respect EG(vm_stack_page_size)
- https://github.com/php/php-src/commit/b45774eed047dad63bb3959df1e38de866346b78
- [7.3~]
- VM スタック拡張の際に EG(vm_stack_page_size) を反映するようにし、またページサイズを指定して初期化する Zend API zend_vm_stack_init_ex() を追加
- [PR:3718](https://github.com/php/php-src/pull/3718) で swoole の中の人と話してた奴
- ↑のコメントで「適切なページサイズの指定どうしよう」で、「実際幾つかアプリ動かしてスタック伸長のログとってみるくらいじゃない？」となってるの、まあそうだよなあみたいな気持ち

## weltling: Fixed bug [#77317](https://bugs.php.net/bug.php?id=77317) __DIR__, __FILE__, realpath() reveal physical path for subst virtual drive
- https://github.com/php/php-src/commit/199914b42dccae1c87212dac988b14f57969652d
- [7.3~]
- windows で、7.3.0 では [subst](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/subst) コマンドでドライブ文字を割り当てられたパスについて、__DIR__, __FILE__, realpath() が本来の物理パスを返してしまう問題の修正

## eli-schwartz: ext/gd: use --with instead of --enable
- https://github.com/php/php-src/commit/285a077c1284544e938cd07cfa1fca3d56cf7726
- ext/gd のビルドで、`--enable-freetype` でなく `--with-freetype` を指定するよう修正

## eli-schwartz: Require pkg-config for external PCRE
- https://github.com/php/php-src/commit/c1a22f3d4e69cb87f8deeed7d03d9434e6901537
- ext/pcre のビルドで、バンドルされてるのでない PCRE を使う際、pkg-config を要求するよう修正
- ↑のとあわせて [PR:3654](https://github.com/php/php-src/pull/3654) で話されてた奴

## weltling: Update binary SDK version for AppVeyor
- https://github.com/php/php-src/commit/3c7dc7b4c4905c8999731d1af26987b5d5425754
- [7.2~]
- AppVeyor のバイナリ SDK バージョンを更新

## dstogov: Removed transparent wrapper
- https://github.com/php/php-src/commit/9882929bfa4422765c1b1fde6a612fa48bfcce2e
- 不要な php_output_wrapper() を削除して php_output_write() を直接呼び出すよう修正