OmniAICreator/Qiita-1.07M huggingface dataset:
Redux TutorialをTypeScriptで実装してみた

ReduxのTutorialをTypeScriptでやってみました. (n番煎じ)　  
とりあえずの自分なりのベストプラクティスを書き記します.

ソースコードは[こちら](https://github.com/pepoipod/react-redux-ts-todo)


## Setup

```shell
$ create-react-app <App名> --scripts-version=react-scripts-ts # TypeScriptで作成.
$ yarn add redux react-redux #reduxを追加
$ yarn add -D @types/react-redux tslint-config-airbnb # reduxのtypeと、air-bnbのtslintを追加.
```

## Linter

自らを律すため、`tslint-config-airbnb`を導入.

globalを

```json
"globals": {
    "window": true,
    "location": true,
    "document": true
  },
```
とか書いとくと良い.   


詳しいrulesは [`tslint.json`](https://github.com/pepoipod/react-redux-ts-todo/blob/master/tslint.json) を確認.

## Action, Action Creator
Actionは [Flux Standard Action](https://github.com/redux-utilities/flux-standard-action) を参考にして、値は `payload` 内に格納するように実装.  
interfaceは Redux のActionをextendsしておく.

```js
interface AddTodoAction extends Action {
  type: ActionTypes.ADD_TODO;
  payload: {
    id: number;
    text: string;
  };
}
```

また、ActionTypeはenumとして定義することで、よりsafeな実装に.    


```js
export enum ActionTypes {
  ADD_TODO = 'ADD_TODO',
  SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER',
  TOGGLE_TODO = 'TOGGLE_TODO',
}

```

Reducerのaction引数の型を指定するために、TodoActionsという共有型としてtypeをexportしておくと良い.

```js
export type TodoActions = AddTodoAction | SetVisibilityFilterAction | ToggleTodoAction;
```


## State
Stateは `states/` 内でinterface定義. 各stateはReduxの思想に乗っ取り、readonlyに指定する.  
ObjectなStateも定義しておくことで、各所でそのtypeを利用できて便利.

```js
export interface TodoState {
  readonly id: number;
  readonly text: string;
  readonly completed: boolean;
}
```

また、Storeで保持されるRootのStateをinterfaceで定義することで、ドキュメント的にStateの内部を記述しておける.


```js
export interface State {
  readonly visibilityFilter: VisibilityFilters;
  readonly todos: TodoState[];
}
```

## Reducer、Store
素直に実装すれば良い.

## Presentational component
Presentational componentなので、基本的にSFCになるよう実装.  
引数の `props` はTutorial内では `({ active, children, onClick })` のように記述されていたが、こちらを参考に、関数内でpropsを展開.  
やってることは変わらないので、好みで決めていいと思う. 個人的に、引数に書くと変数定義部が冗長になりすぎてしまうので、関数内のほうが好み.  
各componentのpropsはOwnPropsとしてinterfaceを定義.

```js
export interface OwnProps {
  active: boolean;
  onClick: () => any;
}

const Link: React.SFC<OwnProps> = (props) => {
  const { children, active, onClick } = props;

  return (
    <button
      onClick={onClick}
      disabled={active}
      style={{
        marginLeft: '4px',
      }}
    >
      {children}
    </button>
  );
};

export default Link;
```

Provider直下のAppもSFCでいいと思う.

```js
const App: React.SFC = () => (
  <div>
    <AddTodo />
    <VisibleTodoList />
    <Footer />
  </div>
);

export default App;
```

### Container component
やり過ぎ感はあるが、 `mapStateToProps` の戻り値として、 `StateToProp` interface、 `mapDispatchToProps` として、 `DispatchToProps` interface を定義.

```js
interface StateToProps {
  todos: TodoState[];
}

interface DispatchToProps {
  toggleTodo: (id: number) => any;
}
```

Tutorialの `AddTodo` は `connect()(AddTodo)` されたことで、AddTodoのtypeが曖昧になってしまうので、 `connect()(AddTodo)` したものを、そのままexportすると良い.
特定文字を含むremote branchを一括で削除する方法

# remote branchの一斉削除

以下コマンドで実施可能。

```
git branch -a | grep <strings> | sed -e 's% *remotes/origin/%%' | while read branch ; do git push origin :${branch} ; done ;
```

 *\<string\>*部分にキーとする特定文字列を入れる。いきなり消してしまうのは怖いので以下で削除候補を確認の上実施するといいと思います。

```
git branch -a | grep <strings> | sed -e 's% *remotes/origin/%%'
```

１度マージ済みのbranchに絞るなら--mergedオプションを入れるとより安全です。
（そもそもマージ済みのbranchは削除してしまうべきと思いますが）



# ローカルで保持しているremote branch情報を削除

remoteのbranchを削除したあとはローカルに残っている*remote/origin/hoge*も削除しましょう

以下３つ全て同じです。

```
git fetch -p
git fetch --prune
git remote prune origin
```

以下でdry runも可能

```
git remote prune origin -n
git remote prune origin --dry-run
```

都度ローカルの掃除をするのが面倒な場合は以下でfetch時に常に-p optionを使用するよう設定可能
```
git config --global fetch.prune true
```
raspbrryPIでインストールの仕方

ラズベリーパイを新たに購入しわくわくしながら設定しますが、やり方をホームページを参照しながらやると思います。ホームページを参照しながらソフトをインストールするには幾つかの方法があります。

たとえばドーロ系のソフトgimp、続けて日本語変換ソフトmozcをインストールするとしましょう。
#一つづつこまめにタイプする
`sudo apt-get install gimp`

インストールするかを聞いてくるので　Yを押します。
`sudo apt-get install fcitx-mozc`

またインストールするかを聞いてくるので　Yを押します。

#-yをつける
あらかじめインストールするかと聞いてくるのがわかっているので -yを使えばインストールするか聞いてこなくなります。
`sudo apt-get install gimp -y
sudo apt-get install fcitx-mozc -y`

#一行にまとめる
`sudo apt-get install gimp fcitx-mozc`

または&&で結ぶこともできます。

`sudo apt-get update && sudo apt-get upgrade -y`
WSH/JScriptをバッチとして実行する（何を言ってるのかわからない

まず、パスが通ってるところにこのバッチファイルを置く。

```execAsCscript.bat
@echo off
cscript //nologo //E:JScript %1
```

次に、拡張子.bat でWSH/JScriptのファイルを作る。
ポイントは1行目の「execAsCscript = "%~f0"」
バッチファイルのコマンドとしても JavaScript のコードとしても有効なコード。
JavaScript としてはグローバル変数を1個消費するだけで特に何もしない。
バッチファイルとしては、別バッチの呼び出し。
CALLではなく直呼びなのでそのまま帰ってこず、それより下の JavaScript コードは無視される。

```hello.bat
execAsCscript = "%~f0"

// JScriptをバッチとして実行する。
// パラメータ無し版

var WshShell = new ActiveXObject("WScript.Shell");

WshShell.Popup( "hello, world" );
```

私はMS-DOSの時代、JPerl.exe を使ってあれこれいろんなことをしていました。
当時、#!.exe という巧妙な仕掛けで、 Perlスクリプトを実行ファイル化していました。

それを思い出して、WSH/JScript で同じようなことが出来んかとあれこれ試して、とりあえずここまで来ました。

現状気に入らない点。

・ゴミが1行表示される。
・起動パラメータがエレガントに扱えない。

こんなもんはまあスクリプトごとに起動バッチを作っとけばいいって話ではありますが。

```hello2.bat
CScript //nologo hello.js
```

とりあえずせっかくなので記録を残しておくことにしました。
RE:PHPExcelで出力したExcelの数式で再計算が実行できなくなった時の対処法

# 元の投稿
https://qiita.com/makasn/items/98b4995266661ec1659f

しかし、$preCalculateFormulasをtrueにする対処は利用している関数によってはうまく動作しないようだ。

# PhpSpreadsheetにおける対応

後継ライブラリのPhpSpreadsheetのissuesで以下を発見。

https://github.com/PHPOffice/PhpSpreadsheet/issues/456

# PHPExcelでの対応

/PHPExcel/Writer/Excel2007/Workbook.php の中の _writeCalcPr メソッドに一行追加し、以下のようにする。

```php:Worksbook.php
	private function _writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $recalcRequired = TRUE)
	{
		$objWriter->startElement('calcPr');

		//	Set the calcid to a higher value than Excel itself will use, otherwise Excel will always recalc
        //  If MS Excel does do a recalc, then users opening a file in MS Excel will be prompted to save on exit
        //     because the file has changed
		$objWriter->writeAttribute('calcId', 			'999999');
		$objWriter->writeAttribute('calcMode', 			'auto');
		//	fullCalcOnLoad isn't needed if we've recalculating for the save
		$objWriter->writeAttribute('calcCompleted', 	($recalcRequired) ? 1 : 0);
		$objWriter->writeAttribute('fullCalcOnLoad', 	($recalcRequired) ? 0 : 1);
		$objWriter->writeAttribute('forceFullCalc', 	($recalcRequired) ? 0 : 1);
		
		$objWriter->endElement();
	}
```
forceFullCalcという属性を追加しているところが該当箇所。
Vue packages version mismatchがでた場合

もしエラーメッセージがこんな感じだったら

```
- vue@2.5.13
- vue-template-compiler@2.5.2

This may cause things to work incorrectly. Make sure to use the same version for both.
If you are using vue-loader@>=10.0, simply update vue-template-compiler.
If you are using vue-loader@<10.0 or vueify, re-installing vue-loader/vueify should bump vue-template-compiler to the latest.
```

`vue-template-compiler` のバージョン不一致が原因。

- もし `vue-loader` の `ver10.0` 以上を利用していたら、`vue-template-compiler` 自体をアップデート。
- もし `vue-loader` の `ver10.0` 未満や `vueify` を使っている場合は、それらを再インストールする。

こんなとき英語がネイティブだったら…
本当に性別情報を活用する必要があるなら、textareaにしたほうがいい

システムで「性別」の情報を扱う前に知っておくべきこと
https://qiita.com/aoshirobo/items/32deb45cb8c8b87d65a4


というのがバズってまして
私も、sexはちょっとやだからgenderにしたいなーとか
man, womanはださいから male female にしたいなーとか
その他は nullかゼロでいいかな　くらいしか考えたことなくて、ようするに、ほとんどのシステムにとってユーザの性別って男か女かがわかればいいレベルでしかないんですよね
で、ほぼほぼ冗談でこういうことを呟いたんですが


「すごくいいことを思いついたんですけど、性別はtextareaにすれば全てが解決する」
https://twitter.com/kituneponyo/status/984715897007783936


ふと、これはすごく正しいのじゃないか、という風に思い至ったので、改めてqiitaで書くことにした


しばしば出てくる「その他」系の選択肢って、「文句言ってくる人がいるから」やってるレベルなんですよね


それでちょっと考えたんですけど、実際に「その他」の人が「その他」をしたとして、とりあえず事情がややこしいことしかわからなくて、じゃあなんなんだよ、ホモセクシャルなのか、トランスジェンダーなのか、あるいはXなのか、そういうのが全然わからないんですよ
facebookの「カスタム」だって所詮選択肢がいっぱいある程度でしかないわけ　本当にそれで説明がつくのか？？？？


それについて議論しているのをいまいち見たことがないんですけど、実はそここそが一番重要な問題じゃないんですかね？
「その他」に分類されるデリケートなステータスの人が、どうデリケートなのか、どう扱ってほしいのか、を説明する場がないというのは片手落ちどころか両手落ちレベルなのでは？？？？？？？


ということで、「本当にユーザから性別情報を取得する必要のあるサービス」については、textareaは用意しておくとすごく顧客サービスの役に立つ可能性が高いのでは？？？？　という気づきでした。
Level 0. Hello Ethernaut （The Ethernaut）

## 原文はこちら
https://ethernaut.zeppelin.solutions
0. Hello Ethernautをクリック

## Hello Ethernaut
このレベルでは、ゲームの基本について説明するぞ。

### 1. MetaMaskのインストール・設定
MetaMaskをまだインストールしていない場合は、MetaMaskブラウザの拡張機能（デスクトップマシンにChrome、Firefox、Brave、Operaなど）をインストールしてくれ。
拡張機能のウォレットを設定し、ネットワークセレクタを使用して、拡張機能のインターフェースの左上にある 'Ropsten test network'をポイントするんだ。

### 2. ブラウザのコンソールを開く
ブラウザのコンソールを開いてくれ。: Tools > Developer Tools.
※　ChromeならF12キーでいけるぞ！
※　HTMLエラーチェッカーを使ってる場合は切っておいたほうがいいぞ！
すると、ゲームからいくつかのメッセージが表示されるぞ。
そのうちの1人があなたのプレイヤーの住所を述べるべきです。
これはゲーム中においてはとっても重要なんだ！
次のコマンドを入力してみな！プレーヤーのアドレスをいつでも確認できるんだ。

```
player
```
ゲームプレイ中に重要な情報を提供することがあるから、警告やエラーに充分注意するんだぞ！

### 3. コンソールヘルパーを使用する
次のように入力して、現在の所持しているEtherの量を確認することもできるぞ

```
getBalance(player)
```
注： "pending"と表示されていても、Promiseを展開してあげれば実際の値を見ることができるんだ。 Chrome v62を使用している場合は、await getBalance(player) とすることで簡単に値を確認できるぞ。

いいぞ、その調子だ！
コンソールで他にどんなユーティリティー機能があるのか​​を調べるには下のコマンドを打つんだ！

```
help()
```
このコマンドはゲーム中に非常に役立つぞ！

### 4. The ethernaut contract
コンソールに次のコマンドを入力してみろ！

```
ethernaut
```
これはゲームの主なスマートコントラクトだ。
コンソールから直接いじる必要はないぞ。（このアプリケーションはあなたのために行います）。
しかし、必要に応じていじることもできるんだ。このオブジェクトで遊ぶことは、ゲームの他のスマートコントラクトとやりとりする方法を学ぶのには最高の方法だ。

先に進んで、ethernautオブジェクトを展開して、内部にあるものを確認してみてくれ。

### 5. Interact with the ABI

ethernautは、展開されたEthernaut.solコントラクトをブロックチェーンにラップするTruffleContractオブジェクトだ。


とりわけ、コントラクトのABIは、Ethernaut.solの所有者などのパブリックメソッドのすべてを公開している。
たとえば、次のコマンドを入力してみてくれ。

```
ethernaut.owner()
```
await ethernaut.owner() とすれば、簡単にEthernautコントラクトの所有者アドレスが誰でも確認できるぞ！
もちろんこのアドレスはお前のアドレスじゃないからな！

### 6. テスト用のEtherを手に入れろ！
ゲームをプレイするには、テスト用のEtherが必要だ。
いくつかのテストネットのEtherを入手する最も簡単な方法は、MetaMask faucet（ https://faucet.metamask.io/ ）を使用する方法だ。
Etherを無事ゲットできたら、次のステップに進むんだ！

### 7. レベルインスタンスを取得せよ！
各レベルをプレイするとき、お前はethernautコントラクトを直接いじらないぞ。
代わりに、レベルインスタンスを生成するように依頼するんだ。
これを行うにはページの下部にある青色のボタンをクリック！クリック！クリックだ！（1回でいいぞ！大事だから3回言ってみただけだ！）
今すぐ行って戻ってこい！
※MetaMaskの「SUBMIT」ボタンを押すと、トランザクションが実行される！
※Instance addressが返ってきたら完了だ！

### 8. Inspecting the contract
ethernautコントラクトと同じように、コントラクト変数を使ってコンソールからABIを調べることができるぞ。

### 9. Interact with the contract to complete the level
レベルの情報メソッドを調べるんだ。

```
contract.info()
```
await contract.info() if you're using Chrome v62.

お前は、契約内のレベルを完了するために必要なすべてを持っている必要があるぞ。
お前がレベルを完了したら、ページの下部にあるオレンジ色のボタンを使って契約書を提出するんだ！
お前のインスタンスをethernautに送り返すぞ。これで、完了したかどうかが判断される。

※「Oops! Looks like you haven't cracked this level just yet」
　と表示されたら、まだクリアじゃないぞ！
The Ethernaut byZeppelinを日本語翻訳してみた

# The Ethernaut byZeppelin 日本語翻訳（ほぼGoogle翻訳）
※翻訳内容が間違っている場合はご指摘お願いします
※オリジナルはこちら https://ethernaut.zeppelin.solutions/

## はじめに
「The Ethernaut」は、http://overthewire.org/wargames/ でプレイされた「El Eternauta comic」に触発されたEVM上のWeb3/Solidityベースの戦闘ゲームだ。
上のレベルにあがるためにはスマートコントラクトをハッキングしなければならないぞ！

Devcon3用にリリースされたCTFバージョンをお探しをさがしてるのかい？
それなら、https://ethernaut-devcon3.zeppelin.solutions/ をみてくれ。
このバージョンはしばらくの間使えるぜ。

あんた、スマートコントラクト開発やセキュリティに興味があるよな？
世界のブロックチェーンインフラを安全に保つのって最高じゃないかい？
どうだい、俺たちの一員にならないか？
VSCode doesn't recognize Git installed on OS X

My vscode on El Capitan says can't find any git but I had a couple of gits that are by apple and brew.

When I type `which git` on terminal, it says `/usr/bin/git` it's apple's(git v2.10). I'd like to use brew one `/usr/local/bin/git` (v 2.17) but vscode recognized neither.

I added this line to the last line of my `~/.bash_profile` then vscode began to work.

    export PATH="/usr/local/bin:/usr/bin/git:/usr/bin:/usr/local/sbin:$PATH"

After then, the terminal answered to `which git` -> `/usr/local/bin/git`. The order of the $PATH was important.

> https://coolestguidesontheplanet.com/install-update-latest-version-git-mac-osx-10-9-mavericks/
バイオインフォマティクス解析環境のGalaxyをMacのDockerで動かしてみる

# 概要

## テスト環境
- MacBookPro, Mem 16GB, SSD 1TB
- macOS 10.13.14
- Docker 18.03-0-ce-mac60

# 準備

コンテナ内へのファイル書き込みをホスト側のMacに保存するために、Data volumeコンテナを最初に作成する。

```
$ docker create -v /export --name galaxy-store \
 bgruening/galaxy-stable /bin/true
```

- `/bin/true` コンテナ領域だけを確保したい場合、何らかの成功するコマンド(exit 0を返す)コマンドを指定する必要がある

# 動かす

```
$ docker run -d --rm \
 -p 8080:80 -p 8021:21 -p 8022:22 -p 8800:8800 \
 --volumes-from galaxy-store \
 --privileged=true \
 -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
 -e ENABLE_TTS_INSTALL=True \
 bgruening/galaxy-stable
```

- `docker run -d` コンテナをデーモンとしてバックグラウンドで実行
- `--rm` コンテナ終了後にコンテナ破棄
- `-p 8080:80 ...` [ホスト]:[コンテナ]間のポートフォワード
- `--volumes-from` 準備で作成したData volumeコンテナ
- `--privileged...` `-e GALAXY_CONFIG_ENABLE...` コンテナ内でのDocker実行を許可
- `ENABLE_TTS_INSTALL...` Test Tool Shed からのツールのインストールを許可

ブラウザから `http://localhost:8080` を開くとGalaxyにアクセスできる。
他のマシンからアクセスするには `http://ホストのIPアドレス:8080`

ホストとコンテナ内のファイル共有に`-v /home/user/galaxy_storage/:/export/`を使うとアクセス権限の問題からうまくいかなかった。

# Galaxyログの閲覧

`$ docker logs -f <CONTAINER ID>`

# コンテナ内のシェルに入る

`$ docker exec -it <CONTAINER ID> /bin/bash`

ターミナルで文字列が変に折り返されないようにするには
`-e COLUMNS=200 -e LINES=50` を追加

# BioContainers(Docker)を使えるように設定

## job_conf.xml ファイルの用意

サンプルの`job_conf.xml.docker_sample`を使う。

```
$ docker exec -it <CONTAINER ID> /bin/bash
# cp /export/galaxy-central/config/job_conf.xml.docker_sample /export/galaxy-central/config/job_conf.xml
```

## Galaxyの再起動

`$ docker exec <CONTAINER ID> supervisorctl restart galaxy:`

## テスト

Docker版のツールを探すがインストールが確認できていない。
コンテナ内のシェルに入って`# docker images`でイメージがダウンロードされたかを確認。

# コンテナの停止

`$ docker stop <CONTAINER ID>`

# 参考
- [bgruening/docker-galaxy-stable: Docker Images tracking the stable Galaxy releases.](https://github.com/bgruening/docker-galaxy-stable)
- [GalaxyProject の Galaxy の Docker stable の開発環境を整える - Qiita](https://qiita.com/manabuishiirb/items/3391af163c827b730ad4)
Delphi / C++Builder 10.2 Tokyo Release 3 でモバイル開発したい

Delphi/C++Builder 10.2.3 で Professional 版でモバイル開発が可能になりました。

公式の記事 [Delphi / C++Builder 10.2.3 Professional - Mobile Packのインストール手順](https://community.embarcadero.com/article/16618-delphi-c-builder-10-2-3-professional-mobile-pack) とか、サポート記事 [Delphi/C++Builder 10.2.3 Professional でモバイル機能を使用するためには](http://support.embarcadero.com/article/44779) に説明がありますが、もう少し噛み砕いた Q&A 形式で説明します

## Delphi 10.2 Tokyo Professional のライセンスがあればモバイル開発できるの？
貴方の持っているライセンスが次の２つの条件をクリアしていれば、モバイル開発できます
1. アップデートサブスクリプション加入期間中であること
2. ライセンス証書の製品名のところに「Delphi 10.2 Tokyo Professional Named User and Mobile Add-on Pack – ESD」って書いてあること

## C++Builder 10.2 Tokyo Professional のライセンスがあればモバイル開発できるの？
貴方の持っているライセンスが次の２つの条件をクリアしていれば、モバイル開発できます
1. アップデートサブスクリプション加入期間中であること
2. ライセンス証書の製品名のところに「C++Builder 10.2 Tokyo Professional Named User and Mobile Add-on Pack – ESD」って書いてあること 

## 「and Mobile Add-on Pack – ESD」って書いて無い
アップデートサブスクリプション加入期間中であれば、プロモーションサイトから 10.2 Tokyo の Add-on Mobile のライセンスがゲットできるので、それ使うとイイヨ

## アップデートサブスクリプション加入期間中なんだけど、自分の持っているライセンスは 10.2 Tokyo じゃない
アップデートサブスクリプション契約しているライセンスが Delphi/C++Builder Professional の XE8, 10 Seattle, 10.1 Berlin のライセンスであれば、プロモーションサイトから 10.2 Tokyo の Add-on Mobile のライセンスがゲットできるよ

## 次のバージョン (10.3 以降) でもゲットした Add-on Mobile のライセンスって使えるの
残念、使えません。10.2 Tokyo 専用です
てか、次のバージョンからは、Professional 版のライセンスだけでいいのだ

## ゲットした Add-on Mobile のライセンスって過去バージョンも使えるの
使えないヨ。10.2 Tokyo 専用だってば

## プロモーションサイトってどこにあるの？
公式の記事内にリンクがあるヨ
Excel 便利コマンドまとめ

集計やら整形やらで何かと使うことの多いExcelですが、○○をする時ってどういう関数を使うんだっけ、
どういう構文だっけということが増えてきたので使った関数などを記載してメモ化していく。
基本的にExcelはこの記事に追記していく方式で進める。


# 指定した範囲に指定の文字列があるかどうかの検索
指定した範囲に目的の文字や数値が入力されていれば「○」を、
入力されていない場合は「×」を表示する様にするにはIF関数にCOUNTIF関数をネストして使用する。

```
=IF(COUNTIF(<検索する範囲>,<検索ワード>),"○","×")
```

### 指定した範囲に指定の文字列がある場合、その文字列と同じ行の特定のセルを表示
VLOOKUPは少し複雑で使い方を覚えるまでが面倒だけど、
要は「指定した列と同じ行の指定した列値を返す」関数。
これを先程の指定範囲内に、特定の文字列があるかどうか特定する関数と組み合わせて、
検索する範囲に指定の文字列がある場合、その行で対応する列値を取り出す、ということも可能。

```
=IF(COUNTIF(<検索する範囲>,<検索ワード>),VLOOKUP(<検索ワード>,<検索する範囲>,<列番号>,FALSE),"X")
```

個人的にはAWRのSQL実行時間の比較とかでよく使う関数。

## 見えているデータだけを対象に計算をする。

フィルタリングを行った状況で範囲指定で計算を行おうとしても、
非表示にしてあるセルも対象となってしまって求めたい値を計算できない、
ということが結構あった。

そんな時用に見えていないセルは計算から除外する、
要は表示されているセルだけを対象に計算を行う、という関数が用意されている。

```
=SUBTOTAL(集計方法,集計範囲始点：集計範囲終点)
```

| 集計方法(引数) | 集計機能 | 同等の関数
| :--- | :--- | :--- |
| 1 OR 101 | 平均値を求める | AVERAGE
| 2 OR 102 | 数値の個数を求める | COUNT
| 3 OR 103 | データの個数を求める | COUNTA
| 4 OR 104 | 最大値を求める | MAX
| 5 OR 105 | 最小値を求める | MIN
| 6 OR 106 | 積を求める | PRODUCT
| 7 OR 107 | 不偏標準偏差を求める | STDEV.S
| 8 OR 108 | 標本標準偏差を求める | STDEV.P
| 9 OR 109 | 合計値を求める | SUM
| 10 OR 110 | 不偏分散を求める | VAR.S
| 11 OR 111 | 標本分散を求める | VAR.P

# 絶対参照
数式などでセル番地を指定していると、コピーをした時にセル番地がズレていってしまう。
そういうときは絶対参照という方法を使用するとセル番地のズレが生じずにコピーが出来る。

絶対参照は＄マークをセル番地の列、行の前にそれぞれ付ける事で有効になる。
下記の様な数式が設定されていた場合、コピー等をしてもズレるのは「A6」の部分だけで、
「B1」の箇所は固定されたままとなる。

```
＝A6＊$B$1
```

# 改行の置換

検索と置換のダイアログを表示させ、[検索する文字列]、或いは[置換後の文字列]に**「Ctrl+j」**を入力すると、入力バーには何も文字は入らないが、改行が入力された状態になる。
この状態で置換をすると、文字が改行に置換されたり、改行を文字に置換したりすることが可能になる。
[Tensorflow]環境構築日記 Ubuntu 16.0.4 LTS on Azure

こんにちは、先ほどやっと二週間の長い戦いの末にてんそーふろーが動きました。
涙が出ますね。。
こちらの方の記事に出会えたのがきっかけでした。
ぜひご覧ください。
https://qiita.com/shizuma/items/0fdb644e7a9964d2b8d4

結局原因はインストールしたはずのCUDA/cuDNNをパスの問題できちんとPython実行時に読み込めていなかったことが原因でした。
Anacondaさん八つ当たりして削除しまくってごめんね。

続きがあれば、ないことを祈りますが、また更新します！

公式ドキュメントインストールの仕方と入っているのかの確認の仕方。
http://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html

PS. 本当にこれっててんそーふろー入ってんのかよ？？おい！
となりました。
こちらの素晴らしい例題を元にてんそーふろーとの淀みない人生をお送りください。

https://github.com/aymericdamien/TensorFlow-Examples

## To-do: summarise these stuff
https://developer.nvidia.com/rdp/cudnn-download
cuDNN v7.1.2 Library for Linux
http://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html
2.3. Installing cuDNN on Linux
postgres ロック状態確認 メモ

postgresでalter tableできないので、ロックされてるんだろうと思いいつもロックを確認するコマンドは覚えられないのでメモ。
自分素人過ぎて(＃＾ω＾)ﾋﾟｷﾋﾟｷ

```sql
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode FROM pg_locks l LEFT JOIN pg_class c ON l.relation=c.relfilenode LEFT JOIN pg_database db ON l.database = db.oid ORDER BY l.pid;
```

プロセスさよなら

```sql
SELECT pg_cancel_backend(プロセス名);
```
ファイルの拡張子の一括置換

---
後輩が1ファイルずつ変換コマンドを作っていたので、
こういうやり方があるよと調べながら教えたのでメモ。

- カレントディレクトリにあるファイルの.txtのファイルを.csvに変換する例

```
ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}' |xargs -n 2 mv
```

---

若手の時に先輩にこんなコマンドを渡されても
何が何だかわからず調べることも出来なかったのでちと説明。
lsの代わりに「find . -name '*txt'」とかだとカレントディレクトリ以外もいける。

### 1. 一覧を出す
```
$ ls *txt
foo.txt		hoge.txt
```
### 2. ファイル名だけにする
```
# .txtを置換して消してるだけ。
$ ls *txt | sed -e s/\.txt//
foo
hoge
```
[【 sed 】 文字列の置換，行の削除を行う](http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230879/)


### 3. mv用のパラータの作成
```
$ ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}'
foo.txt foo.csv
hoge.txt hoge.csv
```
[【 awk 】コマンド（基本編）](http://www.atmarkit.co.jp/ait/articles/1706/02/news017.html)

### 4. あとはmvコマンドにパラメータを流す
```
$ ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}' |xargs -n 2 mv
```
[【xargs】標準入力から生成したコマンドラインを実行する](http://tech.nikkeibp.co.jp/it/article/COLUMN/20140331/547143/)
LeapMotion Orion + Htc vive ちょっと怖い体験を作る

# はじめに：
今回LeapMotion Orion + Htc viveを融合し以下の体験を作ろう

0.ユーザーは井戸の隣に立って、近づくと、人間は井戸の上から下まで移動される。
2.井戸に入ると、怖い動物が来る。
1.スパイダーなどは人間を発見して、食べに行く
2.人間は手や刀や銃などを使って、怖い動物と戦う
3.動物は一定の量が死んだら、勝利し、井戸から解放される

#
まず必要なPackageをインポートします。
GitLab で Container RegistryだけPublicにする方法

GitLab には、Container Registry がありますが、同僚にdocker pullする時にdocker loginしないでもいいようにできるの？と聞かれたので、`「できるよー」` と答えたのですが、あまりどこにも書かれてないようなので、ちょっと書いとく。

## 1. やりたいこと
DockerHub の公開レポジトリみたいに
docker pull(やdocker run) でGitLab Container Registryにあるコンテナーイメージを利用したい。
※docker loginしないでイメージをPullしたい！

## 2. 対応方法
GitLabのプロジェクトをPublicにする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/1e50e7a4-8d48-7fe8-58e5-7436e81d2996.png)

これだけ。

### 2-1. もうちょっと詳しく
あまりにも不親切なので、もう少し細かく書くと。

#### 2-2. 設定画面
「GitLabのプロジェクト」--->「Settings」--->「Permissions」--->「Expand」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d3f34911-8bb2-3004-a6c3-6b02f781ddd2.png)

#### 2-3. Project visibility

「Private」--->「Public」へ変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/2c12f5cc-62bd-fbe6-32ae-ed71ff42cc39.png)

「Save changes」を押す。

以上

### 3. ノーガード戦法はイヤ
なのですが、Project visibility を「Public」にしてしまうとその他の機能もジャジャ漏れでノーガード戦法になってしまうので、Container Registryだけ公開しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/8bc5585b-426d-443e-4e1b-c0834ae63903.png)
TerraformでLambdaをデプロイするときの小技

TerraformでLambdaをデプロイするとき、ローカルでzipファイルを作成しておくか、あらかじめS3にアップしておく必要があります。

```
resource "aws_lambda_function" "sample_function" {
  filename         = "lambda/upload/sample_function.zip"
  function_name    = "sample_function"
  role             = "${aws_iam_role.lambda_sample_function.arn}"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "${base64sha256(file("lambda/sample_function/upload.zip"))}"
  runtime          = "python3.6"

  memory_size = 128
  timeout     = 30
}
```



手動、もしくはなんらかのツールでzipを作成してもいいのですが`Archive Provider`を使用すればTerraformがZIPファイルを作成してくれるようになります。
https://www.terraform.io/docs/providers/archive/d/archive_file.html

```
data "archive_file" "sample_function" {
  type        = "zip"
  source_dir  = "lambda/sample_function"
  output_path = "lambda/upload/sample_function.zip"
}

resource "aws_lambda_function" "sample_function" {
  filename         = "${data.archive_file.sample_function.output_path}"
  function_name    = "sample_function"
  role             = "${aws_iam_role.lambda_sample_function.arn}"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "${data.archive_file.sample_function.output_base64sha256}"
  runtime          = "python3.6"

  memory_size = 128
  timeout     = 30
}
```

Lambdaのコードを変更して`terraform plan`を実行するとzipが作成され差分が出るので`apply`でそのままデプロイできます。

```
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ aws_lambda_function.sample_function
      last_modified:    "2018-04-13T06:00:00.000+0000" => <computed>
      source_code_hash: "C2gsFZgweCbQ88wjZk9+TmH+Beo+/FDPTrkRIn8mEfg=" => "PCJ/UxjA1evwRUUwxD9OI5mXWXWEmfSShCKC8LcaDD/Ak="


Plan: 0 to add, 1 to change, 0 to destroy.
```
CentOS6 Jenkins + Apache(SSL)環境の構築

#環境
CentOS 6.9
Jenkins 2.116
apache 2.2.15
mod_ssl 2.2.15

#概要
JenkinsをSSL化する方法は、2種類あるみたい。
１，Jenkins自体に証明書を設定してSSL化する。
→この方法は、Jenkinsがrootで動作していない場合は1023以下のPort番号が利用できない。(Port 8443などを利用する事が一般的みたい。)

２，Jenkinsの前に、Webサーバ（ApacheやNginx）を構築して、
Webサーバ → Jenkinsという経由でアクセスさせる。

今回の場合は、２の方法の説明です。
最近はNginxが人気みたいですが、特にこだわりがないのでApacheで構築します。

※Jenkinsは、インストール済み前提の説明です。

#参考URL
https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+Apache

#構築作業
## apache mod_sshインストール

```
yum -y install httpd mod_ssl
```

## apache設定その1

```
vi /etc/httpd/conf/httpd.conf

# NameVirtualHost *:80
↓
NameVirtualHost *:80
NameVirtualHost *:443
```

## apache設定その2

```
vi /etc/httpd/conf.d/jenkins.conf (←新規作成)

<VirtualHost *:80>
  ServerName my.domain   # ←ここに自分のドメイン
  Redirect permanent / https://my.domain/ # ←ここに自分のドメイン
</VirtualHost>

<VirtualHost *:443>
  ServerName my.domain    # ←ここに自分のドメイン

  SSLEngine On
  SSLCertificateFile    /etc/pki/tls/certs/localhost.crt # ←その内、Let's Encryptにしたい。。
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.key # ←その内、Let's Encryptにしたい。。

  ProxyRequests     Off
  ProxyPreserveHost On
  AllowEncodedSlashes NoDecode
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
  ProxyPassReverse  /  http://my.domain/  # ←ここに自分のドメイン
  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
```

## apacheの再起動

```
service httpd restart
```

#その他
そのうち、証明書を自己署名から「Let's Encrypt」にしたい。。
zsh 5.5で追加された配列・連想配列の新しいシンタックス

2018/04/09 に[zsh 5.5](https://github.com/zsh-users/zsh/releases/tag/zsh-5.5)がリリースされました。

リリース後しばらくして[Release Notes](http://zsh.sourceforge.net/releases.html)に変更内容が掲載されたので確認してみたら、配列・連想配列で新たなシンタックスが使えるようになっていて、それが結構実用的だったので紹介してみようと思います。

## 配列

### 基本操作

以下の記事で配列の操作は分かりやすく解説されているのですが、一旦基本をおさらい。
参考: [zsh の配列操作の基本から応用まで](https://qiita.com/mollifier/items/f897b3fddd2d10369333)

```
> local -a array=(first second third)
> echo $array
first second third

> echo $array[2]
second

> array[4]=fourth
> echo $array
first second third fourth

> array+=fifth
> echo $array
first second third fourth fifth

> echo $array[5]
fifth
```

`zsh 5.5`で新しく追加されたシンタックスは以下。
分かりやすくするために前バージョンの`5.4.2`の動きも掲載します。

- `zsh 5.5`

```
> local -a array=([3]=third [2]=second [1]=first)
> echo $array
first second third
> echo $array[3]
third
```

- `zsh 5.4.2`(比較用)

```
> local -a array=([3]=third [2]=second [1]=first)
> echo $array
[3]=third [2]=second [1]=first
```

## 連想配列

### 基本操作

こちらも一旦基本をおさらい。
参考: [zshの連想配列の使い方まとめ](https://qiita.com/mollifier/items/ba956b7c07acdabd74a7)

```
> local -A associative_array=(key_1 val_1 key_2 val_2 key_3 val_3)
> echo $associative_array
val_1 val_2 val_3

> echo $associative_array[key_3]
val_3

> associative_array[key_2]=new_val_2
> echo $associative_array[key_2]
new_val_2

> echo ${(k)associative_array}
key_1 key_2 key_3

> echo ${(kv)associative_array}
key_1 val_1 key_2 new_val_2 key_3 val_3
```

`zsh 5.5`で新しく追加されたシンタックスは以下。

- `zsh 5.5`

```
> local -A associative_array=([key_1]=val_1 [key_2]=val_2 [key_3]=val_3)
> echo $associative_array
val_1 val_2 val_3

> echo $associative_array[key_3]
val_3
```

- `zsh 5.4.2`(比較用)

```
> local -A associative_array=([key_1]=val_1 [key_2]=val_2 [key_3]=val_3)
zsh: bad set of key/value pairs for associative array
```

## まとめ

特に連想配列については前バージョンまでのシンタックスは少し分かりづらかったですが、`zsh 5.5`からは直感的に理解できるようになっていて良いです。

今後もこういう便利な機能が追加されていく事に期待。
iOS11からweakの扱いが変わった？

以下のコードには問題があります。
しかし、iOS11では正常に動作し、 iOS10,9 ではクラッシュします。

通常であればクラッシュするのが正しいですが、
iOS11から動作が変わったよ〜など理由を知っている方がいましたら、コメントいただけると嬉しいです。
（Apple公式のソースなど）

# 問題のあるコード

```swift
import UIKit
import WebKit

class ViewController: UIViewController {

    weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupWebView()
    }

    private func setupWebView() {
        webView = WKWebView(frame: .zero) // UIView
        webView.uiDelegate = self
        webView.navigationDelegate = self
        view.addSubview(webView)
        webView.load(URLRequest(url: URL(string: "https://google.com")!))
    }
}

extension ViewController: WKUIDelegate, WKNavigationDelegate { }

```

<img width="907" alt="スクリーンショット 2018-04-13 15.04.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/1901/e087e8c8-f1d2-7df2-87f8-794fd43f4201.png">


# 問題を修正したコード

```swift
    private func setupWebView() {
        let webView = WKWebView(frame: .zero)
        webView.uiDelegate = self
        webView.navigationDelegate = self
        view.addSubview(webView)
        webView.load(URLRequest(url: URL(string: "https://google.com")!))
        self.webView = webView
    }
```
# なぜiOS11は問題の有るコードで動作するのか

求む :pray:

#### 環境

Xcode 9.2


[Original](https://tamazawa.net/2018/04/13/ios11からweakの扱いが変わった？/)
ROC曲線とAUCの出力

# PythonでROC曲線を描画してみた
## 前提
1. Python
1. ロジスティック回帰で予測値出力済み
1. scikit-learnとmatplotlibを使う

## コード

```python:roc.py
from sklearn import metrics
import matplotlib.pyplot as plt
import numpy as np

# FPR, TPR(, しきい値) を算出
fpr, tpr, thresholds = metrics.roc_curve(test_y, predict_y)

# ついでにAUCも
auc = metrics.auc(fpr, tpr)

# ROC曲線をプロット
plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc)
plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
```

![roc_curve.png](https://qiita-image-store.s3.amazonaws.com/0/204051/6f6245af-1437-0f9c-ccbf-1febbc0767be.png)

## 参考
ROC曲線とAUCについてはこちらを参考に。

[【統計学】ROC曲線とは何か、アニメーションで理解する。](https://qiita.com/kenmatsu4/items/550b38f4fa31e9af6f4f)
[【ROC曲線とAUC】機械学習の評価指標についての基礎講座](http://www.randpy.tokyo/entry/roc_auc)
Rubyで「じゃんけんゲーム」を試作

# はじめに
自分とプログラム側で行う「じゃんけんゲーム」を作成。記述したコードや気づいた点などをまとめました。

# じゃんけんゲームの仕様

1. 標準入力で引数を指定し自分の「手」を決定
1. 相手（プログラム側）の手はrand()関数の乱数で決定
1. 勝負を判定し結果を表示
1. こちらの勝ち、若しくは、負けの場合は結果を表示して終了。引き分けの場合は勝負を続行


# クラスの設定と勝負の判定

###　自分の手とプログラムの手を決定



```ruby


class Game
  def janken
    puts "最初はグー、じゃんけん……"
    puts "[0]:グー\n[1]:チョキ\n[2]:パー"
    player_hand = gets.to_i

    program_hand = rand(3)
    jankens = ["グー", "チョキ", "パー"]

    puts "あなたの手:#{jankens[player_hand]}, プログラムの手:#{jankens[program_hand]}"
                （　中略　）

```

rand(3)で「０から２」のいずれかの乱数をprogram_handに代入して相手の手をランダムに決め、自分の選択した手と相手の手を標準出力に表示させます。


###　勝負の結果表示

if文を使って、「あいこの場合」→「自分が勝った場合」→「それ以外の場合（自分が負けた場合）」の流れで記述していきます。


#### あいこの場合
まずは、あいこの場合

```ruby

    if player_hand == program_hand
          next_game = true
 
      puts "あいこで"
      
      # じゃんけんを繰り返す
     while next_game do
       next_game = janken
     end
            （　中略　）

```

player_handとprogram_handにはそれぞれ自分の手と相手の手のデータ（０から２の整数）が入っています。

「あいこ」なのでif分の条件式は上記のように設定します。

また、「next_game」で勝負を継続するか判定します。先にtrueで初期化。




#### 自分が勝った場合

```ruby

    elsif (program_hand - player_hand == 1 || program_hand - player_hand == -2 )
      puts "あなたの勝ちです"
      janken = false # 返り値を返す

            （　中略　）

```
program_handとplayer_handには、それぞれ「0」「1」「2」のいずれかの整数が入っているはずです。


最初にグー、チョキ、パーを以下のように決めています。

```ruby

jankens = ["グー", "チョキ", "パー"]

```

ですから、**グー、チョキ、パーに対応する番号同士で引き算した結果**で勝ち負けを**判定**することができます。



たとえば、自分が勝つ場合の組み合わせは、・・・

- （自分がグー：０、相手がチョキ：１）　…　１－０＝「１」
- （自分がチョキ：１、相手がパー：２）　…　２－１ ＝ 「１」
- （自分がパー：２、相手がグー：０）　　…　０－２　＝　「－２」

と、このように自分が勝つ場合の引き算の結果は「１、または　-２」なります。


ですので、自分が勝つ場合の条件式は以下のようにしました。

```ruby

program_hand - player_hand == 1 || program_hand - player_hand == -2

```


#### 自分が負けた場合

自分が負ける場合は上記以外の条件になりますので、elseで結果を表示します。


```ruby


    else
      puts "あなたの負けです"
      janken = false # 返り値を返す
    end
  end
end　　　　　　　　　
 
```

自分が負けた場合も勝った場合もそこでプログラムを終了するので、「janken」に 「false」を設定してプログラムを抜けます。

# プログラム全文

じゃんけんプログラムの全体像です。

```ruby


class Game
  def janken
    puts "最初はグー、じゃんけん……"
    puts "[0]:グー\n[1]:チョキ\n[2]:パー"
    player_hand = gets.to_i

    program_hand = rand(3)
    jankens = ["グー", "チョキ", "パー"]

    puts "あなたの手:#{jankens[player_hand]}, プログラムの手:#{jankens[program_hand]}"


    if player_hand == program_hand
          next_game = true
 
      puts "あいこで"
      
      # じゃんけんを繰り返す
     while next_game do
       next_game = janken
     end

    elsif (program_hand - player_hand == 1 || program_hand - player_hand == -2 )
      puts "あなたの勝ちです"
      janken = false # 返り値を返す
    else
      puts "あなたの負けです"
      janken = false # 返り値を返す
    end
  end
end

Game.new.janken

```
PaizaのスキルチェックをRubyで一位げと

paizaスキルチェックはrubyで溶ける.

#イキリ注意

総合1位,学生3位,言語別1位

[ITエンジニアを目指す学生の就活サイトpaiza新卒]
(https://paiza.jp/student/challenges/64/page/result)

<img width="1280" alt="スクリーンショット 2018-04-13 16.31.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/59604/30c32331-36e4-25bc-ae99-6950cd7a49c7.png">

<img width="1280" alt="スクリーンショット 2018-04-13 16.31.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/59604/16ceac1c-f9ff-a1f3-44dc-f96cc21a8f98.png">

<img width="1280" alt="スクリーンショット 2018-04-13 16.32.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/59604/65923421-bdbc-7e18-e03f-8c2ed88b3e36.png">

\#要望 としては賞状を画像つきツイートしてほしぃにゃあ,,,

ちな,問題は以下.
> D012:絶対値を求めよ
-100から100までの整数 n が与えられるので、絶対値を出力して下さい。

例えば
-10
と入力された場合

10
と出力して下さい。

\#不安点 問題文アップはしてもいいのかしら…
jQueryでgetパラメータを受け取ってselectボックスを選択させる


次のようなURLでgetパラメータを受け取ってフォームのselectの選択肢を切り替えたい場合。 
/contact?id=01

## selectボックスのhtml

```html

<select name="" id="list">
	<option value="選択1">選択1</option>
	<option value="選択2">選択2</option>
	<option value="選択3">選択3</option>
</select>
```

## jQuery

```javascript

$(function(){

	var arg  = new Object;
	url = location.search.substring(1).split('&');
	for(i=0; url[i]; i++) {
		var k = url[i].split('=');
		arg[k[0]] = k[1];
	}
	var id = arg.id;

	var list = {
		'01':'選択1',
		'02':'選択2',
		'03':'選択3'
	}

	var list_id = list[id];

	$("#list").val(list_id);

});
```
R備忘録 #dplyr

# データフレームからランダムにデータを取り出したい．
`dplyr::sample_n()`, `dplyr::sample_frac`
*cucumber flesh: データフレームからランダムにデータを抽出したい*
http://uribo.hatenablog.com/entry/2015/10/12/164129

# データフレームからサンプルを削除したい．
`dplyr::filter()`
`na.omit()`を使うのではなくて，
`dplyr::filter(data, data$factor != "NA")`を使う！
理由？　あとあと面倒だから！！！

Example
dataというデータセットからfactorという変数が"a"であるものを取り出してdata_fと名付ける．
`data_f<- dplyr::filter(data, data$factor == "a")`


# データをいじる全般

http://delta0726.web.fc2.com/packages/data/00_dplyr.html#6_データ結合編
【Windows】docker-composeを使ってmy.cnfの共有は気を付けよう！（🍣＝🍺問題など）

## 概要
[Docker-composeでSinatra + Nginx + MySQL を動かす時のハマりポイント - Qiita](https://qiita.com/koyo-miyamura/items/54bbde546db07ef64bf3)のプログラムをdocker-composeで動かしていた時に🍣＝🍺問題やハハ＝パパ問題に遭遇しました。
その際、対処のためにmysqlの文字コードの設定を変えたかったのですが、結構ハマったのでメモです。

## 🍣＝🍺問題？ハハ＝パパ問題？
以下が参考になります。
[MySQL と寿司ビール問題 - かみぽわーる](http://blog.kamipo.net/entry/2015/03/23/093052)
[MySQL で utf8 と utf8mb4 の混在で起きること - @tmtms のメモ](https://tmtms.hatenablog.com/entry/2016/09/06/mysql-utf8)

解決策としては文字コードは基本的にutf8mb4を使って、mysqlの設定でcollation-server=utf8mb4_binとすればよさそう。

## docker-composeでmysqlの設定を変えるときの注意点
docker-composeにはサービスごとにcommandでコンテナ内でコマンドを実行できます。
しかし原則1コマンドしか実行できないので、複雑な設定を適用したい場合は困ります。

```yaml:設定を少しいじる場合
version: "3"

services:
・・・
・・・

   db:
     image: mysql:latest
     environment:
       MYSQL_ALLOW_EMPTY_PASSWORD: "true"
       MYSQL_DATABASE: "latestgram"
       MYSQL_USER: "root"
     volumes:
       - ./sql:/docker-entrypoint-initdb.d
     command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
     ports:
       - "3306:3306"

```

よって、以下のmy.cnfに設定ファイルを書いてしまってマウントする方法が考えられます。


```conf:sql/my.cnf
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
[client]
default-character-set=utf8mb4
```

```yaml:上手くいかない例
  db:
    image: mysql:latest
    volumes:
      - ./conf/my.cnf:/etc/mysql/my.cnf

```

しかしこれでは**Windows上でVirtualBox経由でdockerを起動させている場合に上手くいきません**（Windows勢に優しくない世界・・・)

[Windows + docker-compose + mysql で文字化けさせない方法 - Qiita](https://qiita.com/waterada/items/1dbf6a977611e0e8f5c8)
上記を参考にすると

* mysql は File の Permission が 777 の .cnf を読まない。
* Windows からVirtualBox経由でマウントしているディレクトリ/ファイルはすべて 777 になる。
* /etc/mysql/conf.d で volume 指定したファイルも 777 になる。

という理由のようです。

[Docker mysql 設定変更 - LOCAL-C BLOG](https://blog.local-c.com/archives/1984)
ということで上記を参考に、Dockerfileでマウントしてchmodでパーミッションを644にするという方法で対処します。

```dockerfile:sql/Dockerfile
FROM mysql:latest

ADD ./my.cnf /etc/mysql/my.cnf

RUN chmod 644 /etc/mysql/my.cnf

```

これで以下のようにdocker-composeを書き換えれば適用されます

```yaml:docker-compose.yml
version: "3"

services:
・・・
・・・
  db:
    build: ./sql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_DATABASE: "latestgram"
      MYSQL_USER: "root"
      TZ: "Asia/Tokyo"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

```
Qiita Markdownのページ内リンクの罠

Qiitaで記事書いてる人たち、ページ内リンクで困ったことないですか？

僕はこんな寄り道みたいなところでとても困りました。

書き方にいくつかルールがあるみたいなんですけど、あんまり情報が見つからなかったのでまとめておきます。

公式のマニュアルとかあったらごめんなさい……

他にも見つけ次第追記していこうと思います。

- ~~[スラッシュ類の/と\は省略](#スラッシュ類のとは省略)を追記しました。~~[半角記号はアンダーバー_とハイフン-以外省略](#半角記号はアンダーバー_とハイフン-以外省略)にまとめられました
- 半角と全角に分け、大幅に加筆、修正しました
- 半角記号の省略をまとめました
- 全角記号の省略をまとめました

# ページ内リンクの書き方

知っているとは思いますけど一応。

```md
# hoge

## fuga

[hoge](#hoge)

[fuga](#fuga)
```

見出しの深さに関係なく`#`は必ず1つです。

これも躓いた……

# 半角

## 英字の大文字ABCは小文字abcで

[英字の大文字ABCは小文字abcで](#英字の大文字abcは小文字abcで)

```md
## 英字の大文字ABCは小文字abcで

[英字の大文字ABCは小文字abcで](#英字の大文字abcは小文字abcで)
```

## 空白 はハイフン-で

[空白 はハイフン-で](#空白-はハイフン-で)

```md
## 空白 はハイフン-で

[空白 はハイフン-で](#空白-はハイフン-で)
```

## 半角記号はアンダーバー_とハイフン-以外省略

### 半角記号!@#$%^&*()+|~=\`[]{};':",./<>?は省略

[半角記号!@#$%^&*()+|~=\`[]{};':",./<>?は省略](#半角記号は省略)

```md
### 半角記号!@#$%^&*()+|~=\`[]{};':",./<>?は省略

[半角記号!@#$%^&*()+|~=\`[]{};':",./<>?は省略](#半角記号は省略)
```

# 全角

## 英字の大文字ＡＢＣは小文字ａｂｃで

[英字の大文字ＡＢＣは小文字ａｂｃで](#英字の大文字ａｂｃは小文字ａｂｃで)

```md
## 英字の大文字ＡＢＣは小文字ａｂｃで

[英字の大文字ＡＢＣは小文字ａｂｃで](#英字の大文字ａｂｃは小文字ａｂｃで)
```

## 空白　は省略

[空白　は省略](#空白は省略)

```md
## 空白　は省略

[空白　は省略](#空白は省略)
```

半角とはルールが異なるので注意です。

## 全角記号はアンダーバーとハイフン以外省略

正確にはキーボードにあるものだけです。

### 全角記号！＠＃＄％＾＆＊（）＋｜〜＝￥｀「」｛｝；’：”、。・＜＞？は省略

[全角記号！＠＃＄％＾＆＊（）＋｜〜＝￥｀「」｛｝；’：”、。・＜＞？は省略](#全角記号は省略)

```md
### 全角記号！＠＃＄％＾＆＊（）＋｜〜＝￥｀「」｛｝；’：”、。・＜＞？は省略

[全角記号！＠＃＄％＾＆＊（）＋｜〜＝￥｀「」｛｝；’：”、。・＜＞？は省略](#全角記号は省略)
```

## 全角括弧類の【】と『』と《》と〔〕と［］と‹›と«»と〘〙と〚〛は省略

[全角括弧類の【】と『』と《》と〔〕と［］と‹›と«»と〘〙と〚〛は省略](#全角括弧類のととととととととは省略)

```md
## 全角括弧類の【】と『』と《》と〔〕と［］と‹›と«»と〘〙と〚〛は省略

[全角括弧類の【】と『』と《》と〔〕と［］と‹›と«»と〘〙と〚〛は省略](#全角括弧類のととととととととは省略)
```

一応キーボードにない記号も一部試してみました。

さすがにすべての記号は試せませんけど、アンダーバーとハイフン以外は使えそうにない雰囲気です。

全角記号はとりあえず省略してみれば大丈夫そうですね。

# 注意

~~上記の省略によってページ内リンクが被ることがあります。~~

```md
## /と\は省略

[/と\は省略](#とは省略)

## !と?は省略

[!と?は省略](#とは省略)
```

~~滅多なことでは起こらないと思いますけどね。~~

~~一応心の片隅にでも留めておくといいかもしれません。~~

コメントで教えていただいたので、下の[同じヘッダー](#同じヘッダー)にまとめました。

## 同じヘッダー

コメントでご指摘いただいたように、ヘッダーのハッシュが重複した場合、2つ目以降は末尾に`-n`と1からの連番が付くようです。
`-0`は存在しないようです。

[同じヘッダー-0](#同じヘッダー-0)

[同じヘッダー](#同じヘッダー)

[同じヘッダー-1](#同じヘッダー-1)

[同じヘッダー-2](#同じヘッダー-2)

```md
## 同じヘッダー

[同じヘッダー-0](#同じヘッダー-0)

[同じヘッダー](#同じヘッダー)

[同じヘッダー-1](#同じヘッダー-1)

[同じヘッダー-2](#同じヘッダー-2)
```

## 同じヘッダー

```md
## 同じヘッダー

[同じヘッダー-1](#同じヘッダー-1)
```

## 同じヘッダー

```md
## 同じヘッダー

[同じヘッダー-2](#同じヘッダー-2)
```
ドット絵やQRコードをボケさせたくないときに使えるCSS

HTML上でドット絵（pixel art）を拡大縮小すると残念なピクセルのボケが発生することがあります。
CSSの`image-rendering`プロパティを利用すればこのピクセルボケ問題を解消できます。

まずはCodePenで実際に試してみたものをご覧ください。
小さな画像を大きく拡大しています。
<p data-height="1165" data-theme-id="0" data-slug-hash="qoGrdM" data-default-tab="html,result" data-user="h_kudo" data-embed-version="2" data-pen-title="qoGrdM" class="codepen">See the Pen <a href="https://codepen.io/h_kudo/pen/qoGrdM/">qoGrdM</a> by Hibiki Kudo (<a href="https://codepen.io/h_kudo">@h_kudo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

`image-rendering`は画像を拡大または縮小したときにどのようなアルゴリズムで描画されるかを指定できるプロパティで、指定できる値は以下の３種類です。
<blockquote><dl> <dt><code><strong>auto</strong></code></dt> 
  <dd>デフォルト値です。画像を高品質で表示するアルゴリズムにより拡大/縮小されます。具体的には、バイリニア補完などの「滑らかな」色が許容されるアルゴリズムで拡大/縮小されます。これは、写真を想定しています。バージョン 1.9 (Firefox 3.0) から、Gecko は高品質な <em>バイリニア (bilinear)</em> リサンプリングを使用します。</dd> 
<dt><code><strong>crisp-edges</strong></code></dt> 
  <dd>画像は、画像内のコントラストとエッジを保つアルゴリズムにより拡大/縮小されます。これは、画像の処理過程で滑らかな色やぼかし効果が現れません。これは、ピクセルアートなどの画像を想定しています。</dd> 
  <dt><code><strong>pixelated</strong></code></dt> 
 <dd>画像を拡大する時は、「最近傍 (nearest neighbor)」または類似のアルゴリズムが使用され、画像が大きなピクセルで構成されたように表示されます。縮小する時は、'<code>auto</code>' と同じになります。</dd></dl><cite><a href="https://developer.mozilla.org/ja/docs/Web/CSS/image-rendering">image-rendering - CSS: カスケーディングスタイルシート | MDN</a></cite></blockquote>
Chrome（v65）とFireFox（Quantum）では`crisp-edges`は効きませんでした。そんなわけでしばらくは

```css
image-rendering: pixelated;
```
を指定するのが実用的ですかね。
使い所は限定的ですがアイコン画像やQRコードの埋め込みをする際など大いに活躍してくれそうなCSSプロパティですね。
werdump（動作が停止しました）、STOP文が書いてあると出る

リリースビルドのアプリケーションがSTOP文に到達したときに
デバッガからのアタッチがない場合にwerdumpが発生する。

発生元
DEBUGSTOP

概要
動作が停止しました

日付
‎2018/‎04/‎13 15:55

状態
追加のデータが必要です

説明
障害が発生しているアプリケーションのパス:	W:\DEBUGSTOP\DEBUGSTOP\bin\Release\DEBUGSTOP.exe

問題の署名
問題イベント名:	CLR20r3
問題の署名 01:	DEBUGSTOP.exe
問題の署名 02:	1.0.0.0
問題の署名 03:	5a中略5e
問題の署名 04:	DEBUGSTOP
問題の署名 05:	1.0.0.0
問題の署名 06:	5a中略5e
問題の署名 07:	20
問題の署名 08:	12
問題の署名 09:	Debugger.Break
OS バージョン:	6.1.7601.2.1.0.256.48
ロケール ID:	1041
追加情報 1:	574e
追加情報 2:	57中略a5
追加情報 3:	5a45
追加情報 4:	5a中略0a

問題の説明に役立つファイル
WERInternalMetadata.xml
AppCompat.txt
minidump.mdmp
memory.hdmp

この問題に関するその他の情報
バケット ID:	12中略92


```vb:Form1.vb
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MsgBox("a")
        Stop
        MsgBox("B")
        End
    End Sub
End Class
'''
Vagrant 事始め 番外編 02 - 共有フォルダの共有に失敗する

新しく作成した Vagrantbox を起動している途中で、共有フォルダが作成できないというエラーが発生しました。

```
> vagrant up
==> default: Attempting graceful shutdown of VM...
==> default: Checking if box 'centos/7' is up to date...
==> default: Clearing any previously set forwarded ports...
Vagrant is currently configured to create VirtualBox synced folders with the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant guest is not trusted, you may want to disable this option. For more information on this option, please refer to the VirtualBox manual:

  https://www.virtualbox.org/manual/ch04.html#sharedfolders

This option can be disabled globally with an environment variable:

  VAGRANT_DISABLE_VBOXSYMLINKCREATE=1

or on a per folder basis within the Vagrantfile:

  config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false

...

==> default: Mounting shared folders...
    default: /vagrant_data => C:/Vagrant/centos7/data
Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available. This filesystem is made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the guest. This is not a bug in Vagrant and is usually caused by a faulty Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant_data /vagrant_data

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```
最終行に表示された `mount: unknown filesystem type 'vboxsf'` でピンときたので、起動に失敗した仮想マシンのプラグインのインストール状態を確認します。

## 共有フォルダ有効化に必要なプラグインを確認する

```
> vagrant plugin list
No plugins installed.
```
vagrant-vbguest (Virtualbox Guest Additions) がインストールされていないです。

## 共有フォルダ有効化に必要なプラグインをインストールする

vagrant-vbguest を手動でインストールします。

```
> vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching: micromachine-2.0.0.gem (100%)
Fetching: vagrant-vbguest-0.15.1.gem (100%)
Installed the plugin 'vagrant-vbguest (0.15.1)'!
```

プラグインの状態を確認しようとしたら、仮想マシンが起動している必要があると警告が出たので、`vagrant up` をします。

```
> vagrant vbguest --status
VM must be running to open SSH connection. Run `vagrant up` to start the virtual machine.

> vagrant up
...
```

プラグインに必要なソフトウェアのインストールがしばらく続きます。完了したら、`vagrant vbguest --status` で確認します。

```
> vagrant vbguest --status
[default] GuestAdditions 5.2.8 running --- OK.
```

これで共有フォルダが利用できるようになりました。
正規表現　役にたったやつ　どんどん貯めていこう

## ()
グループ化
$1に代入
n番目だとn$に代入
## $1
()によって代入したものが取り出せる
n$とすることでn番目のものを取り出せる
## \/
エスケープ
## .+?
なんでもいい文字の連続
## scan

```
"abracatabra".scan(/.a/) do |matched|
  p matched
end
```

```
"ra"
"ca"
"ta"
"ra"
```
マッチした部分を取り出して、何らかの処理を行うときに使う
## gsubとsubの違い
subは正規表現にマッチした最初の部分を置き換える
gsubは正規表現にマッチする全ての部分を置き換える
Golang 開発環境を goenv で整える

# Golang 開発環境を goenv で整える

# 前提

- macOS Sierra(10.12.6)

# インストール

## goenv インストール
```shell
$ brew install goenv
```

## goenv 設定
```shell:.zshrc
+ export PATH="$HOME/.goenv/bin:$PATH"
+ eval "$(goenv init -)"
```

# インストール出来る Golang のバージョンを確認する
```shell
$ goenv install -l
Available versions:
  1.2.2
  1.3.0
  1.3.1
  1.3.2
  1.3.3
  1.4.0
  1.4.1
  1.4.2
  1.4.3
  1.5.0
  1.5.1
  1.5.2
  1.5.3
  1.5.4
  1.6.0
  1.6.1
  1.6.2
  1.6.3
  1.6.4
  1.7.0
  1.7.1
  1.7.3
  1.7.4
  1.7.5
  1.8.0
  1.8.1
  1.8.3
  1.8.4
  1.8.5
  1.8.7
  1.9.0
  1.9.1
  1.9.2
  1.9.3
  1.9.4
  1.9.5
  1.10.0
  1.10beta2
  1.10rc1
  1.10rc2
  1.10.1
```

# Golang をインストールする
```shell
$ goenv install 1.10.1
```

# インストールされている Golang のバージョンを確認する
```shell
$ goenv versions
* system
  1.10.1 (set by /Users/moritake/.goenv/version)
```

# Golang　のバージョンを切り替える
```shell
$ goenv global 1.10.1
```

# Golang のバージョンを確認する
```shell
$ go version
go version go1.10.1 darwin/amd64
```
Elasticsearch から Elasticsearch へドキュメントを転送する

# はじめに

* Logstash を使って Elasticsearch から Elasticsearch へドキュメントを転送する。

# Logstash とは

* Logstash はデータ処理エージェントで、データを収集して加工して送信することができる。
* fluentd とかと同じような役割の製品で Elastic 社製。

# Logstash 設定

```logstash.conf
# ログの読み込み先の設定
input {
  # Elasticsearch から読み込む
  Elasticsearch {
    # 読み込み先のサーバー
    hosts => [ "from.example.com" ]
	# 読み込み先のインデックス
    index => "logstash-*"
	# Elasticsearch の Scroll API のタイムアウト時間
	# Scroll API はデータを抜け漏れなく取得するための API で、初回リクエスト時に結果を全件スナップショットとして保存しておき、次回以降はそのスナップショットから順次ドキュメントを返していく
	# Scroll API への 2 回目以降のリクエストには新たに追加されたドキュメントは反映されないのでリアルタイムの要求ではなく大量のデータを処理する場合などに利用できる
	# デフォルトは "1m" で 1 分過ぎたらスナップショットが破棄され新たな検索として扱われる
    scroll => "10m"
	# メタデータも読み込むかどうかフラグ
    docinfo => true
	# 読み込みクエリ
    query => '{ "query": { "query_string": { "query": "*" } }, "sort": [ "_doc" ] }'
	# 実行スケジュール. crontab 形式で指定する.
	# これを指定しない場合は 1 度読み込みと書き込みを実行しただけですぐに終了する
    schedule => "* * * * *"
  }
}
# ログの書き込み先の設定
output {
  # Elasticsearch へ書き込む
  Elasticsearch {
    # 書き込み先サーバー
    hosts => [ "to.example.com" ]
	# 書き込み先インデックス
	# 読み込んだメタデータを使って指定できる
    index => "%{[@metadata][_index]}"
	# 書き込む際の document_id
	# これも読み込んだメタデータを使って指定できる
    document_id => "%{[@metadata][_id]}"
  }
}
```

# Logstash 実行

* java が入っていれば基本的に logstash ダウンロードして設定ファイル指定して実行するだけ
* RPM とか Docker イメージもあるので詳細は[公式](https://www.elastic.co/guide/en/logstash/6.2/docker.html)を参照

```sh
curl https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.zip -o logstash-6.2.3.zip
unzip logstash-6.2.3.zip
bin/logstash -f logstash.conf
```
SQL歴1ヶ月でわかったことをSQLを今から勉強する人のためにまとめてみた　前編

## SQLは、「100点取るのは難しいけど、70点ならすぐに取れる言語」だと思う。

1ヶ月でいろいろわかることが出てきました。が先輩エンジニアに質問をすると、必ずと言っていいほど、「SQL難しいからなぁ」「わかるかなぁ」と言われます。
もちろん、JOINとかGROUP BYとかは最初概念を理解するのが難しかったけど、無理ではなかった。話を聞くとDBを扱ってくると、いろいろ絡み合ってきてカオスになる、そうです。

ここではカオスになる手前の人（初心者）のために、SQLをわかりやすく理解することを目的に一度インプットを整理してみます。

## 前提条件
・MySQL
・sequel proを使っています。
※くらいしかわからないほどまだ知識がありませんm(_ _)m
※今回はすでに何かしらのDBと接続していることを前提に説明をすすめていきます。

## 用語
・テーブル：各データが格納されているエクセルのシートみたいなもの
・カラム：1つのテーブルの縦のブロックのこと
・レコード：1つのテーブルの横のブロックのこと

## LEVEL1 : 一つのテーブルのデータを全て出力する
※select文とfrom文を知る。

特定のテーブルのデータを全て表示させてみるのが、SQLを勉強する第一歩です。

sequelの上の「クエリ」タブをクリックします。
白いエディタ画面がでてくるので、ココにSQLスクリプトを書いていきます。
まずは以下の文を書いてみてください。

```sql
SELECT
   *
FROM
   table_1 /*ここは各DBのテーブル名を入力してください。*/
```

指定したテーブルを全て出力することがこれでできます。
* がFROMで指定したテーブルの全てを抽出するという処理をしてくれます。

これで、SQLの第一歩が達成しました。


## LEVEL2: 特定のカラムのみを抽出する
※select文

LEVEL1では、 テーブルの全ての情報を抽出しましたが、今回はカラムを指定して、出力してみます。
以下のSQLを、sequel proのクエリに記載してください。

```sql
SELECT
   table_1.col_a as ColumnA
FROM
   table_1 /*ここは各DBのテーブル名を入力してください。*/
```

正しく1行だけ出力されれば、OKです！
今回は、select文（SELECTとFROMの間のこと）の中に 'as' という文言があります。
これは、「table_1のcol_aを出力してください。そして 'ColumnA' と命名してください」という意味になります。

複数のカラムを表示するには、以下のようにカンマ区切りにします。

```sql
SELECT
   table_1.col_a as ColumnA, table_1.col_b as ColumnB 
FROM
   table_1 /*ここは各DBのテーブル名を入力してください。*/
```
 
カンマで複数のカラムを区切りますが、一番最後にはカンマをつけないように気をつけましょう。
（カンマをつけてしまうとsyntax errorと怒られてしまいます。）

## LEVEL3: 複数のテーブルをJOINする

RDB（リレーショナル・データベース）の場合、複数のテーブルにより構成されています。
その複数の関連しているテーブルを一時的に両手つなぎで、連携しているようにしてデータを表示させます。
これは、管理を楽/シンプルにするためです。

ここで複数のテーブルを連携させることを、JOIN（ジョイン）といいます。
下の例を見てみましょう。

```sql
SELECT
   * 
FROM
   table_1 JOIN table_2 ON table_1.id = table_2.association_id
```

この場合、table_1とtable_2をがっちゃんこした形で一時的に新たなテーブル（みたいなイメージ？）が作成されます。

このように、
```
（テーブル名） JOIN　（連携したいテーブル名）ON （連携するカラム同士を=でつなぐ）
```
で、複数の関係のテーブルを正しく連携することができます。
図解でもっとわかりやすく説明してあるサイトがあったのでリンクを貼っておきます。
https://rfs.jp/sb/sql/s03/03_3.html


LEVEL4移行はまた別で掲載します！
本当にわかりません。。



```/home/ec2-user/environment/myblog/app/views/posts/new.html.erb:4: syntax error, unexpected ':' buffer.append=( f.text_field : title,placeholder: "enter tit ^ /home/ec2-user/environment/myblog/app/views/posts/new.html.erb:7: syntax error, unexpected ':' _buffer.append=( f.text_area : body, placeholder: "enter bod ^```

上がエラーの内容です。




```<%= form_for :post, url: posts_path do |f| %>
<p>
<%= f.text_field : title,placeholder: "enter title" %>
</p>
<p>
<%= f.text_area : body, placeholder: "enter body text" %>```

なぜエラーが出るのか。
構文の一体どこがおかしいのか。。。。