OmniAICreator/Qiita-1.07M huggingface dataset:
RxSwift、RxDatasourceでUITableViewController使用時のdelegate、dataSourceエラー

#1.はじめに
RxSwiftビギナーで勉強中ですが、RxSwift、RxDatasourcesを使用したTableView実装のTipsはあったのですが、UITableViewControllerを使用した場合に起きたエラーで躓いたので備忘録として残します。
理由としては、キーボード表示時にカスタムセルにあるTextFieldをスクロールさせる実装がUITableViewControllerだとデフォルトで行ってくれる為、UITableViewControllerで実装したかった。

#2.環境、使用ライブラリ
・swift4.2
・Xcode10.1
・RxSwift
・RxCocoa
・RxDatasources

#3.実装
RxSwift、RxDataSourcesとUITableViewControllerの実装については割愛します。(覚えてきたら載せたい)

#4.エラー内容
必要な処理を実装し、ビルド、画面を表示させると以下エラーメッセージが表示されます。

```
Assertion failed: This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.
If you are ok with this, try to set delegate (data source) to `nil` in front of this operation.
```
いつも通りグーグル先生で翻訳すると

>アサーションが失敗しました：これは、以前にどこかにデリゲート（またはデータソース）が既に設定されていることを警告する機能です。実行しようとしている操作によってそのデリゲート（データソース）がクリアされます。つまり、設定されているそのデリゲート（データソース）に依存する機能の一部が機能しなくなる可能性があります。
>これで問題なければ、この操作の前にデリゲート（データソース）を `nil`に設定してみてください。

丁寧にエラーメッセージが定義されていますね。すごくわかりやすい。

#5.解決法
私は翻訳する前にググってUITableViewControllerでの実装例がないか探してみたところ、Issueで同様の質問があったのでそれを先に見ました。
https://github.com/RxSwiftCommunity/RxDataSources/issues/214(https://github.com/RxSwiftCommunity/RxDataSources/issues/214)

エラーメッセージの内容と同じようなことを言っていますね。
エラーメッセージ通りdelegateをnilにしてみたところ、まだ同じエラーが出ます。

>デリゲート（データソース）を nilに設定してみてください。

なので、delegateだけでなくdatasourceにもnilを入れて確認するとエラーは解消、想定通りUITableViewControllerで表示できました。
キーボード表示時のスクロール処理も問題なし。

記述箇所は下記のようにviewDidLoadで行いましたが、これが正しい位置なのか理解しきれていませんが、ひとまず。

```
 override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.dataSource = nil
        self.tableView.delegate = nil
}
```

#6.まとめ

<font color="Red">**UITableViewController**</font>を使用して**RxSwift**、**RxDatasources**を使用する場合は、
`delegate`、`datasource`に<font color="Red">nil</font>を入れる必要があるようです。
指摘事項等、何かあればぜひコメントいただければと思います。
Rxまだ全然理解できていませんのでもっと勉強します。

追記:
ご指摘いただきました。本記事はUITableViewControllerの場合であって、`ViewControllerでUITableViewを使用した場合ではありません。`
UITableViewControllerを使用した場合Storyborad、Xib上でDelegate、DataSourceがデフォルトで設定されていますが、解除しても同様のエラーが発生する為、コード上でnil代入は必須のようです。
毎回nilを設定する手間を考えれば、特に理由がなければViewControllerにUITableViewを設定する方が無難かもしれません。
GraphQLアプリをCypressで動かす際につまずいたこと


GraphQLを採用したシステムを開発していて、CypressでE2Eテストを行うようにしました。
しかし色々とつまずくところがあったので、同じ問題に直面した方のために残したいと思います。


## GraphQLのリクエストをwaitできない


/graphqlがエンドポイントだった場合、以下のように書けると思います。

```js
// 動かない
cy.server()
cy.route('POST', '/graphql').as('graphql')
cy.wait('@graphql')
```



しかし、このままだとwaitしてくれません。

その原因として、Cypressは[fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) を現在(2019/02/07)サポートしてないために起こっているようです。

(サポート予定: https://github.com/cypress-io/cypress/issues/687)



そのため、Apollo Clientなどの場合は内部ではfetch APIを使用しているようで、上記のコードでは動きません。

解決方法としては、`delete` オペレーターを使ってfetchを消して[XMLHttpRequest API](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) に戻してやることができるそうです。

index.jsなどで以下を実行する必要があります。

```js
// index.js
Cypress.on('window:before:load', (win) => {
	delete win.fetch
})
```



参考: https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/stubbing-spying__window-fetch


## エンドポイントが一つのためリクエスト毎にaliasを作れない



これはつまずきというか、心配事だったのですが、

一度のテストに複数のリクエストが行われる際、GraphQLだとエンドポイントが一つ(/graphqlなど)なので、

それぞれのリクエストで違うaliasをつけることができません。



```js
// リクエストが全て同じエンドポイント
cy.route('POST', '/graphql').as('query1')
cy.route('POST', '/graphql').as('query2')
```



これは解決策とかの話ではないですが、

GraqhQLの特徴の一つとして、

**１リクエストで欲しいデータが全て取得できる**ので、

そもそも同じタイミングで複数リクエスト行われる状況にはならないはずです。



そこには必ずフローがあるはずで、GraphQLの場合はエンドポイントが同じでも、どのリクエストをしているのかは必ずわかるはずです。



```js
cy.server()
// ログイン
cy.route('POST', '/graphql').as('loginMutation')
cy.get('input').eq(0).type('taro@example.com')
cy.get('input').eq(1).type('password1234')
cy.get('button').click()
cy.wait('@loginMutation')
// ログイン後一覧データ取得
cy.route('POST', '/graphql').as('postsQuery') // 同じエンドポイントだがこのタイミングでは必ず一度だけリクエストが行われる
cy.wait('@postsQuery')
```



どうしても同じタイミンングで複数リクエストが発生してaliasつけたい場合は自作コマンドを作って、bodyにあるデータで判定するしかないようです。

 (参考: https://stackoverflow.com/questions/53814647/how-can-i-alias-specific-graphql-requests-in-cypress)





## テスト毎にlocalStorageがキャッシュされない



GrraphQLの場合JWTなどのトークンベースの認証を使っていると思います。

その場合localStorageにトークンを保存してAuthorizationヘッダーにのせてリクエストしているはずです。



Cypressではテスト毎にlocalStorageがクリアされてしまうので、ログイン状態を保持しておくことができませんでした。

そのため、`beforeEach()` で毎回ログイン処理を行っていてテストの実行時間が無駄に長くなっていました。



Cookieの場合は残したいデータをCypressの[ホワイトリストに入れる](https://docs.cypress.io/faq/questions/using-cypress-faq.html#How-do-I-preserve-cookies-localStorage-in-between-my-tests) ことができます。

localStorageの場合はそのようなAPIが用意されていないため、ワークアラウンドが必要でした。



```js
// index.js

// 保持するトークン
let token

// トークンをlocalStorageにセット
const setToken = () => {
  if (token) {
    localStorage.setItem('token', token)
  }
}

// トークンをキャッシュ
const cacheToken = () => {
  token = localStorage.getItem('token')
}

// テスト実行前にトークンをセット
beforeEach(setToken)

// テスト実行後にトークンをキャッシュ
afterEach(cacheToken)

```



こうすることで、`before()` でログイン処理を一度挟めば、その後の全てのテストでログイン状態を保持したままテストが実行できます。

参考: https://github.com/cypress-io/cypress/issues/461



## 最後に



GraphQLアプリをCypressで実行するにあたって自分のつまったところを紹介しました。

他に、「いいやり方あるよー」、「ここに詰まって、こう解決した」などあれば教えていただきたいです。
Mac で Raspberry Pi 用のディスクをフォーマット（ディスクユーティリティー編）

# 概要
  
Mac に標準装備されているディスクユーティリティーというアプリケーションを使って、Raspberry Pi で使用するための、microSD カードをフォーマットしてみます。

### ホスト

#### Mac

* [MacBook Pro ( 13-inch, Early 2011 )](https://support.apple.com/kb/SP619?locale=ja_JP&viewlocale=ja_JP) 魔改造済み

* メモリ: 16 GB

* ストレージ: SSD 512 GB

* OS: macOS Sierra 10.12.6
  
### フォーマット
  
ディスクユーティリティーを起動します。  
  
![20190206_ディスクユーティリティー01_アイコン01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/62f93591-2e32-a743-6967-f393935cdc99.png)

  
次の順にマウスオーバーしていき「消去」をクリックします。
  
外部 -> 該当する microSD カードのラベル名 -> 右クリック -> 消去  
  
![20190206_ディスクユーティリティー02_外部01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/2c494caa-2b46-8158-f31b-05687a32beee.png)

 
適当なラベル名を記入し（ここでは RPI ）、「セキュリティオプション」ボタンをクリックします。  
  
![20190206_ディスクユーティリティー03_セキュリティーオプション01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/c4aa4dcb-d206-4423-648d-25e426495e49.png)
 
  
プルダウンから「 MS-DOS ( FAT ) 」を選択します。FAT32 を選択したいところですが、グレーになっていて選択できませんので、FAT を選択します。フォーマット後に、ディスクの情報を見てみると、FAT32 になっているので、FAT を選択しても問題ありません。ディスクユーティリティのバグのような気がします、たぶん。。。  
  
![20190206_ディスクユーティリティー04_MS-DOS01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/cfb18902-3f5a-ce81-0313-a9977ea94977.png)

  
そして、「消去」ボタンをクリックして、しばらく待ちます。  
  
![20190206_ディスクユーティリティー05_消去01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/a9aced2c-5ff5-af8c-c5da-e91a9a08d245.png)
  
  
次のダイアログが表示されたら「完了」ボタンをクリックします。  
  
![20190206_ディスクユーティリティー06_完了01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/7741a496-40d1-5460-be49-bc7491e1ceb6.png)

  
これで作業は終了です。  
以上です。
AngularUIのUI.Sortableでテーブル要素がドラッグ時に崩れる事象の解決

## 解決方法
いきなり解決方法[^1]。

```js
var fixHelper = function(e, ui) {
  ui.children().each(function() {
    $(this).width($(this).width());
  });
  return ui;
};

$scope.sortableOptions = {
  helper: fixHelper,
};

```

```html
<tbody ui-sortable="sortableOptions">
    <tr></tr>
    <tr></tr>
</tbody>
```


[^1]: https://github.com/angular-ui/ui-sortable/issues/237
CakePHPインストール

参考[【PHP入門】CakePHP3とは？特徴から使い方まで徹底解説](https://www.sejuku.net/blog/50118)
[9cubed初心者向けのプログラミング講座、パソコン講座などを公開しています。](https://9cubed.info/list/cakephp3/)
[AWS EC2にCakePHP3.2をインストール・環境構築](https://qiita.com/yafuu822/items/de61495d0d642570dfd5)
インスタンスタイプt2.smallではメモリ不足でcakePHPを入れることができなかった

```

#mysql初期設定
$ mysql_secure_installation
```

CakePHP3.6のプロジェクトを作成の前に
ドメインルートディレクトリを作成する

```
mkdir /var/www/html/cake
```

cakephpの起動
```
find / -name cakephp
sudo -i
cd /var/www/html/cake/ap01
bin/cake server
```
なにはともあれメモを取るべきだ





> メモこそ命の恩人だ  _(トーマス・エジソン)_




# なにがしたいのか

すぐにメモが取れる状態にしたい！

## やったこと

- Alfredで即席メモを立ち上げるスクリプト作成


## 使うもの
- Automator (Macに標準で入ってるやつですね。Windowsの方すみません)
- [Alfred](https://www.alfredapp.com/) (情強マカーなら使ってるはず。)
- お好きなエディタorメモツール （私は[CotEditor](https://coteditor.com/)を使っています。軽量かつgrepがつよい。）



## Automatorでアプリ作成

### 新規ファイル作成

アプリケーションで作るとAlfredから呼び出すのが楽です（私見）。

<img width="545" alt="スクリーンショット 2019-02-07 10.57.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/2da56a46-2844-cff7-4f9e-b2586ec4708b.png">


###アクションを組み立てる

1. __新規テキストファイル__ 任意のディレクトリにtxtファイルを作成。
2. __Finder項目の名前を変更: 日付または時刻を追加__ 作ったファイル名の前方に日付を追加
3. __Finder項目の名前を変更: 日付または時刻を追加__ 作ったファイル名の後方に時刻を追加
4. __Finder項目を開く__ 任意のエディタで開いてあげましょう。


2と3でわけて日付を入れているのは、`日付_時刻.txt`のフォーマットにしたかったからです。あんまり深い意図はないのですが、パッと見でわかりやすくするために。


<img width="852" alt="スクリーンショット 2019-02-07 10.49.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/3e04176b-c17e-e8ab-456b-9210eaa75416.png">



### 保存
ファイル＞書き出し

「memo_new.app」とかで書き出しました。
ここでのファイル名=Alfredでの呼び出し名になるので、他のアプリケーションなどと被らないようにつけてあげると良いかと思います。

<img width="596" alt="スクリーンショット 2019-02-07 10.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/7fe02b12-76d0-2d2b-012f-a33922b3ed91.png">

###　使い方


1. `option + space`でAlfred呼び出し
<img width="638" alt="スクリーンショット 2019-02-07 11.06.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/711df692-7754-8cd0-892b-0d7a3e8cc554.png">


2. `memo_new`(さっきのファイル名)を入力
「memo」の時点で出てきてますね。二つ出ちゃってますが気にしないでください。
<img width="674" alt="スクリーンショット 2019-02-07 11.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/87b2bd5a-969c-2edb-7a39-d496eae178ea.png">


3. `Enter`

<img width="1177" alt="スクリーンショット 2019-02-07 11.06.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/151247/ad40aaca-eea6-25f9-8649-7f5f779d3247.png">




### 気になってること
- tmpディレクトリにメモの置き場を作れば、古いtxtファイルから勝手に削除してくれそうな気がする（パーミッションの関係が出てきそう）
- ファイル名に秒までつけられなかったので、1分間に何度もメモ帳を作成することはできない（そんなことするかは別として）
GradleでPowerMockとjacocoの喧嘩を仲裁


# 概要
とあるPJでjavaのUTのカバレッジ100%目指して
jacocoでカバレッジレポート作成してみたら、
<img width="614" alt="test_coverage.png" src="https://qiita-image-store.s3.amazonaws.com/0/352286/a26231ba-0bac-a396-5269-99cb6330a369.png">
のように軒並み0%になっちゃう。

どうやらpowermockとかいう荒くれ者がjacocoさんは嫌いなようで・・・
とは言ってもpowermock依存症なんデス。

# 回避策
https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo

> Second way to get code coverage with JaCoCo - use offline Instrumentation. 

どうやらOffline Instrumentationしろと。
Mavenでの実装例しかないしあんまりGradleでの書き方の記事が無いので書いてみようかと。

### 依存関係
```build.gradle
dependencies {
  testCompile group: 'org.mockito', name: 'mockito-core', version: '2.2.7'
  testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0-beta.5'
  testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0-beta.5'

  jacoco group: 'org.jacoco', name: 'org.jacoco.ant', version: '0.8.2', classifier: 'nodeps'
  jacocoRuntime group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.8.2', classifier: 'runtime'
}
```
ちなみにOffline Instrumentationが働くのはpowermockの1.6.6以降らしいのでご注意を。

### Offline Instrumentation

```build.gradle
configurations {
  jacoco
  jacocoRuntime
}

task instrument(dependsOn: ['classes']) {
  ext.outputDir = buildDir.path + '/classes-instrumented'
  doLast {
    ant.taskdef(name: 'instrument',
                classname: 'org.jacoco.ant.InstrumentTask',
                classpath: configurations.jacoco.asPath)
    ant.instrument(destdir: outputDir) {
      fileset(dir: sourceSets.main.output.classesDir)
    }
  }
}

gradle.taskGraph.whenReady { graph ->
  if (graph.hasTask(instrument)) {
    tasks.withType(Test) {
      doFirst {
        systemProperty 'jacoco-agent.destfile', buildDir.path + '/jacoco/jacoco-coverage.exec'
        classpath = files(instrument.outputDir) + classpath + configurations.jacocoRuntime
      }
    }
  }
}

task report(dependsOn: ['instrument', 'test']) {
  doLast {
    ant.taskdef(name: 'report',
                classname: 'org.jacoco.ant.ReportTask',
                classpath: configurations.jacoco.asPath)
    ant.report() {
      executiondata {
        ant.file(file: buildDir.path + '/jacoco/jacoco-coverage.exec')
      }
      structure(name: 'Example') {
         classfiles {
           fileset(dir: sourceSets.main.output.classesDir)
         }
         sourcefiles {
           fileset(dir: 'src/main/java')
         }
      }
      html(destdir: buildDir.path + '/reports/jacoco/test/html')
    }
  }
}

```

コンパイル直後にinstrumentして、test+jacocoって感じですかね。
これで`report`タスク実行してみると、

<img width="639" alt="coverage_after.png" src="https://qiita-image-store.s3.amazonaws.com/0/352286/2282b15b-7c05-c382-5832-db793a4e88ce.png">

無事にPowerMockとjacocoが仲直りできました。

# 感想
instrumentってのがまだ何してんのかはよくわかっとらん。
実際はマルチプロジェクト構成なので、カバレッジレポート結合したいですね～。

ということで次回はマルチプロジェクトで様々なドキュメント結合でもしてみます。
EmacsでRubyのハッシュ記法を読みやすくする

次のようにハッシュのキーと値が両方シンボルで横に羅列しているとき、ひと目、何がキーで何が値なのかわかりません。

<img width="779" alt="スクリーンショット 2019-02-07 10.58.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/2369/de50949e-96d6-dc42-a12e-861b5568fd56.png">

全部シンボルなので同じ色になるのは仕方がないのですが、読みやすさを考慮してキーの色を変更します。

```elisp
(setq my-ruby-highlight-keywords '(
  ("\\(?:^\\s *\\|[[{(,]\\s *\\|\\sw\\s +\\)\\(\\(\\sw\\|_\\)+:\\)[^:]"
    (1 (progn (forward-char -1) font-lock-preprocessor-face)))))

(defun my-ruby-highlight ()
  (font-lock-add-keywords nil my-ruby-highlight-keywords))

(add-hook 'ruby-mode-hook #'my-ruby-highlight)
```

`font-lock-preprocessor-face` はもともと正規表現のオプションのところにしか使ってないのでこれを流用します。他の face でもよいです。

上を設定すると次のようになります。

<img width="762" alt="スクリーンショット 2019-02-07 10.59.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/2369/fcfa1630-4a00-8349-e643-e7be7d47ba56.png">

ちょっと見やすくなりました。
Amazon Linux WorkSpaces で 2 段階認証が必要な Office 365 のメールアカウントを設定する

Amazon Linux WorkSpaces で 2 段階認証が必要な Office 365 (Exchange Online) のメールアカウントを設定しました。色々調べたので、忘れる前にメモしておきます。

## 手っ取り早い方法: アプリパスワード

Office 365 にはアプリパスワードを発行する機能があります。アプリパスワードを発行すれば 2 段階認証に対応していないアプリでも ID とアプリパスワードの組み合わせで Office 365 のメールにアクセスできます。

ですが、アプリパスワードの発行によって、事実上、2 段階認証をとばせるルートを許してしまうので、今回はアプリパスワードを使わないでやってみたいと思います。

## 地道な方法: OAuth2

※ この方法は Azure Active Directory にアプリ登録を行う権限が必要です。

2 段階認証が必要な Office 365 アカウントのメールを送受信するには OAuth2 というスマホのメールアプリでよく使われているような認証方式を使います。例えば、Google (Gmail) のアカウントをメールアプリに追加するときに、Google のページが開いて、そこから ID やパスワードなどを対話的に設定していくあの方式です。

## Evolution の更新

現在のところ、Office 365 の OAuth2 認証に対応する Linux 用メールクライアントは Evolution ぐらいしかないようです。

既定のイメージに Amazon 標準の Evolution のパッケージがプリインストールされていましたが、標準パッケージの Evolution はバージョンが古く OAuth2 に非対応でした :relieved:

幸い、Flathub に[最新版のパッケージ](https://flathub.org/apps/details/org.gnome.Evolution)があったので、標準パッケージを削除して Flathub 版を再インストールしました。

参考: [Amazon Linux WorkSpaces に最新の Evolution をインストールする](https://qiita.com/mosop/items/7abbe8717fc1b8402396)


## アプリの登録

Evolution から OAuth2 認証で Office 365 にアクセスするためには、事前に Azure Active Directory の開発者向け機能を使ってアプリを登録しておく必要があります。手順は以下のとおり。

1. [Azure](https://portal.azure.com) に Office 365 のアカウントでサインイン。

1. [Azure Active Directory] -> [App registrations (preview)][^1] -> [New registration] から新規アプリを登録する。入力項目は次のように設定する。
  * Name: アプリの名前 (任意)
  * Supported account types: Accounts in this organizational directory only
  * Redirect URI:
     * 種類: Public client
     * URI: https://login.microsoftonline.com/common/oauth2/nativeclient

2. 登録したアプリの [API permissions] -> [Add a permission] -> [Exchange] -> [Delegated permissions] を表示し、以下の権限を選択して、追加する。
  * EWS.AccessAsUser.All

[^1]: この機能はまだプレビュー版でした。

## 受信設定

Evolution のメールアカウント設定で [Receiving Email] タブの項目を以下のようにします。

* Server Type: Exchange Web Services
* Username: Office 365 のユーザーID (メールアドレス)
* Host URL: https://outlook.office365.com/EWS/Exchange.asmx
* Authentication の種類: OAuth2 (Office365)
* Override Office365 OAuth2 settings: チェックする
* Tenant: 登録したアプリの Directory (tenant) ID[^2]
* Application ID: 登録したアプリの Application (client) ID[^2]

[^2]: Application ID と Directory ID は登録したアプリの [Overview] で確認できます。![misc.png](https://qiita-image-store.s3.amazonaws.com/0/63688/07fc32a3-63ba-9a54-87e5-1b1f4d1776f6.png)


## アプリの承認

続けて [Receiving Email] タブにある [Fetch URL] をクリックすると、サインインページが表示されます。Office 365 のアカウントにサインインしてアプリを承認すれば設定完了です。:tada:

## 参考

* [Evolution-EWS and OAuth2 for outlook.office365.com](https://wiki.gnome.org/Apps/Evolution/EWS/OAuth2)
(随時更新) 統計検定準1級/1級取得に向けた勉強メモ

統計検定準1級/1級取得を目指して勉強中なのですが、[公式の書籍](https://www.amazon.co.jp/dp/448902150X/)を読んだだけではなかなか身にならなかったため、試験範囲に記載された項目について随時まとめていくことにしてみました。そのメモになります。

# 確率と確率変数
## 確率分布と母関数
* [確率母関数、モーメント (積率) 母関数](https://qiita.com/mtakayuki/items/ecb969044a3205fb624d)

# 確率分布
## 離散型確率
* [二項分布](https://qiita.com/mtakayuki/items/d3281110b9918da66536)
* [超幾何分布](https://qiita.com/mtakayuki/items/6db9588524691c378304)
* [ポアソン分布](https://qiita.com/mtakayuki/items/f02b1c64b114e437c17e)

# 統計的推測 (推定)
## 統計量

* [十分統計量、フィッシャー-ネイマンの分解定理](https://qiita.com/mtakayuki/items/3472a42eed7661981954)
JavaScriptなWebエンジニアがはじめて触る基板

# はじめて触る基板
とりあえず何かハードウェア触ってみたいし、作ったHTMLなやつと繋げてみたいしなと思ってもいっぱいありすぎて対応してるかも不明で何買っていいかわからないのでリストアップしました。
最終的にはブラウザなりから操作する（WebBluetoothとか)なので基準がバラバラですが。

## 開発環境とか作りたくない場合
### micro:bit　(2000円代)

https://www.amazon.co.jp/dp/B07L2KXWGH/
秋葉原のマルツ、秋月電子などリアル店舗でも購入可能
○ Bluetooth | × WiFi
○ オフライン単体稼働
○ 自作HTML連携(WebBluetoothは可。クラウド経由は不可。USB経由(Node.js等経由)は可。)

* 教育用のデバイスなので、開発環境の作成がほぼいらない。
* ブロック言語やJavaScript、Pytohなどがブラウザ上で開発可能なのでとっつきやすい
* 加速度なども内臓されているのでできることも多い

参考
WebBluetooth: [micro:bitとWebBluetoothで通信してみました](https://qiita.com/yokmama/items/5522fabfb5b9623278e2) / [webGPIO-etc-on-microbit-via-webBluetooth
](http://chirimen.org/webGPIO-etc-on-microbit-via-webBluetooth/?fbclid=IwAR3je3nxNV0VXmO2XBPHGL9MFRGZUX4jbhc8kd-Mh-6r3sj13DLiEOSCrVw)LINE Things: [line-things-starter](https://github.com/line/line-things-starter)

### obniz (5000円代)
https://www.amazon.co.jp/dp/B07DD6FK8G/
○ Bluetooth | ○ WiFi
× オフライン単体稼働(要WiFi接続)
○ 自作HTML連携(クラウド経由で可。非常に容易。)
※WebBluetoothで接続できるか不明

* 文字列の画面がついてるので状態確認がしやすい
* 開発自体はクラウド経由のAPIで制御できる。いつも通りにHTMLやJSを作り、ブラウザからAPI叩くと制御できるという形なのでとっつきやすい。

参考
[クイックスタート](https://obniz.io/doc/quickstart)
LINE Things: [line-things-starter](https://github.com/line/line-things-starter)


## 画像表示したりできる画面付きが欲しい場合
### M5Stack　(4000円代)
https://www.switch-science.com/catalog/3647/
秋葉原の千石電子などリアル店舗でも購入可能
○ Bluetooth | ○ WiFi
○ オフライン単体稼働(UIFlow(ブラウザ上での開発環境)経由の場合は要WiFi接続)
○ 自作HTML連携(WebBluetoothは可。クラウド経由で可だがクラウド側の自作環境構築必要。USB経由(Node.js等経由)は可。)

* フルカラー液晶画面がついてるので状態確認や画像など表示できる
* ハンダづけとかしなくても色々つなげれるセンサーが別売りである
* 開発自体はクラウド経由でも可能だが、ブラウザとつなげるなど行おうとすると開発環境をそれなりに作る必要がある

参考
WebBluetooth: [M5StackでBLEを使う](https://qiita.com/nsawa/items/2afd4ae9c10af87d0133)
LINE Things: [line-things-starter](https://github.com/line/line-things-starter)

## がっつり基板な感じから始めたい場合
### Espressif ESP32-DevKitC (1000円代)
http://akizukidenshi.com/catalog/g/gM-11819/
秋葉原の秋月電子などリアル店舗でも購入可能
○ Bluetooth | ○ WiFi
○ オフライン単体稼働
○ 自作HTML連携(WebBluetoothは可。クラウド経由で可だがクラウド側の自作環境構築必要。USB経由(Node.js等経由)は可。)

* 安価であるが少々不安定なことも
* 開発環境をそれなりに作る必要がある
* センサとかは何もないので何か追加したりする必要がある

参考
LINE Things: [line-things-starter](https://github.com/line/line-things-starter)

### Adafruit Feather nRF52 Bluefruit LE　(3000円代)
https://www.switch-science.com/catalog/3277/
○ Bluetooth | × WiFi
○ オフライン単体稼働
○ 自作HTML連携(WebBluetoothは可。クラウドは不可。USB経由(Node.js等経由)は可。)

* 多少値は張るが安定感ある
* 開発環境をそれなりに作る必要がある
* センサとかは何もないので何か追加したりする必要がある

参考
LINE Things: [line-things-starter](https://github.com/line/line-things-starter)


## 買って電池いれたら動くのが欲しい場合
SensorMedal-EVK-001(1.4万代)
http://itstore.zaikostore.com/shopdetail/000000001546/
○ Bluetooth | × WiFi
○ オフライン単体稼働
○ 自作HTML連携(WebBluetoothは可。クラウドは不可。USB経由は不可。)

* プログラムも書かなくてもWebBluetoothでサクッとつながる
* 専用基板なので電池の持ちが非常に良い
確率母関数、モーメント (積率) 母関数

# 確率母関数

非負の離散型確率変数 $X$ に対して、確率母関数は $t^X$ の期待値として定義される。

```math
\begin{align}
G_X(t) &= E[t^X] \\
&= \sum_{x=0}^{\infty} t^x f_X(x)
\end{align}
```

$G_X(t)$ の $m$ 階微分は、以下のように表される。

```math
\begin{align}
G_X^{(m)}(t) &= E\left[X(X-1)\cdots(X-m+1)t^{X-m}\right]
\end{align}
```

これにより、$X$ のモーメントが求められる。

* $E[X] = G_X^{'}(1)$
* $E[X(X-1)] = G_X^{''}(1)$
* $E[X^2] = E[X(X-1)] + E[X] = G_X^{''}(1) + G_X^{'}(1)$
* $V[X] = E[X^2] - E[X]^2 = G_X^{''}(1) + G_X^{'}(1) - \left(G_X^{'}(1)\right)^2$

また、以下のように確率 $P(X=x)$ は、$G_X^{(x)}(0)/x!$ で表される。このことから、$G_X(t)$は確率母関数 (probability generating function; 確率生成関数) と呼ばれる。

```math
\begin{align}
G_X^{(m)}(0) &= E\left[X(X-1)\cdots(X-m+1)0^{X-m}\right] \\
&= \sum_{x=0}^{\infty} x(x-1)\cdots(x-m+1)0^{X-m} f_X(x) \\
&= m(m-1)\cdots 1 f_X(m) \\
&= m!P(X=m)
\end{align}
```

# モーメント (積率) 母関数

一般の確率変数 $X$ に対しては、モーメント母関数は $e^{tX}$ の期待値として定義される。

```math
\begin{align}
M_X(t) &= E[e^{tX}] \\
&= \sum_{x=0}^{\infty} t^x f_X(x)
\end{align}
```

$M_X(t)$ の $m$ 階微分は、以下のように表される。

```math
\begin{align}
M_X^{(m)}(t) &= E\left[X^me^{tX}\right]
\end{align}
```

$X$ の (原点まわりの) $m$ 次のモーメントは、$M_X^{(m)}(0)$ で表されることから、$M_X(t)$ はモーメント母関数 (moment generating function; モーメント生成関数) と呼ばれる。

* $E[X] = M_X^{'}(0)$
* $E[X^2] = M_X^{''}(0)$
* $V[X] = E[X^2] - E[X]^2 = M_X^{''}(0) - \left(M_X^{'}(0)\right)^2$

## 複数の確率変数に対するモーメント母関数

複数の確率変数に対しても、同様に定義される。

```math
\begin{align}
M_{XY}(s, t) &= E\left[e^{sX+tY}\right] \\
M_{XY}^{(m,n)}(0,0) &= E\left[X^mY^n\right]
\end{align}
```
そもそもPython3でinput文を使うようなコーディングを普段しないから覚えてない

AtCoder Beginners Selection https://atcoder.jp/contests/abs は良い教材なので試しに使ってみようとしているけど、そもそもPython3でinput文を使うようなコーディングを普段しないから覚えてない。なので

Python3 のコードの例として

```python
# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print("{} {}".format(a+b+c, s))
```

というのがあったから、ここにメモっておこうと思う。
Bootstrap4 のボタンがとても綺麗な件【感動備忘録】

今まで`btn-primary`とか`btn-info`とかを多用してた。


ただ、`btn-outline-primary`とかの方がとても綺麗！


まあ普通のエンジニアにとっては当たり前だと思うけど、僕はとても感動した！
AWS-sdkでサイズが大きいファイルをS3にアップロードする方法

## 起きたこと

webアプリで5MBくらいのファイルをS3にアップロードしようとした時に

```.js
const uploadFile = fs.readFileSync("/hoge/hogehoge.zip");
const params = {
      Bucket: "test_bucket",
      Key: "hoge/hoge.zip",
      Body: uploadFile
    };
return S3Client.upload(params).promise();
```
って書いたらreadFileSyncに時間がかかりすぎてブラウザがタイムアウトを起こしてしまう問題が発生しました。

## 解決方法

[stackoverflow様](https://stackoverflow.com/questions/29709182/how-do-i-read-and-upload-a-large-file-to-s3)によると

```.js
const uploadFile = fs.createReadStream("/hoge/hogehoge.zip");
```
ってしたら一瞬でアップロードできてS3を確認するとファイルサイズは元のファイルサイズと同じで中身も同じでした！！
円周率の求め方

#はじめに
学校の情報の時間に円周率を計算せよという課題がでた時に少し勉強来たことの備忘録。
いつかロボットで使うかもだし……(使う気がしねぇ
自分は数学力が皆無なので間違ってても悪しからず……

#マダヴァ・グレゴリー・ライプニッツの公式
俗に言うライプニッツの公式を使用した求め方です。

![20170504163602.png](https://qiita-image-store.s3.amazonaws.com/0/283010/2c7366f4-2cac-6d3f-e2e2-6fe97f59125c.png)


``` ライプニッツ.js
var num = parseInt(window.prompt("計算回数を入力してください","入力"));
var pi4 = 0;
for(i=0;i<=num;i++){
    pi4 += (1 / (i * 4 + 1) - 1 / (i * 4 + 3));
}
document.write("実行結果は"+pi4*4+"です。")
```

これだけです
#オイラーによる求め方
あとは参考程度にオイラーの公式を使ったのも。。(あってるかわかりません)

```オイラー.js
var num = parseInt(window.prompt("計算回数を入力してください","入力"));
var pi = 0;
for(i=1;i<=num;i++){
    pi+=1/Math.pow(i,2);
}
pi*=6;
pi=Math.sqrt(pi);
document.write("実行結果は"+pi+"です。")
```

##参考
https://www.procrasist.com/entry/pi_1
http://python-remrin.hatenadiary.jp/entry/2017/05/04/163617
↓これから∑の式にしてやったら早いかな
https://blog.goo.ne.jp/kano08/e/3445a68122c2d6945b5f917dc4c9d4a9
Android-ktxのSpannableTextで文字を装飾する

# 
[android-ktx](https://developer.android.com/kotlin/ktx?hl=ja)という便利な拡張がある。
そのandroid-ktxでSpannableTextを便利に使えるらしいので試してみた。

## 導入

```app/build.gradle
    implementation 'androidx.core:core-ktx:1.1.0-alpha04'
```

## 実装

```kotlin
    private fun setSpannable() {
        // 0〜5文字の文字サイズ100spにする
        val sp1 = "0123456789".toSpannable()
        sp1[0..5] = AbsoluteSizeSpan(100)
        main_text.text = sp1

        // 3〜5文字をリンク
        sp1[3..5] = object : ClickableSpan() {
            override fun onClick(widget: View) {
                Log.d("tag","click")
                Toast.makeText(context, "Click!", Toast.LENGTH_SHORT).show()
            }
        }
        main_text.movementMethod = LinkMovementMethod.getInstance()
        main_text.text = sp1
    }
```

## スクショ
![2019-02-07-11-09-21.png](https://qiita-image-store.s3.amazonaws.com/0/52227/a1f44986-0d75-d4e8-cdb5-3e2e6e79a155.png)

## 備考
kotlin + android-ktx は素晴らしいね

コード https://github.com/ikemura23/Android-Kotlin-Lab/commits/android-ktx
wemosでtimer

#概要

wemosでtimerやってみた。
1khzしか、出ない。精度が悪すぎ。腐ってる。

#環境

- wemos d1 r1
- arduino esp8266 v2.5.0-beta2


#波形

![001.png](https://qiita-image-store.s3.amazonaws.com/0/18104/06a8c11f-1f70-7a22-7886-bc3b7d784ea8.png)

#シリアルプロット

![gg.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ff2dd0e6-58a5-5185-adb7-db3530f6dea9.jpeg)


#サンプルコード

tickerを使った。

```
#include <Ticker.h>

Ticker tk;
volatile unsigned long timeSpent = 1;
unsigned long prevm = 0;
void isrt0(void)
{
	unsigned long now;
	int state = digitalRead(LED_BUILTIN);
	digitalWrite(LED_BUILTIN, !state);
	now = micros();
	timeSpent = now - prevm;
	prevm = now;
}
void setup()
{
	pinMode(LED_BUILTIN, OUTPUT);
	digitalWrite(LED_BUILTIN, LOW);
	Serial.begin(115200);
	tk.attach_ms(1.0, isrt0);
}
void loop()
{
	Serial.println(timeSpent);
}
```

os_timer使った。

```
extern "C"
{
	#include "user_interface.h"
	#include "osapi.h"
}

os_timer_t t0;
volatile unsigned long timeSpent = 1;
unsigned long prevm = 0;
void isrt0(void * z)
{
	unsigned long now;
	int state = digitalRead(LED_BUILTIN);
	digitalWrite(LED_BUILTIN, !state);
	now = micros();
	timeSpent = now - prevm;
	prevm = now;
}
void setup()
{
	pinMode(LED_BUILTIN, OUTPUT);
	digitalWrite(LED_BUILTIN, LOW);
	Serial.begin(115200);
	os_timer_setfn(&t0, isrt0, NULL);
	os_timer_arm(&t0, 1, true);
}
void loop()
{
	Serial.println(timeSpent);
}

```

以上。
Android Developers Blog適当意訳 #1 Google releases source code of Santa Tracker for Android 2018

# Google が Santa Tracker for Android 2018 のソースコードを公開しました
2019年1月29日

[原文](https://android-developers.googleblog.com/2019/01/google-releases-source-code-of-santa.html)
**※英語の勉強と自分用のメモ程度の超適当なものですので、内容の正確さは保証致しかねます。**


本日我々は [google/santa-tracker-android](https://github.com/google/santa-tracker-android) で17のミニゲーム、サンタ追跡機能、着せ替えアプリなどを含む Google's Santa Tracker 2018 のアンドロイドアプリのソースコードを公開しました。
一見去年のものと似ているように見えますが、アプリ内部では Google Play からのダウンロード量を出来る限り少なくするために、大規模なサイズ削減を行いました。
ユーザーが最初にアプリをダウンロードする時のサイズはたったの **9.2MB** です。
これは昨年のアプリの 60MB と比べて **85%** の削減です。

### Android App Bundle

我々はこの削減を達成するために [Android App Bundle](https://developer.android.com/guide/app-bundle/) を利用しました。
Android App Bundle の主な利点は Google Play が [dynamically optimized APKs](https://support.google.com/googleplay/android-developer/answer/9006925) をユーザーの端末に提供出来る事です。
さらに、我々はそれぞれのゲームを個別の動的モジュールとしてオンデマンドでダウンロード可能です。
これはあなたが最初にゲームを起動した時にプログレスバーを見たであろう理由です。(我々は実際にゲームをゲーム開始前に Google Play からダウンロードしてしいます。)
より詳細な App Bundle の適用はブログをご覧ください。 [Moving to Android App Bundle](https://medium.com/androiddevelopers/google-santa-tracker-moving-to-an-android-app-bundle-dde180716096) から始めましょう。

### Gboard stickers

今年追加した機能の一つに Gboard sticker pack があります。これは、ユーザーが友達にステッカーをシェア出来る機能です。
ゲームに登場するキャラクターがステッカーにいる事に既に気づいているかもしれませんね。
我々は端末のローカルインデックスにステッカーを配信する為に [Firebase App Indexing](https://firebase.google.com/docs/app-indexing/) を使っています。
こうする事で、 Gboard keyboard app がステッカーを取得しユーザーがステッカーをシェアする事を可能にしています。
[ここ](https://github.com/google/santa-tracker-android/tree/master/santa-tracker/src/main/java/com/google/android/apps/santatracker/stickers/SantaTrackerStickers.kt) でソースコードをご覧いただけます。

### 多くのコード改善

上記以外に、我々は多くのコード改善を行いました。 minimum SDK version を Lollipop (21) にし、サポートライブラリを [AndroidX](https://developer.android.com/jetpack/androidx/) にし、ゲームで使われている素材のフォーマットをモダンなものにし、さらに多くの小さな改善を行いました。

### コードを確認してみてください

もしこれらの事に興味があるようでしたら、コードをチェックアウトしあなたの感想をお聞かせください。
質問や問題を見つけた場合は、 [issue tracker](https://github.com/google/santa-tracker-android/issues) で知らせてください。
[未来の自分へ]git rebase -iで困ったら

# 前置き
尊敬するエンジニア先輩が未来の自分の為にドキュメントを残す、
という名言に感銘を受けたリスペクトタイトル。意味はない

# 内容メモ
コミットを纏めたりする際、git reabase -iを使うと思うけど検索してもいい感じなドキュメント見つからないしヘルプ見るにも一度rebase実行させないと行けないので、ヘルプ抜粋。

中身については追記するかもしれないし、しないかもしれない。

[原文]

```
 24 # Commands:↲
 25 # p, pick <commit> = use commit↲
 26 # r, reword <commit> = use commit, but edit the commit message↲
 27 # e, edit <commit> = use commit, but stop for amending↲
 28 # s, squash <commit> = use commit, but meld into previous commit↲
 29 # f, fixup <commit> = like "squash", but discard this commit's log message↲
 30 # x, exec <command> = run command (the rest of the line) using shell↲
 31 # d, drop <commit> = remove commit↲
 32 # l, label <label> = label current HEAD with a name↲
 33 # t, reset <label> = reset HEAD to a label↲
 34 # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]↲
 35 # .       create a merge commit using the original merge commit's↲
 36 # .       message (or the oneline, if no original merge commit was↲
 37 # .       specified). Use -c <commit> to reword the commit message.↲
 38 #↲
 39 # These lines can be re-ordered; they are executed from top to bottom.↲
 40 #↲
 41 # If you remove a line here THAT COMMIT WILL BE LOST.↲
 42 #↲
 43 #>--However, if you remove everything, the rebase will be aborted.↲
 44 #↲
 45 #>--↲
 46 # Note that empty commits are commented out↲
```

[google翻訳]

```
24＃コマンド：
 25＃p、pick <commit> =使用するコミット
 26＃r、reword <commit> =コミットを使用するが、コミットメッセージを編集する
 27＃e、edit <コミット> =コミットを使用するが、停止のために停止する
 28＃s、squash <commit> =コミットを使用しますが、前のコミットにマッチします。
 29＃f、fixup <commit> = "squash"と似ていますが、このコミットのログメッセージを破棄します。
 30＃x、exec <コマンド> =shell↵を使用してコマンドを実行する（行の残りの部分）
 31＃d、drop <コミット> =削除をコミット
 32＃l、label <label> =現在のHEADにラベルを付ける
 33＃t、reset <label> = HEADをラベルにリセットする
 34＃m、merge [-C <commit> | -c <commit>] <label> [＃<oneline>]↲
 35＃。元のマージを使用してマージコミットを作成するcommit's↲
 36＃。メッセージ（またはオンラインの場合、元のマージコミットがなかった場合
 37＃。指定された）。コミットメッセージの単語を変更するには、-c <commit>を使用します。
 38＃↲
 39＃これらの行は並べ替えることができます。彼らは上から下に実行されます。
 40＃↲
 41＃ここで行を削除すると、コミットは失われます。
 42＃↲
 43＃>  - ただし、すべてを削除すると、リベースは中止されます。
 44＃↲
 45＃>  - ↲
 46＃空のコミットがコメントアウトされていることに注意してください。
```
VMD-Liftingやってみた。

#概要

VMD-Liftingが魔法なので、やってみた。

#写真

左の写真から右のVMDができた。

![gg.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d6f5e3ab-4a1e-bdba-2505-5ca633dbb201.png)

#参考にしたページ

https://qiita.com/errno_mmd/items/44a7aedfeb853307e443

#成果物

http://jsdo.it/ohisama1/iERW

以上。
複数のgithubアカウントにssh keyを登録する


## キーを作成する

github_private_rsaはお好きなファイル名でどうぞ

```sh
ssh-keygen -t rsa -C "your_email@example.com" -f github_private_rsa
```

## sshキーをコピーして２つ目のgithubに登録する

```sh
cat ~/.ssh/github_private_rsa.pub | pbcopy
```

## .ssh/configに設定を追加

```config:.ssh/config

Host github-private.com
  User git
  HostName github.com
  IdentityFile ~/.ssh/github_private_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```


## 実際にcloneする時に気をつけること

`git@github.com:user_name/repository_name.git`
となっているものを`.ssh/config` で使っているHostに置き換える必要がある


```diff
- git@github.com:user_name/repository_name.git
+ git@github-private.com:user_name/repository_name.git
```

```
git clone git@github-private.com:user_name/repository_name.git
```
sSwitchForwarder.exe Manual

# はじめに

GUI 上の**転送先リスト**を保持し、その選択を GUI 上で切り替える事で、都度転送先を切り替える事ができる

いわゆるローカルプロキシ(プロキシエディタ)を複数使いまわしたりする場合、Webブラウザ側でプロキシの設定を、その都度変更するのは面倒だな、と思って作った

このツールの**待機ポート**を Webブラウザのプロキシとして設定する事で、好きなタイミングで転送先(ローカルプロキシ)ほ変更することができる

# インストール

1. [本家](http://rocketeer.dip.jp/sanaki/free/free142.htm)で sSwitchForwarder.lzh をダウンロード
2. sSwitchForwarder.lzh を解凍(エンジニアを対象としているツールなので、エンジニアなら LZHぐらい解凍できるはず)
3. sSwitchForwarder.exe を起動するだけ
4. レジストリ**HKCU\Software\sanaki\sSwitchForwarder**を使うので、アンインストール時には消した方がいいよ

# 使い方

![067.png](https://qiita-image-store.s3.amazonaws.com/0/182822/540a0e19-39bb-3e14-72ca-f7ba86b8d27b.png)

GUI を見て、なんとなく分かると思う。
転送先の設定を登録して、(編集する場合、「停止」状態で、該当するリストをダブルクリック) **「Start」**ボタン
これで、**待機ポート** で指定したポートで待機して、リスト上の選択された転送先に通信を転送するようになる

あとは、リストの選択項目を変更すれば、転送先も都度変更されるので、好きなタイミングでローカルプロキシを変更する事ができる

# 以上
starting and stopping ambari services via rest api

## stop all services
```
curl -i -u admin:admin -H "X-Requested-By: ambari"  -X PUT  -d '{"RequestInfo":{"context":"_PARSE_.STOP.ALL_SERVICES","operation_level":{"level":"CLUSTER","cluster_name":"Sandbox"}},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}'  http://localhost:8080/api/v1/clusters/Sandbox/services
```

## start all services

```
curl -i -u admin:admin -H "X-Requested-By: ambari"  -X PUT  -d '{"RequestInfo":{"context":"_PARSE_.STOP.ALL_SERVICES","operation_level":{"level":"CLUSTER","cluster_name":"Sandbox"}},"Body":{"ServiceInfo":{"state":"STARTED"}}}' http://localhost:8080/api/v1/clusters/Sandbox/services
```
IBM Code Patternsの歩き方

## 始めに
この記事は、2/6に開催した[bmxug.tokyo #7 Code Patterns](https://bmxug.connpass.com/event/117060/)の振り返り内容です。
bmxug.tokyoは、月に1回のペースでIBM Cloudを中心にコンテナ周りの事やその他の開発の困りごとをみんなで、ワイワイと相談する勉強会を開催しています。`IBM Cloud`を触ったことが無い、という方でも汎用的な技術周りの話も多いので、楽しめますよ～。
[bmxug.tokyo紹介資料](https://speakerdeck.com/motuo1201/bmxug-dot-tokyozhao-hui-zi-liao)

### ↓↓過去のイベントはこちら↓↓
* [bmxug.tokyo これから始めるPaaS開発相談会](https://bmxug.connpass.com/event/91928/)
* [bmxug.tokyo PaaS相談会#2 : Laravel On IBM Cloud](https://bmxug.connpass.com/event/94157/)
* [bmxug.tokyo PaaS相談会#3 : IBM Cloud What's New!](https://bmxug.connpass.com/event/97556/)
* [bmxug.tokyo 開発相談会#4 : IBM CloudFunction/Laravel](https://bmxug.connpass.com/event/100749/)
* [bmxug.tokyo 開発相談会#5 : DevOps(CI/CD,Test)](https://connpass.com/event/103839)
* [bmxug.tokyo 開発相談会#6 : Docker/Kubernetes](https://bmxug.connpass.com/event/112451/)

## Code Patternsの歩き方
### Code Patternsとは
かなり具体的な要件を定義し、IBM Cloud上での開発手順と共に公開しているサイトです。これを眺めているだけでも、とても面白いと思います。

具体的には…
[IoT で駆動する独自のコンベヤー・ベルトを作成してモニターする](https://developer.ibm.com/jp/patterns/build-monitor-iot-driven-conveyor-belt/)←IBMerの方のおススメ
[Drupal 駆動の Web サイトを Kubernetes 上で実行する](https://developer.ibm.com/jp/patterns/run-drupal-website-on-kubernetes/)←勉強会で話題。Kubernetesの体験をするのにピッタリ
というのがあります。
他にも`Watson`を使った分析の手法、話題の`ブロックチェーン`を使ったシステムの構築など、初心者～上級者を問わず、様々な技術にトライするのにちょうど良い素材が集まっています。

[英語版](https://developer.ibm.com/patterns/?cm_sp=Developer-_-code-_-See-the-Code)だけではなく、[日本語版](https://developer.ibm.com/jp/patterns/?cm_sp=Developer-_-code-_-See-the-Code)があるので、とても安心ですね。
また、日本語版はオリジナルの英語版では分かり辛かったり省略されている部分を補足している記事もあるので、まずは日本語版でチャレンジすると良さそうです。

### TryIBMDev
上記の発展形として、[TryIBMDev](https://developer.ibm.com/jp/tryibmdev/)があります。
サイトから概要を引用すると…

> IBM Developer Advocate や IBM Champion が Code Patterns を元に開発したアプリをソースコード付きでご紹介
アプリのコンセプト、作り方の手順、コードのカスタマイズを解説

しているサイトになります。
一例として、公開されている[「らくらくトランスクライバー」](https://www.ibm.com/developerworks/jp/cognitive/library/cc-run-drupal-website-on-kubernetes/index.html)は、上記の例で挙げた`Kubernetes上で作成したDrupalのサイト`に`Watson(Speech to Text)`を組み込む事例となります。
`Code Patterns`で実現したものを、どうやってカスタマイズするか悩んだ時にはとてもありがたい情報があるので、こちらも眺めるだけでも面白いと思います。

### つまづきポイント
手順は公開されているものの、**その手順を実行するまでの準備が意外と大変**でした。
勉強会中にCode Patternsを実装してみた際に、皆さんがつまづいた大きなポイントは下記の2点でした。

1. CLIのインストール(Cloud FoundryやKubernetesを使う際に、CLIのインストールが必要な時がある。)
2. ライトアカウント(クレジットカード登録不要)では使えないサービスが一部に存在する。
(Kubernetes等、一部のサービスでは`Pay-as-you-go`にする必要がある。**※無料で実現は可能**)

もし、ご自身で試してみてつまづいたポイントがあれば、是非、`bmxug`に相談してみて下さい。
[Bmxugが開催する勉強会](https://bmxug.connpass.com/)に参加するのも良いですし、[Slack](https://docs.google.com/forms/d/e/1FAIpQLScRnRIMClD1VHiWLPAcPtr_-rlYfkfC9f-onVePfnUc1rGJOQ/viewform?c=0&w=1)がありますので、こちらから聞いて頂くのも:ok:です。

## まとめ
参加者の皆さん、Code Patternsを見るだけで様々なインスピレーションを得ていたようです。
ビジネスに適用できそうな内容も多く掲載されていますので、実際に手を動かして楽しんでみて下さい:+1:

次回もCode Patternsやります！参加申し込みは[こちらから](https://bmxug.connpass.com/event/120006/)
WindowsUpdateを無効にする方法


#Windows Update サービスを無効にする
[WindowsUpdateが0x80070422エラーで失敗するときの対処法](http://俺の技術メモ.net/0x80070422/)
※リンク先は有効にする方法が記述されている。

    Windowsキー を押しながら [R] キー を押す。
    services.msc と入力して [OK]をクリックする。
    [Windows Update] サービスを探して、右クリックし、[プロパティ] をクリックする。
    [全般] タブの [スタートアップの種類] で、[無効]を設定する。
    [サービスの状態] でサービスが停止する。

#更新プログラムを確認しない
[Windows 10 の Windows Update の自動更新設定](https://blogs.technet.microsoft.com/jpwsus/2015/09/17/windows-10-windows-update/)

「d) 更新プログラムを確認しない (推奨されません)」に構成する場合、
ローカル PC 上で設定可能なローカル グルーポリシーを使用して設定する手順は、以下の通りです。
(ローカル グループ ポリシーは、Windows 10 Pro, Enterprise エディションで使用可能です。)

    1. スタート ボタンを右クリックして [コマンド プロンプト (管理者)] をクリックします。
    2. コマンド プロンプトが開くので、gpedit.msc を実行します。
    3. ローカル グループ ポリシー エディターが開きます。左ペインより以下の場所に移動します。
    [コンピューターの構成] - [管理用テンプレート] - [Windows コンポーネント] - [Windows Update]
    4. 右ペインより [自動更新を構成する] をダブル クリックします。
    5. ダイアログが開くので、[無効] を選択して [OK] をクリックします。
    6. ローカル グループ ポリシー エディターを閉じます。
    7. コマンド プロンプト上で gpupdate /force を実行します。このコマンドでポリシーを強制的に反映させます。

#その他
有効にする場合は本文中の[無効]設定した部分を[有効]に変更すること。
認証プロキシ環境下でIntelliJ IDEAを用いてandroidアプリをビルドする

社内プロキシ環境下で、androidアプリのビルドに苦戦したのでメモ

どれが有効か切り分けができていないので、試したことをすべて載せます。

### ①IntelliJ IDEAの設定
IntelliJ IDEAのトップから「Configure」 → 「Setting」
![設定1.png](https://qiita-image-store.s3.amazonaws.com/0/296916/4e3b311a-4ac2-262b-95b4-dd0e8bae4375.png)

HTTP Proxyの設定から「Manual proxy configuration」を設定
![設定2.png](https://qiita-image-store.s3.amazonaws.com/0/296916/72405d3f-69eb-3bcd-49c6-1d3aac57cf1f.png)


### ②ユーザーディレクトリ配下のgradle.propertiesの設定
以下を追記

```[ユーザーディレクトリ]/.gradle/gradle.properties
systemProp.http.proxyPassword=***
systemProp.http.proxyHost=***
systemProp.https.proxyPort=***
systemProp.https.proxyUser=***
systemProp.https.proxyPassword=***
systemProp.https.proxyHost=***
systemProp.http.proxyPort=***
systemProp.http.proxyUser=***
```

### ③プロジェクト内のgradle.propertiesの設定
以下を追記

```[プロジェクトディレクトリ]/gradle/wrapper/gradle-wrapper.properties
systemProp.http.proxyPassword=***
systemProp.http.proxyHost=***
systemProp.https.proxyPort=***
systemProp.https.proxyUser=***
systemProp.https.proxyPassword=***
systemProp.https.proxyHost=***
systemProp.http.proxyPort=***
systemProp.http.proxyUser=***
```

### ④gradlewファイルの設定
先頭(#!/usr/bin/envの下)に以下を追記

```:[プロジェクトディレクトリ]/gradlew
set JAVA_OPTS=-DproxyHost=*** -DproxyPort=*** -Dhttp.proxyUser=*** -Dhttp.proxyPassword=*** -Dhttps.proxyUser=*** -Dhttps.proxyPassword=***
```

### ⑤「Could not determine Java version using executable」への対処
gradleのバージョンが合っていないことが原因らしい
以下の行を書き換えてgradleのバージョンを変更する

```:[プロジェクトディレクトリ]/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
```


### 参考
- [Gradleでのプロキシ設定](https://qiita.com/hishida/items/9479fb64a016032c0938)
- [Intellij IDEA+Gradleでインポート時にCould not determine Java version using executableって出る](https://takeda-san.hatenablog.com/entry/2018/07/22/233025)
Rで使用する依存パッケージ一覧

# なぜ必要になったか
LambdaでRを動かそうかと思ったのだが如何せん全ての依存パッケージをまるっとzipにする必要があった。
Lambdaへは以下コードから使用しているパッケージの依存パッケージ名を全て取得し、あと、base,compiler,datasetsを入れればOK

# コード
```R
################################################################################
# Lambdaへアップする必要がある依存パッケージ一覧を出力
# 
################################################################################
library(tools)
REQUIRE_LIBS <- list(
  "R.utils",
  "tuneR",
  "jsonlite"
  , "xml2"
  , "aws.s3"
)
ALL_PKG <- available.packages()

funcDependencies <- function(libNm, all_pkg) {
  depenVec <- package_dependencies(packages = libNm, all_pkg, which = "Imports", reverse = F)[[1]]
  if (length(depenVec) > 0) {
    depenVecTmp <- depenVec
    for (depen in depenVecTmp) {
      depenVec <- c(depenVec, funcDependencies(depen, all_pkg))
    }
  }

  return (depenVec)
}

libs =c()
for(libNm in REQUIRE_LIBS) {
  libs <- c(libs, libNm, funcDependencies(libNm, ALL_PKG))
}
createDownloadUrl <- function(libNm) {
  return(paste0("https://cran.r-project.org/src/contrib/", libNm, "_", packageVersion(libNm), ".tar.gz"))
}
libs <- sort(unique(libs))
libs <- lapply(libs, createDownloadUrl)
cat(paste(c(paste0("---- 依存パッケージ:", length(libs), "件"), libs), collapse = "\n"))
```
# refs.
[Rのパッケージの依存関係を色々調べたいときのメモ](https://notchained.hatenablog.com/entry/2015/04/16/185724)
パスドラのパズルを再現してみた(アルゴリズム編)

#概要
パズドラのアルゴリズムを再現を目指しました。なお筆者は曲芸師前後(2015年)に引退しているので古い可能性があります。

###はじめに
パズドラのアルゴリズムを検索しているとかなり難解(個人の感想です)な印象を受けました。ですが、深く考えてみるとアルゴリズムだけではプログラムを勉強し始めて一年目ぐらいの知識量でも作れそうということが分かったので公開しました。


###用語解説・定義
#####盤面
後述のドロップが動かせる範囲のこと。また、画面上に存在するドロップ全てのことを指す。

#####ドロップ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113502/6e69d5e4-16aa-01e2-3ce4-72fd529201ad.png)
画像上にたくさんある〇や□のこと。各種属性に分かれている。盤面上のこれを操作してパズルを成立させる。

#####塊
![キャプチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/113502/19390a9f-7e6d-700e-e023-13620778d110.jpeg)
記事内専用の造語。同属性ドロップが三つ以上縦か横につながっていることを指しており、塊同士がL字や十字やT字のように繋がっていると一つの塊とみなす。画像上では5コンボが成立しており、1と2の間の炎(赤)ドロップは三つ以上に並んでいないので繋がっていないものとみなす。

#考察
###ステップ分割
- 待機状態(☆)
- パズルフェイズ
- コンボフェイズ
- ダメージフェイズ
- ステージ移動・勝敗フェイズ

初期状態→パズルフェイズ→コンボフェイズ→ダメージフェイズ→(どちらかのHPが尽きるまで☆へ戻る)→ステージ移動、勝敗フェイズという流れになっている。

###ステップ解説

パズドラを知らない人のための解説。知っている人は読み飛ばして構いません。
#####待機状態
パズルが並んでいるだけの状態であり、ここからダンジョンが始まる。スキルと呼ばれる特殊技を使うことができる。盤面上のドロップをつかむことでパズルフェイズに移行。

#####パズルフェイズ
一つのドロップ(〇)を掴んで盤面内の好きな場所に動かすことで、ドロップ同士が入れ替わる。一定時間立つか、ドロップを離すことでコンボフェイズへ移行。

#####コンボフェイズ
今回の目玉。塊が成立している場合、繋がっている塊ごとに消えていく。その盤面上から塊が全てなくなるまで重力は働かず、全てなくなると上から新しいドロップが降って隙間が埋まる。塊が消えるごとにダメージは増え、最終コンボが終わるとダメージが確定。また、これ以上コンボを繋げられない状態になるとダメージフェイズに移行。

#####ダメージフェイズ
コンボフェイズの終了時にはダメージが確定しているので、その分敵にダメージを与え、その後敵の動きがあり、一ターンが終了。どちらかのHPが0になるまで待機ステップへ戻る。

#####ステージ移動・勝敗フェイズ
敵のHPが残っていてかつフロア数が残っている場合は次のフロアへ移動、最終フロアだった場合は勝利、プレイヤーのHPが0になった場合は敗北処理を行う。

#再現
##初期状態、ダメージフェイズ、ステージ移動・勝敗フェイズ
割愛

##パズルフェイズ
ドロップを持った状態で隣のマスに移動するとそこと入れ替えるようにする。当たり判定などを使用

##コンボフェイズ
盤面サイズの二次元配列(今回は5×6)を用意
それぞれ
1. コンボ数(何コンボ目に消えるか)、整数
2. 属性、整数or列挙型
を管理、保管する。

以下の変数を用意する
1.現在のコンボ数

###コンボ判定
左上から順番に、三つ先までの属性が一致しているかどうか判定をする
![パズル１.png](https://qiita-image-store.s3.amazonaws.com/0/113502/9ec45ec4-ba77-6e92-2109-7e1cda666fc7.png)

もし塊が成立している場合は、三つ先までのコンボ数の数値を(現在のコンボ数)+1する

![パズル２.png](https://qiita-image-store.s3.amazonaws.com/0/113502/62d8341f-0302-809d-37dc-ab4e5faf21e1.png)

現在判定しているドロップのうちどれかのコンボ数の値が1以上かつ塊が成立しているなら、
![パズル４.png](https://qiita-image-store.s3.amazonaws.com/0/113502/94c60985-b309-666f-eb80-3ab2783b6fb3.png)

判定している全てのコンボ数を0以外の含んでいるコンボ数と同じにする
![パズル５.png](https://qiita-image-store.s3.amazonaws.com/0/113502/908e0887-a8ab-5ab0-bf2e-066069283183.png)

#終わりに
使う知識としては、if,for,変数,配列ぐらいのものでパズドラみたいな複雑なゲームのコンボ判定アルゴリズムが実装できるとわかりました。次回はUnityを使って実際にパズドラが作ってみようと思います。
Gitの超基本的コマンドのまとめ

プログラミング入門者です。
ここでは、Gitについて解説します。
参考にしたのはいつもお世話になっております、ドットインストールのGit入門。
やっぱ動画が分かりやすいです。


それでは、Gitを使っていきましょう！
インストールなどは他のサイトで詳しく紹介するので、そちらを参考にしてください。

その前に、軽くGitについて説明します。

〇Gitとは？
バージョン管理システムの1つで、組織でアプリやシステムを共同開発するのに欠かせない存在。
プログラマーの作業を分担したり、分担した作業をまとめたりします。
<br>
それでは、コマンドの紹介。

```php
git init
```
ディレクトリを作成したら最初にこれが必要。
「このディレクトリをgitで使うぞ～」と宣言する。これで宣言したら、これ以降の作業にはgitコマンドを用いる。

```php
git status
```
今いるファイルがどんな状況か確認できる。
次にどんな作業をすればいいのかも教えてくれるので便利。

```php
git add .
git log  //ファイルの概要を表示
```
addで今のディレクトリにあるファイルをすべてステージングエリアに上げます。


＊ステージングエリア：作業エリアと変更エリアの間。一時的にセーブするイメージです。一時的にセーブしているので、削除や移動が簡単です。ここがgitの良い所です。

```php
git rm
git mv
```
さらに、addの取り消しや、取り消しの取り消しもできます(ややこしい)。

```php
git reset --hard HEAD  //直前のaddを取り消す
git reset --hard HEAD^  //2個前のaddを取り消す
git reset -- hard ORIG_HEAD  //直前のresetを復元
```

<br>
問題がなければ、リポジトリ(記録が保管されるデータベース)に完全にセーブします。

```php
git commit -m "コメント"
```
commitを使います。コメントには、「ここを変更しましたよ~」ということを書きます。
ある程度作業を終えたら、どんどんコミットしましょう。

次に、ブランチについて解説。
ブランチ＝枝で、色々なところに枝分かれさせて作業できます。

```php
git  checkout hoge
```
hogeにはブランチ名を入れます。

例えば、hogeとhogehogeという2つのブランチがあったとします。
この時に、hogeで作業した内容はhogehogeに影響しません。
そのため、異なる複数の作業を同時進行したり、色々なことを試したりできます。

作業をしていて、「2つのブランチをまとめたい」となったらマージします。

```php
git checkout hogehoge //マージしたい大元のブランチに移動
git merge hoge  //hogeの内容をhogehoegに反映
```

<br>
今回は基本的なコマンドだけでしたが、このようにgitを扱っていきましょう！
【Swift】CoreDataでクラスの二重登録のワーニングの解決方法

　こんなのは使い慣れていれば出ないワーニングだとは思うのですが、ようやく理解し始めて放ってあったのを治したので、メモしておきます。


CoreDataを使うでチェックをいれて生成したxcdatamodeldファイルでエンティティを追加して、クラスを作るとします。
自動生成されるクラスのターゲットは基本的にプロジェクトのメインアプリになっていると思います。
`（Properties.swiftやDataClass.swiftを選択して、右側のfileinspectorのTarget Membershipで確認できます）`

で、Embedded Frameworksなんかでライブラリを追加して、そっちの方でCoreDataのラッパークラスやデータ処理のクラスなんかを作ってエンティティを使おうとして、ライブラリもターゲットに追加してシミュレータで動かすと

```
Class ”エンティティ名” is implemented in both
（シミュレータ上のフレームワークのパスと、CoreDataシミュレータのパスが表記される）
One of the two will be used. Which one is undefined.
```

となります。
もうわかってると思いますが、Target Membershipでメインアプリとフレームワークで両方ターゲットに入っているのが問題になってます。
私の場合は、ですが、フレームワーク側でしか直接エンティティのメンバーに触らないので、ターゲットからメインアプリを外したことでこのワーニングが解消されました。

ちなみに
ファイルを生成しないでやると、今度は実行時に

```
CoreData: warning: Unable to load class named 'エンティティ名' for entity 'エンティティ名'. Class not found, using default NSManagedObject instead

```

が出ます。これは自動生成したやつでいいからプロジェクトに登録してあげればいいだけです。

どっちのワーニングも、動くことは動くんですけどね。わかってしまえばただの凡ミスなんですけど、周りに経験者がいないとわかるまで時間がかかるんですよね…。
Pageantを使用した踏み台サーバー経由のWinSCP

# はじめに
以前にPageantを使用した踏み台サーバー経由のアクセスについてまとめたが、その場合のWinSCPの使用方法について、意外にまとまっていないため備忘録として記載。

# 環境構成
以前の記事を確認してほしい。
[「Pageantを使用して踏み台サーバー経由でアクセスしてみた」の環境構成](https://qiita.com/untitle_23/items/7af5e6b1d29f95c13f36#%E7%92%B0%E5%A2%83%E3%81%AE%E5%89%8D%E6%8F%90)

# 前提
以前同様に以下が設定されていること。

- Teratermがクライアント端末にインストールされていること
- Pageantがクライアント端末にインストールされていること
- WinSCPがクライアント端末にインストールされていること
- 公開鍵/秘密鍵があり、公開鍵だけが各サーバーに配置されていること

# WinSCP設定方法
設定はすごい簡単。

## セッション設定
`転送プロトコル`：SFTP（SCPでも可）
`ポート番号`：22（デフォルトから変更していない場合）
`ホスト名`：SFTP/SCPしたいサーバーの**Private IPアドレス**を記載する
`ユーザー名`：sshで使用するユーザー名を記載
`パスワード`：未入力
<img width="471" alt="001.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/9dd1a090-479d-f457-1466-3598066c1ced.png">

## トンネル設定
赤丸の部分だけ注意。それ以外はデフォルトのままで問題ない。
`SSHトンネルを経由して接続する`：チェック
`ホスト名`：踏み台サーバーの**Global IPアドレス**を記載する
`ポート番号`：22（デフォルトから変更していない場合）
`ユーザー名`：sshで使用するユーザー名を記載
`パスワード`：未入力
`秘密鍵`：選択しない
<img width="413" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/86236f1d-e610-581d-1d28-420a28dfd01e.png">

## 認証設定
赤丸の部分だけ注意。それ以外はデフォルトのままで問題ない。
`Pagentでの認証を試みる`：チェックする（デフォルトでチェックされている）
`エージェントの転送を許可する`：チェックする
`秘密鍵`：選択しない
<img width="411" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/7c18d79c-2123-dbb8-2072-e2bc7675e19a.png">

ここまでの設定で踏み台サーバー経由のWinWCPが可能となっている。
(Pageantは起動済みであることが前提)

# 注意事項
例えば、[以前の記事](https://qiita.com/untitle_23/items/af4e6b9fb00cf5981e32)のように、sshログを取得するように踏み台サーバーを構築している場合は、[ここ](https://qiita.com/untitle_23/items/af4e6b9fb00cf5981e32#aws%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%A8%E9%81%95%E3%81%86%E7%AE%87%E6%89%80)にも記載の通り、AllowTcpForwardingはyesにしておく必要がある。その場合のセキュリティについては要検討だ。
php-master-changes 2019-02-06

今日はドキュメントの修正があった！

# 2019-02-06
## cmb69: Fix typo
- https://github.com/php/php-src/commit/535fefc27bc117011e78db63a4c59b5d8ce6601e
- README.RELEASE_PROCESS の脱字を修正

## cmb69: Fix NEWS
- https://github.com/php/php-src/commit/b2907527e92088c172879bc8d462fb2b5628b8ba
- [7.3~]
- NEWS で [#77287 の修正](https://qiita.com/sj-i/items/54700aad32242fa6650f#nikic-fixed-bug-77287)が 7.3.3 で入ったことになっていたのを 7.3.2 の位置へ記述を移動