OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubの無料プライベートリポジトリにpushしようとしてエラーになったのを解決した

#要点
- GitHubアカウントのメールアドレスと、pushする時に使うメールアドレスは別物。
- GitHub Desktop(Mac版)だけだと設定が直せないことがある。コマンドラインだいじ。
- 解決方法はこれ↓　(ID+usernameの所は各自読みかえが必要です)

```command
$ git config --global user.email ID+username@users.noreply.github.com
$ git commit --amend --reset-author
```

#はじめに
先日（2019/1/7)、GitHubで無料ユーザでもプライベートリポジトリを持てるようになりましたね。
せっかくなので私も、手元にあるちょっとしたRailsプロジェクトをGitHubに上げてみようと思い立って試したところ、なかなかうまく行かない...

なお、環境は macOSX Mojave + VSCode 1.25.1 + Rails 5.2.2 + GitHub Desktop 1.5.1 です。

##実施したこと
- GitHubにログイン
- GitHub Desktop をダウンロード＆インストール
- GitHubのWebサイト側でプライベートリポジトリを1つ作成
- ローカルリポジトリと紐付け

このあたりまで、いくつかのサイトを確認しつつ、特に問題なく進行。

##1つ目の問題
紐付けたリポジトリをGitHub Desktopから「Publish Branch」を実行しようとしたところ、
`Cannot push these commits as they contain an email address marked as private on GitHub`
というエラーが発生し、サーバにpushできません。

よくよく調べてみると、GitHubアカウントのメールアドレスと、pushする時に使うメールアドレスは別物であり、後者ではGitHub側から指定されたアドレスを使う必要があるようです。ここで設定したメールアドレスは公開情報になってしまうので。

そして、push用のアドレスは以下のいずれかとのこと。
- (2017/7/18以降に作成したアカウント) ID+ユーザ名@users.noreply.github.com
- (2017/7/18より前に作成したアカウント) ユーザ名@users.noreply.github.com

私の場合は、アカウント作成は2011年でしたので前者かと思いましたが、実は後者のアドレスになっていました。（ハマったポイントその1）
リポジトリを作成したのが今回が初めてだったからかもしれません。

##2つ目の問題
登録すべきアドレスがわかったので、GitHub Desktopの「Preferences...」から「Git」タブの「Email」欄を修正します。
これで良しと思いながら「Publish Branch」を押すと、、、また同じエラー。
うまく反映できていないようです。（ハマったポイントその2）

次のように、コマンドでpushしようとしてもダメ。

```command
$ git push -u origin master
```

ここで、小一時間ハマり続け、、、
諦めかけたところで、改めて上のコマンドの結果をよく見たら 
`[remote rejected] master -> master (push declined due to email privacy restrictions)` 
という文言が。

それを手がかりにし、ようやくたどり着いた解決策がこれでした。（再掲）

```command
$ git config --global user.email ID+username@users.noreply.github.com
$ git commit --amend --reset-author
```

Authorの所に、通常のメールアドレスが入ってしまっていたのを、 --reset-author で修正したということですね。
--amend は既存のcommitに対して、新たなcommitを作らずに修正を入れるオプションのようです。

そして「Publish Branch...」を実施すると、、、無事にサーバ側へpushされてくれました！

めでたしめでたし。


#参考リンク
ありがとうございました！

http://ryoichi0102.hatenablog.com/entry/2017/10/12/000713
http://takafumi-kimura.hatenablog.com/entry/2018/01/03/000000

#最後に
別にGitHub Desktopなんて入れなくてもよかったのかも？
みなさま使っておられますか？
【JavaScript】【for文駆逐作戦】mapメソッドの使い方

## この記事の内容
- JavaScriptのES6で正式採用された「map」の使い方について
- for文は駆逐していく方針らしいです

## なぜ駆逐するのか
- 読みづらいし、ナウくないから。
- 配列の取り出し方を制する者は、ES6を制すから

## さっそく書き方

### いつもの「for文」

```javascript

var cars = [
   { type: '軽自動車', price: '安い'},
   { type: '高級車', price: '高い'}
];

  for (var i = 0;  i < cars.length;  i++ ) {
    var prices = cars[i].price;
    console.log(prices);
    // 安い、高い
  }
```

### 最新の「map文」
```javascript
var cars = [
   { type: '軽自動車', price: '安い'},
   { type: '高級車', price: '高い'}
];

var prices = cars.map(function(car){
  return car.price;
});
//結果：["安い", "高い"]
```
### 補足
- 配列内のオブジェクトの好きなプロパティを取り出して、新しい配列を作成することができる

## まとめ
- だんだんfor文を使わなくても値を取り出せるようになってきた。
- for文で取り出さないで、いろんなメソッドを使って取り出すからこそ真のJavaScript使いになれるんだと思う

function pluck(array, property) {
  // 与えられた`array`に対してmapをかけて
  return array.map(function(element) {
    // 対象のオブジェクト(element)の対象のpropertyを抜き取る
    return element[property];
  });
}
Slay the Spire Mod開発入門(1) 導入編

# はじめに

本記事は Steam版 Slay the SpireのMod開発に関して調べたことをまとめたものです。
導入編では既存のModをsteam標準のWorkshopを経由せず、Mod管理ツールであるMod the Spireから直接起動する方法を解説します。
(自身で開発したModを取り込む方法は次回以降の記事で解説します)

# インストール

Mod開発に必要な以下のものをインストールします。

* Steam
* Slay the Spire本体
* Mod the Spire
* Base Mod


SteamとSlay the Spire本体のインストール方法については割愛します。
Mod the SpireおよびBase ModはSteamのWorkshopからサブスクライブしてください。

# Modのダウンロード

以下のそれぞれのURLからStSLib.jarおよびAspiration.jarをダウンロードしてください。
StSLib.jarはMod開発用のライブラリ、Aspiration.jarはいくつかのレリックを追加するModです。

https://github.com/kiooeht/StSLib/releases
https://github.com/erasels/Aspiration-StS/releases


# Slay the Spireの起動

以下の手順を実行します

* SteamからSlay the Spireを起動
* プロンプトが表示されるので「With Modsをプレイ」を選択してMod the Spireを起動
* ディレクトリアイコンをクリックすることでModの管理ディレクトリが表示されるので、そこに先ほどダウンロードした2つのjarファイルを配置する
* 一度Mod the Spireを終了させ、再度起動する

以下のようにAspirationおよびStSLibが一覧に追加されていれば成功です。

![qiita_sts1.PNG](https://qiita-image-store.s3.amazonaws.com/0/115351/f4f1fefa-b869-3a7b-c29f-2bb2b8bdba25.png)

なおSteamのWorkShop経由で導入したものはSteamアイコンが、ローカルドライブから直接読み込んだものはリサイクルアイコンで表示されているので、自身でWorkshop経由で導入したものとの混同には注意してください。

それぞれのModにチェックを入れた状態でPlayをクリックするとSlay the Spireが起動します。
Mod導入が成功していれば画面右下にMod名が表示されます。
またコレクションのレリック一覧に未知のレリックが追加されていることも確認できるでしょう。
【Swift4.0】シミュレーター起動して、アプリ開いてみたら白紙だった件

###陥ったエラー
シミュレーター起動して、アプリを開いて見ると、白紙。。


![スクリーンショット 2019-01-15 0.30.44.png](https://qiita-image-store.s3.amazonaws.com/0/325154/ebd21347-b637-d6a3-0339-f9ca362f9053.png)



###問題を見つける

xcodeを開くと、
![スクリーンショット 2019-01-15 0.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/325154/2bcaa333-bb7b-238d-a08a-fd5a1198d595.png)

なんかエラーっぽいものが、、、
横2本線が入った赤い箱をクリックすると、Thread 1: signal SIGABRTと表示された。

要は、やりとりが中断されてます！ということ。



ストーリーボードに戻り、
![スクリーンショット 2019-01-15 0.40.02.png](https://qiita-image-store.s3.amazonaws.com/0/325154/8bb0f74f-37ed-8b8a-3c9c-053268a5bc34.png)



左の黄色いアイコンを、コントロールキーを押しながら、クリック！
![スクリーンショット 2019-01-15 0.42.27.png](https://qiita-image-store.s3.amazonaws.com/0/325154/f27e51c0-542c-e523-867c-1e0345a8c858.png)

するとこんな画面が出てきて、黄色い三角の箇所がエラー（やりとりが中断されてる）らしい。
![スクリーンショット 2019-01-15 0.44.46.png](https://qiita-image-store.s3.amazonaws.com/0/325154/ca9c4de2-f12f-3c06-7bd6-ce4f6cbd966c.png)


###トラブルシューティング
バツ印を押すだけ！！
今回でいうと、Resultの左側にあるバツを押してからシミュレーターを起動すると無事アプリが立ち上がります！
【ibatis3】DBからデータ取得時に日付項目を時分秒切り捨て形式で取得する方法

◆時分秒切り捨て

	<resultMap id="javaTypePlus" class="java.util.HashMap"							
		groupBy="SEIRINO,BUYER＿NO">						
		<result column="TIME" property="TIME" jdbcType="DATE" javaType="java.sql.Date" />						
	</resultMap>
ElasticsearchとElasticSearchから始まる表記ゆれの気持ち悪さについて

先日、`CakePHP`のドキュメントをたまたま見ていたら気づきました

https://book.cakephp.org/3.0/en/elasticsearch.html

<img width="826" alt="スクリーンショット 2019-01-15 0.18.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/2b0e0008-6808-0f76-c209-62f74225f239.png">


**Elaticsearch** のことが**ElasticSearch** と書かれている！

ここで改めて、表記ゆれの気持ち悪さという事を感じました

__採用面接で受け取る履歴書にある代表的な表記ゆれ__

|正しい表記|表記ゆれ|
|----|----|
|Elaticsearch|ElaticSearch|
|MySQL|MYSQL, Mysql|
|GitHub|github,Github|
|PHP|php,Php|
|JavaScript|javascript, javaScript|
|Kotlin|kotlin|
|PostgreSQL|postgreQL, PostgresSQL|

ここで派閥は大きく２つに分かれそうだと思います

* 大文字小文字の違いだったらいんじゃね？
* 表記ゆれ、絶対に許さない

ちなみに、僕はどちらかというと後者ですが、自分の過去記事がミスってないか不安に駆られています
参考文献無しで書きなぐる傾向があるのでビクビクしてます

というのも、名前って非常に重要だと思ってます
gessy0129で げっしーと呼んで頂いてることが多いのですが、
大文字小文字の違いだったらよくね？だと、げつしーでも良いことになるので、厳密にしたいと思ってます

ただ、一貫してげつしーと呼んでくれるならそれはそれでいいと思うので、
プロジェクト内で一貫してれば良いような気もしてます
MySQLとMysqlが混在してたら発狂すると思う

皆様、表記ゆれには気をつけて下さい
Sourcetreeの403エラーを解決した

##前提
・Sourcetree & github連携
・Sourcetree　version 3.0.1

##やったこと
Sourcetree初コミットで403エラーが出たが、
リモートリポジトリのURLを変更することで解決した

before：　https://lulu34@github.com/lulu34/HelloGit.git
※初期設定でURLの一部にユーザ名（lulu34@）が含まれていたため、削除
after： https://github.com/lulu34/HelloGit.git

↓のURL/パス欄の内容変更を行った
<img width="915" alt="スクリーンショット 2019-01-15 0.31.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/60209/0fef550e-794c-5d7b-ad79-59b1c36166ff.png">

##参考
以下URLの順で設定していたらつまづいた・・・（すぐ解決してよかった）
https://qiita.com/naoki85/items/c7660d70347e9e70b201
[.NET] 日付計算いろいろ

```c#:以下の例で使用する変数
DateTime date = DateTime.Today;
```

### ▼前月初日
```c#
new DateTime(date.Year, date.Month, 1).AddMonths(-1)
```

### ▼前月同日
```c#
date.AddMonths(-1)
```

### ▼前月末日
```c#
new DateTime(date.Year, date.Month, 1).AddDays(-1)
```

### ▼前々月末日
```c#
new DateTime(date.Year, date.Month, 1).AddMonths(-1).AddDays(-1)
```

### ▼当月初日
```c#
new DateTime(date.Year, date.Month, 1)
```

### ▼当月末日
```c#
new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month))
```

### ▼翌月初日
```c#
new DateTime(date.Year, date.Month, 1).AddMonths(1)
```

### ▼翌月末日
```c#
new DateTime(date.Year, date.Month, 1).AddMonths(2).AddDays(-1)
```

### ▼1年前の前月初日
```c#
new DateTime(date.Year, date.Month, 1).AddYears(-1).AddMonths(-1)
```

### ▼1年前の前月末日
```c#
new DateTime(date.Year, date.Month, 1).AddYears(-1).AddDays(-1)
```

### ▼1年前の当月初日
```c#
new DateTime(date.Year, date.Month, 1).AddYears(-1)
```

### ▼4月開始年度
```c#
date.AddMonths(-3).Year
```
ESLintでJavaScriptの循環的複雑度(cyclomatic-complexity)を検証する

一般的に条件分岐やループが多ければ多いほどその関数のバグの混入確率が上がると言われています。関数の複雑度を測るために循環的複雑度(cyclomatic-complexity)を用いて複雑度を数値として計測し、閾値を超えていないかをlintで検証する方法を紹介します。

(2019/01/17 追記)
前半部分はほぼ同じ内容ですが、別記事でTSLintを使った方法を別記事に書きました。
[TSLintでTypeScriptの循環的複雑度(cyclomatic-complexity)を検証する - Qiita](https://qiita.com/shisama/items/8d5ace30a1111fdb4a1c)

# 循環的複雑度(cyclomatic-complexity)とは
[循環的複雑度 - Wikipedia](https://ja.wikipedia.org/wiki/循環的複雑度)

一言で言えば、プログラムの複雑度です。分岐の数が多ければプログラムの実行経路は多くなり複雑度は上がります。逆に少なければ下がります。`if`や`for`など分岐がないプログラムの循環的複雑度は1となります。

拙いですが、以下のような関数があるとします。

```js
function check(a, b) {
  if (a >= 0) {
    console.log("aは正の数です。")
  } else {
    console.log("aは負の数です。")
  }
  if (b >= 0) {
    console.log("bは正の数です。")
  } else {
    console.log("bは負の数です。")
  }
}
```

```js
check(1, -1) // aは正の数です。bは負の数です。
check(-1, 1) // aは負の数です。bは正の数です。
```
で条件を網羅できます。
循環的複雑度の数え方は大まかに言えば「`if`などの条件分岐や`for`などのループなど制御構文の数」+1した数です。
`else`は含みません。
参考: [Project Metrics Help - Complexity metrics](http://www.aivosto.com/project/help/pm-complexity.html)

よって上記の`check`関数の循環的複雑度は3となります。

# 循環的複雑度の閾値

非常に古い統計データですが、循環複雑度が高ければバグは発生しやすいということは以下のグラフを見るとわかります。

![Prob for Cyclomatic](https://res.infoq.com/news/2008/03/cyclomaticcomplexity/en/resources/mccabegraph.jpg)

|循環的複雑度|バグ混入確率|
|---|---|
|11|25%|
|38|50%|
|74|98%|


参考: [Cyclomatic Complexity Revisited](https://www.infoq.com/news/2008/03/cyclomaticcomplexity)

循環的複雑度が10を超えるとバグ混入確率がゆるやかに上昇していっているので、1つの関数の循環的複雑度は10以内に抑えるようにコードを書くようにするといいでしょう。

# ESLintでの検証
ESLintはJavaScriptの静的解析ツールです。  
参考: [ESLint 最初の一歩 - Qiita](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)

ESLintには様々なルールがありますが、循環的複雑度を検証するルールも存在します。

それが[complexity](https://eslint.org/docs/rules/complexity)です。

ルールの設定は簡単で循環的複雑度が10を超える場合はエラーにしたい場合は以下のように設定を書きます。

```json
{
  "complexity": ["error", 10]
}
```

.eslintrcをyamlで書いている場合は

```yml
complexity:
  -  error
  -  10
```

と書くことで循環的複雑度の設定は完了です。
設定する値はエラーレベルと閾値です。

エラーレベルは以下の３種類から設定できます。

* `off`: 循環的複雑度の検証をしない
* `warn`: 循環的複雑度の閾値を超えると警告
* `error`: 循環的複雑度の閾値を超えるとエラー

ESLintのcomplexityの閾値を10に設定した場合、循環的複雑度が11の関数があれば以下のようなエラーメッセージを出力します。

```
> eslint index.js


/path/to/sample-code.js
  1:1  error  Function 'test' has a complexity of 11  complexity

✖ 1 problem (1 error, 0 warnings)
```

# あとがき
プログラムの複雑さを機械的に検証し、回避することでバグの混入確率だけでなく可読性も上がると思います。ぜひ、導入しましょう。
今回はJavaScriptとESLintでの検証方法を紹介しましたが、他のプログラミング言語でも循環的複雑度を検証することができる静的解析ツールはいくつかあると思いますので探してみてください。
~~TypeScriptとtslintを使った検証方法についても別記事で紹介したいと思います。~~
(2019/01/17 追記)冒頭でも紹介したとおり書きました。
[TSLintでTypeScriptの循環的複雑度(cyclomatic-complexity)を検証する - Qiita](https://qiita.com/shisama/items/8d5ace30a1111fdb4a1c)

最後までお読みいただきいただきありがとうございました。質問や不備などがあればコメント欄または[Twitter(@shisama_)](https://twitter.com/shisama_)までお願いいたします。
Ruby on Rails Tutorial デプロイ時のError 及び その解決策

Railsチュートリアル進行中、第1章の1.5.2「Herokuにデプロイする」で下記のコマンドを記述するとErrorが発生。

```ruby:~/hello_app
$ git push heroku master
```

```Error:Error
remote:  !
remote:  !     You must use Bundler 2 or greater with this lockfile.
remote:  !
```

とりあえず

```bash:bash
$ bundler -v
```

でバージョン確認してみるも

```bash:bash
Bundler version 2.0.1
```

となっており、ちゃんとバージョン2以上やないかい！！！

結局解決策探していたら次のコードを記述すればデプロイできたので
応急処置として記載しておきます。

```ruby:~/hello_app
$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
```
[参考ページ](https://github.com/bundler/bundler/issues/6784)

これで先程のErrorは消えるはず
ですが新しくappをデプロイする際毎回同じ作業を繰り返すことになるので面倒です。
新しい方法が見つかり次第再度掲載し直します。




少しでも同じ悩みを抱える人の手助けになりますように。。。
社内でシェルスクリプトからAnsibleに移行しつつある話

# はじめに
今いる会社でインフラエンジニアとして仕事をしています。
何十台ものサーバをセットアップして顧客先に納品しているのですが、そのOS設定作業を今までシェルスクリプトで行なっていました。(時には手順書通りにコマンドうってセットアップ...みたいなこともありました。)
しかし、**Ansible**という**サーバ構成管理ツール**の存在に気づき始めた人が社内に出て、今構築作業を行なっています。

なぜAnsibleを使うようになったのか話したいと思いますが、Ansibleの具体的な概要については割愛します。

# なぜAnsibleに移行しようとするか？


## 設定するサーバ自体にコマンド打たなくても良い
### 今までのシェルスクリプト
シェルスクリプトで設定しようとすると...

設定するサーバの端末を開く
↓
シェルスクリプトがあるサーバをマウントし実行、またはUSBなどのメディアでシェルスクリプトを実行
↓
再起動したらその後に使うシェルスクリプトを実行するためまた最初から同じ作業の繰り返し...

となってしまっていて非効率であり、これが何十台・何百台のサーバをセットアップすることもありものすごく大変でした。

### Ansibleで実装
ところが、Kickstartなどでネットワークスイッチ等繋いでOSインストールのときにIPアドレスが設定されてあれば、Ansibleサーバにネットワークの設定を記述するだけでサーバ毎に端末開く必要が無くなります。(**hostsの設定**)
また、Ansible自体に**再起動後にまた設定作業を再開できる機能がある**のも大きなメリットです。

## 冪等性の概念がある
### 今までのシェルスクリプト
ApacheやNTPなどミドルウェアの設定ファイルに`sed`コマンドで記述する処理をシェルスクリプトに書いていました。
しかし、また同じシェルスクリプトを実行しようとしたら、設定ファイルの記載が二重化されてしまうことが幾度かありました。
そのためにif-elseの条件分岐で対処していますが、`もし〜されていたら`を考えながらプログラミングするのは結構大変でした。

### Ansibleで実装
Ansibleには**何回同じ処理を実行しても結果が変わらない冪等性**という概念があります。
サーバの定義を記述したAnsibleのPlaybookを実行してその後何回もやっても実行結果は変わることがありません。(少しだけ例外はありますが...)
なので、シェルスクリプトとは違い余計な処理をすることないのは大きなメリットです。

## 見やすさ・わかりやすさ
### 今までのシェルスクリプト
社内の人間によってスクリプトの書き方がバラバラであり、分割したモジュール毎の管理が面倒でした。
また、プログラム内の見やすさに関してもインデントでの区切りがなかったり不自然であったとしてもシェルスクリプト自体は動いてしまうのが難点でした。

### Ansibleで実装
AnsibleのPlayBookは`YAML`で記述するのでインデントを区切らないとエラーが起こって実行できなくなってしまいますので、**PlayBookに書いて実装すると自然と見やすくなっていきます。**
また、OS設定の項目が多くなった時もAnsibleには`Role`というモジュールが存在しているのでミドルウェアごとのインストール・設定やドライバ・FWのインストールなども分割して記述できるので**Roleのどこに何が書いているか明確になリます。**
これにより設定するサーバに変更点があってもRoleの概念で当確の部分を修正しやすくメンテナンスが容易となっています。

## その他
同じ構成管理ツールとしてPuppet、Chef、Chefの軽量版のItamaeなどが存在しています。
これらは以下のようなことがありAnsibleを採用しました。
1. 社内のインフラエンジニアはプログラミングの経験が乏しいため他の構成管理の記述に必要な`Ruby`を扱える人がいない→YAMLなら覚えることも少なく書きやすい
2. 他の構成管理ツールだとモジュールがやや複雑で優先度などもわかりにくい
3. 他の構成管理ツールだと設定するサーバにエージェントのインストールが必要になる

# 問題点
IntelのNICドライバをインストールするときはいつもソースコードからmakeして行なっていましたが、RPM化しないとできなくなってしまいました。(もしかしたらソースコードからインストールできるのかもしれませんが...)
他のドライバも同様にAnsibleでのインストールの仕方が未確立なこともあり、その部分はシェルスクリプトで対処することになっています。
今更だがanyenvをfishで使う

# tl;dr
2019/01/15現在の話です

```~/.config/fish/config.fish
set PATH $HOME/bin $HOME/.anyenv/bin $PATH
anyenv init - fish | source
```

# 何も言うことは無い
無いと言ったが強いて言うなら`eval (anyenv init - fish | source)`だとか`eval (anyenv init - fish)`だとか書いているブログに当たったりしていたが、動かなかったり余計だったりする。
古い情報だと`eval (anyenv init - | source)`と書いてたりもするけど昔はそういう感じだったのだろうか……?

# 追記 2019/11/09
もっと早く追記すべきでしたがissue立てて解決したので、こんな記事見てないで公式のREADMEを読もう！！！！
https://github.com/anyenv/anyenv

```
$ set -Ux fish_user_paths $HOME/.anyenv/bin $fish_user_paths
```
BadFunctionCallExceptionとBadMethodCallExceptionの使い方メモ

# 実装/継承

BadFunctionCallExceptionとBadMethodCallExceptionを遡っていく。もとい公式リファレンスでBadMethodCallExceptionのページからどんどん遡っていく。

[Throwable interface](http://php.net/manual/ja/class.throwable.php)
　└ [Exception class](http://php.net/manual/ja/class.exception.php)
　　└ [LogicException class](http://php.net/manual/ja/class.logicexception.php)
　　　└ [BadFunctionCallException class](http://php.net/manual/ja/class.badfunctioncallexception.php)
　　　　└ [BadMethodCallException class](http://php.net/manual/ja/class.badmethodcallexception.php)

# 使い所

使い所は共に未定義の関数/メソッドを呼ぼうとしたとか引数が無いとかになるんですが、呼ばれたくないマジックメソッドでthrowするのもありかと思います。

```php
class Hoge {
    public function hogeFunc() {
        echo 'hogeFunc'.PHP_EOL;
    }
}
class Piyo {
    private $msg;
    public function __construct($msg) {
        $this->msg = $msg;
    }
    public function __clone() {
        throw new BadMethodCallException('Piyo object does not allow clonin.');
    }
}

function foo($func) {
    if(!function_exists($func)) throw new BadFunctionCallException('function is nothing.');
    echo 'call func!'.PHP_EOL;
    $func();
}
function bar($obj, $func) {
    if(!method_exists($obj, $func)) throw new BadMethodCallException('method is nothing.');
    echo 'call method!'.PHP_EOL;
    $obj->$func();
}

try {
    foo(hogepiyo); // BadFunctionCallException
    bar(new Hoge(), piyoFunc); // BadMethodCallException
    $piyo = clone new Piyo('Hi!'); // BadMethodCallException
} catch (BadMethodCallException $e) {
    echo 'catch BadMethodCallException'.PHP_EOL;
    echo $e->getMessage();
} catch (BadFunctionCallException $e) {
    echo 'catch BadFunctionCallException'.PHP_EOL;
    echo $e->getMessage();
}
```

使い所はマジックメソッドでのthrowになるのかなぁという印象。そもそもなところであまり使わない気もする。

やっぱ例外ってちゃんと使おうとすると難しいです。
Azure WebAppsへのJavaのWebアプリケーション作成

#目的
WebAppsを使用して簡単なJavaのWebアプリケーションを作成する

コードには直接パスワードを入力せずWebAppsの接続文字列にDB（SQLDatabase）への接続情報を含むことでセキュリティを向上させる

#手順１　WebAppsの作成
AppServiceからWebAppsを選択して作成する

#手順２　Java環境構築
作成したWebAppsの『アプリケーション設定』を選択し、『全般設定』で
Javaバージョン、Javaマイナーバージョン、Java Webコンテナーに任意の設定を選択

※今回はJava8, 1.8.0_181(oracle), Tomcat 8.5(最新）を選択

#手順３　DBへの接続情報を入力
作成したWebAppsの『アプリケーション設定』を選択し、『接続文字列』で
接続文字列名、値、種類を入力する

※今回は以下のように入力する
1.serverId, SQLServerの名前, SQLServer
2.dbId, SQLDatabaseの名前, SQLAzure
3.useId, SQLServerで作成したユーザID, SQLServer
4.pass, SQLServerで作成したパスワード, SQLServer

#手順４　アプリの実装

アプリ内で環境変数の取得（System.getenv）で先ほどの接続情報を取得する

種類にSQLServerを選択した場合は**System.getenv("SQLCONNSTR_接続文字列名")**、
SQLAzureを選択した場合は**System.getenv("SQLAZURECONNSTR_接続文字列名")**で値を取得する

また、WebContent/WEB-INF/libの下にSQLServerのJDBCドライバを格納すること
（https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017）

以下は簡単なサンプルコード

```
package servlet;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.DriverManager;

public class SQLExecution {
	
	//WebAppsの環境変数から値を取得
	String hostName = System.getenv("SQLCONNSTR_serverId"); // update me
	String dbName = System.getenv("SQLAZURECONNSTR_dbId"); // update me
	String user = System.getenv("SQLCONNSTR_useId"); // update me
	String password = System.getenv("SQLCONNSTR_pass"); // update me
    
    String url = String.format("jdbc:sqlserver://%s:1433;database=%s;user=%s;password=%s;encrypt=true;"
        + "hostNameInCertificate=*.database.windows.net;loginTimeout=30;", hostName, dbName, user, password);
    Connection connection = null;
    String sql = null;
    
    void select() {
    }
    
    public void insert() {
    	try {
    		//JDBCドライバを指定
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			
            connection = DriverManager.getConnection(url);

            // Create and execute a SELECT SQL statement.
            sql = "insert into testTBL("
            		+ "key"
            		+ ")"
            		+ "Values"
            		+ "("
            		+ 1
            		+ ")";

            try (Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql)) {
                connection.close();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

#手順５　アプリのデプロイ
アプリをWebAppsにデプロイする
方法はいくつかあるが、今回はAzure Toolkit for Eclipse（https://docs.microsoft.com/ja-jp/java/azure/eclipse/azure-toolkit-for-eclipse-installation?view=azure-java-stable）を使用

アプリを右クリックし『Azure』<『Publish AS Azure Web Apps』を選択し、デプロイしたいWebAppsを選択する

#感想
最近はクラウドをよく使うので、接続情報をコードから排除できるのはよかった。
こうしておけば、テスト環境・本番環境でも全く同じコードが使えますし、GitHubなどでコードを公開した時の危険性も減るので重要と思う。
【二分法(Bisection method)】Fortranによる二分法アルゴリズム

#**はじめに**

#**二分法とは**
数値解析における**二分法（Bisection method）**は、解を含む区間の中間点をを求める操作を繰り返すことによって方程式を解く求根アルゴリズムです。その動作が示すように反復法の一種です。

また、$f(x) = 0$ の解を少なくとも一つ求める際、ここでは割愛しますが、**ニュートン法**と違って、**安全確実に**解を求めることができます。
しかし、ニュートン法と比較して**収束は遅い**です。

#**目標**
目標は、中間値の定理が成立する条件のもとで、$f(x) = 0$ となる解を一つ求めることです。

###**中間値の定理**
> 方程式 $f(x)$が閉区間 $[x_1, x_2]$ で連続であり、$f(x_1)f(x_2) < 0$ であれば、$x_1 < x < x_2$ で $f(x) = 0$ となる $x$ が存在する。

つまり、方程式が連続であり、なおかつ関数値の符号が異なる初期条件を与えることができれば必ず収束します。その際、関数が単調増加あるいは単調減少であれば、区間上限を十分に大きく、区間下限を十分に小さくすることで適切な初期条件となります。

また、**有効桁数は繰り返しの回数に比例して増える（線形収束）**ことから、あらかじめ解の精度を予測することも可能です。

#**二分法アルゴリズム**
1. 前提：$f(x_1)$と$f(x_2)$で符号が異なる区間下限 $x_1$ と区間上限 $x_2$を初期値として定めます。
2. $f(x_1) > 0$ なら $x_p = x_1$ 、 $x_m = x_2$ とおき、そうでなければ、 $x_p = x_2$ 、 $x_m = x_1$ とおきます。
3. 中点 $x_{mid} = \frac{x_p + x_m}{2}$ を計算します。
4. $f(x_{mid})$ の符号を調べます。 $f(x_{mid}) > 0$ なら $x_p = x_{mid}$ とし、$f(x_{mid}) < 0$ なら $x_m = x_{mid}$ とします。
5. 3に戻って操作を繰り返します。

#**コード**
Fortran90の基礎に関してはこちらの記事にまとめています。
[【Fortran超入門】プログラム全体の流れ・文法の基礎[FORTRAN]](https://qiita.com/takuyanin/items/303e9a88d403252e934d)


```main.f90
program bisection_method
  implicit none
  real x1, x2, acc, root
  integer eflag
! エラー検出用にeflagに初期値0を設定
  eflag = 0
! 精度(accuracy)値を設定
  acc = 1.0e-7
  x1 = 1.0
  x2 = 2.0
! 上記でx1, x2に初期値を設定しているが、下記read分をコメントアウトすることで対話的に入力可となる
! read *, x1, x2
! 二分法
  call bisection(x1, x2, acc, root, eflag)
! エラーフラグ値が0であれば解（根）を表示
  if (eflag == 0) then
    print *, 'Root=', root
  else
!-- エラーが検出されればエラー値（1or2）を表示
    print *, 'ERROR=', eflag
  endif
end program bisection_method
```

```bisection.f90
subroutine bisection(x1, x2, acc, root, eflag)
  implicit none
  real x1, x2, acc, root
  integer eflag

  integer, parameter::IMAX=30
  real f1, f2, xp, xm, xmid, fmid
  integer i
! y値を計算
  call func(x1, f1)
  call func(x2, f2)
  if (f1*f2 >= 0.0) then
!-- エラー値を１に設定（解がある保証がない）
    eflag = 1
!-- subroutineからメインプログラムへ返る
    return
  endif

  if (f1 > 0.0) then
    xp = x1
    xm = x2
  else
    xp = x2
    xm = x1
  endif

  do i=1, IMAX
    xmid = (xp + xm)/2.0
    print *, xmid, xp, xm, ABS(xp-xm)
!-- 精度が十分であればrootに値を代入してメインプログラムに返る
    if (ABS(xp-xm) < acc*2.0) then
      root = xmid
      return
    endif
    call func(xmid, fmid)
    print *, fmid
    if (fmid > 0.0) xp = xmid
    if (fmid < 0.0) xm = xmid
    if (fmid == 0.0) then
      root = xmid
      return
    endif
  enddo
!-- エラー値を2に設定（精度を満たすことに失敗）
  eflag = 2
!-- 精度を満たせなかったため、中間値を解とする
  root = (xp + xm)/2.0
end subroutine bisection

subroutine func(x, f)
  implicit none
  real x, f
  f = x**2 - 2.0
end subroutine func
```


#**コンパイル/実行**
ファイルを分割した場合、`gfortran`コマンドに続けて列挙します。

```
$ gfortran main.f90 bisection.f90
```

```
$ ./a.out
1
3
   2.00000000       3.00000000       1.00000000       2.00000000
   2.00000000
.
.
.
  -1.19209290E-07
   1.41421366       1.41421366       1.41421354       1.19209290E-07
 Root=   1.41421366
```

#**参考**
[二分法 from Wekipedia](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%B3%95)

#**おわりに**
こちらの記事が役に立ったという方はいいね、お願いします(^^)
SQLで出来ない事をSparkでやってみる(その1：groupBy）

#はじめに

SQLで出来る事はSparkSQLにまかせれば良いし、色々日本語でも
出回っているからいいんだけれど、日本語であまりここら辺の情報って
ないような気がするので、少しずつ書いてみます。
ただし、あまりScala自体の書き方はダメダメと思います。すいません。
今後進化します。ご容赦ください。

#例）滞在時間の計算

例えば、こんなログがあるとします。

| UserID       | Location | Id | Staytime    |
|:-----------------|------------------:|:------------------:|:------------------:|
| AAA             |              公園 | 1 |      360        |
| AAA           |            公園 |   2 |   180       |
| AAA             |              公園 | 3 |      360        |
| AAA           |            移動 |   4 |   0       |
| AAA             |              公園 | 5 |      360        |
| AAA           |            移動 |   6 |   0       |

これをこう集計したい場合

| UserID       | Location | Id | Staytime    |
|:-----------------|------------------:|:------------------:|:------------------:|
| AAA             |              公園 | 1 |  900|
| AAA           |            移動 |   4 |   0|
| AAA             |              公園 | 5 |  360|
| AAA           |            移動 |   6 |   0|

Sparkでやるとこんな感じ。

```scala:test.scala
object test extends App {
  import org.apache.spark.sql.{Dataset, Row, SparkSession}

  case class TestLog(userID:String,Location:String, Id:Int, Staytime:Int)

  val spark = SparkSession.builder().master("local").getOrCreate()
  import spark.implicits._

  /* テストデータ作成 */
  val testData:Seq[TestLog] =
    Seq(
      TestLog("AAA","公園",1,360) ,
      TestLog("AAA","公園",2,180) ,
      TestLog("AAA","公園",3,360) ,
      TestLog("AAA","移動",4,0) ,
      TestLog("AAA","公園",5,360) ,
      TestLog("AAA","移動",6,0) )

  /* 不要だけれども、今回はその１なのであえてRDD */
  val data = testData.toDF().rdd

  /* IDで並び替えて、足し合わせ。その後、参照用にDataSet化。リストの扱いは全くイケテナイ */
  val data3 = data.groupBy(k => k.getString(0)).mapValues(
    m => m.toList.sortBy(m => m.getAs[Int]("Id")).foldLeft[List[TestLog]](List[TestLog]())((m,k) => {
      if (m.isEmpty) m :+ TestLog(k.getString(0),k.getString(1),k.getInt(2),k.getInt(3))
      else if (m.last.userID == k.getString(0) && m.last.Location == k.getString(1)) {
        val mtest = m.init
        val m2 = m.last
        mtest :+ TestLog(k.getString(0), k.getString(1), m2.Id, k.getInt(3) + m2.Staytime)
      }
      else
        m :+ TestLog(k.getString(0),k.getString(1),k.getInt(2),k.getInt(3))
    })
  ).flatMap(x => x._2).toDS()

  /* 出力結果参照 */
  data3.show()

}
```

#まとめ

SQLでかける事をあえてgroupByで書くとなぜ必要なのかよくわからないので
SQLでかけそうにない事を選んでSpark使ってみました。
今後もSparkであんまり使わないけど、なんで必要そうなのか色々考えて書いてみます。
（次回以降もっと良い書き方を紹介したい。）
atcoder ABC106

Cは簡単な発想で解ける問題であり、D問題は左と右の場所について二次元配列で持つという発想に至らなかった。やはり条件で駅の数が500*500しかないことに気づいて利用するという流れが大事である。
https://atcoder.jp/contests/abc106

#C問題
1は1、2は22のように1年後iがi乗増えて行くので、10兆年後K番目の数字は何か答える問題。明らかに一番左の数が1以外ならk番目の数はその数になるので、一番左が1だった時の場合を考える。この場合、K番目まで全部1なら10兆年後もK番目は1であるが一つでも1以外の数字があればその数字がk番目になる。よって、k番目までについて1かどうか判定することで答えが導ける。

#D問題
明らかに、各クエリに対し全探索していてはTLEになってしまう。なので、各線のLとRを二次元配列として持っておき累積和をとることで答えを時間以内に出すことができる。ここで、累積和について2つの方法がある。

#一般的な累積和
数列a[] = {1,2,3,4,5}
が与えられた時、以下のようにすることで、i番目までの数値の和を求めることができる

```java
int[]a ={1,2,3,4,5};
int[] sum = new int[5] 
for(int i = 1;i <= 4;i++){
    sum[i] = sum[i-1]+a[i-1];	
}
```

```java:結果
1 3 6 10 15
```
累積和を用いることで、x番目からy番目までの和をO(1)で求められる。

```java
int x = 2;
int y = 4;
sum[y]-sum[x];
```
```java:結果
9
```

#二次元累積和
今回の問題では使わなくてもACできるが、実用的なテクニックである。まず二次元累積和の概要としては、累積和S<sub>i</sub><sub>j</sub>は0からi,jまでにあるaの和を表す。詳しい導出は参考urlを見て欲しいが、大事なことは、この累積和の作成の手順である。これは以下のように実装できる。

```java

int[][] a = new int[5][5];
int[][] sum = new int[6][6];
for(int i = 1;i <= 5;i++){
   for(int j = 1;j <= 5;j++){
      s[i][j] = a[i-1][j-1] + s[i-1][j]+s[i][j-1]+s[i-1][j-1]
    }
}

#参考url
https://tqk.hatenablog.jp/entry/ABC106-2
Certified Hyperledger Fabric Administrator (Beta) 受験記

HyperledgerコミュニティがSawtoothのAdministrator資格 (CHSA) に続き、Fabric向けのAdministrator資格試験を開始する模様。昨年末にBetaプログラムの先行募集があったので受けてみた。

# どんなテストなのか

Administratorとあるとおり、Hyperledger Fabricで構成されるプライベートなBlockchainネットワークの管理者をターゲットにした内容の問題が出題された。そのためChaincode(スマートコントラクト)開発に必要とされるようなプログラムスキルを発揮する場面は全くなく、主にネットワーク設定の変更方法や問題を抱えるHyperledger Fabricのネットワーク環境上での実際にトラブルシュートを行うスキルを問う設問が多く、基本的なDockerの使い方以外は、Hyperledger Fabric固有の設定周りに関する広い知識が必要とされる。以下のオフィシャルページに出題範囲と配分が載っているので参考になるだろう。

[Hyperledger Fabric Certification – Hyperledger](https://www.hyperledger.org/resources/training/hyperledger-fabric-certification)

# Betaプログラムとは

Betaプログラムの実施目的は合格ラインの見極めるためらしい。ということもあって、協力者はタダで受験可能かと思いきや、しっかり受験料は取られる。が通常より安い100USDで受けられるという微妙なメリットがついてくるのだ。正式に受けると300USDとかするようなのでディスカウント価格ではある(が、よくバーゲンセールしているので、ベータプログラムが終了後でもタイミングが合えば、オンライン学習コースがバンドルされた上で200USD以下とかでオファーがある場合もある)。さらに一度落ちても無料で一年以内に再試験可能らしい。このチャンスはBetaプログラム参加特典というわけではなく、一般の受験者にも与えられるようです。

[Certified Hyperledger Fabric Administrator Terms of Service | Linux Foundation ID](https://identity.linuxfoundation.org/terms-of-service/certification/976)

# どんな問題が出題されるのか

普段業務でHyperledger Fabricの環境には触れており、更にはFabricコア部分のソースコードも覗いたり触ったりしているので、何とかなるんじゃないかと勘違いして受けてみましたが、残念な結果になりそうです（まだ結果がきてませんが）。こっそりここで設問内容を具体的にお伝えするのは、受験時に交わした[秘密保持契約](https://training.linuxfoundation.org/wp-content/uploads/2018/11/hyperledger_cert_conf_agreement_v1_0.pdf)上アウトらしいので控えますが、公式ドキュメントを一通り読んでいろいろ実際に動かして理解しておく必要が当然ながらありそうです。全26問でしたが、全て実戦形式の問題でした。個人的には試験時間2時間じゃ全然足りないボリューム感でした。

# どんな風に受験するのか

試験の模様は、本試験の提供元であるLinux Foundationの別資格試験の模様を記した以下の記事を参考になります。ほぼ同じような感じで試験自体は進みました。

[Cloud Foundry Certified Developer（CFCD）を取得した - Qiita](https://qiita.com/oke-py/items/c28d332b79bdfca33223)

試験にはWebカメラが必須なのですが、「カメラを使ってまわりをぐるっと見せて〜」とか「机の上も何もないか映して〜」とか、試験開始前に英語で注文が付きます（チャット越しに）。一度試験が始まると思い出したかのように「残り３６分だよ」とか、切りの悪いタイミングでリマインダーを入れてくれます。私の場合は試験時間が過ぎてもなかなか「試験終了！」の知らせがなく、試験官が離席もしくは寝ていた疑惑がありました。

なお試験中に唯一開くことが許される１つのブラウザのタブ上で参照可能なサイトは以下でした。このドメイン配下ならOK。

[A Blockchain Platform for the Enterprise — hyperledger-fabricdocs master documentation](https://hyperledger-fabric.readthedocs.io/en/release-1.3/)

# まとめ

個人的には日頃触れているプラットフォームに関して、腕試し的な目的で何も準備せずに臨みましたが、普段はかなり偏った関わり方をしていたのも手伝って、試験中終始あたふたしていた印象です。既に落ちたと決めてかかっていますが、もう１ライフ残っているので少し抑えるとこ抑えてから再度臨みたいと思います。受かれば２年間自慢できるようなので是非皆様も受けてみてはいかがでしょうか。
【初めての大規模データ①】Linuxでファイル分割

#はじめに
業務でメモリに乗らない数百GB以上のデータを扱う機会がありましたが、
そこで、Pandas等がうまく使えず困ったことが発生したました。

その内容を踏まえて以下の内容についてまとめていきます。
同じような問題にぶつかった方に、少しでも役立てばと思います！

①Linuxでのファイル分割（この記事）
②[Daskでの分散処理](https://qiita.com/katsuki104/items/222a9d5e85e4f92f4c43)
③[大規模データでのダミー変数化](https://qiita.com/katsuki104/items/def2962af8af896f4007)

##_データが大きいと何が困るのか_
処理が重くなったり、遅くなったりするのはなんとなくイメージつくかと思います。
処理スピードに関してはマシンパワーやCPUコア数に依存すると思いますので、唇を噛んで受け入れるしかないこともありますがただ遅くなるだけでなく、**できないこともでてきます**。

例えばcsvを`pd.read_csv()`でDataFrameに読み込むと、CSV上のデータが
全てDataFrameに入りますが、これはメモリ領域を使っています。
私の会社のマシンは多くてもメモリ16GBのため、仮にcsvが100GBあった場合、領域が足りず`pd.read_csv()`でエラーを吐き、データが読み込めません。

こうなってしまった場合の対処方法としては、ファイルを分割するかデータを分割するしか無いかと思います。

###ファイルを分割するとは...
100GBのcsvを1GBずつ100個のファイルに分けるということです。
そして、本来100GB一気に流したかった処理を1ファイルずつ100回実行することになります。
これだと、手間はかかりますがメモリを一度に大量消費しないで処理できます。

###データを分割するとは...
100GBのcsvを1GBずつ読み込んで行くということです。
先の例で言うと、csv全体でなく1GB読み込んでDataFrameに入れ、処理が終わったらまた次の1GBをDataFrameに読み込んで同じ処理をする、という流れをイメージしてください。

どこで分散（分割）するかが違うだけで、やっていることは同じですよね！
このページではタイトルの通り、Linuxでのファイル分割について説明したいと思います。

# Linuxでのファイル分割
そもそも、
> 「このcsvを3つに分割してください！」

と言われたらどうしますか？

私はWindowsで仕事していますが、真っ先にエクセルで開いて行数を確認し、行数を3分割して3つのエクセルシートにコピペすることを想像します。
しかし、ファイルを開くというのもまたメモリを使うので、大規模データをダブルクリックして開こうとした時点でメモリを食いつぶしてPCが固まってしまいます。もちろん、他のテキストエディタ等でやっても同じです。

「じゃあファイルの中見れないじゃん！！！！！」
と思いますが実はその通りです。だから面倒臭いのです...

ファイルの中身を確認せずに綺麗に分割することはヒューマンにはできないので、PCにお願いするしかないのです。

## _（Windowsでそのままやりたいのに）なぜLinux？_
Windowsにはファイル操作するためのコマンドがそれほど充実していないからだと思います。
ググれば、「Windows環境でファイル分割用のbat作ってみた」的な記事もでてきますが、どれも1つや2つのコマンドで完結するものではありません。

Linuxであれば専用の便利なコマンドがいくつかありますのでわかりやすいですし、MacOSで開発されている方ならそのままLinuxコマンドが使えるかと思います！（羨ましいぜ！）

私はWindowsで仕事していますので、VitualBoxにUbuntuをインストールしてその中にファイルを渡してファイルを分割してもらっています。

字面を見ると「うわぁ、めんどくせえ...」と思いますが、個人的にはファイルの分割自体、前処理の前処理で使う程度ですし、使うコマンドもシェルスクリプトにしておけば打ち直す必要もなく応用効くので意外とそうでもないです。
（セッティングするのがそもそもめんどくさいですけどね...仮想環境とホスト側のフォルダを共有させるのにも最初は詰まって投げかけました。笑）

##　ファイル分割処理用のコマンド紹介まとめ
### _less_
[詳しい文法はこちら](http://www.atmarkit.co.jp/ait/articles/1702/09/news031.html)
先に「大規模ファイルは開けない」と書きましたが、それでも中身の状態を確認しないとどうにもこうにもなりません。

lessコマンドはページ単位でファイルを表示してくれるコマンドです。
ページ分しか表示しないので、大きなデータでも気軽に確認することができます。
（個人的にはcatの安全版だと思って使っています）
私はファイル分割・連結後に結果確認としてファイルの状態を見たい時などによく使っています！

### _head_
[詳しい文法はこちら](http://www.atmarkit.co.jp/ait/articles/1603/07/news023.html)
名前の通り、ファイルの「頭」を表示することができ、デフォルトでは最初の10行だけ表示します。

~~lessのファイル保存オプションをいつも忘れるのでファイルにリダイレクトしたい時に~~
私は`$head -n 1 your_filename > columns.csv`でカラム名だけをゲットしたい時等によく使っています！

### _split_
[詳しい文法はこちら](http://www.atmarkit.co.jp/ait/articles/1711/24/news016.html)
ファイルを分割するコマンドです。本日の主役、お世話になっております。
`-l`オプションで指定行数ごとでの分割、`-b`オプションで指定サイズごとでの分割、`-n`オプションで指定個数での分割ができます。

### _cut_
[詳しい文法はこちら](https://eng-entrance.com/linux-command-cut)
csvファイルを縦に分割したい時はsplitではなくcutコマンドを使います。
特定のカラムのデータだけズボっと抜き取りたい場合はこちらをお使いください。

### _grep_
[詳しい文法はこちら](https://eng-entrance.com/linux-command-grep)
ファイルを分割したあとのデータ管理に使います。
特に、ファイルを何十個にも分割したあとに特定のデータを探すのは
grepなくしてはもう無理です。


##最後に
今回はファイル分割についてまとめましたが、ライブラリを使ってPython上でデータを分割する方法については次の記事をご覧になてください！！
[【初めての大規模データ②】Daskでの並列分散処理](https://qiita.com/katsuki104/items/222a9d5e85e4f92f4c43)
OWASP Juice Shop をDocker上で動かす

# OWASP Juice Shopとは
[OWASP TOP 10](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)に記載されている脆弱性を含む、多数の脆弱性のあるWeb Application。
Node.jsやAngularで実装されており、セキュリティトレーニングや脆弱性のデモ、CTFの学習として使える。
Docker, Heroku, Vagrant等を用いて環境を構築できる。今回はDockerのコンテナ上に構築することとする。

## 動作環境
- Windows 10
- Docker: Ver18

## やったこと
1. Docker Toolboxのインストール。[参考サイト](https://goodbyegangster.hatenablog.com/entry/2018/09/09/201045)
2. Docker Quickstart Terminalで以下のコマンドを実行

```
docker pull bkimminich/juice-shop
docker run --rm -p 3000:3000 bkimminich/juice-shop
```

http://192.168.99.100:3000  へアクセス
![JuiceShop.png](https://qiita-image-store.s3.amazonaws.com/0/234000/775a133b-ae58-e682-99e6-a8614275f1de.png)

幅広い難易度の課題も用意されており、ゲーム感覚でトライできるので、CTFの学習のとっかかりとしてはとてもよさそう。

## その他参考にしたサイト
https://www.slideshare.net/zaki4649/ss-116423487
https://bkimminich.gitbooks.io/pwning-owasp-juice-shop/content/
https://github.com/bkimminich/juice-shop
https://www.owasp.org/index.php/OWASP_Juice_Shop_Project
初心者のUnityゲーム作り

# はじめに
初めまして。ゲーム作りに挑戦したくなり、Unityを頑張ってみようと思いました。
しばらく前にチュートリアルを作ったきり放置されていたUnityを起動。
投稿のテストも兼ねて、作成中に調べたこと等のメモを残そうと思います。
基本操作的なところは割愛します。

# 作ったもの
自分で作るのは初めてなので、めちゃくちゃシンプルなものにしました。
ゲーム作り入門の定番のイメージがあるシューティングです。
![gameView.png](https://qiita-image-store.s3.amazonaws.com/0/311225/06c345c5-7f0d-eebf-1080-a59416ff44a1.png)
……びっくりするくらいシンプルです。
キャラと弾の画像はペイントの図形で、縦幅が短く感じたので矢印をつぶして無理やり距離を稼いでいます。

主な仕様は以下の通りです。
- 左右のキー押下でレーン移動
- スペースキー押下で弾発射
- 一定時間ごとに4レーンのうちランダムで敵機出現
- 弾が敵機に当たると消滅

以下は、作成時に調べたことのメモです。

# キー押下
自機移動や弾発射のためにキー押下の判定をしました。

```cs
    if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        // キー押下時処理
    }
```
Update内でinputクラスの`GetKeyDown`を呼ぶことでキー押下を判定します。
引数のKeyCodeで判定するキーを指定します。
また、`GetKey`で押している間、`GetKeyUp`でキーを離したときを判定できます。

# 一定時間ごとに処理
一定時間ごとに敵機を出現させるために時間処理を作成しました。
いろいろ調べたので、今回使った方法をメモ。

```cs
    public float interval;  // 一定間隔
    private float delta;    // 経過時間

    void Update()
    {
        delta += Time.deltaTime;
        if (delta >= interval)
        {
            // 敵機出現処理
            // 経過時間リセット
            delta = 0;
        }
    }
```
`Time.deltaTime`は前フレームからの経過時間らしいです。（もう少し調べます……）
なので、Updateが呼ばれるたびに時間を加算していって、指定した時間分経過したら処理実行という流れです。

# プレハブから生成
敵機出現処理のために、プレハブから敵機を生成したら良いと思い調べました。

```cs
    GameObject prefab = Resources.Load("Prefabs/" + name) as GameObject;
    Instantiate(prefab, pos, Quaternion.identity);
```
上記の1行目のコードでプレハブのオブジェクトを取得できます。
`Resources.Load`でResourceフォルダ内のアセットを取得。
その際のフォルダ構成に注意。
![path.png](https://qiita-image-store.s3.amazonaws.com/0/311225/892d84f9-46f6-4883-cba9-027481af5851.png)
……メンバ変数にGameObjectを用意してInspectorからできそうだったけどどっちがいいんでしょう。

2行目のコードでオブジェクトを生成。
`Instantiate((生成するオブジェクト), (位置), (回転))`となっています。
`Quaternion.identity`はプレハブの回転そのままに生成ということらしいです。（Quaternionがまだ理解できていません）

# 衝突判定
敵機と弾の衝突判定を敵機オブジェクト内に作成しました。

```cs
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Shot"))
        {
            // 衝突処理
        }
    }
```
`OnTriggerEnter2D`メソッドで衝突を判定。引数のCollider2Dオブジェクトが、衝突した相手のオブジェクトになっています。
衝突した相手を識別するために弾オブジェクトに"Shot"タグを設定し、判定しています。
この関数を使うために注意することは、`RigidBody 2D`と`Collider 2D`を衝突するお互いのオブジェクトにアタッチする必要があります。

# 画面の座標を取得
画面外に出た弾や敵機を消滅させようと画面端の座標を取得しようと思いました。

```cs
    Camera.main.ViewportToWorldPoint(Vector3.zero)
```
上記のコードで左下の座標を取得できるようです。
`Vector3.zero`の代わりに`Vector3.one`を渡すと右上の座標を取得できます。

# さいごに
これからもぼちぼち作っていきたいと思います。
まずは今回作ったものに得点、ライフ、タイトルとかを付けたいと思います。
その際は、また投稿するかもしれません。
【ES6 JavaScript】アロー関数とthisについて初心者エンジニアがまとめてみた

# ES6とは
ES2015というJavaScriptのバージョンのことです。
現在のモダン開発の殆どは、このバージョンに倣っています。

[詳細の概要はこちら](https://qiita.com/morrr/items/883cb902ccda37e840bc)でご確認ください。

# thisについて
以下のコードではthisの使い方について説明します。

**例1**

```js
value = 'global value';

function printValue(){
  console.log(this.value); //上記のvalueキーの値を指している
}

let obj = {
  value: 'obj value',
  func: printValue
} //新たにobjオブジェクトを作成し、valueに'obj value'を格納

let obj2 = {
  value: 'obj2 value',
  func: printValue
}//obj2を作成し、valueに'obj2 value'を格納

obj.func();
obj2.func();

/* 
"obj value"
"obj2 value"
*/
```
[例1デモ](https://jsfiddle.net/watsuyo_2/o0wtdcke/74/)
printValue関数にconsole.log()をするように記述します。
ここで言う、**this.value**は直前で変数定義した**value**を指します。
**console.log(this.param);**をオブジェクト定義後に単体で記述するとvalueの値('global value')が直接出力されます。

objとojb2オブジェクトでの定義は、各キー(valueとkey)に値を代入しています。
それぞれのオブジェクトを呼び出すには、**obj.func();**のように「valueキー.funcキー()」になります。
オブジェクトを呼び出すと、初めに定義したfunctionが呼ばれるため、console.log()されます。
その時の処理結果は、objとojb2オブジェクトで代入された値となります。

## アロー関数(ES6以降)のthis
例2と似たようなコードにはなりますが、printValue関数を定義する際にアロー関数となっています。
変更点はfunctionがアロー関数に変更されただけになりますが、処理結果はそれぞれ一番始めに定義した、valueオブジェクトの値になります。

**例2**

```js
value = 'global value';

let printValue = () => { //アロー関数
  console.log(this.value); //上記の変数valueの値を指している
}

let obj = {
  value: 'obj value',
  func: printValue
} //新たにobjオブジェクトを作成し、valueに'obj value'を格納

let obj2 = {
  value: 'obj2 value',
  func: printValue
}//obj2を作成し、valueに'obj2 value'を格納

obj.func();
obj2.func();

/* 
"global value"
"global value"
*/
```
[例2デモ](https://jsfiddle.net/watsuyo_2/j7nvfur6/5/)

[MDNのカンファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)の記載では、

```
アロー関数式 は、その名のとおり矢印を使って記述し、function 式より短い構文で同様な内容を記述することができます。なおthis, arguments, super, new.target を束縛しません。
```

とありますが、実行した結果から判断すると

例1のfunction・・・**valueは再代入可能**なためfunctionで定義される関数はthisを束縛しない
例2のvalue・・・**valueは再代入が不可能**なためアロー関数で定義される関数はthisを束縛する

ということになります。
最近のJavaScriptではES6が多く使われているので、thisを使う際はこの違いを把握する必要があります。

# 感想
ここ最近、【転職して痛感…】でもJavaScriptの基礎についてアウトプットしていますが、まだまだ知らないことが多すぎる。。。
がんばるじょ！
SocSci Meetup ～社会科学をブートする～ 勉強会メモ

# 概要

[SocSci Meetup ～社会科学をブートする～](https://sansan.connpass.com/event/111942/)

> Tech全盛の時代に、社会科学が立ち上がる！
> Sansan株式会社 DSOC R&D内で行ってきた社会科学系論文読み会を拡張し
>「社会科学はAI時代にどのような価値を生み出せるか？」を考えるコミュニティ"SocSci"を旗揚げします。
> 今回のイベントでは、社会ネットワーク研究からデジタル環境のエスノグラフィーまで
> 最新の研究潮流、あるいは古典的な研究の精査を通して
> 「サービス開発・モノづくりに社会科学はどう関与できるのか？」について考えていきます。


# 発表

## 枯れない古典の社会学的思考

[発表資料](https://speakerdeck.com/sansanbuildersbox/social-scientific-thinking-of-undying-classics)

- SanSanLabのビジネスマンタイプ分析
 - 取り込まれた名刺データだけで、ユーザの特徴分析
 - 社員のプロファイリングやチーム編成への利用
- 分析軸
 - キーマン: 社内の多くの人とつながっているか
 - チームリーダ: チーム内でどれだけ密なつながりを形成しているか
 - 開拓者: どれだけ希少な人とつながりがあるか
 - 大御所： どれだけ高い役職の人とつながりがあるか
 - イノベーター： どれだけ多くの業界とつながりあるか
- 社内ネットワークの構成を見ている
 - 社内では普通名刺は交換しない
 - 共通の名刺を交換した履歴から協働関係を推定
- 相互作用を媒介するオブジェクトは何か
 - 起源は社会学者ジオルグジンメルのアイデアから
 - 名刺への応用
- 他に社会科学が役立った点
 - 手法
  - ネットワーク分析
  - インタビューやエスノグラフィー
 - 発想
  - 社会ネットワークから得られる
  - 名刺を「相互作用オブジェクト」としてとらえる

## 人脈が支える経済ネットワーク

[発表資料](https://speakerdeck.com/sansanbuildersbox/social-scientific-thinking-of-undying-classics)

- 人脈ネットワークとビジネス
 - 個人や組織のパフォーマンスは、人脈に依存する
 - つながりの有無、多様性、質の評価
- 名刺による人脈ネットワークの定量化
- ソーシャルキャピタル
 - 個人の利益を最大化しつつ、人間関係を生成する
 - 協調関係を通して、効率性が向上する
- Christakisの研究
 - コホート研究のデータを使って、健康状態の社会ネットワーク上の伝播を実証
 - 肥満同士でネットワーク近傍度が近くなる
  - 類は友を呼ぶ
  - 共通環境要因
  - 誘引効果
- ソーシャルキャピタル関係の研究
 - 企業の関係性を可視化
 - 売上や契約規模と人脈の関係
 - 企業ネットワークと企業の成長の関係性

## 情報過多社会における接触情報の偏り

- 現代において、失われる情報の多様性
 - フィルターバブル
     - 検索やレコメンデーションで選択肢を狭めている
 - エコーチェンバー
     - 身近の情報発信者が偏る
- 多様性が失われたとき
 - 自分の持っている情報が正しいと信じる
　   - ミクダス仮説
 - 批判的な意見ばかり聞いていると、正確な判断が困難になる
 - 相手の事情に触れないため、攻撃的になる
- 事例：Twitterとの関係(受動的情報接触)
 - リベラルとコンサバのツイートを同時に見る人は少ない
- 事例：ニュースキュレーション(半受動的情報接触)
 - レコメンデーションにより、ユーザの見る情報の多様性が低下する
- 事例：AbemaTV(能動的情報接触)
 - ユーザとコンテンツの2部グラフからコンテンツの特徴を学習(LINE 2nd)
 - 時間とともに、情報の多様性の増加
- 能動的な選択を促すことで、ユーザの多様性を増大させられる可能性


## なぜIT企業はエスノグラファーを雇ったのか？

- エスノグラフィー
 - 他者の活動を観察したり聞き取ったりすることで、意味を言語化して理解する方法
 - 文化人類学が起源
 - 異文化人の生活様式を調査する
 - 質的調査法として活用されている
- 事例
 - Lucy Suchman (Xelox)
     - コピー機の使われ方の検証
 - Danah Boyd (Microsoft Research)
     - 若者のSNSの使い方

# 参考

- [SocSci Meetupに参加してきた](http://mopinfish.hatenablog.com/entry/2019/01/09/234732)
tig のdiff で長い行が見切れて見えない時

tig で diff を見てたら

<img width="1392" alt="スクリーンショット 2019-01-14 午後11.27.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/69140/75c0b8c1-06e2-a73f-04e7-35463cbd30d1.png">

右側が見切れていて見れないときがある。

j, k で上下に移動するvim キーバインドなので h, l で左右見れると思ったら別のキーバインドに割り当てられていて悲しい。

まあ 普通に **Left キーと Right キーを押せば左右にスクロールします。**
でもカーソルキーなんて押したくないですよね(ですよね)。

そこで便利なのが **O (大文字のo) を押せば今見ているdiff が最大化されて全画面に表示されます。**

または `.tigrc` に以下を追加すれば折返しが有効になり、デフォルトで見れるようになります。

```
set wrap-lines = yes
```
Advent Calendar 2018 を終えて

# Advent Calendar 2018 を終えて

+ よくメンバーに「振り返りが大切だと」とか言ってるのに発起人が振り返らないでどうするか。。
+ 良かった点や悪かった点を書いていきたいと思います

# 良かった点

1. Slackで最初に書いた時に絵文字で反応してくれたのが３人。コメントで反応してくれたのが３人だったのに15人も書いてくれた！
2. 記事を２つ以上書いてくれた人が３人も居たので、この人達のおかげで埋められた！
3. <img width="531" alt="スクリーンショット 2019-01-14 23.23.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/0fc7a0e1-31b8-d0c8-a034-3336eb53db0d.png">こんなスタートだったのにいつの間にか全社が参加してくれた！
4. 採用面接時に記事を見てくれた人が居た！

# 悪かった点

1. 「いいね！」があまりつかなかった。。。
3. 記事を書くために業務時間外まで頑張ってくれた人がいた。。。
4. <img width="358" alt="スクリーンショット 2019-01-14 23.26.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/f266a952-f389-8bc7-144b-90662112e7c8.png">こんな事を執行役員が言ったのに執行役員が書いてなかった。。。
5. 採用面接時にPHPとKotlinとAWSメインだよ！って言ってるのにそれ系の記事が皆無だった。。。

# 今後も続けようと思ったこと

+ 今回、書いてもらうときの案内は基本的に「書いてね〜」って感じで自主性に任せてみました
    + いざと慣れば２５記事僕が埋めるつもりでした
+ しかし思ったよりも皆書いてくれたのはとても嬉しかったので、、、
+ <img width="560" alt="スクリーンショット 2019-01-14 23.30.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/59f6a7a5-03f1-5fcd-02d9-a46c394e06f9.png">
+ 色んな理由つけてギフト券送ってしまいました。個人的に！
+ <img width="182" alt="スクリーンショット 2019-01-14 23.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/ee6eeb70-0dc8-8ff6-2c24-258be9393bc5.png">
+ 「送ったよ〜」の後のリアクションが薄かったので、次回は多分金額下がりますｗ
+ 今回は予想外過ぎて予算取るのを忘れていたので個人的に送りましたが、次回は期待以上の成果を出してくれた人には頑張って予算とって会社として何か用意したいなと思ってます！
Ansible の git module が "Permission denied (publickey)." となった

## 前提
- ssh forward agent によってリモートでローカルの鍵を使用している
- git module の `become: true` にしたところこのエラーが発生した(外すと通常通りcloneできる)。

## 対応前
エラー発生時のコード

```ini:ansible.cfg
[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

```gitclone.yml
---
- hosts: all
  tasks:
    - name: Install git
      become: true
      apt:
        name: git
    - name: Clone
      git: >
        repo=<GIT_REPO>
        dest="<DIR>"
        accept_hostkey=true
      become: true
```

以下のようなエラーが起こる

```:error
Cloning into '<DIR>'...
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

## 対応後

`ansible.cfg`に `sudo_flags`の設定を加えると動作する。

```ini:ansible.cfg
[defaults]
transport = ssh
sudo_flags = -HEs

[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

## 参考
[Ansible и Git Permission denied (publickey) в Git Clone - Qaru](http://qaru.site/questions/1655410/ansible-and-git-permission-denied-publickey-at-git-clone)
YOLO(You Only Look Once )をざっくばらんに説明する②

次の記事の続きです．
YOLO(You Only Look Once )をざっくばらんに説明する①
https://qiita.com/NoriakiOshita/items/cbd122cbb4bcd6286f12

前回の記事ではバウンディングボックスについて曖昧に書いていましたので，本記事ではその補足記事です．

まず、画像をS×S分割したひとつひとつの要素をセルと呼びます．

####目的
1.各セルがどのオブジェクトに属しているかを推定することです.
2.1を行ったあとは信頼スコアをIoUによって計算してバウンディングボックスをオブジェクトにつき一つにします．(前記事参照．)

####具体的方法

まず画像から沢山のバウンディングボックスが検出されます．
ですが一つのオブジェクトにはひとつのバウンディングボックスのみ表示したいです．
これを信頼スコアを用いて一つにします．(これをNMSなどと呼びます．)

各セルはのCの条件付きクラス確率$Pr（Class_i | Object）$も予測します。これらの確率は、オブジェクトを含むセルに基づいて調整されます。

各バウンディングボックスは5つの要素を含みます矩形領域のためのx, y, w, h,と信頼度です．

<img width="493" alt="スクリーンショット 2019-01-14 22.58.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/a96bbbb8-2e57-0132-cd16-3f3f02ae1018.png">
図1．　参考文献[1]から


この情報を用いて損失関数を最小化します．
<img width="450" alt="スクリーンショット 2019-01-14 23.31.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/fdc5db5b-bb54-33ea-ca30-f59d2c6b835f.png">
図2.　参考文献[1]から


参考文献
[1]「You Only Look Once:Unified, Real-Time Object Detection」
https://arxiv.org/pdf/1506.02640.pdf
はじめてのGOLD「JDBC」

## JDBC
java SE8 GOLDの範囲であるところの「JDBC」についてのまとめを試みます！

「JDBC」とは、javaから様々なデータベースにアクセスできるようにするための仕組み、いわゆるインターフェースです。

silverの時にも学んだ「多態性」をデータベースにも適用しているというわけです。

つまりこれがあると何ができるのかというと、Oracle,MySQL,PostgreSQL...ほかに思いつかないですけど(無知)
JDBCを用意することで、これらのデータベースに__１行で接続できる__ようになります。

## 使い方
まず必要なものはこちらです。
__・JDBCドライバ__
以上です。
それから、ここではEclipse,MySQLで行うものとします。

#### JDBCドライバ
「jdbcドライバ　[使いたいデータベース名]」で検索すると出てきます。
自分の使うデータベースに応じたものをダウンロードします。

ダウンロードしたものを開くと、JARファイルが入っています。
(mysqlだと「mysql-connector-java-〇〇.jar」です。)
これがJDBCドライバの本体です。

適当に置いておいたままではjavaはこれがどこにあるのかわかりません。
なので色々なメッセージで「これはどこにあるのだ」と訴えてきます。
Eclipseで実行するにも、設定が必要です。

`プロジェクトを右クリック → [プロパティ] → [Javaのビルドパス] → [ライブラリー]タブ →　[外部JARの追加]`

この手順で、自分が先ほどダウンロードしたJARファイルを指定します。

#### No Suitable Driver found for ...
こんなエラーを出す場合があります。
これがつまり、上の「これはどこにあるのだ」という状態です。

ちょっと話は逸れますが、サーブレットでの実行時は上記の設定では足りません。
足りない、というよりも、JARファイルの置き場所に注意が必要になります。
`[WEB-INF/lib]`この直下にJARファイルを配備します。

#### 書き方
Eclipseでプロジェクト、パッケージ、クラスを作成して、いざ書いてみます。

~~~java
String jdbc = "jdbc:mysql://localhost/test_db?serverTimezone=JST";
// jdbc:(データベース名)://localhost/(スキーマ名)?(タイムゾーン情報)
~~~

まずはこれです。
後に書くConnectionクラスを使う際にjdbcの居場所をこれで特定します。

~~~java
try(Connection con = DriverManager.getConnection(jdbc,"root","pass");
    Statement statement = con.createStatement();
    ResultSet resultSet = statement.executeQuery(sql)){
~~~

try-with-resouece文の途中です。
jdbc関連はSQLExceptionを投げますので、tryで囲んでいます。

Connectionオブジェクトを使って接続しています。
`getConnection()`の引数は、
１．JDBCドライバの情報
２．データベースのユーザー名
３．パスワード（データベース作成時に設定したもの）
となっています。

この接続を使って、StatementオブジェクトにSQL文を受け取る準備をさせます。

３行目にてついにSQL文を実行しています。
ResultSetは読んで字のごとく"結果セット"です。
`executeQuery()`はSELECT文の結果を受け取ることができます。まとめてゴソっと入ってくるので、これを後で取り出しましょう。

そして、開いた接続は閉じねばなりません。
本来であれば各クラスにある`close()`で閉じてあげるのですが、try-with-resouce文で解放してあげれば問題ありません。

~~~java
while(resultSet.next()){
    System.out.println(resultSet.getString(2));
}
~~~

どんなSQL文を投げたかによりますが、これは結果セットを取り扱っている文の一例です。

まず１行目の`next()`はResultSetクラスのメソッドです。これは、届いた結果セットの「次の行」へ移ります。
１回目であれば「１行目」を見てくれます。２回目以降は、一行ずつ進んでいってくれます。便利ですね。
IteratorのhasNext()と似たような働きをしてくれます。
ここでは、行がある限り処理を行ってくれます。

ちなみにここでは`SELECT * FROM human`というSQLを投げることとしました。
`humanテーブル`には複数のカラムがありますが、___２番目___に`name`というカラムがあるとします。このカラムは文字列のデータが入っているので、___String___で受け取ることができます。
故に、ここでは___`getString(2)`___となります。
もちろん、受け取るデータ型とメソッドが合っていなければデータを受け取ることができません。
それぞれのデータ型に応じてメソッドは用意されていますので、適宜使い分けていきます。`getObject()`で受け取ってからjava上で振り分けていくこともできます。
また、getXX()の引数の整数ですが、これは補足しておくと"結果セットのカラムのインデックス"です。今回はカラムの指定をしていないので、２番目のカラムということで`getString(2)`としました。
ですが、もしSQLが`SELECT name FROM human`だった場合、nameしかありませんからこの数字は"1"になります。
（０から数えません。１が始まりです。注意です。）
ksnctf 24 Rights out 100pt

#問題

https://ksnctf.sweetduet.info/problem/24

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/aa83b9b7-b058-6738-28de-d0a592f4262f.png)

#解いてみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/72e45ce8-f95e-db70-175d-1e915a35b784.png)

とのこと。

exeファイルをダウンロードして、実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ff398039-22e7-d809-005f-c13c083b3158.png)

ボタン押すと十字部分が反転するゲーム。昔よくありましたよね。
全部反転すればいいゲームですが、問題文にあった通り、ゲームの内容は関係なさそうなので、いったん無視します。

BinText使って文字列を探してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b9783ca4-3bcd-de4f-7f52-08f0642aba38.png)

FLAGで検索してみましたが、該当せず。

TrIDを使って何でコンパイルされたか確認します。
と思ったら32bitでしか動かないっぽくて、ダブルクリックしても画面が出てこない。
Web上でできるようになってたので、やってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fb01e0c2-532d-9ce3-7f28-246a00bd889b.png)

.NETって書いてあるし、ソースに戻せるかもしれません。
ILSpyを使ってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5122d92c-d14d-b801-c1c2-e57d3bfa3f6a.png)

ソースが戻せました。
どうやらC#だったみたいです。

右のソースをささっと呼んでいると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6501c857-5150-c91f-edce-bbb2102a81c7.png)


というところがありました。
ここの処理を読み解けばflagにたどり着けそうな雰囲気満載です。
intをxorしてcharに変換している処理がありました。
読み解くのは大変なので、Ideone.comでこの関数だけ動かします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/bd6ed1b3-e07c-d873-293f-c9fc788e97fa.png)

出ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3d98022d-a4e3-716d-1e81-57b6b08c67a0.png)

元のゲームを頑張ってみましたが、解けません。。。
攻略法あるのかしら。
【Rails】Ajaxでビューのロード後に追加した要素を発火させる方法【Ajax】

現在プログラミングスクールでチャットアプリを作成中。目下ajaxについて勉強しています。

今回は、ビューのローディング時に存在していない要素をajaxで追加したあと、その要素をクリックした時に発火させたい場合どうするかについて書きます。

例えばhamlで

```
#user-search-result
```

とidをつけたところに子要素としてajaxで

```
  function buildHTML(user) {
    var html =`<div class="chat-group-user clearfix">
                  <p class="chat-group-user__name">${user.name}</p>
                  <a class="user-search-add chat-group-user__btn chat-group-user__btn--add" data-user-id="${user.id}" data-user-name="${user.name}">追加</a>
                </div>`
    return html;
  }

（中略）

    .done(function(data) {
      $('#user-search-result').empty();
      if (data.length !==0) {
        data.forEach(function(data){
          var html = buildHTML(data);
          $('#user-search-result').append(html)
        });
      }
    })
```
というようにhtmlの記述を差し込んだとします。

ここでhtmlの「追加」ボタンを押したらイベントが発火する仕様にしたい場合、

```
  $(".chat-group-user .user-search-add").on("click",function() {処理});
```
としても、このhtmlはロードした後に差し込んだものなので上手く動きません。

このような場合、元からビューに存在していた、親要素である

```
#user-search-result
```
を引数として取って

```
  $("#user-search-result").on("click",".chat-group-user .user-search-add",function() {
  });
```

と書くと想定通りの動きをするようになります。

以上、拙い内容でしたがご参考まで。