OmniAICreator/Qiita-1.07M huggingface dataset:
G Suite Domain-Wide Delegationを使ってG SuiteのGroupを作成する

## TL;DR

- googleapisを使って、G Suiteの Groupを作成できるようにした
- 公式のドキュメントにはnodejsでの実装方法が無かったので自分で実装した
    - よってこれが最適な方法かは分からない
- G Suiteの特権管理者の権限が付与されている必要がある

https://developers.google.com/admin-sdk/directory/v1/guides/delegation
大体このドキュメントに沿って作った

## 手順

- GCP上にサービスアカウントを作成する
- G SuiteのAdmin consoleにて、GCPのサービスアカウントに G Suite APIを叩くための権限を付与する
- Groupを作成するコードを実装する

## GCP上にサービスアカウントを作成する

- GCP consoleにてservice accountのページを開き、新しく service accountを作成する
- Enable Google Apps Domain-wide Delegation にチェックを入れる
- 鍵を作ってDLする
- 鍵のjsonを開き、client_idをメモしておく

<img width="554" alt="スクリーンショット 2018-10-16 16.41.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/23606/601c43a8-b6af-c360-417f-c3648622dee7.png">


## GCPのサービスアカウントにG Suiteの権限を付与する

- G Suiteのadmin consoleを開く
- Advanced settingsを選ぶ
- AuthenticationセクションのManage API client accessを選ぶ
- Client Nameの部分にサービスアカウント作成時にメモしておいた client idを設定する
- scopesの部分に`https://www.googleapis.com/auth/admin.directory.group
`を設定する
    - APIに必要な権限は[このドキュメント](https://developers.google.com/admin-sdk/directory/v1/reference/groups/insert) から確認できる
- authorize を押す

<img width="1149" alt="スクリーンショット 2018-10-16 20.44.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/23606/f0988aec-53b3-d1db-cf8a-5d92f1abcc80.png">


## Groupを作成するコード

```create_group.ts
import { google } from "googleapis";
import path from "path";

async function main() {
  const jwtClient = new google.auth.JWT({
    keyFile: path.join(__dirname, "credentials.json"),
    scopes: ['https://www.googleapis.com/auth/admin.directory.group'],
    subject: process.env.SUBJECT
  });

  await jwtClient.authorize()

  const admin = google.admin({
    version: 'directory_v1',
    auth: jwtClient
  });

  const param = {
    requestBody: {
      email: 'sample-group@xxx.jp',
      name: 'sample-group',
      description: 'hogehoge'
    }
  };

  const response = await admin.groups.insert(param);
  console.log(response.data);
}

main();
```

`jwtClient` を生成する際の `subject` には操作権限の委任を行うユーザのメールアドレスを渡す必要があり、監査ログ等にはここで指定したユーザの名前が記録されます。

## 結果

```console
$ npx ts-node create_group.ts
{ kind: 'admin#directory#group',
  id: 'xxx',
  etag: '"xxx"',
  email: 'sample-group@xxx.jp',
  name: 'sample-group',
  description: 'hogehoge',
  adminCreated: true }
```

こんな感じでグループができました
Chefのテンプレート(erb)をfileリソースで使う

#概要
Chefでtemplateリソースを用いてファイルを作成する場合、レシピとtemplates下のerbファイルの2つで管理する必要がある。
レシピでerbを使うことで1つのファイルで管理可能とできる。

##レシピ例

```ruby:recipes/default.rb

node.default['erb']['user'] = {
  'usr1' => {
    'uid' => 1000,
    'home' => '/home/usr1',
    'shell' => '/bin/bash',
    'comment' => 'foo',
  },
  'usr2' => {
    'uid' => 1001,
    'home' => '/home/usr2',
    'shell' => '/bin/bash',
  },
}

########

require 'erb'

file '/tmp/test.txt' do
  content ERB.new(<<~'EOC', nil, '-').result(binding)

    ユーザー情報

    <% node['erb']['user'].each do |u_name,u_attr| -%>
    user : <%= u_name %>
      uid     : <%= u_attr['uid'] %>
      home    : <%= u_attr['home'] %>
      shell   : <%= u_attr['shell'] %>
    <% if u_attr['comment'] -%>
      comment : <%= u_attr['comment'] %>
    <% end -%>

    <% end -%>
    EOC
end
```
- fileリソースのcontentに対して、rubyのERBリソースを使用する。
- ERBのソースは、ヒアドキュメントとして、<<~'EOC'の次の行からEOCの前の行までを指定。<<~を使用することで、全体をインデント可能としている。出力はインデントされない。'EOC'とシングルクォートで括ることで、バックスラッシュを含めてそのまま評価せずに使用可能としている。
- ERB.newへの第3引数である'-'は、trim_modeの指定。この指定により、-%>で改行させないことが可能になる。制御系の<%の最後を-%>としているのは、その箇所に不要な改行を入れないため。
    - 参考：[標準添付ライブラリ紹介 【第 10 回】 ERB](https://magazine.rubyist.net/articles/0017/0017-BundledLibraries.html)
- <% %>や<%= %>の内部ではそのままRubyの変数が使用可能
- if文の箇所は以下の様にも書ける。ここでは、表示しない場合に改行させない為に-%>で終了させ、かつ表示させる場合には改行させる為に+ "\n"を行なっている。

```
    <%= "  comment : " + u_attr['comment'] + "\n" if u_attr['comment'] -%>
```



##出力例



```
         * file[/tmp/test.txt] action create
           - create new file /tmp/test.txt
           - update content in file /tmp/test.txt from none to 5f5248
           --- /tmp/test.txt	2018-10-16 11:16:06.727526733 +0000
           +++ /tmp/.chef-test20181016-4802-10u25k4.txt	2018-10-16 11:16:06.727526733 +0000
           @@ -1 +1,15 @@
           +
           +ユーザー情報
           +
           +user : usr1
           +  uid     : 1000
           +  home    : /home/usr1
           +  shell   : /bin/bash
           +  comment : foo
           +
           +user : usr2
           +  uid     : 1001
           +  home    : /home/usr2
           +  shell   : /bin/bash
           +
           - restore selinux security context
```
Youtube IFrame API による関連動画の表示制御が変更になった件

Youtube IFrame APIによる、プレイヤーの初期化では、
`playerVars: {}`というオブジェクトで、プレイヤーのオプションを指定できる。

```JavaScript
new YT.Player('player', {
      playerVars: { 
             'autoplay':       1,
             'controls':       1, 
             'rel':            0,
             'showinfo':       0,
      },
      videoId: '{youtubeId}',
      events: {
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange
      }
    });
```

## playerVarsによるオプションが利いてない？
とくに、`rel:0`で関連動画を非表示にするオプションはよく利用されるだろう。
ところが、今日（2018/10/16）実装しようとしたところ、`rel:0`を指定しても、関連動画が表示されてしまった。
~~他のパラメータの機能も確認したところ、`showinfo:0`を指定しても動画タイトルの非表示にはならなかった。こちらも意図しない（仕様とは異なる）動作だ。~~（これは勘違いっぽい）
以前は、関連動画の非表示も~~動画タイトルの非表示も~~問題なく指定した通りになっていたはずなのだが・・・

~~いろいろ検証した結果、FirefoxとSafariでは、機能していることに気づいた。~~
~~どうもChromeでのみ機能していないようだった。Chromeの一時的なバグなのだろうか。~~

~~Youtubeを運営しているGoogle謹製のブラウザでのみ発生している点が解せない。~~

### 2018/10/18追記
ブラウザの問題ではなく、Googleによる仕様変更のようだ。仕様変更は2018/9/25に行われたようだ。
解説している記事を見つけた。
https://www.davideocompany.com/blog/youtube-update-that-will-effect-video-embeds

以下、Googleの発表と思われる箇所を引用。（元記事は見つけられなかったので、引用の引用）
> The behavior for the rel parameter is changing on or after September 25, 2018. The effect of the change is that you will not be able to disable related videos. However, you will have the option of specifying that the related videos shown in the player should be from the same channel as the video that was just played.

要約すると
`rel`パラメータの働きが変わって、（`rel:0`にすることで）関連動画の非表示はできなくなるけど、その代わりに関連動画を同じチャンネルの動画に限定する機能になる。
ということのようだ。

関連動画にユーザーに見せたくない動画（競合他社の動画とか）が並ぶわけじゃないからいいだろ、ということなのかな。引用させてもらった[元記事](https://www.davideocompany.com/blog/youtube-update-that-will-effect-video-embeds)の人は、
> でもよお、表示された関連動画をユーザーがポチったら、自分のサイトから離脱して**youtubeに飛んじまうんだぜ！**
> そんで、youtubeでは他のユーザーの動画が勝手に表示されて、再生されるんだぜ。

って怒っている様子だ。ご指摘ご尤も。


とにかく、動画再生終わった後に、だらだらと他の動画のサムネイルが表示されるダサい感じになるのはもう回避不能らしい。合掌。
PhpStormでクラスプロパティをサクッと生成する小技

PhpStormでコンストラクタの引数からクラスプロパティをサクッと生成する小技のやりかたを紹介する。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PhpStormでクラスプロパティをサクッと定義する方法<br><br>1. ⌘ + Nでコンストラクタのテンプレを生成する<br>2. コンストラクタの引数を定義する<br>3. Option + returnで「Initialize fields」する<br><br>以上 <a href="https://t.co/GT3DOITojP">pic.twitter.com/GT3DOITojP</a></p>&mdash; ❄️suin (@suin) <a href="https://twitter.com/suin/status/1052161556903911424?ref_src=twsrc%5Etfw">2018年10月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 手順

1. クラスの`{`から`}`の間にキャレット(カーソル)を置く
2. <kbd>Command</kbd>+<kbd>N</kbd>を押して「Generate」ウインドウを開く
3. そのまま「const」と打つと「Constructor」に絞り込まれるので<kbd>return</kbd>を押す
4. コンストラクタのテンプレが生成されるので、引数を埋める
5. コンストラクタの引数にキャレットを置いた状態で<kbd>option</kbd>+<kbd>return</kbd>を押しIntensionを表示する
6. そこに表示された「Initialize fields」を選択肢<kbd>return</kbd>を押す
pythonで動的に変数を定義する

# 動的に変数を定義

最初に結論、基本的に配列でいいと思う。

いつもformatで動的に文字列などを作成しているが、
変数も動的に定義しようと思ったらどうすんのかと思ったので備忘録。

使いたいなと思ったシチュエーションは、dfで `df['name_{}'.format(x)]`
みたいな感じで特徴量生成してて、
それをname部分も変えて二重に回したかった。

改めて考えると、やっぱり配列（keyを動的に定義）でいい。

### やり方

 `exec` で定義すればいいらしい。

~~`eval` で行うとグローバル変数になるので要注意。~~
※ `eval`では変数定義はできないそうです。コメントでご指摘いただきました。（2018/10/17追記）


### サンプルコード

```py
names = ['aaa', 'bbbb', 'ccccc']

for name in names:
    x = len(name)
    exec('{} = {}'.format(name, x))
    
print(aaa) # 3
print(bbbb) # 4
print(ccccc) # 5
```

なんかにつかえるといいな。
ScalaのPlayで SeqデータからShift-JISのCSVを出力する

# ScalaでPlayFramworkのレスポンスで Shift_JISのCSVを出力する
↑↑↑↑↑↑↑ 編集リクエストの内容

CSVでダウンロードさせたいみたいな案件がある時に有効。


## 条件

1, CSVライブラリにはPureCSVを使う
https://github.com/melrief/PureCSV
2, Shift-JISに変換するのはPlayの機能で補う

## 実装

- purecsvのREADMEに書かれてるとおりに　build.sbt を記述

```
resolvers += Resolver.sonatypeRepo("releases")
libraryDependencies += "com.github.melrief" %% "purecsv" % "0.1.1"
```

- Controllerを実装 

```
import play.api.mvc.Codec
import purecsv.safe._

case class CSV(id: String, name: String)
val header = CSV("ID", "氏名")
val csv = header +: Seq(CSV("1", "ヤマダ"), CSV("2", "スズキ"))

implicit val myCustomCharset = Codec.javaSupported("Shift_JIS")
Ok(csv.toCSV()).as("text/csv; charset=shift_jis")
```

最後の2行で、Shift-JIS指定ができる。Content-Typeも書き換わってくれる。
指定したroutes にアクセスすると、Shift-JISのCSVが取得できる
画像を２つ重ねて編集

データなどを比較する際、データを印刷した紙を２つ並べるということをしていました。
文字同士の比較であればgrepなどの方法がありますが、画像となるとそうもいきません。
今回は地図の画像を印刷せずに重ねて比較するPowerPointでの方法を紹介します。
Wordでも同じ動作ですが、図形はPowerPointの方がやりやすいです。
# 比較データの入手と取り込み
画像の比較をするのであれば、元のデータをPowerPointに取り込む必要があります。
今回は２枚の地図があり、片方には道順、片方は土地の名称が入っているものの重ね方を紹介します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/70311220-a07a-af27-05d1-cc77e1e4f683.png)
これが土地の名称が入っているほう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/2ae967c1-3e9e-f5fa-ac9e-94ba511591b5.png)
これが道順のほうです。
土地の名称の入っているほうはインターネットの地図サービスから取り込んだもの、道順のほうはパンフレットなどからスキャンしたものということになるでしょう。
今回は、この記事の画像をコピーしてPowerPointに貼り付けてもいいですし、実際の地図サービスからとどこかの会社案内のサイトに記載されている地図を使ってもいいかもしれません。
まず１枚、PowerPointに貼り付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b8f28994-25d9-4ec9-0289-b0d050de6d69.png)
もう１枚、同じくPowerPointに貼り付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/dab4653c-3f40-3845-90fe-dee2ad58a108.png)
# 透明度の設定
重ねたら当然、後ろの画像が見えなくなります。
そこで、画像を透明にします。
右クリックして図の書式設定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b2066e15-b283-a41f-7ce4-aff95bb23dce.png)
そして右に出てくる作業ウィンドウから効果（一番右）をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/78dab9a4-2df6-1687-11ee-1982e22756da.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/786f36b1-126c-feef-81ac-e7fc5c72225e.png)
図の透明度が設定できるので70%程度にします。
もう一枚の画像にも同様に設定しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/2cc24413-f671-7317-b477-5755c1f99d1b.png)
# 単色化と色分け
このままではどの線がどちらの画像かわかりません。
そこで、それぞれの画像ごとに色分けするとよいでしょう。
図の色から彩度：０を選択すると単色化できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/9760e7bb-6c61-7046-2ba8-3d20ad7c0861.png)
色の変更で一番下の列から任意の色をクリックすると、灰色の部分に色がつきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/cafcf85d-2895-3f56-a1da-bab4c9f71f32.png)
もう一つの画像にも違う色を設定してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/1eec7130-44d8-ae80-d7c8-ddc5fb6edcaf.png)
あとは、後ろの余計なプレースフォルダを消し、図形を重ね合わせればよいのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/0a7db504-6544-f14d-ec2a-d1f9bf678ada.png)
ここから新たな図形を足してオリジナルの地図を作成することもできますし、オリジナルの何かを作ることもできます。
# 図の順番
今は赤い色が手前にきていますが、青い色を手前に表示したい場合は、図形を右クリックして、最背面を選べばその図形を後ろにすることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/192188da-d108-5b1a-0202-af67c81f234f.png)
# 図同士のサイズ調整
図同士のサイズが違えば重ねてもずれてしまいます。
図を厳密にサイズ調整する場合は、図をクリックしたときに出てくる図ツールタブの書式設定タブをクリックすれば、サイズ調整が出てきます。ここの上下ボタンで図全体の寸法が変わるので、重ねながら少しずつサイズを変えていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/df474c33-6e60-f322-89bf-dbedd4fccdab.png)
QLayoutに追加したQWidgetを削除する

# はじめに
何らかのイベントが発生したとき，途中でウィジェットを削除したくなるときがあります．例えば，グリッド状に表示したウィジェットを画面のリサイズに合わせて変更したい，というときです．消した分だけストレッチしたいということもあるでしょう．

常識的な思考でしたら，`QBoxLayout.removeWidget`を呼び出すなどで登録されたウィジェットを削除しますが，どうやら`removeWidget`を呼び出してもレイアウトから削除されずに残ったままになります．

それだけでなく，ウィジェットが削除されたままレンダリングされる，という状態が発生するため問題だらけです．不具合にしか思えません．

今回はウィジェットを削除する方法を説明します．

## 回避策
`removeWidget`を呼び出しても内部的にレンダリングされたままになる現象は今のところ対応されてないらしいです．対症療法的ですが，以下の方法で削除できます．

```python 
# ラベルだけ削除したい
layout = QVBoxLayout()
label = QLabel("I need to remove a label.")
btn = QPushButton("test")
layout.addWidget(label)
layout.addWidget(btn)

# 気持ち的に完全に削除したい
label.hide()
layout.removeWidget(label)
del label   # 変数の中身自体を削除する
```

`QWidget.hide()`を呼び出せば画面から消えてくれるだけでなく，消えた分だけストレッチもされます．あまりにも対症療法的とも思えますし，そもそもメモリリークが起こり得るのではないかと思うのですが，消す方法がないですし，どうやら内部的には`QWidget.show()`を呼び出せる状態のままになっているらしいです．

そのため，del文を使って参照自体を切り離すということをやっていますが，これがまた内部的に問題を起こすかどうかは未知数です．**かなり危険な方法だと思います**．

## Flyweightパターンで回避する
このような状態では，かなり不安が残ります．特に，Qt内部で削除したウィジェットが参照されたときに落ちる可能性も拭えないからです．
（Pythonでは削除した変数はNone型ではなく例外が送出されます）

これを回避するには，到るところで例外キャッチしないといけないわけですがどこで発生するか特定できない例外のためにコードを割くのは無謀だと思います．
そこで回避策の一つとして**Flyweightパターン**を使って使用できる想定分だけ大量のウィジェットを作成します．

```python
# とりあえず大量のオブジェクトを作成しておく
layout = QVBoxLayout()
labelList = []
for _ in range(100):
  label = QLabel("hogehoge")
  label.hide()
  layout.addWidget(label)  # 表示はしないけど追加はしておく
  labelList.append(label)

# 今は5個だけ表示する
for label in rangee(5):
  label.show()
```

あらかじめ大量のオブジェクトを確保しておき，使い回すような方法を**メモリプール**と呼ぶことがあります．内容が同じ（もしくは継承先が同じ）であれば，本質的に使い回せることを示唆するデザインパターンです．

使わなくなれば`QWidget.hide()`を呼び出すことも，使いたくなれば`QWidget.show()`で呼び出すことができます．

## 考察
レイアウトから削除してウィジェットを切り離しても，どうやらQtのどこかに登録されたままになっている可能性が考えられます．レンダリングされたまま残るのですから，座標値なども親子関係を解消した上で解決しているように思われます．

そのため，`QWidget.removeWidget`を呼び出してもレンダリングとして削除されず，再描画されても残ったままになる，という挙動を説明できます．恐らく，レンダリング周りでウィジェットもしくは描画情報が生き残っている可能性が考えられます．

del文で削除しても動いているには動いているのですが，基本的に`QWidget.hide()`を呼び出しましょう，ということなので，下手するとdel文で削除したウィジェットを参照する可能性があります．del文の削除を行うと意図しない動作が発現することも予想できるため，**ウィジェットを増減させるケースはFlyweightな設計を心がけるべきです**．

# おわりに
根本的な対応策になっていない気がするのですが，いずれにせよ大量のウィジェットを表示するのであれば，最悪想定分だけオブジェクトを確保するのは理にかなっています．

また，急な操作が発生するとウィジェットのために大量のメモリ確保が必要になり，非常に操作が重くなります．これを何度も繰り返すのはあまり良い設計ではありません．

この回避策だとそもそも少ない数だったら実装するコスト考えるとあまり良いとは言えないのではないか，と言われればその通りです．しかし，レンダリングの情報まで削除しに行くか？　と言われると面倒くさいです．カプセル化されてたら調べる意味もありませんし，どのような副作用があるのかもわかりません．私ならウィジェットを増減させるならば，Qtの動作を考えてFlyweightにします．
シンプソン則（数値積分）

# シンプソン則とは
- 数値積分の解法の一つ
- 関数$f(x)$において、微小区間の関数値を二次方程式で近似
- 微小区間$[x_0,x_2]$の端点とその中点$x_1$を用いて、二次方程式を求める

![qiita-integer-4.png](https://qiita-image-store.s3.amazonaws.com/0/299208/d12391df-ac76-74a2-1d40-a241bd01cd07.png)


# 算法
三点の$y$座標をそれぞれ$f(x_0)=y_0,f(x_1)=y_1,f(x_2)=y_2$とする。
近似に用いる二次方程式$y=ax^2+bx+c$は、$(x_0,y_0),(x_1,y_1),(x_2,y_2)$を通る、また、$x_2-x_1=h,x_1-x_0=h$とすると、
$$ a=\frac{y_0-2y_1+y_2}{2h^2}$$$$b=\frac{-(x_1+x_2)y_0+2(x_2+x_0)y_1-(x_0+x_1)y_2}{2h^2}$$$$c=\frac{x_1x_2y_0-2x_2x_0y_1+x_0x_1y_2}{2h^2} $$
この二次方程式$y=ax^2+bx+c$を$x_0$から$x_2$まで積分すると、
$$ \int_{x_0}^{x_2}(ax^2+bx+c)dx=\frac{a}{3}(x_2^3-x_0^3)+\frac{b}{2}(x_2^2-x_0^2)+c(x_2-x_0) $$$$=\frac{h}{3}(y_0+4y_1+y_2)$$

区間$[a,b]$が微小距離$h$で$2n$等分されているとし、各$x_i\ (i=0,1,\cdots,2n)$の$y$座標を$f(x_i)=y_i$とすると、区間$[a,b]$内の積分は次のようになる。
$$\int_a^bf(x)dx=\frac{h}{3}{(y_0+4y_1+y_2)+(y_2+4y_3+y_4)+\cdots+(y_{2n-2}+4y_{2n-1}+y_{2n})}$$$$=\frac{h}{3}(y_0+4y_1+2y_2+4y_3+2y_4+\cdots+2y_{2n-2}+4y_{2n-1}+y_{2n})$$
ただし、$h=(b-a)/(2n)$


# サンプルコード
$f(x)=\sqrt{1-x^2}$において、区間$[0,1]$の定積分の値を求めるプログラム。
分割数は4。
解析解は$\pi/4$です。


```c:simpsons_rule.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return sqrt(1-x*x);
}

/* シンプソン則（区間[a,b]をn分割） */
double simpsons_rule (double a, double b, int n) {
  double h;
  int i;
  double value=0;

  h = (b - a) / (2*n);
  for (i = 0; i <= 2*n; i++) {
    if (i == 0 || i == 2*n) value += f(a + i*h);   // 0か2nのとき
    else if (i % 2 == 1) value += 4 * f(a + i*h);   // 奇数
    else value += 2 * f(a + i*h);   // 偶数
  }
  value = value*h/3;
  return value;
}

int main (void) {
  printf("Analytical solution: %f\n", M_PI/4);
  printf("Numerical solution : %f\n", simpsons_rule(0, 1, 4));
  return 0;
}
```

実行結果

```
Analytical solution: 0.785398
Numerical solution : 0.780297
```


# 特徴
- 一区間の誤差評価：$O(h^5/90)$
- 全区間合計の誤差評価：$O(h^4)$
docker-composeから環境変数をDockerfileに渡す方法

# 概要

Linuxコンテナの場合はdocker-composeから環境変数をDockerfileに渡す方法がすぐに見つかりますが、Windowsコンテナの場合は渡す方法が分かりにくかったのでまとめておきます。

# 方法

Dockerfileに渡したい環境変数は `PARAMETER` とします。
まずはDockerfileにARGで指定しておきます。 `${PARAMETER}` の箇所にはdocker-composeから渡される環境変数が展開されます。

```Dockerfile:Dockerfile
FROM microsoft/windowsservercore:ltsc2016

ARG PARAMETER
ADD ${PARAMETER} .
```

次にdocker-compose.ymlではbuildのargsに環境変数を指定しておきます。

```yaml:docker-compose.yml
version: '3.7'
services:
  sample:
    build:
      context: ./sample
      args:
        - PARAMETER=${PARAMETER}
```

最後にdocker-composeの呼び出しです。
setで環境変数を設定してdocker-composeを呼び出します。
ここでは `abc` という値がDockerfileの `${PARAMETER}` で展開されます。

```:コマンドプロンプト
set PARAMETER=abc
docker-compose up
```
trimTrailingWhitespaceでMarkdownの改行を消されないようにする

Visual Studio Codeで`trimTrailingWhitespace`の設定を有効にしたままMarkdownのファイルを編集すると、行末のスペースが削除されてしまい、改行コードがなくなってしまったのでどうにかならないか調べました。

settings.jsonに以下の設定を追加すると、ファイルの保存時に行末の空白を自動で削除してくれるようになります。

```
// 行末のスペースを自動削除
"files.trimTrailingWhitespace": true
```

このままではMarkdownの行末スペースが削除されてしまったので、言語ごとのオプションを追加します。

```
// 行末のスペースを自動削除
"files.trimTrailingWhitespace": true,

// Markdownの場合のみ無効化する
"[markdown]": {
  "files.trimTrailingWhitespace": false
},
```
VB.NETでInterSystems IRIS Platformのデータベースにアクセスする方法

10月3日に発表されたInterSystems IRIS for Healthについて、VB.NETでの接続法を調べました。
（結論から言いますと、以前この項で紹介したVB.NETによるCache'の接続と殆ど同じです。）

1.InterSystems IRIS Platformのインストール（ディスクを使用）

2.右下のアイコン[IR]から、Studioを起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/bc5726f1-d41a-ad89-3bf5-dfb1bf6e514e.png)

3.テーブルとなるクラスを作成する（新規→クラスの作成から。ここではネームスペース"USER"の中に、MercForNLPというクラスを作成している。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/e7fc0a8a-ef22-79be-a3a2-c7f68054e29f.png)

ソースコードは次の通り。contentFullの後ろについているMAXLANがないと、デフォルトの文字列は50文字ぐらいになる。

```vb:MercForNLP
Class User.MercForNLP Extends (%Persistent, %Library.Populate)
{

Property diseaseName As %String;

Property medicalDivision As %String;

Property dataType As %String;

Property contentFull As %String(MAXLEN = 100000);

```

4.VB.NETの準備
プロジェクトを新規作成し（ここではフォームアプリケーションを作成）、プロジェクト→参照の追加で
C:\InterSystems\IRIS\dev\dotnet\bin\4.5\InterSystems.Data.IRISClient.dll
C:\InterSystems\IRIS\dev\dotnet\bin\4.5\InterSystems.Data.GateWay64.dll
を追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/5b0d5370-6057-ac04-11ca-ea1de3c8cc12.png)

Buttonを1つ作成し、IRISへの接続コードを記述する。VB.NET内コードの記述は次の通り。port=51773であることに注意する。ここではSQL文を使って、ID=1のデータをReader.Read()で読み出しています。また、これがクラウドにある場合（IRIS Platformではユーザー登録でクラウド上のIRISを利用できるようになります）でも、アドレス指定を変えるだけですので、操作法は共通です。

```vb:IrisConnectionTest.vb

Imports InterSystems.Data.IRISClient
Imports InterSystems.Data.IrisTypes

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim IrisConnect As IRISConnection = New IRISConnection()

        IrisConnect.ConnectionString = "Server = localhost; " + "Port = 51773; " + "Namespace = TESTSAMPLES; " + "Password = yourpass; " + "User ID = yourname;"
        IrisConnect.Open()

        Dim SQLtext As String = "SELECT * FROM SQLUser.MercForNLP WHERE ID = 1"
        Dim Command As New IRISCommand(SQLtext, IrisConnect)
        Dim Reader As IRISDataReader = Command.ExecuteReader()
        Dim smsg As String

        'While (Reader.Read())
        Reader.Read()
        smsg = "TinyProvider output: \r\n   " _
          + CStr(Reader(Reader.GetOrdinal("ID"))) + ": " _
          + Reader(Reader.GetOrdinal("contentFull"))
        Console.WriteLine(smsg)
            MsgBox(smsg)
        'End While

        Reader.Close()
        Command.Dispose()
        IrisConnect.Close()

    End Sub

End Class

```

実行結果は次の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/a3e9d90d-0d04-0cc5-90f4-c9798d4627ce.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/dea29c41-77e8-938a-309c-7278c4a71b8c.png)

IRISにはObjectBindingはまだありませんが、「つながる」仕組みを作るために今後実装が計画されているとの談話でした。CacheCommandを使って記述する方法で、接続性は担保できると考えています。
Ubuntu18.04LTSのログインループへの対処

#　最初に
ubuntuのログインループへの対処は調べるといろんな方が紹介されていましたが，Ubuntu18.04LTSでの例は少なかったので今回解決した方法を紹介しておきます．

## 環境
Windows10とのデュアルブート
Ubuntu 18.04 LTS

## 問題
ユーザでログインする際，パスワードを入力すると一瞬固まった後暗転して再びユーザ選択画面へ戻る．

繰り返しログインを試しても，再起動して試しても変化なし．

## 対処法
    1.仮想コンソールを開く
    2.unity-tweak-toolを再インストール
    3.再起動
という手順で解決しました．詳しい手順は以下で説明していきます．

### 仮想コンソールを開く
ubuntuログイン画面で`Ctrl+Alt+F1`で仮想コンソールが表示されます．（環境によって`F1~F6`の中の違うキーであったりするので，ガチャガチャやってみると良いです）

※ユーザ選択画面ではなくログイン画面

仮想コンソールを閉じたい場合は，`Alt+F7`もしくは

```sh
$ exit
```

とコマンドを入力するとログイン画面に戻れます．

### unity-tweak-toolを再インストール
以下のコマンドを実行します．

```sh
$ sudo apt install unity-tweak-tool
$ unity-tweak-tool --reset-unity
```

途中，エラーが出たので以下のコマンドも実行しましたが，こちらはlockの取得に関するエラーであり，今回の問題に関係はないと考えられます．

    $ rm var/lib/dpkg/lock
    $ sudo apt --fix-broken install

### ログインの確認
仮想コンソールを終了してログインができるかどうか確認．ログインできた場合は再起動してログインできるかどうか確認しましょう．
私の場合はここで解決していました．

## 上記の手順で解決しなかったら・・・

nVidiaドライバの方に問題があるかもしれません．そちらの方法を試してみてください．
【Rails】rails g model/migrationの使い分け

モデルとマイグレーションファイルについて、
指している内容と使い分けについて、以下にまとめます。

## rails g model モデル名

・データベースのテーブルを司るモデルを新しく生成する。
※同時に、マイグレーションファイルも生成されます。

```ruby.qiita.rb
$ rails g model morikuma
```
新しく「morikuma」モデルとテーブルを生成します。

## rails g migrate マイグレーションファイル名

・データベースの設計図となるマイグレーションファイルを新しく生成する。
※すでに存在しているテーブルに変更が必要な時に使用します。

```ruby.qiita.rb
$ rails g migration add_column_morikuma
```
すでに存在している「morikuma」テーブルにカラムを追加するための
マイグレーションファイルを生成した想定の記述例です。

##　生成したマイグレーションファイルを実行する
`rails g model 〜`
`rails g migration 〜`
で生成された設計図であるマイグレーションファイルは実行されないとデータベースに反映されません。

```ruby.qiita.rb
$ rake db:migrate
```
必ず、以下の記述でマイグレーションファイルを実行しましょう。

今日はこのあたりで失礼します。

## 参考サイト
マイグレーションファイルの役割と生成
https://qiita.com/right1121/items/0a54ba76dc4261702d1e
UINavigationControllerで数個前(n個前)の画面に戻りたいマン

# 概要
様々な画面、様々なパターンでの表示があるアプリを作成中。
`UINavigationContoller`で画面を制御している状態。
作る物が画面A1に画面Bの処理が完了したら戻ったり、画面A1から画面B更に画面Cに遷移した後画面Cから画面A1に戻ったり。
画面A2から画面Bに行って処理が完了したら画面A2に戻ったり・・・。
何個戻るのか、どこに戻るのか正直わからん状態な状況になってしまった。

で、その解決方法を色々考慮したのでメモ。

とりあえず要件を整理した結果、下記が分かった。

* 戻る画面は、呼び出し元の画面
* 呼び出し元の画面は複数ある（画面A1だったり画面A2だったり画面A3だったり）
* 処理完了後呼び出し元に戻る場合は、遷移順として必ず画面Bを経由する
* 処理完了後戻らないパターンも実はある

# 解決方法

とりあえず画面Bを必ず経由するようなので、画面Bの`ViewDidLoad`で親`ViewController`(画面A1等)を`Singleton`で管理している変数に格納。
これは処理後に、呼び出し元に戻る必要がある場合だけ実行。
それ以外はnilをつっこんでおいた。

```swift
AppData.shared.parentViewController = self.navigationController?.viewControllers[(self.navigationController?.viewControllers.count)! - 2]
```

処理が終わったら呼び出し元に戻る呪文を唱える。


```swift
if let parentViewController = AppData.shared.parentViewController {
    AppData.shared.parentViewController = nil
    self.navigationController?.popToViewController(parentViewController, animated: true)
}
```

うごいた。よかったね。

# おまけ
## 悲しい失敗編
最初実装時、protocolで画面Cとかを閉じるときに画面Bにも閉じろという形で処理をすれば終わりじゃないかと思っていた。

```swift
self.navigationController?.popViewController(animated: true)
```

2画面まではそれで行けたのだが、3画面以降はprotocolで定義した関数が順々に呼び出されるも`popViewController`が実行されなかった。
3画面以降は下記で囲うとかすれば動きそうだが、まあよろしくない実装なので、今回の方法を試してみるなど。

```swift
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
}
```
## 言い訳
今回一人でアプリ作ってるのもあり強制アンラップしたりしてるけど、よい子はまねしちゃいけないぞ。

おわり。
Xonsh のスクリプトで ssh の config を読み込んで、選択した番号のサーバーに接続する

作業環境が Windows から Mac に変更になり ssh クライアントをどうしようかと考えてました。
前は MobaXterm を使っていて接続先を保存しておけば何回かクリックしただけでトンネリングしつつ別サーバーにログインするということができました。
Mac の場合だとターミナルから普通に別サーバーにログインできるのですが、接続したいサーバーがたくさんあって覚えきれないので ssh の config に設定を書きました。
ということで、今回はその config を Xonsh のスクリプトで読み込むことにしました。

手元の環境は以下になります。

* MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
* macOS High Sierra 10.13.6
* Python 3.6.5 :: Anaconda, Inc.
* xonsh==0.6.10

スクリプトは以下になります。
[read_ssh_config](https://github.com/nettle0010/read_ssh_config)

以下のような感じで選択した番号について ssh 接続します。

```
$ xonsh ssh_list.xsh
Selection    	Host                
-----------------------------------------------------
0            	aaaa.bbbb.cccc
1            	dddd.eeee

please select number:1
start connection.
```

bash でも同じことはできると思うのですが、ファイルを読み込んで抽出したリストを使って ssh コマンドを実行するというところを Python3 で書けたのが良かったです。

```
target_hosts = []
with open(dir + '/config') as f:
    for row in f:
        if row.startswith('Host '):
            host = row.replace('Host ', '').replace('\n', '')
            target_hosts.append(host)
.
.
.
ssh @(target_hosts[int(selected_num)])
```

多段でのトンネリングも config で設定できるので、最終的な接続先だけ選べばいいのは楽になったかなと思っています。

### 参考になった記事
[Pythonistaに贈るXonshのススメ](https://vaaaaaanquish.hatenablog.com/entry/2017/11/30/175236)
Unity個人的まとめ

#個人的に助かったやつの置き場所

###オブジェクトごとのGravityをＯＮＯＦＦする↓
https://qiita.com/Nicky/items/552b1f737e8b0af01cfd
```rb = this.GetComponent<Rigidbody>();　```
を置く場所を間違えてエラー吐きまくってたからとても助かった

###Instantiate
```GameObject obj = Instantiate(ball, BrushTip.position, BrushTip.rotation) as GameObject;
                obj.GetComponent<Rigidbody>().AddForce(obj.transform.forward * 10000f);
```
オブジェクトの生成と力を加えて飛ばすやつです。オブジェクトを横向きで飛ばしたいなどの場合は回転➡︎力を加える➡︎回転などで対応できる可能性がある。

###AddForceがうまくいかないとき
AddForceがうまくいかない？それMassがでかいだけだよ。1000にすると100万でも動きが鈍い。


###これをいれないと経過時間が0のままになって動かないよ
```timeElapsed += Time.deltaTime;```

###テキストはフォントサイズを大きくしてからScaleを小さくするぼやけない

###SteamVR起動してたらインターネットの速度がありえないほど遅くなった
SteamVRを終了すると治る　なんでだろう

###vector3の桁数を変える
https://qiita.com/shoridevel/items/2c1570a35392c100a43b

###Unityにおけるランダムな数の生成
https://docs.unity3d.com/ja/current/ScriptReference/Random.Range.html
``` Vector3 position = new Vector3(Random.Range(-10.0f, 10.0f), 0, Random.Range(-10.0f, 10.0f));```

###クリックした場所にprefabを生成
```
public class CLick : MonoBehaviour
{
    [SerializeField] GameObject prefab;

    void Update()
    {
        //  クリック、あるいはタップした瞬間
        if (Input.GetMouseButtonDown(0) || IsTap())
        {
            
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                Vector3 pos = hit.point;
                GameObject obj = Instantiate(prefab, pos, this.transform.rotation) as GameObject;
            }

        }
    }
    /// <summary>
    /// タップした瞬間を検出
    /// </summary>
    /// <returns>タップした瞬間のみtrue</returns>
    bool IsTap()
    {
        if (Input.touchCount > 0)
        {
            return Input.GetTouch(0).phase == TouchPhase.Began;
        }
        return false;
    }
}```

子の子、すなわち孫を取得するとき
GetChild(0).GetChild(0)のようにすればいい。感覚的にできていいね。
play-services-adsを使用せず広告IDを取得する

## 概要
- 広告IDを利用するSDKの手順書によく `com.google.android.gms:play-services-ads` を記載してねと書いてあります。
- が、2018/10に公開された `play-services-ads-identifier` の設定だけで `ads` 本体には依存せずに広告IDが取得できます。(AdvertisingIdClientが参照できる)

## 設定方法

```app/build.gradle
dependencies {
    implementation 'com.google.android.gms:play-services-ads-identifier:16.0.0'
}
```

## 依存関係グラフ
- supportLibraryのバージョンを揃えてないですが... 

```
\--- com.google.android.gms:play-services-ads-identifier:16.0.0
     \--- com.google.android.gms:play-services-basement:16.0.1
          \--- com.android.support:support-v4:26.1.0
               +--- com.android.support:support-compat:26.1.0 -> 28.0.0 (*)
               +--- com.android.support:support-media-compat:26.1.0
               |    +--- com.android.support:support-annotations:26.1.0 -> 28.0.0
               |    \--- com.android.support:support-compat:26.1.0 -> 28.0.0 (*)
               +--- com.android.support:support-core-utils:26.1.0 -> 28.0.0 (*)
               +--- com.android.support:support-core-ui:26.1.0 -> 28.0.0 (*)
               \--- com.android.support:support-fragment:26.1.0 -> 28.0.0 (*)
```

## 参照
- [Release Notes] (https://developers.google.com/android/guides/releases#october_2nd_2018)
- [MVNRepository](https://mvnrepository.com/artifact/com.google.android.gms/play-services-ads-identifier)
  - ☝️2018/4から公開されていたみたいです
ターミナルでルート権限にする

#コマンド
###1.su
```su - root```
###2.sudo
```sudo su - root```

#suとsudoの違い
###1.su 
①ユーザーがroot(**s**uper **u**ser)になる。
②root権限は維持される。

※suの後にハイフン（```-```）をつけるとディレクトリがrootのホームディレクトリに移動するらしい（つけなければディレクトリはそのまま）。
###2.sudo　
①コマンドをroot(super user)として実行できる。
②コマンド実行後rootから元のユーザーに戻る。
HomeBrewインストール

HomeBrewをインストール
最初うまくいかなかった。
どうやら、コピペ元が、ダブルクオーテーションが日本語になってた模様

#2019/02/10

```
brew update
# cask を使える様に
brew cask
# brew tap が走る。→ レポジトリとして　home-brew/caskが追加された
```
中点則（数値積分）

# 中点則とは
- 数値積分の解法の一つ
- 関数$f(x)$において、微小区間$[x_0,x_1]$内の関数値は、区間の中点での関数値で一定であると仮定する

![qiita-integer-3.png](https://qiita-image-store.s3.amazonaws.com/0/299208/851e9766-6521-d067-4f53-c43432081098.png)


# 算法
区間$[a,b]$を小区間に$n$等分し、刻幅$h$と分点$x_i$を次のようにする。
$$ h=\frac{b-a}{n}\ ,\ \ x_i=a+\frac{2i+1}{2}h\ ,\ (i=0,1,\cdots,n-1) $$

積分の近似値は、
$$ \int_a^bf(x)=\sum_{i=0}^{n-1}hf(x_i) $$


# サンプルコード
$f(x)=\sqrt{1-x^2}$において、区間$[0,1]$の定積分の値を求めるプログラム。
分割数は4。
解析解は$\pi/4$です。


```c:midpoint_rule.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return sqrt(1-x*x);
}

/* 中点則（区間[a,b]をn分割） */
double midpoint_rule (double a, double b, int n) {
  double h;
  int i;
  double x, value=0;

  h = (b - a) / n;   // 区間幅の計算
  for (i = 0; i < n; i++) {
    x = a + h*(2*i + 1)/2;   // 分点の計算
    value += f(x);
  }
  value = value*h;
  return value;
}

int main (void) {
  printf("Analytical solution: %f\n", M_PI/4);
  printf("Numerical solution : %f\n", midpoint_rule(0, 1, 4));
  return 0;
}
```

実行結果

```
Analytical solution: 0.785398
Numerical solution : 0.795982
```

# 特徴
- 全区間の誤差
$$ E=\frac{h^2(b-a)}{24}f^{\prime\prime}(\xi)\ ,\ \ \ (a<\xi<b) $$

- 分割数を倍にすると誤差は$1/4$に減少
- 上記の$\xi$は、[台形則](https://qiita.com/omu58n/items/55699bd127ed74d6b73f)のとは違うので、中点則の方が誤差が小さいことを表しているわけではない
AndroidStudioでSHA-1を簡単に見つける方法

FirebaseやGoogleMap APIなどで用いるSHA-1をAndroid Studioを使って簡単に見る方法を紹介します。

コマンドや他のアプリは用いずにAndroid Studioだけで簡単に見ることができます。

---

projectの右上に*Gradle*と書かれた場所があるのでここをクリック

![スクリーンショット 2018-10-16 18.20.45.png](https://qiita-image-store.s3.amazonaws.com/0/303361/16c3a81c-1158-6882-fbd4-083afbc3b4c2.png)



開くと*project名*と*:app*というフォルダがあります。

![スクリーンショット 2018-10-16 18.20.57.png](https://qiita-image-store.s3.amazonaws.com/0/303361/640554c7-9f2d-11f8-98e9-b59dd8e7270d.png)

*:app → Tasks → android → signingReport　*と開いていきます。

![スクリーンショット 2018-10-16 18.21.11.png](https://qiita-image-store.s3.amazonaws.com/0/303361/069e20bf-d38a-8b1c-3778-ac30f212b230.png)

*signingReport*のファイルを開くと以下のようにSHA-1を見ることができます


![スクリーンショット 2018-10-16 18.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/303361/89f1c66c-a6e8-88d8-fd08-c48e82afe68a.png)

実行する際は*signingReport*を閉じてからおこなってください。
Thread 1: signal SIGABRTと出てしまう理由が判明した

###概要

**コードは合ってるのになぜかThread 1: signal SIGABRTと出てしまう**


これが
<img width="1170" alt="スクリーンショット 2018-10-16 18.09.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/6eddd8d0-727f-4382-db75-ecc22160331a.png">

なぜかこうなる

<img width="1170" alt="スクリーンショット 2018-10-16 18.15.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/a58a328e-d2f8-a3ce-531b-229a96c0cc46.png">


###原因

原因は間違ってコード上でした関連付けを**コード上でしか削除してなかった**事だった

つまり本来は

```
class ViewController: UIViewController {

    override func viewDidLoad() {
　　　　　　　　省略
　　　　　　　　}
    @IBAction func tapTweetBtn(_ sender: UIButton) {
    省略
```

とOutletしなきゃいけないのに


```
class ViewController: UIViewController {
 @IBOutlet weak var tapTweetBtn: UIButton!

    override func viewDidLoad() {
```

と間違えてしてしまい

```
 @IBOutlet weak var tapTweetBtn: UIButton!
```

をコード上から削除した

だけどこれだけじゃダメなのです

なぜならコード上で消してもシステム上での関連付けはそのままされているので
シミュレータが必死にこの関連付けのコードを探してしまい止まってしまう
というカラクリでした

###改善策

この赤丸の所のシステム上の関連付けを切ればOK

<img width="1427" alt="スクリーンショット 2018-10-16 18.30.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/7ae72f50-495b-98c6-654e-811684f27d90.png">

<img width="260" alt="スクリーンショット 2018-10-16 18.35.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/1cb5f48a-d1d2-07bf-938e-283fa2fa291d.png">

シミュレータを起動させると…

<img width="795" alt="スクリーンショット 2018-10-16 18.38.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/fce4fb49-8e72-dd04-06a8-976979864647.png">

**成功しました**

わーい


###まとめ

間違えて関連付けしてしまった場合は
コード上だけでなくシステム上のOutletも削除する

終わり
データバインドをシンプルに

# DataBindings

## 概要
設定クラス等をコントロールにデータバインドする場合について、
値が変更されたときに、現在値と比較して違っている場合だけ OK ボタンをクリック可能にしたい場合がある。
これを実現するには、通常、下記の手順で実装となる。

1. 設定クラスを作成
2. 設定クラスに INotifyPropertyChanged インターフェイスを実装
3. 編集用コントロールを配置
4. コントロールに設定クラスのインスタンスをデータバインド

が、INotifyPropertyChanged インターフェイスをいちいち実装するのが面倒。。


## INotifyPropertyChanged インターフェイスは必要か
例えば、TextBox にデータバインドする場合、DataSourceUpdateMode を OnPropertyChanged にしても、プロパティの値が変更されるタイミングは、TextChanged イベントの後になるため、このイベントで値を比較しても正しい結果は得られない。


## 解決案
TextChanged イベントが発生したらデータソースを更新する処理を手動で入れてやる！


```C#
static void BindData(this Control control, string propertyName, object dataSource, string dataMember, Action onChanged = null)
{
	//control.DataBindings.Clear();
	var binding = control.DataBindings.Add(propertyName, dataSource, dataMember, true, DataSourceUpdateMode.Never);
	if (binding != null)
	{
		// デフォルトイベント発生時に手動でデータソースを更新
		// (DataSourceUpdateMode.OnPropertyChanged だと、TextBox.TextChanged イベント後にデータソースが更新されるため)
		var defaultEvent = control.GetType().GetDefaultEvent();
		if (defaultEvent != null)
		{
			defaultEvent.AddEventHandler(control, new EventHandler((sender, e) =>
			{
				binding.WriteValue();
				onChanged?.Invoke();
			}));
		}
		else binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
	}
}
```

値変更時のイベントは、コントロールによって TextChanged だったり ValueChanged だったりするため、DefaultEventAttribute で指定されているイベントを取得する。

```C#
static EventInfo GetDefaultEvent(this Type type) => type.GetEvent(type.GetAttribute<DefaultEventAttribute>()?.Name ?? string.Empty);

static TAttribute GetAttribute<TAttribute>(this ICustomAttributeProvider element, bool inherit = true) where TAttribute : Attribute
{
	if (element == null) throw new ArgumentNullException(nameof(element));
	return element.GetCustomAttributes(typeof(TAttribute), inherit).FirstOrDefault() as TAttribute;
}
```

### 各コントロールと Default 属性値

|Control|DefaultProperty|DefaultEvent|DefaultBindingProperty|
|---|---|---|---|
|TextBox|Text|TextChanged|Text|
|CheckBox|Checked|CheckedChanged|CheckState|
|RadioButton|Checked|CheckedChanged|Checked|
|NumericUpDown|Value|ValueChanged|Value|
|DateTimePicker|Value|ValueChanged|Value|
|DataGridView|Text|CellContentClick|-|
【Excel VBA】Excel2010以降のVBAで画像の実体を挿入する

# 2010以降で記録したマクロで画像貼り付けすると参照扱いに
ブラウザ打鍵系テストをやると待ってる地獄があるじゃないですか。
ほら、キャプチャをひたすらExcelに貼り付けてはマーキングするアレです。
大量のケースがあるともう心が死ぬやつ。あと手動ゆえのミスとかも出ますし。
それはSeleniumでキャプチャ画像を出力して、Excel VBAで予め作ったテンプレートに貼る事で効率化したんですけど、画像をExcelのワークシートに貼り付ける処理をググるよりマクロ記録でやったほうが早いんじゃねって思ったのが間違いだったんです。
2010以降では、マクロの記録で画像を挿入すると、出来上がるコードはリンク貼り付けになっちゃうなんて、そんな。まさか。完全に落とし穴じゃねーか！マクロ記録してなければリンク貼り付けにならんのに！
リンク貼り付けだとパス変わると画像が見えないんですよね…

# 解決法
前振りはこの辺にしておいて、解決法です。
2007までは有効だった「ActiveSheet.Pictures.Insert」ではなく、「ActiveSheet.Shapes.AddPicture」を使います。

```vb
Dim shp as Shape
With Workbook
    ' 画像貼り付け
    With .ActiveSheet
        .Cells(1, 1).Select
        Set shp = .Shapes.AddPicture( _
                fileName:="C:\\temp\img.png", _
                linktofile:=False, _
                savewithdocument:=True, _
                Left:=Selection.Left, _
                Top:=Selection.Top, _
                Width:=0, _
                Height:=0)
    End With

    With shp
        ' 一旦縦横のサイズを100%にリセットする
        .LockAspectRatio = False
        .ScaleHeight 1, msoTrue, msoScaleFromTopLeft
        .ScaleWidth 1, msoTrue, msoScaleFromTopLeft

        ' 縦横比固定で75%に設定
        .LockAspectRatio = True
        .ScaleHeight 0.75, msoTrue, msoScaleFromTopLeft
        ' 最背面に配置
        .ZOrder msoSendToBack
        ' 画像の囲み線を1pxの黒い実線に
        With .Line
            .Visible = msoTrue
            .ForeColor.ObjectThemeColor = msoThemeColorText1
            .ForeColor.TintAndShade = 0
            .ForeColor.Brightness = 0
            .Weight = 1
        End With
    End With
End With
Set shp = Nothing
```

> linktofile:=False, _
> savewithdocument:=True, _

ここがキモです！ここでリンク埋め込みか実態埋め込みか、ファイル内に画像を保存するかを設定してます。

なんでわざわざ貼り付けた後に100%にしてるかって、そのままだと100% * 100%になってない時があるんですよ…
縦横比固定にチェックが入ってても73% * 69%みたいなわけわからん数値になってたりするので…
Munchkin is not defined の原因

エラー検知ツールの [Sentry](https://sentry.io/) でエラーログを見てるとき、↓のエラーが20万件弱発生していた。

```javascript
Munchkin is not defined
```

Munchkinというのは、マーケティングオートメーションツールのMarketoのトラッキングをしたいときに使うScriptで、
公式ドキュメントに書いてあったようにCDNから `munchkin.js` を読み込んで、ページの読み込み時に初期化して使っている。

```html
<script type="text/javascript" src="//munchkin.marketo.net/munchkin.js"></script>
<script>Munchkin.init('munchkinAccountId');</script>
```

CDNで読み込んだ関数を呼び出してるだけなので特にエラーが頻発するようには見えず、、、
実際、チームメンバーの誰の環境でもエラーは再現できませんでした。

`is not defined` と言われてるので、関数が定義されてない状態で `init()` が実行されてるんだろうけど、
同期的に読み込まれてるので、CDNが読まれる前に関数を実行してるわけでもないし。。

Developer toolで回線速度を落としても特に関係なく。。

## 原因
悪戦苦闘した後にたどり着いた原因が、ブラウザのAdBlock系のプラグインでした😭
AdBlockerを入れてるとMunchkinのCDNにアクセスできず、 `Munchkin` が参照できずにエラーが起きていました。

## 解決策
window objectに `Munchkin` が存在するか判定してから、 `init()`　を実行するようにしました。

```javascript
  (function() {
    function initMunchkin() {
      if (!('Munchkin' in window)) {
        return;
      }
      Munchkin.init('munchkinAccountId');
    }

    initMunchkin();
  })();
```
PyCharm でファイル保存時に autopep8 で自動フォーマットしたい！

# PyCharm でファイル保存時に autopep8 で自動フォーマットしたい！
と思ったのですが、ググってもなかなか情報が出てこず・・・
苦戦しましたが解決したのでメモです

# PyCharm での設定
ファイルウォッチャーという、ファイルが保存されたタイミングで任意のプログラムを実行できる機能を使って autopep8 が実行されるように設定します
https://pleiades.io/help/idea/using-file-watchers.html

### 1. 新規のウォッチャーを追加
設定画面から [Tools] → [File Watchers] を選択し `+` ボタンをクリックします

もしメニューに `File Watchers` が表示されていない場合は、同じ名前の `File Watchers` というプラグインをインストールすると表示されるようになります
![autopep2.png](https://qiita-image-store.s3.amazonaws.com/0/43699/c12730d2-1709-d873-861f-b66541361c7c.png)

### 2. autopep8 を設定

以下の画面が表示されたらそれぞれ項目を入力します

- `File type` 
    - `Python` を選択
    - 一つ下の `Scope` を選ぶと対象とするファイルのディレクトリを制限できます
- `Program`
    - `autopep8` コマンドの場所を選択
    - 例) `/hoge/bin/autopep8`
- `Arguments`
    - autopep8 に渡す引数を入力
    - 例) `--in-place --aggressive --aggressive $FilePath$`

![autopep1.png](https://qiita-image-store.s3.amazonaws.com/0/43699/0f4e47de-4261-7d3c-ccbf-8bdf830c0e23.png)

### (optional) 3. 全てのプロジェクトで有効にしたい場合
デフォルトではファイルウォッチャーを追加したプロジェクトでのみ有効になっているので、以下のファイルウォッチャーの一覧画面で `Level` を `Global` に設定すると他プロジェクトでも利用できます
ファイルウォッチャーを作成したプロジェクト以外では、 `Enabled` がオフになってしまっているので忘れずにオンにしましょう
![autopep3.png](https://qiita-image-store.s3.amazonaws.com/0/43699/cbfca3b2-4259-5838-b14f-702e9fb04eaf.png)


### (optional) 4. プロジェクト毎に別設定を利用したい場合
例えば、プロジェクトのディレクトリ直下に `.flake8` を置いていて、プロジェクト毎に異なる設定を有効にしたいとします

autopep8 の引数の `--global-config` にプロジェクト毎の設定ファイルのパスを渡すことで異なる設定を有効にできます
例えば以下を `Arguments` に設定します
`--in-place --aggressive --aggressive $FilePath$ --global-config $ProjectFileDir$/.flake8`


# ダメだった方法
## `command + s` をマクロで置き換える
以下の Q&A で書かれているように、 `autopep8 実行` と `保存` をするマクロを作り、 `command + s` にそのマクロをバインドする方法も試してみました
https://stackoverflow.com/questions/44483748/pycharm-pep8-on-save

ですが、これだとファイルの拡張子に関係なく全てのファイルに autopep が適用されてしまい、 yml や json のファイルが勝手に書き換わってしまうという問題が起こることが分かり即却下となりました・・・

## Save Actions を使う
Save Actions というプラグインを使うと保存時にフォーマットの修正を自動で実行できます
ただこれは、 PyCharm に設定したコードフォーマットを適用するというだけなので、 autopep8 を実行するためには使えませんでした
https://plugins.jetbrains.com/plugin/7642-save-actions
Markdown記法まとめ！！part1

#リスト
- item1
- item2
- item3

```
- item1
- item2
- item3
```


#改行
半角スペース２個以上(Enterで改行してから)

hello. hello. hello. hello. 
  hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello.

```
hello. hello. hello. hello. 
  hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
```

#引用
文の先頭に > を入れる

>hello world

```
>hello world
```

#区切り線
---   or  ***  or  ___

hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
---
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
***
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
___
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 


```
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
---
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
***
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 
___
hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. hello. 

```



#テキストエディタ上でプレビューを表示させる（Atomなど）
プレビュー：　Control + Shift + M
プレビューを消すとき：　Control + Shift + M
TypeScript interfaceの拡張あれこれ

TypeScriptのinterface拡張に関するちょっとしたメモ書きです。

## 基本

以下のような定義のinterfaceがあったとします。（例えばライブラリなどで宣言されていたり）

```型定義.d.ts
interface iFoo {
  bar: string
  baz: number|string
}
```

この定義は自分（のアプリケーションコード内）で勝手にプロパティを追加宣言して拡張することができます。

```my-app.ts
// iFooに新しくquxプロパティを定義
interface iFoo {
  qux: boolean
}

// 3種のプロパティが揃ってないとエラーになる
const foo: iFoo = {
  bar: "bar",
  baz: 0,
  qux: true,
}
```

これは [Declaration Merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) と言うそう。

しかし制限もあり、元々あるプロパティの型を上書きすることはできません。

```ts
// barプロパティはstring型として定義済みなのでNG
interface iFoo {
  bar: number // Error!
}
```

ただしextendすれば条件付きで変えることは可能です。
例えば`baz`プロパティ(`number|string`型)を変更する場合、

- `any`型のように元の型にも適合するような緩い型にする
- `number`型のように受け取れる型を狭める

形での拡張はできます。

```ts
// number|string => any： OK
interface iFooExtend extends iFoo {
  baz: any
}

// number|string => number：これもOK
interface iFooExtend extends iFoo {
  baz: number
}
```

しかし以下のように拡張しようとすると怒られます。

```ts
interface iFooExtend extends iFoo {
  baz: number|string|boolean // Error!
}
```

これは`number|string`型にはboolean型が適合しない（代入できない）ためです。
要は元の型に代入できるような型であることが条件になっています。

## どうしても違法拡張したいとき

いったん定義を弱める拡張を行ってから、再度拡張するのはOKらしいです。

```ts
interface iFooWeaken extends iFoo {
  baz: any
}

interface iFooExtend extends iFooWeaken {
  baz: number|string|boolean
}
```

さらにWeakenという型を作って経由することで記述を簡略化することができます。（以下コードは[こちら](https://github.com/Microsoft/TypeScript/issues/3402#issuecomment-385975990)から引用）

```ts
type Weaken<T, K extends keyof T> = {
  [P in keyof T]: P extends K ? any : T[P];
};

interface iFooExtend extends Weaken<iFoo, 'baz'> {
  baz: number|string|boolean;
}
```

やや邪道感が漂いますが、interface拡張を頻繁に行いたいときは便利そうです。

## 参考
- [TypeScript: Overriding interface property type defined in d.ts](https://stackoverflow.com/questions/41285211/typescript-overriding-interface-property-type-defined-in-d-ts)
- [(suggestion) Overrides in extending class and interface definitions](https://github.com/Microsoft/TypeScript/issues/3402)
.NET Core で SharePointOnlineに接続する

.NET Core でCSOMを使おうとするとハマる点があったので書き残しておく。
（ちなみに初投稿。緊張する...）

##前提
Visual Studio 2017 を使用中。
**.NET Core** のコンソールアプリケーションを作成すること。
SharePointOnlineに接続できる環境であること。

##DLLが違う
.NET Framework だったら単純にNuGetパッケージでMicrosoft.SharePointOnline.CSOMをダウンロードして参照すればいいものを、.NET Core はそこからDLL抜き出して別途参照させないといけない。
今回必要だったDLLは以下の3つ。

    Microsoft.SharePoint.Client.Portable.dll
    Microsoft.SharePoint.Client.Runtime.Portable.dll
    Microsoft.SharePoint.Client.Runtime.Windows.dll

DLLは<a href="https://www.nuget.org/packages/Microsoft.SharePointOnline.CSOM">NuGetのギャラリー</a>から取得したものを使用した。
上２つは .NET Core 用のフォルダ？「netcore45」から。

SharePoint.Client.dll や
SharePoint.Client.Runtime.dll
ではなく
SharePoint.Client.**Portable**.dll
SharePoint.Client.Runtime.**Portable**.dll
であることが重要。

最後の一つ
SharePoint.Client.Runtime.Windows.dll
は「net45」から取得した。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/274676/534c447c-0424-6b1d-ca0d-07e74eb7f52e.png)

##非同期処理に対応する
そしてコードでの相違点は ExecuteQuery にある。
.NET Framework だったら単純にこう↓

```
clientcontext.ExecuteQuery()
```

.NET Core ではどうもここが非同期処理になるらしく、Asyncになる。

```
clientcontext.ExecuteQueryAsync()
```

非同期処理になるので、直前にLoadしたオブジェクトの取得まで待機しないとオブジェクトの操作ができない。

```
await clientcontext.ExecuteQueryAsync()
```

これをしないと、プロパティ値が取得できなかったり（そもそもエラーになる）、このあとに値を追加しても全く反映されなかったりする。
PHPでメソッドチェーンを使う

画像アップロード系の記事を書いた時にメソッドチェーンで実装したら便利だったのでメモ代わりに投稿
利用する場合にコードが読みやすくなるので良いですね

## 動作環境
PHP 7.1.20
※たぶん5系全般でも動きます

## クラスの作成
returnで自分自身を返せばOK(setterに実装すると使いやすい)

```photoUploader.php
<?php

/**
 * Class PhotoUploader
 */
class PhotoUploader
{
    private $filesystem;
    private $path;

    /**
     * PhotoUploader constructor.
     * @param Filesystem $filesystem
     */
    public function __construct(Filesystem $filesystem)
    {
        $this->filesystem = $filesystem;
    }

    /**
     * @param $path
     * @return $this
     */
    public function setPath($path)
    {
        $this->path = $path;

        return $this;
    }

    /**
     * @return String
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * @param $file
     * @return bool
     */
    public function upload($file)
    {
        // upload処理
    }

```

## 利用サンプル
```sample.php
<?php
$filesystem = new Filesystem();
$uploader = new PhotoUploader($filesystem)

$path = '/tmp/test.png'

// こんな感じで使う
$uploader->setPath($path)->upload($file);

```
機械学習におけるデータ表現の最適化方法集


機械学習においてデータを正しく表現することは、成果に大きく影響してくる。
”特徴量エンジニアリング”とは特定のアプリケーションに対して、最良のデータ表現を模索すること。

今回は特徴量エンジニアリングについて紹介したい。

まずデータ表現として一般的なカテゴリ特徴量の変換からみていく。



## ワンホットエンコーディング（ダミー変数）
カテゴリ変数を１つ以上の０と１の値を用いて新しい特徴量で置き換えるもの。
ダミー変数と言われればわかりやすい。
数ある特徴量の中で該当するものは１と記載される。そこがワンホットエンコーディングと呼ばれる所以。


#　
次はモデリングのデータ表現の変換方法を３つ見ていく。


## １、ビニング・離散化
モデルの表現を豊かにする方法part１。
線形モデルはその名のとおり線形にしかモデリングできない。
その線形モデルを連続データにして強力にする方法の１つが特徴量のビニング、離散化である。
一線で表すのではなく、１グラフをいくつかの”ビン”に分け、その間で特徴量が一定となり同じ値を予測できる。この変換は線形モデルにとって柔軟性、表現力が増す。




## ２、交互作用と多項式
モデルの表現を豊かにする方法part2。
もとのデータの交互作用特徴量と多項式特徴量を加える方法である。

交互作用特徴量とはもとの特徴量から２つの特徴量のすべての組み合わせと、もとの特徴量の２乗のこと。

多項式特徴量はある特徴量xに対して、x ** 2, x ** 3・・・を考えること。


ビニング、離散化によって分けられた場合、各ビンの間の線は定数を学習する。
けれど線形モデルは傾きも学習できるはず！という考えを、上記の２つを用い、元の特徴量をビニングされたデータに加えなおすことで実行する方法。





## ３、単変量非線形変換
log, exp, sinなどの数学関数を用いた変換。

線形モデルなどにおいて、特徴量とターゲットに非線形関係があるとモデリングが難しくなる。
そこをこの関数たちがデータの相対的なスケールを修正してくれるのでモデリングしやすくなる。

# 　
以上の方法は線形モデルなどに対し有効であるが、決定木やランダムフォレストなどには性能を下げてしまう。最適な変換を見つけることが大事。

# 自動特徴量選択
特徴量を増やすとモデルが複雑化して過剰適合の危険がでてくる。
ただ、増やした上で有効な特徴量を取捨選択すればより汎化性能があがる。

その有効な特徴量の見分け方は？

という戦略３つを紹介

## １、単変量統計
特徴量とターゲットの間に顕著な関係があるか計算する戦略。”単変量”という名のとおり個々の特徴量を個別に考慮する。そのため他の特徴量を組み合わさっている特徴量は捨てられる。

## ２、モデルベース特徴量選択
教師あり学習モデルを使って特徴量の重要性を判断する戦略。
このモデルは最終的に使いたいモデルではなくてもよいが、個々の特徴量の重要性の指標が出力できるモデル。たとえば決定木などではfeature_importances_属性、線形モデルでは係数なども利用できる。


単変量統計と異なる点は、すべての特徴量を同時に考慮できる点である。

## ３、反復特徴量選択
異なる特徴量を用いた一連のモデルを作る。そのモデルの作り方は２パターンあり、

・１つずつ特徴量を足していく方法

・すべて特徴量を使い１つずつ取り除いていく方法

である。複数モデルを作るので高価な戦略。



#　




機械学習を応用していく上では

・どのような特徴量を用いるか

・どの特徴量と機械学習手法を組み合わせるか


の２点がうまくいくかを左右する。

一つ一つの実行例も今後紹介できればと思うが、

次回は機械学習モデルの性能評価である。

# 参考文献
・Pythonではじめる機械学習ーscikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
（著者　Andreas C.Muller、Sarah Guido  発行所　株式会社オライリー・ジャパン）
台形則（数値積分）

# 台形則とは
- 数値積分の解法の一つ
- 関数$f(x)$において、微小区間$[x_0,x_1]$内での関数値を一次方程式で近似する

![qiita-integer-2.png](https://qiita-image-store.s3.amazonaws.com/0/299208/5a232bd3-b5ec-a2f3-479e-16fc47cc0d55.png)


# 算法
微小区間$[x_0,x_1]$の区間幅$x_1-x_0=h$とし、各$y$座標を$f(x_0)=y_0,f(x_1)=y_1$とする。
区間内の関数値を一次方程式で近似すると、この区間内の積分値は
$$ \int_{x_0}^{x_1}f(x)dx=\frac{h}{2}(y_0+y_1) $$
となるので、区間$[a,b]$内の積分は各微小区間内での積分値の和で表せるから、
$$ \int_a^bf(x)dx=\frac{h}{2}(y_0+y_1)+\frac{h}{2}(y_1+y_2)+\cdots+\frac{h}{2}(y_{n-1}+y_n) $$$$ =\frac{h}{2}(y_0+2y_1+2y_2+\cdots+2y_{n-1}+y_n)$$


# サンプルコード
$f(x)=\sqrt{1-x^2}$において、区間$[0,1]$の定積分の値を求めるプログラム。
分割数は4とする。
解析解は$\pi/4$です（単位円の$1/4$）。


```c:trapezoidal_rule.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return sqrt(1-x*x);
}

/* 台形則（区間[a,b]をn分割） */
double trapezoidal_rule (double a, double b, int n) {
  double h;
  int i;
  double value=0;

  h = (b - a) / n;   // 区間幅の計算
  for (i = 0; i <= n; i++) {
    if (i == 0 || i == n) value += f(a + i*h);
    else value += 2 * f(a + i*h);
  }
  value = value*h/2;
  return value;
}

int main (void) {
  printf("Analytical solution: %f\n", M_PI/4);
  printf("Numerical solution : %f\n", trapezoidal_rule(0, 1, 4));
  return 0;
}
```

実行結果

```
Analytical solution: 0.785398
Numerical solution : 0.748927
```

# 特徴
- 全区間の誤差
$$ E=\frac{h^2(b-a)}{12}f^{\prime\prime}(\xi) \ \ , \ \   (a<\xi<b) $$
- 分割数を倍にすると誤差は$1/4$に減少
- でも、区間数を増やしすぎると丸め誤差が増加する