OmniAICreator/Qiita-1.07M huggingface dataset:
住所から郵便番号を検索するものをKnockout.jsで作った

#はじめに
APIからどうやったらJSONを引っ張ってきて、それをごにょごにょできるか試すために作りました。

郵便番号検索に使ったAPI
https://zipcoda.net/

サンプルサイトはここ
http://ayama.main.jp/Post-code.html

#コード
```HTML:HTML(Mainのみ)
<main>
    <form>
        <div class="addressInput">
            <input id="address" type="text" data-bind="value: address" placeholder="例）東京都千代田区永田町" />
            <button type="button" id="search" data-bind="click: searchPostCode">検索</button>
        </div>
        <div>
            <fieldset class="primaryPostCode">
                <legend>入力した住所の郵便番号</legend>
                <div data-bind="text: primaryPostCode()"></div>
            </fieldset>
        </div>
    </form>
</main>
```
```HTML:Javascript(ViewModelのみ)
$(document).ready(function () {
    postCodeviewModel = (function () {
        var postCodeviewModel = function (initData) {
            var self = this;

            self.address = ko.observable();
            self.primaryPostCode = ko.observable();

            $("input").on("keydown", function (e) {
                if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
                    return false;
                } else {
                    return true;
                }
            });
        }

        postCodeviewModel.prototype.searchPostCode = function () {
            var self = this;

            $.ajax({
                url: "http://zipcoda.net/api",
                dataType: "jsonp",
                data: {
                    address: self.address()
                }
            })
            .then(function (data) {
                self.primaryPostCode(data.items[0].zipcode);
            })
        }

        return postCodeviewModel;
    }());
}());
```

#課題
* レスポンシブ対応を一応やったけど、知識不足感がある
* 最終的にJQueryだけでいいじゃんてものになったので、最初にちゃんと要件固めて、それに見合ったフレームワークを選定する力があるといいのかもしれない
* （デザインがださい）
GASでhangouts chatのbotを作ってみる

google謹製のチャットツール、hangouts chatのbotを作成してみたメモです。

[公式チュートリアル](https://developers.google.com/hangouts/chat/quickstart/apps-script-bot)があるので、これに沿ってbotを作成・公開してみます。

## bot本体を作成する

[最低限の機能を持ったテンプレート](https://script.google.com/create?template=hangoutsChat)が用意されています。これを開き、自分のドライブに適当な名前で保存します。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/287153/7c5fc25b-89cd-0cf9-e368-18ff62f3a5eb.png)

ひとまずbotそのものはこれで完成です。機能を実装する際は、ここに保存したコードを改修していきます。

## botをGoogle Cloud Platformで公開する

メニューから「公開」⇒「マニフェストから配置」を選択します。

Latest Version (HEAD)の「Get Id」から配置IDが取得できるので、メモ帳にでもコピペしておきます。

メニューから「リソース」⇒「Cloud Platform プロジェクト」を選択します。

プロジェクト名と一意なIDが書かれているリンクから、Google Cloud Platformのダッシュボードに飛びます。

メニューから「APIとサービス」⇒「ライブラリ」に移動し、Hangouts Chat APIを有効化します。

Hangouts Chat APIの設定を開き、必要事項を入力していきます。
「変更を保存」で保存すれば公開完了です。

#### ボット名
適当な名前を入力します。botを追加する際は、この名前で検索することになります。

#### アバターのURL
チャットのアイコンを設定します。httpsで公開されているURLである必要があるみたいです。
アイコンを用意していない場合は、[chatのアイコン](https://goo.gl/yKKjbw)を借りましょう。

#### 説明
適当に入力します。

#### 機能
複数メンバーのルームに投入して動かしたい場合は「ボットはルーム内で機能します」
DM(一対一)のチャットで動かしたい場合は「ボットはダイレクトメッセージ内で機能します」
にチェックを入れます。

#### 接続設定
Apps Script projectを選択し、さきほどコピペしておいた配置IDを貼り付けます。

#### 権限
「ドメイン内の特定のユーザーとグループ」を選択し、ひとまず自身のメールアドレスを入力します。ほかの人に使ってほしい場合は該当のメールアドレスも入力しましょう。

## botを使ってみる

Chatで「ユーザー、チャットルーム、botを検索」から、設定したボット名で検索します。
リストに出てきたbotの「メッセージ」を押下すれば、botの追加は完了です。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/287153/d7297de1-2471-2cbc-2f47-218a8e67f0ca.png)

話しかけると、「You said "話しかけた内容"」と返してくれます。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/287153/0eb9f9e7-1e9c-bd13-2566-d3afca6cafa0.png)

## 返信内容を変えてみる

せっかくなので、返信処理をちょっとだけいじってみます。
作成したプロジェクトの中に、`onMessage(event)`という関数があり、これがメッセージを受け取る処理になります。
送られてきたメッセージは、`event.message.text`で取得でき、`{"text":"返信したいテキスト"}` をreturnすればメッセージを返信できそうです。

```javascript
function onMessage(event) {
  var said = event.message.text;
  var msg = "";
  if (said === "ズン") {
    msg = "ズンズン";
  } else if (said === "ズンドコ") {
    msg = "＼き！よ！し！／";
  } else {
    msg = "えっ？";
  }
  return { "text": msg };
}
```

こんな感じで動きます。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/287153/7eda26f3-7c48-c7b5-39f1-94709fa227d7.png)


## まとめ
botというと、「rubyやPythonで書いて、サーバ借りて、プログラム置いて…」
というイメージがあったのですが、GASとGCPを利用することでかなりお手軽にbotを構築できました。
その他のgoogle系APIとも連携が容易そうなので、google系のツールを多用している環境ではかなりパワーを発揮しそうです。
basenameコマンドの使い方（fileの抽出方法）


basenameはファイル名やディレクトリパスを利用してファイル名やディレクトリ名を抽出するコマンド。拡張子を抽出しないことも可能。

##挙動

###ファイルをとりだす
```
$basename path_name 
```

####例
```
$basename User_name/Desktop/projects/file.xml
```
###拡張子なしのファイルをとりだす

```
$basename path_name extension_name
```
####例
```
$basename User_name/Desktop/projects/file.xml .xml
```

つまり、拡張子を取り出したくない場合は、拡張子を語尾にかく！


動作原理としては、パスの一番右の部分を抽出している。

以上です:)
要素の途中から表示・非表示を切り替える

##最初に
テーブル要素の特定行までは初期表示、以降は初期は非表示とし、ボタン押下で表示・非表示を切り替えるといった要件があったので、考えた結果をメモしておく。
今回はテーブル要素でやっているが、恐らく別の要素にも適用可能と思う。
＃他にやり方はあるんだと思いますが、与えられた環境等等の制限の中で考えた結果として受け止めて頂ければ幸い。。

##まずは
まず、**対象の要素（ここではテーブル要素）を囲むDiv要素**を用意、このDivに**position:relative**を適用しておく。
ロード完了後（window.onload等、テーブルを描画後）に**テーブル全体の高さを保持**しておく。（フィールド変数なりなんなりで）
保持後、対象の要素に**height:特定の高さ、overflow-y:hidden**を適用する。（position:relativeと併せてクラス化しておき、クラス適用するのがよい）
これで**初期表示で特定の高さまで表示し、以降を非表示の状態**にできた。

##続いて
あとはボタンに**onclick**時の挙動を設定する。
テーブルに非表示の領域がある場合（判定方法は色々と考えられるので各位好きな方法で）、表示処理としてjQueryの**animate()**を使う。
animate()は第一引数に指定したスタイルに第二引数に指定した時間（ミリ秒）をかけて変化させるもの。
スタイルとして**height:保持したテーブル全体の高さ**を指定することで、全体を表示できる。
また、非表示の際は**height:特定の高さ**に戻してあげる。
ここで、高さの指定を%指定で100%にすれば元の高さに戻せるのでは？と思うかもしれない。
**animate()は何故か%指定するとアニメーションなしで100%の高さになる。。。**
**このため、テーブルの全体の高さを保持する必要がある。**

##コード
実際のコードを以下に示す。
また、動作するサンプルをcodepenに作成したので、最後のURLを参照。

```html:html
<div id="toggle">
  <table>
    <thead>
      <tr>
        <th>行数</th>
        <th>項目１</th>
        <th>項目２</th>
        <th>項目３</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>１</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>２</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>３</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>４</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>５</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>６</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>７</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>８</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>９</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
      <tr>
        <td>１０</td>
        <td>値１</td>
        <td>値２</td>
        <td>値３</td>
      </tr>
    </tbody>
    </div>
  <div>
    <button>表示</button>
  </div>
```

```css:css
div {
  position:relative;
}
table td, table th {
  border-style: solid;
}
th {
  background-color: #FAB
}
button {
  position: relative;
}
div#toggle.toggle {
  position:relative;
  height: 230px;
  overflow-y: hidden;
}
```

```javascript:javascript
let origin_height = 0;
$(window).on("load",function(){
  origin_height = $("div#toggle").height();
  $("div#toggle").addClass("toggle");
  $("button").on("click", function(){
    if (origin_height > $("div#toggle").height()) {
      $("div#toggle").animate({height:origin_height}, 500);
      $(this).text("非表示");
    } else {
      $("div#toggle").animate({height:"230"}, 500);
      $(this).text("表示");
    }
  });
});
```
動作サンプル
https://codepen.io/anon/pen/ajWyKM
[VisualStudio] よく書くコードはスニペットにまとめて爆速コーディング

スニペットを作ったらコーディングが捗ったという内容


# スニペットとは？
コードの断片
任意のテンプレートを一瞬で呼び出せる機能
VisualStudioには最初からいくつか登録されている


# 作り方
[**Visual Studio Snippet Generator**](http://tools.unitycoder.com/VisualStudioSnippetsGenerator/)
スニペットを簡単に作れるサイト

## 項目について
| 項目        | 内容                        |
|:------------|:---------------------------|
| Shortcut    | スニペットを出すのに使う文字  |
| Description | スニペットについての説明      |
| Author      | 作成者                      |
| Code        | 召喚するコード               |

## 手順
### 作成の手順
1. 項目を埋める
2. Generateを押す
3. 下にスニペットが出力されたのを確認する
4. Downloadを押す

### VisualStudioに追加する手順
1. ツールを選ぶ
2. コードスニペットマネージャーを選ぶ
3. コードスニペットマネージャーのインポートを押す
4. ダウンロードしたスニペットを選択する
5. 完了を押す


# 実際に使ってみる
自分の設定したショートカット文字を入力してTabを2回押す
![interpolate.gif](https://qiita-image-store.s3.amazonaws.com/0/270131/8f08db6f-8006-4ea1-1aa3-ebd883e97e0b.gif)
**<font color="Red">と</font><font color="Orange">て</font><font color="Gold">も</font><font color="Green">便</font><font color="Blue">利</font><font color="Purple">！</font>**

※出てこない人
ツール->オプション->テキストエディター->C#->IntelliSense->スニペットの動作 から好きな設定を選ぶ

# いくつか便利なスニペット紹介

```c#:いつも使うコメント
//====================
//  $end$
//====================
```

```c#:ちょっと見た目を変えたコメント
//********************
//  $end$
//********************
```

```c#:Doxygenコメント
/** 
 * @param $end$
 */
```

```c#:パリピコメント
//☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
//  $end$
//☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
```

```c#:女子力コメント
//ﾟ+｡*ﾟ+｡｡+ﾟ*｡+ﾟ ﾟ+｡*ﾟ+｡｡+ﾟ*｡+ﾟ ﾟ+｡*
//  $end$
//ﾟ+｡*ﾟ+｡｡+ﾟ*｡+ﾟ ﾟ+｡*ﾟ+｡｡+ﾟ*｡+ﾟ ﾟ+｡*
```

# まとめ
みんなも使おう！
railsでモデル（テーブル）命名の落とし穴

複数作業者との事故が起こらないようにマイグレーションを使わないでDB管理をしている故の凡ミスかもしれないが、数時間ハマったので一応記録。


記録用モデル(テーブル)でActiveRecordのクラス名を**"DataHistory"**などと命名したと想定。

他のエンジニア作業者との事故が起こらないようにmigrateをせずに運用という前提で
テーブルをSQLで直接クリエイトしてテーブル名を**"data_histrys"**などと命名してしまうと

```
Mysql2::Error: Table 'data_histories' doesn't exist: SHOW FULL FIELDS FROM `data_histories`
```

といった感じで怒られる。存在しないって、ちゃんとあるやんけ！
（ここでちゃんとエラーが指す対象をちゃんと読み解けば良かったものの、意味を理解しようとせずエラー文をそのままググっただけだったのがハマった原因ではある）



この場合、SQLのテーブル名は英文法的に**"data_histories"**としなければrails側では**"DataHistory"**クラスのモデルとしては認識してくれない。

〇　→　**"data_histories"**
✖　→　**"data_historys"**


英文法的に複数形のスペルが単純に"s"だけではない不規則な複数系単語を扱う場合は要注意。
railsの命名規則にひっかかる恐れがあります。制約へのこだわり強すぎる・・・。

こんな事態は中学英語すら苦手な日本人エンジニアくらいしか当てはまらないとは思いますが・・・
CDNのjsやcssをさくっと１ファイルにまとめて高速化するblade拡張

````html
@mixmix
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css"
      integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
<link href="/css/styles.css?{{time()}}" rel="stylesheet">
<link href="/css/animate.css" rel="stylesheet" type="text/css">
<link href="/css/main.css" rel="stylesheet" type="text/css">
@endmixmix
````

こんな感じに書いておくと

```html
<link href="/storage/mixmix/3627482dd6bd4907389e0c1fcbfce6d0.css?1537641502" rel="stylesheet" type="text/css">
```

こんな感じに、さくっとまとめてローカルファイル化して高速化してくれる `@mixmix` ディレクティブの実装手順です。

# 実装手順

@mikkame さんの助けにより、packagist からインストールできるようになりました。
@mikkame さんありがとうございます！渋谷にいらっしゃったら飯おごります

https://packagist.org/packages/prexlab/laravel_mixmix

```
composer require prexlab/laravel_mixmix
php artisan storage:link
```


## 仕様

- ローカル環境（`APP_ENV=local`）ではまとめません。リモート環境でだけでまとめます。
- ?FORCE_MIXMIX=1 とすると、ローカルでもリモートでも、最新のmixmixファイルを生成します 
- fontawesomeみたいに、内部で相対リンクで `@import`してると動かなくなります。 `@mixmix`の外においてください。
言語別にバブルソートをプログラムしてみた

同じ題材でプログラムしたら文法の違いがどんな感じなるか気になったので簡単なプログラムを作成して比較できるようにして見ました。
記述の仕方は言語ごとに特徴があるが、forとifの共通の制御文を使用し、入れ替え処理が同じになる結果となりました。
言語はシステム開発のツールと考えていたのを改めて実感しました。

##PHP

```php
$dt = array(7,5,9,6,2,4,1,3,8);
for($i = 0; count($dt) > $i; $i++){
    foreach($dt as $k=>$v){
        $set_k = $k + 1;
        if(isset($dt[$set_k]) && $v > $dt[$set_k]){
            $tmp = $dt[$set_k];
            $dt[$set_k] = $dt[$k];
            $dt[$k] = $tmp;
        }
    }
}
```


##Java

```java
int dt[] = {7,5,9,6,2,4,1,3,8};
for(int i = 0;dt.length - 1 > i;i++){
    for(int j = 0;dt.length - 1 > j;j++){
        int k = j + 1;
        if(dt[j] > dt[k]){
            int tmp = dt[k];
            dt[k] = dt[j];
            dt[j] = tmp;
        }
    }
}
```

##JavaScript

```javascript
let dt = [7,5,9,6,2,4,1,3,8];
for(let i = 0;dt.length - 1 > i;i++){
    for(let j = 0;dt.length - 1 > j;j++){
        let k = j + 1;
        if(dt[j] > dt[k]){
            let tmp = dt[k];
            dt[k] = dt[j];
            dt[j] = tmp;
        }
    }
}
```

##Python

```python
dt = [7,5,9,6,2,4,1,3,8]
for i in dt:
    for j in dt:
        k = dt.index(j) + 1
        if len(dt) > k and j > dt[k]:
            tmp = dt[k]
            dt[k] = j
            dt[dt.index(j)] = tmp
```

##Ruby

```ruby
dt = [7,5,9,6,2,4,1,3,8]
for a in dt do
    dt.map.with_index{|v,i|
        k = i + 1
        if !dt[k].nil? && v > dt[k]
            tmp = dt[k]
            dt[k] = v
            dt[i] = tmp
        end
    }
end
```
学習日誌　第二項

FizzBuzz を利用してFortranとpythonの差を計ってみた。
なおきちんとCPUやらメモリーやらを指定してはいないので、お粗末なデータとなってます。
#Fortran90
```FizzBuzz.f90
implicit none
integer i,j
integer t1, t2, t_rate, t_max, diff
call system_clock(t1)

  read(*,*) j
  do i=1,j
   if (mod(i,15)==0) then
      write(*,*)"FizzBuzz"
   else if (mod(i,3)==0) then
      write(*,*)"Fizz"
   else if (mod(i,5)==0) then
      write(*,*)"Buzz"
   else
      write(*,*) i
   end if
  end do

call system_clock(t2, t_rate, t_max)
  if ( t2 < t1 ) then
    diff = (t_max - t1) + t2 + 1
  else
    diff = t2 - t1
  end if
print "(A, F10.3)", "time it took was:", diff/dble(t_rate)
end

```
#python3.5

```FizzBuzz.py
import time
n=input()
n=int(n)
start = time.time()

for i in range(0,n+1):
    if (i%15)==0 :
        print("FizzBuzz")
    elif (i%3)==0 :
        print("Fizz")
    elif (i%5)==0 :
        print("Buzz")
    else:
        print(i)

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```
<br>
#結果

|  j の値  |Fortran　実行時間[sec] |python　実行時間[sec] |
|----------|--------------------------|----------------|
|100  |     1.281    |0.002621|
|5000|3.704|0.1030|
|9999|1.968|0.2104|
|100000000|1591|1847|


<br>
数値のブレはちょこちょこあるものの、大体こんな感じ。
1億は試行回数一回のお粗末なので、結構なブレがありそうですが、見事に逆転しました。
ビッグデータの処理ならコンパイル型の方が早いという証左かもしれない。
使い分けが一番大事ってはっきりわかんだね。
今の所言えるのは、Fortranは計算が早いけど、分類とかを早くしようとするなら少し工夫がいると思う。
そもそも一回一回表記させてるのも問題だとは思う。

以上！
Node.jsからWeb Appsの環境変数へのアクセスと接続文字列へのアクセス


[WebApps](https://azure.microsoft.com/ja-jp/services/app-service/web/)だと環境変数をアプリケーション設定の箇所に書くことができます。接続文字列という変数設定もできるのでこれらについてメモ

## 環境変数

通常のNode.jsでの環境変数アクセスは`process.env.HOGE`といった形でアクセスしますね。

WebAppsだとアプケーション設定の箇所にこんな感じで設定しておくことができます。 

↓のキャプチャでHOSTの値を使いたい場合は`process.env.HOST`

![スクリーンショット 2018-09-26 11.28.56.png](https://qiita-image-store.s3.amazonaws.com/0/35387/26823288-951f-e0c5-1c06-faa7a3a9243a.png "スクリーンショット 2018-09-26 11.28.56.png")

MySQLの設定だとこんな感じ。

```js
const config = {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
    port: 3306,
    ssl: true
};
```

## 接続文字列

基本同じなんですけど、パスワードなどの情報を扱うときは↑の画像のようにマスクかけたいところです。

接続文字列に追加しておくとこんな感じで非表示になってくれるので通常パスワードなどはこちらに入れた方が良いです。

![スクリーンショット 2018-09-26 11.34.38.png](https://qiita-image-store.s3.amazonaws.com/0/35387/27420ffc-3c40-16bd-423f-261f60c03964.png "スクリーンショット 2018-09-26 11.34.38.png")

MySQLや他のDBMSを選択できますが今回はMySQLにしました。
この場合は`MYSQLCONNSTR_`という接頭辞で環境変数が設定されます。以下のような形で利用できます。

```js
const config = {
    host: process.env.MYSQLCONNSTR_DB_HOST,
    user: process.env.MYSQLCONNSTR_DB_USER,
    password: process.env.MYSQLCONNSTR_DB_PASS,
    database: process.env.MYSQLCONNSTR_DB_NAME,
    port: 3306,
    ssl: true
};
```

他のDBMSを選択した際については[Azure Web Appsで、DBへの接続文字列をコードから分離する](http://www.atmarkit.co.jp/ait/articles/1706/05/news021.html)の記事などを見るとアクセス方法が分かります。

## だいたいまとめてる

ローカルで.envなど使ってる時でも使いたいのでこんな感じのが多いかも

```
const config = {
    host: process.env.DB_HOST || process.env.MYSQLCONNSTR_DB_HOST,
    user: process.env.DB_USER || process.env.MYSQLCONNSTR_DB_USER,
    password: process.env.DB_PASS || process.env.MYSQLCONNSTR_DB_PASS,
    database: process.env.DB_NAME || process.env.MYSQLCONNSTR_DB_NAME,
    port: 3306,
    ssl: true
};
```
Android Studio で将棋もどき作ってみる(描画についてざっくり)

# 初めに
現在進行形で作ってます、
最終目標はBluetoothを使って二人で対戦を考えてます。

# きっかけ
私事ですが今ファイアー*ムブレムにハマってまして、それがどんな処理になっているんだろう？作ってみたい！
と思い作り始めました。

# 動作環境
android 6.0 以上 ムズカシイ仕組みは使っていないので動くはず。

# 基本設計
SurfaceViewを継承してGameViewを作成してます、主に(メインループや描画などはDixqさんの[Androidの館](https://dixq.net/Android/)の「ゲーム イライラ棒アプリ作成」を参考にさせて頂いてます)
処理ごとにファイルを分けて書いてるのでデバッグがラクです。

# 配置されたユニットの描画について
あまりこういった戦略ゲーム(マスのユニットを進めていくゲーム)の製作記事がないので大変でした。
自軍ユニットは**PlayerPieceList**(ArrayList)を使用して管理、そのインデックスを**charMap[][]**に代入してイベントが発生したら**charMap[][]**をもとに**PlayerPieceList**を参照するようにしてます、
敵軍ユニットは別に**EnemyPieceList**(ArrayList)を、用意してそのときに敵軍は**インデックス + 200**で**charMap[][]**に代入して区別するようにしてます。

さらに職種に応じた画像を出すために**JobMap[][]**を用意して職種に応じた値を代入してます。
描画時にそれを参照して職種に合わせた画像を表示させます。

BtlCtrlにPlayerPieceList、EnemyPieceListが入ってます
一部抜粋

```ruby:DrawPiece.java
@Override
    public void OnDraw(Canvas c) {
        int x, y;

        cnt++;
        //jobMapをもとにキャラを描画する
        for (x = 0; x < Map.Inst().mapSizeX; x++) {
            for (y = 0; y < Map.Inst().mapSizeY; y++) {

                //jobMapをもとにキャラを描画
                if (Map.Inst().charMap[x][y] >= 200) { //200より大きければ敵
                    if (Map.Inst().jobMap[x][y] == 1) { //敵剣士
                        //if(BtlCtrl.Inst().PlayerPieceList.get(Map.Inst().charMap[x][y])
                        //c.drawBitmap(image.enemySword[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[x][y] - 1 - 200).heading], image.rowSize * x, image.rowSize * y, paint);
                        if (cnt < 30) {
                            EnemyDraw(image.enemySword, x, y, 0, c, paint);
                        } else if (cnt < 60) {
                            EnemyDraw(image.enemySword, x, y, 1, c, paint);
                        } else {
                            EnemyDraw(image.enemySword, x, y, 0, c, paint);
                            cnt = 0;
                        }

public void EnemyDraw(Bitmap img[], int posX, int posY, int leg, Canvas c, Paint p){
            if(leg == 1){
                c.drawBitmap(img[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[posX][posY] - 200).heading + 1], (image.rowSize * posX) + Global.Inst().mapScrollX, (image.rowSize * posY) + Global.Inst().mapScrollY, p);
            }else{
                c.drawBitmap(img[BtlCtrl.Inst().EnemyPieceList.get(Map.Inst().charMap[posX][posY] - 200).heading - 1], (image.rowSize * posX) + Global.Inst().mapScrollX, (image.rowSize * posY) + Global.Inst().mapScrollY, p);
    
            }
        }


```
EnemyDrawのインデントがずれてしまった。。。

# スクリーンショット
![Screenshot_20180926-101725.jpg](https://qiita-image-store.s3.amazonaws.com/0/266954/5ee48894-a2b9-52d3-e2c3-6e93dd68b610.jpeg)
表示されているメニューについても次回書こうと思ってます。

# 引っかかったところ
Androidではdpiの関係で画像を自動で拡大縮小するみたいで64*64ピクセルの画像を用意してもAndroid上では変わってしまうので必要な時に.GetWidthで画像サイズを取得して解決しました。


#参考にさせて頂いたサイト
[Androidの館](https://dixq.net/Android/)「ゲーム イライラ棒アプリ作成」

#終わりに
ぼちぼちLightning Talksっぽく書いていこうと思います。
下手な文章ですが最後まで読んでいただきありがとうございます。
CentOS7.5にdnfをインストールする

#dnfとは？
yumの後継となるパッケージマネージャー。
Fedora18から試験運用されており、Fedora22でデフォルトのパッケージ管理ツールとされている。

[dnfのwiki](https://ja.wikipedia.org/wiki/DNF_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))

#yumとの違い
yumはPython2.xで動作（Python3.Xではエラー）
dnfはPython3.Xでも動作する



#インストール

```
yum -y install wget
yum -y install epel-release
yum -y install dnf
(これでインストールできなければ以下)
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm
yum install python-dnf-0.6.4-2.sdl7.noarch.rpm dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm

```

#確認
yumのオプションは引き継いでいるので同じ使い方でOK

```
dnf -y install httpd
dnf remove httpd
```
#まとめ
近い内にはyumは無くならないだろうけど来る日に備えときましょう。
（ドキュメントとかとか）
OneDriveのExcelファイルをPDF化する

履歴書をOneDriveで作っているのですが、OneDriveのExcelOnlineで作ったファイルをPDF化するのに毎回迷っているのでメモしておきます。


## PDFにしたいEcxelファイルを作成する
そのまんまです

## ファイルが完成したら「メニュータブ」の「ファイル」から「印刷」を選択
「名前をつけて保存」ではなく「印刷」のほうを選択します。

## こんなダイアログが出てきます。
<img width="543" alt="スクリーンショット 2018-09-26 11.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/231072/55101ff4-5eda-0088-879b-03373859903b.png">

ここで「印刷」ボタンをクリックするとPDFファイルがダウンロードされます。

Wordは「名前をつけて保存 > PDFとして保存」できるのですが、なぜかExcelの場合は「印刷」を選択しないとPDF化できません。

…わかるかよ！

前にもやったはずなのですが忘れていて手間取ったのでメモしておくことにしました。Excel持ってない人は参考にしてみてください。
TeamSQL もいいけど、 DBeaver もいいぞ

[TeamSQL](https://qiita.com/shunichi_com/items/b07ae8c678aa7c0e2ff6) のエントリが話題ですが、 [DBeaver](https://dbeaver.io) の知名度がイマイチ低いのでご紹介。

2019/10/23追記
[dbcli](https://qiita.com/nanasess/items/f985e3d6250247aaa03c) のエントリも書いたのでぜひご覧ください！

## DBeaver
![logo](https://dbeaver.io/wp-content/uploads/2015/09/beaver-head.png)

![screen1](https://dbeaver.io/wp-content/uploads/2018/03/data_edit.png)

マルチプラットフォーム対応のデータベースGUIツールで MySQL, PostgreSQL, MariaDB, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Derby など、多くのデータベースに対応しています。
Enterprise Edition では MongoDB, InfluxDB, Apache Cassandra, Redis, Apache Hive など NoSQL / BigData database にも対応しています。

開発もとても活発で、月2回くらいのペースで新バージョンがリリースされています。


### SQLエディタ
![screen](https://dbeaver.io/wp-content/uploads/2018/03/sql_script.png)

### ER図の自動生成
![screen2](https://dbeaver.io/wp-content/uploads/2018/03/erd.png)

### 日本人にも優しい多言語対応

<img width="1284" alt="スクリーンショット 2018-09-26 11.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/40662/313f8397-bc2a-471d-bfe2-c50383acb787.png">

複数行にわたるテキストを、インラインで直接編集できるのが個人的に重宝しています。

### 結果セットのエクスポート

<img width="1256" alt="スクリーンショット 2018-09-26 11.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/40662/c6de4acf-ab58-3cd1-a858-60cdd06211ae.png">

SQLの結果を CSV, DbUnit XML, HTML, JSON, SQL INSERT, XML, Markdown などの形式にエクスポートできます。 Enterprise Edition なら Excel 形式にもエクスポートできます。

### 信頼の実績

無料の Community Edition でも十分すぎる機能ですが、 Enterprise Edition は [IBM, Apple, Amazon, SAP, Disney などの企業でも使われているそうです](https://dbeaver.com/clients/)
WindowsからmacOSへVNCでアクセスしたときのキーアサイン

|Windows10での入力||Macでの出力| |
|:--:|:--|:--:|:--|
| : |コロン| + |プラス|
| @ |アットマーク| " |ダブルクォーテーション|
| [ |開き角カッコ| @ |アットマーク|
| ] |閉じ角カッコ| [ |開き角カッコ|
| \ |(スラッシュの右)| - |ハイフン|
| _ |アンダーバー(SHIFT+スラッシュの右)| = |イコール|
| \ |バックスラッシュ(^ の右)| ] |閉じ角カッコ|
| " |ダブルクォーテーション(SHIFT+2)| * |アスタリスク|
| ( |開き丸カッコ| ) |閉じ丸カッコ|
| ) |閉じ丸カッコ| 0 |数字の 0 |
| { |開き中カッコ| ` |バッククォーテーション |
| } |閉じ中カッコ| { |開き中カッコ |
| ｜ |縦棒| } |閉じ中カッコ|

現状、: (コロン)と開き丸カッコを入力する手段がない。
厳密等価演算子(===)について改めて調べてみた

長らくjavascriptに触れてきたものの、**等価演算子(==)**と**厳密等価演算子(===)**の違いをなんとなくほわんとしたイメージで捉えてしまっていたので、今更ながら再確認。


##空文字('') == 0 の結果は？

再確認のきっかけとなったのが上記の式の結果。

```javascript
var kara = '';
kara == 0;	// true
```

上記の結果に**false**を期待していたので**「あれ？」**となった。
結論からいくと、falseを期待する場合は演算子を等価演算子ではなく**厳密等価演算子**を使えばよい。

```javascript
kara === 0;	// false
```

これは、厳密等価演算子が**型と内容を厳密に判定**するため。

等価演算子は両辺の型を解釈し、**異なる型の場合に同じ型に変換をしてくれる**ため、前者の判定は**true**となる。
つまり、**等価演算子**は**いい感じに型を一方に寄せて判定をしてくれる気の利いたヤツ**なのだ。

一方**厳密等価演算子**は、**余計な配慮はせずにバッサリと判定する白黒ハッキリしたヤツ**である。

**判定を行う際はこの性格の違いをよく考えて適当な方を選択する必要がある**、と改めて認識した次第。

以下、間違えやすそうな判定を思いつく限り列挙。

```javascript
'1' == 1;	// true(文字列を数値に変換後に比較される)
'1' === 1;	// false
true == 1;	// true(真偽値を数値に変換後に比較される)
true === 1;	// false
false == 0;	// true
false === 0;	// false
null == 0;	// false(型を寄せることができないのでfalse　null === 0も同様)
undefined == 0;	// false(型を寄せることができないのでfalse　undefined === 0も同様)
null == undefined;	// true
null === undefined;	// false
'1' == new String('1');	// true(右辺はオブジェクトなので、プリミティブな文字列に変換後に比較される)
'1' === new String('1');	// false
NaN == NaN;	// false
NaN === NaN;	// false(NaNの比較はいずれの場合もfalseとなるので注意)
Object.is(NaN, NaN);	// true(NaNを正確に比較したい場合、Object.is()で判定可能。IEは未対応とあるがWindows10・IE11で動作した)
Object.is(-0, +0);	// false(余談だがObject.is()は0の記号違いも異なると解釈する)
```

両演算子の判定について詳細な説明は以下を参照。

等価演算子の判定アルゴリズム
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

厳密等価演算子の判定アルゴリズム
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6
Swap使用プロセスの確認

こういうのはいくらでも書いている方がいますが、自分のための備忘録。

```bash:Swap使用プロセスを確認するコマンド
$ grep VmSwap /proc/*/status | sort -k 2 -nr | head | cut -d"/" -f3 | grep -e '^[0-9]*$' | xargs -I{} ps u -p{} --no-headers
```

swap使用プロセスTOP10を表示します。
お好みでheadの後ろに"-[表示したいプロセス数]"を入れて表示数を調整。

clamavのフルスキャンがswapバカ食いしてる上にスキャン時間かかりすぎ感があることが確認できました。
CPUも100%張り付きですわ…
もう知らんわ…
CatBoostのチューニングについてまとめ（ただの訳）

## CatBoostとは

勾配ブースティング木モデルの1種

[公式](https://tech.yandex.com/catboost/doc/dg/concepts/parameter-tuning-docpage/)の訳＋αを備忘録的にまとめる。


## CatBoostモデルのチューニング

### One-hot-encoding

前処理の段階ではやるなというのが公式の指示。何よりも先に説明するあたり重要そうだ。
categorical featuresについては、ちゃんと設定しないとよいスコアがないらしいい
参照：https://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db

一意の値が”one_hot_max_size”で設定したint以下の特徴量についてone-hot-encodingを適用する。デフォルト値は2

### Number of trees

　他のパラメータを調整する前に優先して設定する。反復回数を大きな値に設定しつつ、オーバーフィット検出器パラメータを使用し、最良のモデルオプションをオンにして検証する。

- iterations : まず大きな数を設定しておく。
- use_best_model : Trueにしておく。評価用のeval_setがfitのパラメータとして必要になる。
- eval_metric : overfitting detection と use_bset_modelで使用する評価指標。４１種
- od_type : IncToDecIter または　Iterを設定
- od_pval : IncToDeclterの場合に使用するしきい値。10^-10～10^-2が推奨されている。値が大きいほど、過学習が早期に予防される。デフォルトは0
- od_wait : 最適な指標値に達した後、iterationを続ける数。IncToDeclterの場合、しきい値を無視して指定回数を続ける。fitしたあと、model.tree_count_で最適な木の数がわかる。

たとえば以下のようになるか。

```
import catboost

mod = catboost.CatBoostClassifier(iterations=5000,

                                  calc_feature_importance = True,

                                  use_best_model=True,

                                  eval_metric = 'Accuracy' )

mod.fit(X_train, y_train,

        cat_features=categorical_features_indices,

        eval_set=(X_validation, y_validation),

        plot=True)

print(mod.tree_count_)
```

&nbsp;

### learning_rate (float)

デフォルトは自動または0.03となる。

検証方法：
- 最後のiterationに過学習がない → Learning rateを上げる。
- 過学習している → Learning rate を下げる。

&nbsp;

### 色々試す必要があるもの

#### depth (int)

４～１０が最適になることが多い。おすすめは６～１０

#### l2_leaf_reg (int)

正則化係数。正の値のみ。これを使用するとlearning_rateが自動設定ではなくなる。

#### random_strength (float)

木構造を構築する際、どのような分割したらコスト関数をより改善するかスコアを計算することになるが、そのスコアに加える正規分布確率変数（平均0）の標準偏差乗数。過学習対策に利用できる。（アンサンブルされる木構造のランダム性があがるため？）。デフォルトは１

#### bagging_temperature (float)

ベイジアンブートストラップを使用すると（デフォルト）、訓練データをサンプリングする際にランダムな重みを割り当てることができる。bagging_temperatureのパラメータの値が「1」に設定されている場合、重みは指数分布からサンプリングされる。このパラメータの値が "0"に設定されている場合、すべての重みは1に等しくなる。パラメータは０～infの範囲で設定する。大きいほどbaggingが積極的になる。


&nbsp;

### has_time　（bool）

時系列など、データセットに順序がある場合に使用する。


## オーバーフィット検出器

オーバーフィットが発生した場合、CatBoostはトレーニングパラメータよりも早くトレーニングを停止することができる。IncToDecとIterの２つのタイプがある。

### IncToDec

改善率CurrentPValueが設定した閾値を下回ったとき、トレーニングを停止する。
CurrentPValuenの計算式はよくわからない……。


### Iter

指標最大値を得た後、更新までのイテレーション回数の猶予


&nbsp;

## トレーニングの可視化

plot=trueをパラメータにセットする。独自のビュアーやTensorBoardが使用できるほか、

jupyter notebookで使用する場合、拡張パッケージが必要

```
pip install ipywidgets

jupyter nbextension enable --py widgetsnbextension
```

jupyter labについては別の方法でipywidgetsを適用させる必要がある。
```
jupyter labextension install @jupyter-widgets/jupyterlab-manager
```
が、それでも手元ではプロットされない（断念）。


# まとめ

- まず、デフォルトのパラメータでモデルを訓練してみる。plotや自前のlearning_curveで確認しつつ、tree_count_でNumber of treesを決定。過学習の傾向があれば、learning_rateの調整へ。
- 交差検証＋検証曲線で汎化性能をチェックしながら。learning_rateを上げたり下げたり。
- 残りのパラメータをRandomsearchやHyperoptなどでまとめて調整。


## ref

- [公式](https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/)
- [パラメータ](https://tech.yandex.com/catboost/doc/dg/concepts/python-reference_parameters-list-docpage/)
タスクスケジューラーでxcopyが動かなかった話

# 概要

PC内の画像をNASにバックアップするバッチを、タスクスケジューラーで実行するようにしていたが、実は動作できていなかった。
原因はコピー先フォルダをネットワークドライブで指定していたためで、UNC形式で指定することで回避できた。

# 詳細

- NASを購入したので内臓HDDの画像をバックアップしたく、NASの共有フォルダにSドライブを割り当て、次のようなbatファイルを作成した。  
`xcopy c:\*.jp* S:\WinDesktop\C-Drive /d /i /s > .\CopyPhotoLog-C.txt`

- 手動で実行したときは問題なく動作してたので、タスクスケジューラーでデイリーバックアップするようにした。実行履歴も正常に動作しているようだった。
- しばらくたって、バックアップが正常動作しているか心配になったので、手動でbatを実行してみると、バックアップされているはずの画像がコピーされてしまった。慌ててタスクスケジューラーの履歴を見ると確かにエラーが返っていた。
- 調べてみるとタスクスケジューラーでネットワークドライブにアクセスするときは、UNC接続しろという記述を発見。(https://qa.atmarkit.co.jp/q/1424)
確かにこれで動作するようになったが、理由がいまいちわからずモヤモヤ。
- さらに調べてみると次の情報を発見。ネットワークドライブはユーザーが対話形式のログオンをしていないとネットワークドライブが使えないとのこと。
http://www.unirita.co.jp/blog/data-utilization/data-linkage/20140916-2.html

# 結論

ネットワークドライブの割り付けは対話形式のログオン時に割り当てられるため、タスクスケジューラーでの実行は利用できない。そのため、ネットワークフォルダを使用する際はUNC形式で指定するべし。
`xcopy c:\*.jp* \\nas\WinDesktop\C-Drive /d /i /s > .\CopyPhotoLog-C.txt`
UIデザインは人の好奇心に依存している

##はじめに
私は普段、同居している81歳のおばあさんにiPadの使い方を教えたり、サポートをしています。
発端はとある２５歳男性に、PS4の使い方について教えてあげたことです。
彼はPSボタンを長押しして出てくるメニューの存在を知らず、スリープモードが存在することを知りませんでした。

８１歳のお婆さんも以前、iPadの入力キーボードが左右に分割されてしまい、入力ができない問題に直面しました。これもまたiPadのキーボード右下にある、「キーボードを隠すキー」を長押ししてしまったことが原因でした。

以上の出来事から私は、**UIデザインは人の好奇心に依存している**と考え、その意見を文章に書き起こしてみました。

##本記事における好奇心の定義について
本記事では好奇心を次とします。
> わからないものに対して、それを知りたいと思う欲求

そして、好奇心の強い人を次と定義します。
> 好奇心が予測できないリスクへの不安を凌駕し、行動してしまう人

知らないことやわからないことにチャレンジすることは怖いものです。
好奇心の強い人とは予測できないリスクに鈍感だったり、承知した上で行動を起こす人だと定義します。

##機械音痴の正体
世の中には残念ながら機械音痴の人がいます。彼らはしばしば訳のわからないトラブルに悩まされ、機械に翻弄されています。
機械音痴の原因について良い記事があったので引用しますと、そこでは次の３つの原因が挙げられています。
> - イメージ力がない
- 基本的仕組みが理解できていない
- 機械に触れる時間が少ない
>
引用元　http://souma-ism.xyz/archives/715

これら３つの原因が正しいとすると、根本的な原因として**好奇心**の不足が原因ではないかと見ています。
つまり機械音痴=好奇心の低い人と言えるのです。

###イメージ力がない
UIには様々なアイコンが登場します。歯車のアイコンであれば何らかの設定でしょうし、人のアイコンならプロフィール設定などと想像ができるでしょう。しかし、それらは歯車の形状を知っていたり、人のシルエットがそうなると知っている必要があります。

機械音痴の人が知識に存在しない形状のアイコンを見たときの反応は、「押したらどうなるかわからないから押さない」というものになるでしょう。
対照的に好奇心の強い人は、どうなるかわからないにも関わらず、とりあえず押してみるでしょう。すると好奇心の強い人は「この形状のアイコンを押すと、これこれこのような動作をする」と知見が貯まる訳です。

###基本的仕組みが理解できていない
>つまり、今使おうとしている機械はなんの役割を果たすもので、どういったジャンルのものなのかを理解することによって基本的構造もイメージしやすくなり、操作が簡単になります
引用元 http://souma-ism.xyz/archives/715

機械音痴の人が好奇心の低い人とすると、彼らは好奇心が低いが故に機械への理解を深めようとしません。
好奇心の強い人はわからないものに対して知りたいと欲するため、専門家レベルとはいかないとしても理解を深めようとします。

###機械に触れる時間が少ない
上記２つの理由から、好奇心の低い人は機械の操作を避け、対照的に好奇心の高い人は積極的に機械を操作しようとします。その結果、機械の操作時間に差が生まれ、知見の多さに格差が生じるのです。

##好奇心に依存するUIの例

###ボタン長押し
残念ながら昨今のUI、特にモバイルデバイスのUIについては画面面積の制約から、一つのボタンに複数の機能が持たされることが多いです。その最たる例がボタンの長押しです。
好奇心の高い人はボタンをこねくり回して、そのうち長押しに機能が存在することを察知します。
長押しすることで別の機能が存在することを示唆するデザインとか無いんでしょうかね？

###ダブルクリック（ダブルタップ）
素早く二回ボタンを押すというのも、一つのボタンに複数機能を持たせる方法の一つです。
パソコンが身近な世代ではダブルクリックの文化があるために、それを想像することは容易いでしょう。

しかし、これからモバイルデバイスのみ触れてきた世代が登場します。彼らはダブルクリックの知見が無いために、好奇心の高い人のみが使える操作になる恐れがあります。

###ドラッグ&ドロップ
知っている人からすれば当たり前の操作ですが、それがドラッグ&ドロップできることがわかるデザインは限られています。滑り止めを表すような、立体的なアイコンが例として挙げられます。しかし、このデザインにできる箇所は限られているでしょう。

MacのDockからアイコンを移動して、Dockからアプリケーションを非表示にする操作は、デザインからは読み取れません。このアイコンに全て滑り止めをつけるわけにはいきませんよね。
引っ張ってぐりぐりするなんて操作もまた、好奇心の高い人しか行わないでしょう。

##加齢による変化
人は歳をとり衰え、そして死にます。
一般的に高齢になる程、最新機器の操作が難しくなる傾向にありますが、その原因もまた好奇心の低下によるものです。
衰える能力の中に好奇心もまた含まれているのですが、これには明確なデータが存在します。

次のページの「年齢別の好奇心の瑞日比較」のグラフを見てください。
http://tmaita77.blogspot.com/2013/12/blog-post_8.html

これはOECDの国際成人力調査のデータをグラフ化したものとなっています。
基本的に年齢が上がると好奇心が衰えている人の割合が増えますが、完全に好奇心の低い人で世代が埋め尽くされるわけではありません。
好奇心の低さが最新機器への適応力の低さに繋がっていること、そして歳の割に適応力の高い人がいることが、これにより説明できると思います。

実際に私のお婆さんも好奇心がないせいか、生活環境の改善を行ってくれません。より良い商品の選択、より良く安全な家具の配置など自ら進んで行えず、**人やメディアに好奇心を向ける代行を依頼している**をしている状態です。
（ちなみに問題の25才男性も周りに流されやすいタイプです）

##最後に　好奇心の低い人をどう扱うか
私は好奇心を失った人は取り残されて当然と考えています。
ですが、プロダクトとして多くの人に使ってもらい利益を得ようとするならば、好奇心の低い人を考慮する必要があるでしょう。

私はUI/UXデザイナーでは無いので具体的な改善案は思いつかないのですが、デザインの方向性として**僅かに残された好奇心を刺激**したり、**好奇心のない生命体にも本能で理解させること**が重要なのではと思いました。この記事がデザイナーに届くことを祈ります。

そして誰か長押しボタンをどうにかしてください！！！
ホスティングサービス一覧はどこかに無いのでしょうか？

最近弊社のメールサーバー、Webサーバーのルーターがアクセス多々で
ハングアップするので
ホスティングサービスの利用を考えております。

さくらメール
たのめーる
ぐらいしか知らないのですが
他に良い所をご存知な方はお教え頂けないでしょうか？

(+_+)
gitコマンドのエイリアス設定

# 設定方法
cf. https://qiita.com/peccul/items/90dd469e2f72babbc106
# 設定例
```bash:.gitconfig
[alias]
	ch = checkout
	br = branch
	st = status -s
	di = diff --name-only
	lo = log --oneline
	shl = stash list
	shs = stash save
	shp = stash pop
	ad = add --all
	co = commit -m
	coa = commit --amend
	pu = push origin HEAD
```
NERDTreeの設定

自分がしているNERDTreeの設定を書いておきます。
必要最低限で十分便利

## 環境

* OS: Mac
* プラグインマネージャー：dein.vim

## 前提

`NERDTree`がインストールされていること

## 出来ること

* `vi`でファイルを指定したら、NERDTreeを非表示それ以外は表示とする
* `:NERDTree`じゃなく、「Control+e」でツリーを表示させる

## 方法

`.vimrc`に以下を追記

```
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
let g:NERDTreeShowHidden=1
nnoremap <silent><C-e> :NERDTreeToggle<CR>
```
Android Studio の Run App を --stacktrace 付きで実行する


Android Studioで`Run App`ボタンで実行するとコンパイル失敗するけど、エラーの詳細がわからないことがあります。
`./gradlew assembleDebug --stacktrace` を実行すればすぐわかるようなエラーなんですが、エラーを確認するためだけに、このコマンド実行するのもだるいですね。時間かかるし。

というわけで`Run App`を`--stacktrace`付きで実行する方法の紹介です。

Android Studio -> Preferences -> Buid, Execution, Deployment -> Compiler の Command-line Optionsに`--stacktrace` を追加することで、 Run App で実行してもエラーの詳細を確認することができるようになります。

![Kobito.giQqBI.png](https://qiita-image-store.s3.amazonaws.com/0/18273/6b9ee7ce-4a3f-ed3d-26a8-5534a29391ee.png "Kobito.giQqBI.png")
[mysql] insert中にmaxを使用する

最大値+1ずつ増えるのをselectを使わずにinsertの一文で実装したい。

```
insert into table
    ( columnA, columnB, columnC )
    select
        valueA,
        valueB,
        case when max(columnC) is null then 1 else max(columnC)+1 end,
    from table;
```
【12月開催】PwCテクノロジーコンサルタント1dayインターンシップ

#PwCテクノロジーコンサルタント1dayインターンシップ

##概要
PwCテクノロジーコンサルタントインターンシップは、PwCのテクノロジーコンサルタントになりきり、仮想のクライアントに対しテクノロジーを駆使した課題解決の提案をしてもらうインターンシップです。

インターンシップで取り組むテーマは、デジタル戦略、サイバーセキュリティ戦略等、実際の仕事内容をリアルに再現したものとなっています。
インターンシップでは、チームでコンサルティングワークを実施していただきます。現場で活躍する現役コンサルタントもメンバーとして加わり、コンサルタントの考え方、仕事の仕方を指導します。

多様なバックグラウンドを持つ コンサルタントで構成されるテクノロジーコンサルティング部門の業務を体験してください。
コンサルティングワーク後には現役コンサルタントから、実施して頂いた作業について、良かった点や課題、課題を改善するための助言などの個別フィードバックがあります。また、チームメンバーや社員とフランクにお話いただける懇親会も予定していますので、是非、ご参加ください。

ビジネスとテクノロジーの両方の知見を必要とするテクノロジーコンサルタントの仕事を体感してみませんか？


【こんな人にぜひ！】
・サイバーセキュリティに興味がある人
・新しいテクノロジーに興味がある人
・ご自身のテクニカルスキルを試してみたい人
・コンサルタントの仕事を体験してみたい人　　
・テクノロジーを用いたビジネスを考えることが好きな人　
・新しいアイデアを考えることが好きな人　　

##実施詳細
実施期間：2018年12月15日（土）
応募締切：2018年11月22日（木）23:59
実施場所：PwCコンサルティング合同会社　東京丸の内オフィス（東京駅近辺）
募集人数：約50名
交通費：遠方から新幹線もしくは飛行機で参加される方には、弊社規定に従い、交通費をお支払いいたします。※国内のみ
昼食： 弊社でご用意いたします
参加資格：現時点で大学・大学院に在籍し、2020年3月卒業/修了見込みかつ2020年4月/10月入社が可能な方

##持ち物
筆記用具、時計、PC

##お問い合わせ
イベントに関するお問い合わせはkazuya.michiwa@pwc.comへお願いします。

##選考のフロー
■応募の流れ
選考フローは以下の通りです。 まずはマイページよりエントリーください。
マイページ作成（プレエントリー）
URLはこちら 
https://goo.gl/xEToaU
↓ 
エントリー 
↓ 
エントリーシート提出 
↓ 
Web適性試験（11月22日　 23:59 締切) 
↓ 
グループディスカッション（日時、会場はWeb適正検査を通過された方に個別にご連絡します）
↓
インターンシップ参加！
 

##ご注意
このイベントは、現時点で大学・大学院に在籍し、2020年3月卒業/修了見込みかつ2020年4月/10月入社が可能な方を対象としたイベントです。
PwC's Analytics Hackathon

# PwC's Analytics Hackathon<br>

## 概要

PwC's Analytics Hackathonは、スキルや創造性を活かして、社会の課題解決に取組むイベントです。
 
皆さんとPwCの若手コンサルタントでチームをつくり、企業や組織が抱える課題を解決するために「どのようなデータ分析手法が最適であるか」を考えて頂きます。実際に検討した手法を用いてデータ分析を行い、その結果から解決策を検討し、発表を行っていただくプログラムとなります。

ハッカソン後は、PwCのコンサルタントとフランクにお話いただく懇親会も予定しています。

【こんな人にぜひ！】

* コンサルタントの仕事を体験してみたい人
* データサイエンティストに興味がある人
* データ分析を用いた研究をしている人
* テクノロジーを用いたビジネスを考えることが好きな人　
* 新しいアイデアを考えることが好きな人
* ご自身の分析スキル・プログラミングスキルを試してみたい人
* Hackathonに参加してみたい人 

## 推奨スキル
### プログラミングスキル
下記いずれかの対象言語でのプログラミング経験

* Python
* Ruby
* Perl
* R
* MATLAB
* C
* C++


### 分析スキル
下記いずれかの分析アルゴリズムの使用経験

* 回帰：ロジスティック回帰、SVMなど
* ツリー：決定木、ランダムフォレストなど
* ベイズ：単純ベイズ（ナイーブベイズ)など
* アンサンブル学習 ： ブースティング、バギングなど
* 時系列：AR、MA、(S)ARIMAモデルなど
* 商品分析：アソシエーション分析、ABC分析、バスケット分析など
* 顧客分析：デシル分析、RFM分析など
* 自然言語解析：テキスト解析、共起ネットワーク、感情分析、Word 2 Vectorなど
* クラスタリング：k近傍法(KNN)、階層型クラスタリング、非階層型クラスタリング（K-Means）、トピックモデルなど
* 異常検知（外れ値検知）：教師なし異常検知、教師あり異常検知、半教師あり異常検知など
* ニューラルネットワーク：CNN、RNN、LSTM、自己組織化マップ（SOM)など



## 審査員

![藤川 琢哉](https://qiita-image-store.s3.amazonaws.com/0/218445/8bf2ac77-e3bd-1b06-7d65-7fa467c62dab.jpeg)

#### 藤川 琢哉
PwCコンサルティング合同会社
テクノロジーコンサルティング
データアナリティクス
ディレクター 

神奈川県出身。東京工業大学でAIを専攻。卒業後、10年来テクノロジーコンサルタントとしてIT戦略、サイバーセキュリティ、ロボティクス、デジタル戦略等、様々なテクノロジーコンサルティングの案件に従事。現在は大学時代に培ったAIの専門性を活かし、データアナリティクスで特にシミュレーションモデリングを担当。現場でのコンサルティング業務以外では、テクノロジーコンサルタント職の採用担当として、年間1000人の学生と接触しキャリアアドバイスを実施。

----------


## 実施詳細

* 実施期間：2018年11月17日（土）
* 応募締切：2018年11月9日 （金）23:59
* 実施場所：PwCコンサルティング合同会社　東京オフィス（東京駅近辺）
* 募集人数：約50名
* 交通費：遠方から新幹線もしくは飛行機で参加される方には、弊社規定に従い、交通費をお支払いいたします。※国内のみ
* 昼食： 弊社でご用意いたします
* 参加資格：現時点で大学・大学院に在籍し、2020年3月卒業/修了見込みかつ2020年4月/10月入社が可能な方

## 持ち物

Windows PCやMac、タブレットなどハックするためにご自身が必要と判断するもの


## お問い合わせ
イベントに関するお問い合わせはkazuya.michiwa@pwc.comへお願いします。

## 選考のフロー

■応募の流れ
選考フローは以下の通りです。    まずはマイページよりエントリーください。

マイページ作成（プレエントリー）
URLはこちら 
https://goo.gl/CQqgWZ 
↓ 
エントリー (アンケート登録　11月9日　23:59 締切）
↓ 
ハッカソン参加！

※定員制のイベントになりますので、アンケートの回答をこちらで確認させていただいた上で、ご招待の有無を決めさせて頂きます。


## ご注意

このイベントは、現時点で大学・大学院に在籍し、2020年3月卒業/修了見込みかつ2020年4月/10月入社が可能な方を対象としたイベントです。
api blueprint関連記事まとめ

## 概要

Swaggerと同じようにAPI定義がmarkdown形式で記述できるapi blueprintに関する参考になる記事をまとめています。

自分用なので、自分記事が若干多めです。随時更新

この記事良かったよーとか、教えていただけると助かります。


## 公式

api blueprint
https://apiblueprint.org/


## ドキュメント作成

api blueprintとaglioを利用してAPI仕様書を作成する
https://qiita.com/kai_kou/items/630f6c1e4e577518bd14

API BlueprintとdrakovとdreddでAPIドキュメントを書きつつモックサーバを立ててさらにテストを走らせる
https://arata.hatenadiary.com/entry/2018/03/22/204723


## モック

api blueprintとdrakovを利用してAPIモックサーバを立ち上げる
https://qiita.com/kai_kou/items/bdbb6c3f8d1ac655595d


## 環境構築

Dockerとapi blueprint+aglio+drakovを使ってAPI開発を楽にする
https://qiita.com/kai_kou/items/feca8974f3967a285ff4

## Tips

api blueprintでData Structuresを利用する際の注意点
https://qiita.com/kai_kou/items/a48931ee165de7f3cee4

api blueprint でData Structuresを用いてIFを定義する
https://qiita.com/haseshin/items/1394b0c70e25c9f51762
Macでsedを使ってスネークケースをパスカルケースに変換したかった

Macに入っている sed はLinuxに入っているsedと違うみたい。。。
[参考] https://shunirr.hatenablog.jp/entry/2012/12/19/160544

なので、GNU sed というものをhomebrewでインストールしてgsedを使うといいらしい。

```sh
$ brew install gnu-sed
```
インストール完了したら↓

## スネークケースをパスカルケースに変換

```sh
$ echo "hoge_fuga" | gsed -r 's/(^|_)(.)/\U\2\E/g'
HogeFuga
```

## スネークケースをキャメルケースに変換

```sh
$ echo 'hoge_fuga' | gsed -r 's/_(.)/\U\1\E/g'
hogeFuga
```
SmartNewsのフィード配信を実装してみた

#ニュースアプリに記事が載る仕組みは？
　SmartNewsやGunosyといったニュースアプリは毎日色々な記事を表示させています。それを実現しているのが**フィード配信**です。フィード配信とはサイトのURLに定期的にアクセスして新着記事を探し、それを別のサイトに投稿する仕組みを用いた配信になります。

　記事を配信したいサイトはニュースアプリ側の仕様に従った情報を渡してあげる必要があります。記事を配信したいサイトは情報を渡すためのURLをニュースアプリ側に伝え、ニュースアプリ側はそのURLに定期的にアクセスすることにより新規コンテンツのを自動的に探し出すことができます。

#学んだことたち
##XML, RSSとは
　XMLとはHTMLと同じくマークアップ言語の一つです。HTMLとの大きな違いとして、XMLでは自分でタグを自由に定義することができます。タグ自体に意味を持たせることができるので人間にとっては読みやすいかつ、機械にもタグの属性や重要度がわかりやすい言語です。

　RSSとは、記事などのコンテンツの情報を配信するための技術です。フィード配信に用いられており、RSSの他にもAtomもフィード配信に用いられています。

##CDATAとは
　SmartNewsの仕様書を読んでいると記事情報などのタグ中で *<![CDATA[* と *]]>* で囲まれている箇所がありました。CDATAってなんだと思って調べてみました。
　まずXMLで書かれたコードは構文解析がなされます。なので以下のような例では、*<部長>*という要素が含まれる*<社員>*という要素になります。

```xml

<社員>
　<部長>大原</部長>
</社員>
```
　しかしこのような構文解析をさせずに、ただ単に社員というタグの中に定義したタグや、pタグなどのhtmlを書きたい時はどうしたらいいのか。。その時に用いられるのがCDATAです。CDATAで囲まれた箇所は構文解析をされずにXMLパーサーを透過してくれます。

##mime-typeの指定
　ニュースアプリ側はURLに定期的にアクセスして必要な情報を取得して、新着記事を探しています。そのため、仕様に則ったファイルを作成してそこにアクセスしてもらうという手段を考えました。この時に問題となったのがmime-typeの指定です。

　mime-typeとはファイルの種類を示すものです。ブラウザはHTTPヘッダーなどでファイルの種類が指定されていなければ、ファイルを拡張子で判断してcontent-typeを決めています。example.xmlというファイルであればmime-typeは *text/xml* と判断されてしまいます。

　SmartNewsのフィード配信で必要なmime-typeは *application/xml+rss* なのでを指定したい。。。そこで色々とXML上でmime-typeを指定する方法はないか調べたのですがなさそうでした。なので作成したファイルを *S3* にあげて、フィードリーダーがURLにアクセスした時にダウンロードして、header情報でmime-typeを指定してあげることで解決しました。

##media:thumbnailなどの拡張されたタグ
　まず、`<media:thumbnail>`ってなんだ。なんか仕様書に書かれている他のタグ`<title>`などと様子が違うことを感じ取りました。そこで調べてみました。

　まず、XMLやRSSはタグを自由に定義することができます。また、yahooやSmartNewsなどはタグを拡張して一般の人が使えるように公開してくれています。そのためタグ名がぶつかってしまうことが考えられます。そこでタグに対する一意性を確保する必要があります。その時にタグに対する`namespace`と`タグ名`を`:`で繋ぐことでタグの一意性を確保しています。

##実装で困ったこと
　最初にchannnelのxmlを記述し、それをSimpleXMLElementクラスのオブジェクト化しました。そのオブジェクトに`addChild`をすることによってitemのタグを作成していました。

　しかし、`media:thumbnail`タグを作成する時に問題が。titleと同様に*addChild*をしてあげてもただの`thumbnail`タグが表示されてしまう。。この問題に関しては拡張されたタグということが関係していました。addChildで拡張されたタグを作成してあげる時には、第3引数に`namespace`を入れてあげることで`media:thumbnail`と正しくタグを生成してくれます。

　もう一つの問題が発覚しました。titleタグの時は`<title>土佐日記</title>`のように開きタグと閉じタグの間にデータを入れてあげたらよかったのに、media:thumbnailは`<media:thumnail url="http://url">`のようにタグ中のurl属性にデータを入れる必要がある。。まず、タグに属性を追加するにはaddAttribute関数を用います。第一引数に属性名、第二引数に属性に入れるデータを指定します。その次に、namespaceつきタグを読み込む方法についてです。children関数を使います。childrenメソッドでタグのprefixを指定して、suffixをアローで繋いであげることで読み込んでくれます。
DeviseをSendGridのAPIキーで使うための設定

サンプルでは、DeviseのSMTP設定にユーザーIDとパスワードを記入すると書いているけど
パスワードは記入したくないので、探したらapiキーでも設定できるよってちょろっと書いていた。

なんてことはなかった。ユーザー名に`apikey`の文字を、パスワードには、APIキーを指定する。

config/environment.rbに追記

```Ruby
ActionMailer::Base.smtp_settings = {
  :user_name => 'apikey',
  :password => ENV["SENDGRID_API_KEY"],
  :domain => ENV["DOMAIN"],
  :address => 'smtp.sendgrid.net',
  :port => 587,
  :authentication => :plain,
  :enable_starttls_auto => true
}

```

参考
https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/send_transaction_mail.html
Max8が出たのでNode for Maxを試してみた

# はじめに
[ここ](https://github.com/Cycling74/n4m-examples)にNode for Maxのサンプルプロジェクトがいくつか置いてあるので参考になりそう。

# 天気API叩いてみた
## 使うやつ
天気になんの恨みもないが、手頃なAPI、それはお前だ！！
[OpenWeatherMap](https://openweathermap.org/current)

## 確認できたこと
- npmを使ってパッケージを入れられる(axios)
- APIのキーを`.env`に秘匿できる
- Maxから引数を受け取り、JSONなどのデータをMaxに返すことができる
- `async/await`を使って非同期処理を綺麗に書ける
- ファイルを分割してlibを作っても、ちゃんと`require`で相対パスから読み込むことができる

## スクショ
![Sep-26-2018 08-29-22.gif](https://qiita-image-store.s3.amazonaws.com/0/148589/95bd204e-9776-bf33-6c15-f65a6711c653.gif)
**Maxパッチの中からAPI叩けた！**

## ソースコード
[github](https://github.com/yuichkun/n4m-open_weather_api)

# （おまけ）そもそもNode本体はどこにあるの
デバッグツールのスタッツを見ると、どうやらMaxアプリの中にnodeとnpmのバイナリが入っているらしい。

<img width="403" alt="Screenshot 2018-09-26 04.43.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/148589/83a7c546-9036-cb0b-2a3d-b8c13537627b.png">

なので、実行環境を自分のPCに用意しなくてもOK。

で、実行中のプロセスを調べたらこんな感じで、
![ps.png](https://qiita-image-store.s3.amazonaws.com/0/148589/fc22a283-7843-c468-0841-2c4482d6bba4.png)

`/Applications/Max.app/Contents/Resources/C74/packages/Node For Max/source/lib/nsRunner.js`
これがエントリポイントになっているようで、
Maxのスクリプトの中で

```javascript
require('max-api');
```
なんの断りもなく（パッケージを解決することなく）こんな風にMaxAPIが呼べるのは、この`nsRunner.js`の中で呼ばれている｀nsProcessShell.js`あたりで実行前にラッピングされているからっぽいです。

# むすび
楽しいですね！！
まだPythonista3使ってないの？ー基本操作・StaShインストール編ー

pythonista3は少し前に世間を騒がせた超最強のpython神アプリでiOSで使用することができます。

スマホでpythonのコードを全て書いて実行できるので、自分だけしか使わない便利なアプリやゲームを作ったり出来ます。

使った人にしかわからないのが辛いくらい神アプリ！

今回はその神アプリの基本的な使い方について説明します。

# Pythonista3をインストールする

pythonista3のインストールは[こちら](https://itunes.apple.com/jp/app/pythonista-3/id1085978097?mt=8)からできます。

# StaShをインストールする

StaShは、Pythonista3の中で使用できるシェルで`cd`とか`ls`とか基本的なシェルコマンドはほとんど使えます！

pythonのライブラリをインストールするのにもとても便利なので、Pythonista3を使う人には必須です！

## **1.Pythonista3を開く**

## **2.一旦自分の開発用のフォルダを作る（任意）**

- 「New File」をクリック

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/ff762a15-a760-b92d-96d6-22a675a636e4.png">

- New Folderをクリックする

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/807cda0c-9701-32c9-8503-1b4115f57633.png">

- 好きな場所に好きなフォルダを作成する


## **3.一個ファイルを作ってみる（任意）**

- Empty scriptをクリックする

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/eede6188-b62f-e9a9-38b2-a64e1b7cc8a5.png">

- .pyファイルを作る

僕は適当にtest.pyを作りました。

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/c8022098-4c18-ebba-9f8d-bdeb43b6faa1.png">


## **4.コンソール画面に移動する**
StaShのインストールだけやりたい人はここからで大丈夫です。
先程作ったtest.pyをクリックすると、コンソール画面にいきます。
test.pyじゃなくてもいいです。何でもいいです。コンソール画面が開けばおっけーです。

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/3f3b2b13-fe52-1929-43af-bdd3494b9721.png">


## **5.インタラクティブコンソールの画面に移動する**
右にスワイプしたら、インタラクティブコンソールの画面に変遷します。
スワイプは、右にシュってするやつです。笑

下に入力画面が出てきたらおっけーです！

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/99b472b2-218a-8975-6047-f3cca0b0b5a4.png">


## **6.StaShをインストールする**

インタラクティブコンソールで、StaShをインストールします。
StaShは、Pythonista Shellの略らしい
Pythoni「sta Sh」ell

このインタラクティブコンソールで以下のコマンドを実行します

```shell

import requests as r; exec(r.get('http://bit.ly/get-stash').text)
```

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/8ab2170f-ab23-ca1d-ad10-2070e9892aab.png">


## **7.StaShを使う**

上記のコマンドを実行すると、launch_stash.pyとstash_extensionsが生成されます。

launch_stash.pyを選択し、実行する（▷を押す）とStaShが起動します。

<img width="320" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/238739/c90250bb-a822-8cbe-1cfa-ab416a82d0a5.png">


## おわりに

Pythonista3の記事を書いたらここ↓↓↓にためていきます。

[まだPythonista3使ってないの？ースクレイピング編ー](https://qiita.com/n_oshiumi/items/97ace8c78db0ce881ccb)
php-master-changes 2018-09-25

あまり更新がない日。
今日あたり[型付プロパティ](https://wiki.php.net/rfc/typed_properties_v2)の[投票終了日](https://externals.io/message/103148#103148)。
スカラ型宣言は JST の朝 5 時くらいまで票が行ったり来たりするのを見守ってたおぼえ。
今回は 9/25 の evening というのが PDT あたりのだとすると、日本では 9/26 の 10 時から 16 時までの間くらい？[ルクセンブルク](https://github.com/bwoebi)時間なら 7 時くらいには日変わってる、くらい

# 2018-09-25
## cmb69: Update NEWS wrt. php-7.3.0RC2 tagging
- https://github.com/php/php-src/commit/36092b23548403a7b9f1af1425ead3471689e604
- [7.3~]
- 7.3 RC2 のタグ打って NEWS の更新

## dstogov: Removed unused function
- https://github.com/php/php-src/commit/5edaa6f9470f40cee1b48c8e5b0a3e2654594f90
- ext/soap の使われていない関数を削除
TopK

# TopK問題
選択アルゴリズム（英: selection algorithm）とは、数列から k 番目に小さい（あるいは k 番目に大きい）数を探すアルゴリズムである。
[Wiki](https://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

# アルゴリズム
## Sort
```
sort(arr, 1, n);
return arr[1, k];
```
*O(n*lg(n))*

## Partition Sort
```
for(i=1 to k){
    bubble_find_max(arr,i);
}
return arr[1, k];
```
*O(n*k)*

## Heap
```
heap[k] = make_heap(arr[1, k]);
for(i=k+1 to n){
         adjust_heap(heep[k],arr[i]);
}
return heap[k];
```
*O(n*lg(k))*

## Quick Sort
```
void quick_sort(int[]arr, int low, inthigh){
         if(low== high) return;
         int i = partition(arr, low, high);
         quick_sort(arr, low, i-1);
         quick_sort(arr, i+1, high);
}
```
*O(n*lg(n))*

## Binary Search
```
int BS(int[]arr, int low, inthigh, int target){
         if(low> high) return -1;
         mid= (low+high)/2;
         if(arr[mid]== target) return mid;
         if(arr[mid]> target)
                   return BS(arr, low, mid-1, target);
         else
                   return BS(arr, mid+1, high, target);
}
```
*O(lg(n))*

## Randomized Select
```
int RS(arr, low, high, k){
  if(low== high) return arr[low];
  i= partition(arr, low, high);
  temp= i-low; //数组前半部分元素个数
  if(temp>=k)
      return RS(arr, low, i-1, k); 
  else
      return RS(arr, i+1, high, k-i); 

}
```
*O(n)*
【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～ResnetS40のレイティング

<img width="200" style="float: left;" alt="将棋AIで学ぶディープラーニング" src="https://qiita-image-store.s3.amazonaws.com/0/233744/ded117b9-37c7-1b41-033d-960e63ca5fe1.jpeg">
第廿三夜も、本書から逸脱するが、現状のソフトレイティングを見てみようと思う。
基本的なレイティングは以下の参考サイトに基づいて導出することとする。
【参考】
①[早見表](http://kishibetsu.com/hayami.html)
②[思考深度制限した技巧２の２４R](http://www.uuunuuun.com/single-post/2018/07/31/%E6%80%9D%E8%80%83%E6%B7%B1%E5%BA%A6%E5%88%B6%E9%99%90%E3%81%97%E3%81%9F%E6%8A%80%E5%B7%A7%EF%BC%92%E3%81%AE%E6%A3%8B%E5%8A%9B)
[コンピュータ将棋 まとめサイト](https://www.qhapaq.org/shogi/)
###やったこと
（１）Gikou２D1　vs　ResnetS40
（２）レイティング
###（１）Gikou２D1　vs　ResnetS40
それぞれの条件は以下の通り
ResnetS40；Temperature　70、Playout　1000
Gikou2
![Gikou.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/2b27940b-f75e-8bfc-60a3-2fa60b3894f3.jpeg)
そして対戦条件は
![taisenCond.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/0efff926-1dd1-6726-2c6c-2357ae60fe95.jpeg)
対戦結果
![Gikou2vsS40.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/a9754d14-4d65-f4a2-84ec-582adee7218e.jpeg)
###（２）レイティング
上記の対戦では少ないが、一応以下のようにレイティングを予測できる。
まず、参考①から想定される両者のレイティングを再掲させていただくと以下の通り

|レイト差　|　期待勝率|
|:-:|:-:|

|　　　　　|　上位　|　下位|
|:-:|:-:|:-:|
|３２～３８|	５５％|	４５％|
|３９～４５|	５６％|	４４％|
|４６～５２|	５７％|	４３％|
|５３～５９|	５８％|	４２％|
|６０～６６|	５９％|	４１％|　
|６７～７４|	６０％|	４０％|
|７５～８１|	６１％|	３９％|
|８２～８８|	６２％|	３８％|
|８９～９６|	６３％|	３７％|
|９７～１０３|	６４％|	３６％|
つまり、想定されるレイト差は３２から１０３の間だということになる。

そして、Gikou2D1のレイティングは参考②から
Gikou2 D1	1512	+17/-9	3800
及び1513とあるので、だいたいこの辺りであるようです。

ということで、今回の１０回の対戦から予測されるレイティングは
１４０８～１４８０
辺りのようです。
###やったこと
・最近レイティングが見直されたGikou2のレイティングからResnetS40のレイティングを予測すると１４０８～１４８０となった

・10回では予測の幅が大きくなるので少なくとも100回程度実施したい